aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.circleci/config.yml2
-rw-r--r--lerna.json2
-rw-r--r--package.json5
-rw-r--r--packages/0x.js/CHANGELOG.json35
-rw-r--r--packages/0x.js/CHANGELOG.md4
-rw-r--r--packages/0x.js/package.json52
-rw-r--r--packages/0x.js/src/0x.ts59
-rw-r--r--packages/0x.js/src/index.ts4
-rw-r--r--packages/0x.js/test/global_hooks.ts2
-rw-r--r--packages/abi-gen/CHANGELOG.json22
-rw-r--r--packages/abi-gen/CHANGELOG.md4
-rwxr-xr-xpackages/abi-gen/bin/abi-gen.js2
-rw-r--r--packages/abi-gen/package.json19
-rw-r--r--packages/assert/CHANGELOG.json12
-rw-r--r--packages/assert/CHANGELOG.md4
-rw-r--r--packages/assert/package.json14
-rw-r--r--packages/assert/src/index.ts32
-rw-r--r--packages/assert/test/assert_test.ts2
-rw-r--r--packages/base-contract/CHANGELOG.json18
-rw-r--r--packages/base-contract/CHANGELOG.md4
-rw-r--r--packages/base-contract/package.json18
-rw-r--r--packages/base-contract/src/index.ts12
-rw-r--r--packages/connect/CHANGELOG.json12
-rw-r--r--packages/connect/CHANGELOG.md4
-rw-r--r--packages/connect/package.json16
-rw-r--r--packages/connect/src/http_client.ts2
-rw-r--r--packages/connect/src/utils/type_converters.ts6
-rw-r--r--packages/connect/src/ws_orderbook_channel.ts6
-rw-r--r--packages/connect/test/ws_orderbook_channel_test.ts2
-rw-r--r--packages/contract-wrappers/CHANGELOG.json18
-rw-r--r--packages/contract-wrappers/CHANGELOG.md4
-rw-r--r--packages/contract-wrappers/package.json47
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts36
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts3
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts23
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts3
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts10
-rw-r--r--packages/contract-wrappers/src/index.ts15
-rw-r--r--packages/contract-wrappers/test/exchange_wrapper_test.ts14
-rw-r--r--packages/contract-wrappers/test/global_hooks.ts2
-rw-r--r--packages/contract-wrappers/test/subscription_test.ts38
-rw-r--r--packages/contracts/compiler.json1
-rw-r--r--packages/contracts/package.json34
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol16
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol202
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol8
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol218
-rw-r--r--packages/contracts/test/asset_proxy/proxies.ts31
-rw-r--r--packages/contracts/test/exchange/core.ts194
-rw-r--r--packages/contracts/test/exchange/dispatcher.ts6
-rw-r--r--packages/contracts/test/exchange/libs.ts8
-rw-r--r--packages/contracts/test/exchange/match_orders.ts180
-rw-r--r--packages/contracts/test/exchange/signature_validator.ts8
-rw-r--r--packages/contracts/test/exchange/transactions.ts20
-rw-r--r--packages/contracts/test/exchange/wrapper.ts274
-rw-r--r--packages/contracts/test/forwarder/forwarder.ts104
-rw-r--r--packages/contracts/test/libraries/lib_bytes.ts11
-rw-r--r--packages/contracts/test/multisig/asset_proxy_owner.ts2
-rw-r--r--packages/contracts/test/multisig/multi_sig_with_time_lock.ts2
-rw-r--r--packages/contracts/test/utils/asset_wrapper.ts20
-rw-r--r--packages/contracts/test/utils/block_timestamp.ts (renamed from packages/contracts/test/utils/increase_time.ts)9
-rw-r--r--packages/contracts/test/utils/constants.ts2
-rw-r--r--packages/contracts/test/utils/core_combinatorial_utils.ts8
-rw-r--r--packages/contracts/test/utils/erc20_wrapper.ts14
-rw-r--r--packages/contracts/test/utils/erc721_wrapper.ts10
-rw-r--r--packages/contracts/test/utils/exchange_wrapper.ts10
-rw-r--r--packages/contracts/test/utils/forwarder_wrapper.ts18
-rw-r--r--packages/contracts/test/utils/log_decoder.ts6
-rw-r--r--packages/contracts/test/utils/match_order_tester.ts22
-rw-r--r--packages/contracts/test/utils/multi_sig_wrapper.ts6
-rw-r--r--packages/contracts/test/utils/order_factory.ts15
-rw-r--r--packages/contracts/test/utils/order_factory_from_scenario.ts36
-rw-r--r--packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts2
-rw-r--r--packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts4
-rw-r--r--packages/contracts/test/utils/token_registry_wrapper.ts4
-rw-r--r--packages/contracts/test/utils/transaction_factory.ts6
-rw-r--r--packages/contracts/test/utils/type_encoding_utils.ts21
-rw-r--r--packages/contracts/test/utils/web3_wrapper.ts6
-rw-r--r--packages/dev-utils/CHANGELOG.json18
-rw-r--r--packages/dev-utils/CHANGELOG.md4
-rw-r--r--packages/dev-utils/package.json20
-rw-r--r--packages/dev-utils/src/blockchain_lifecycle.ts43
-rw-r--r--packages/ethereum-types/CHANGELOG.json3
-rw-r--r--packages/ethereum-types/package.json8
-rw-r--r--packages/fill-scenarios/CHANGELOG.json12
-rw-r--r--packages/fill-scenarios/CHANGELOG.md4
-rw-r--r--packages/fill-scenarios/package.json32
-rw-r--r--packages/fill-scenarios/src/artifacts.ts6
-rw-r--r--packages/fill-scenarios/src/constants.ts1
-rw-r--r--packages/fill-scenarios/src/fill_scenarios.ts300
-rw-r--r--packages/fill-scenarios/src/index.ts223
-rw-r--r--packages/json-schemas/CHANGELOG.json18
-rw-r--r--packages/json-schemas/CHANGELOG.md4
-rw-r--r--packages/json-schemas/package.json12
-rw-r--r--packages/json-schemas/schemas/call_data_schema.ts2
-rw-r--r--packages/json-schemas/src/schema_validator.ts2
-rw-r--r--packages/metacoin/package.json28
-rw-r--r--packages/migrations/CHANGELOG.json18
-rw-r--r--packages/migrations/CHANGELOG.md4
-rw-r--r--packages/migrations/artifacts/2.0.0/ERC721Token.json30
-rw-r--r--packages/migrations/artifacts/2.0.0/Exchange.json99
-rw-r--r--packages/migrations/artifacts/2.0.0/ExchangeWrapper.json12
-rw-r--r--packages/migrations/artifacts/2.0.0/Forwarder.json22
-rw-r--r--packages/migrations/artifacts/2.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json723
-rw-r--r--packages/migrations/artifacts/2.0.0/TokenRegistry.json16
-rw-r--r--packages/migrations/artifacts/2.0.0/Whitelist.json12
-rw-r--r--packages/migrations/package.json33
-rw-r--r--packages/migrations/src/2.0.0/migration.ts8
-rw-r--r--packages/migrations/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/migrations/src/utils/artifact_writer.ts4
-rw-r--r--packages/monorepo-scripts/CHANGELOG.json6
-rw-r--r--packages/monorepo-scripts/package.json9
-rw-r--r--packages/monorepo-scripts/src/constants.ts2
-rw-r--r--packages/monorepo-scripts/src/find_unused_dependencies.ts11
-rw-r--r--packages/monorepo-scripts/src/globals.d.ts19
-rw-r--r--packages/monorepo-scripts/src/postpublish_utils.ts23
-rw-r--r--packages/monorepo-scripts/src/prepublish_checks.ts43
-rw-r--r--packages/monorepo-scripts/src/publish.ts35
-rw-r--r--packages/monorepo-scripts/src/test_installation.ts16
-rw-r--r--packages/monorepo-scripts/src/types.ts14
-rw-r--r--packages/monorepo-scripts/src/utils/changelog_utils.ts8
-rw-r--r--packages/monorepo-scripts/src/utils/utils.ts52
-rw-r--r--packages/order-utils/CHANGELOG.json25
-rw-r--r--packages/order-utils/CHANGELOG.md4
-rw-r--r--packages/order-utils/package.json31
-rw-r--r--packages/order-utils/src/abstract/abstract_order_filled_cancelled_lazy_store.ts12
-rw-r--r--packages/order-utils/src/asset_data_utils.ts (renamed from packages/order-utils/src/asset_proxy_utils.ts)112
-rw-r--r--packages/order-utils/src/constants.ts1
-rw-r--r--packages/order-utils/src/crypto.ts2
-rw-r--r--packages/order-utils/src/exchange_transfer_simulator.ts2
-rw-r--r--packages/order-utils/src/index.ts3
-rw-r--r--packages/order-utils/src/order_state_utils.ts4
-rw-r--r--packages/order-utils/src/order_validation_utils.ts2
-rw-r--r--packages/order-utils/src/remaining_fillable_calculator.ts14
-rw-r--r--packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts18
-rw-r--r--packages/order-utils/src/store/order_filled_cancelled_lazy_store.ts65
-rw-r--r--packages/order-utils/test/exchange_transfer_simulator_test.ts9
-rw-r--r--packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts4
-rw-r--r--packages/order-watcher/CHANGELOG.json27
-rw-r--r--packages/order-watcher/CHANGELOG.md4
-rw-r--r--packages/order-watcher/package.json46
-rw-r--r--packages/order-watcher/src/artifacts.ts19
-rw-r--r--packages/order-watcher/src/compact_artifacts/DummyToken.json22
-rw-r--r--packages/order-watcher/src/compact_artifacts/ERC20Token.json49
-rw-r--r--packages/order-watcher/src/compact_artifacts/ERC721Token.json71
-rw-r--r--packages/order-watcher/src/compact_artifacts/EtherToken.json287
-rw-r--r--packages/order-watcher/src/compact_artifacts/Exchange.json543
-rw-r--r--packages/order-watcher/src/compact_artifacts/Token.json172
-rw-r--r--packages/order-watcher/src/compact_artifacts/TokenRegistry.json547
-rw-r--r--packages/order-watcher/src/compact_artifacts/TokenTransferProxy.json187
-rw-r--r--packages/order-watcher/src/compact_artifacts/WETH9.json100
-rw-r--r--packages/order-watcher/src/compact_artifacts/ZRX.json20
-rw-r--r--packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts74
-rw-r--r--packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts27
-rw-r--r--packages/order-watcher/src/index.ts3
-rw-r--r--packages/order-watcher/src/order_watcher/collision_resistant_abi_decoder.ts54
-rw-r--r--packages/order-watcher/src/order_watcher/dependent_order_hashes_tracker.ts230
-rw-r--r--packages/order-watcher/src/order_watcher/event_watcher.ts26
-rw-r--r--packages/order-watcher/src/order_watcher/expiration_watcher.ts14
-rw-r--r--packages/order-watcher/src/order_watcher/order_watcher.ts433
-rw-r--r--packages/order-watcher/src/schemas/order_watcher_partial_config_schema.ts13
-rw-r--r--packages/order-watcher/src/types.ts16
-rw-r--r--packages/order-watcher/src/utils/assert.ts14
-rw-r--r--packages/order-watcher/test/expiration_watcher_test.ts110
-rw-r--r--packages/order-watcher/test/global_hooks.ts8
-rw-r--r--packages/order-watcher/test/order_watcher_test.ts525
-rw-r--r--packages/order-watcher/test/utils/token_utils.ts2
-rw-r--r--packages/order-watcher/test/utils/web3_wrapper.ts2
-rw-r--r--packages/order-watcher/tslint.json3
-rw-r--r--packages/react-docs-example/package.json6
-rw-r--r--packages/react-docs-example/ts/docs.tsx8
-rw-r--r--packages/react-docs/CHANGELOG.json27
-rw-r--r--packages/react-docs/CHANGELOG.md4
-rw-r--r--packages/react-docs/package.json15
-rw-r--r--packages/react-docs/src/components/documentation.tsx16
-rw-r--r--packages/react-docs/src/docs_info.ts7
-rw-r--r--packages/react-docs/src/types.ts6
-rw-r--r--packages/react-docs/src/utils/doxity_utils.ts22
-rw-r--r--packages/react-docs/src/utils/typedoc_utils.ts2
-rw-r--r--packages/react-shared/CHANGELOG.json18
-rw-r--r--packages/react-shared/CHANGELOG.md4
-rw-r--r--packages/react-shared/package.json8
-rw-r--r--packages/react-shared/src/components/nested_sidebar_menu.tsx2
-rw-r--r--packages/sol-compiler/CHANGELOG.json18
-rw-r--r--packages/sol-compiler/CHANGELOG.md4
-rw-r--r--packages/sol-compiler/package.json28
-rw-r--r--packages/sol-compiler/src/compiler.ts14
-rw-r--r--packages/sol-compiler/test/compiler_test.ts2
-rw-r--r--packages/sol-cov/CHANGELOG.json26
-rw-r--r--packages/sol-cov/CHANGELOG.md4
-rw-r--r--packages/sol-cov/package.json22
-rw-r--r--packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts4
-rw-r--r--packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts4
-rw-r--r--packages/sol-cov/src/ast_visitor.ts14
-rw-r--r--packages/sol-cov/src/coverage_subprovider.ts2
-rw-r--r--packages/sol-cov/src/get_source_range_snippet.ts2
-rw-r--r--packages/sol-cov/src/profiler_subprovider.ts2
-rw-r--r--packages/sol-cov/src/revert_trace_subprovider.ts4
-rw-r--r--packages/sol-cov/src/trace_collection_subprovider.ts6
-rw-r--r--packages/sol-cov/src/trace_collector.ts8
-rw-r--r--packages/sol-resolver/CHANGELOG.json3
-rw-r--r--packages/sol-resolver/package.json14
-rw-r--r--packages/sol-resolver/src/globals.d.ts7
-rw-r--r--packages/sol-resolver/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/sol-resolver/src/resolvers/fallthrough_resolver.ts2
-rw-r--r--packages/sol-resolver/src/resolvers/name_resolver.ts2
-rw-r--r--packages/sol-resolver/src/resolvers/npm_resolver.ts2
-rw-r--r--packages/sol-resolver/src/resolvers/relative_fs_resolver.ts2
-rw-r--r--packages/sra-report/CHANGELOG.json18
-rw-r--r--packages/sra-report/CHANGELOG.md4
-rw-r--r--packages/sra-report/package.json20
-rw-r--r--packages/subproviders/CHANGELOG.json22
-rw-r--r--packages/subproviders/CHANGELOG.md4
-rw-r--r--packages/subproviders/package.json22
-rw-r--r--packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts4
-rw-r--r--packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts2
-rw-r--r--packages/subproviders/src/subproviders/ganache.ts2
-rw-r--r--packages/subproviders/src/subproviders/ledger.ts12
-rw-r--r--packages/subproviders/src/subproviders/mnemonic_wallet.ts4
-rw-r--r--packages/subproviders/src/subproviders/nonce_tracker.ts2
-rw-r--r--packages/subproviders/src/subproviders/private_key_wallet.ts4
-rw-r--r--packages/subproviders/src/subproviders/redundant_subprovider.ts2
-rw-r--r--packages/subproviders/src/subproviders/rpc_subprovider.ts4
-rw-r--r--packages/subproviders/src/subproviders/signer.ts2
-rw-r--r--packages/subproviders/src/utils/wallet_utils.ts4
-rw-r--r--packages/subproviders/test/integration/ledger_subprovider_test.ts2
-rw-r--r--packages/subproviders/test/unit/ledger_subprovider_test.ts2
-rw-r--r--packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts24
-rw-r--r--packages/subproviders/tsconfig.json3
-rw-r--r--packages/testnet-faucets/package.json18
-rw-r--r--packages/testnet-faucets/src/ts/dispatch_queue.ts4
-rw-r--r--packages/testnet-faucets/src/ts/error_reporter.ts4
-rw-r--r--packages/testnet-faucets/src/ts/handler.ts2
-rw-r--r--packages/testnet-faucets/src/ts/server.ts24
-rw-r--r--packages/tslint-config/CHANGELOG.json10
-rw-r--r--packages/tslint-config/package.json6
-rw-r--r--packages/tslint-config/rules/customNoMagicNumbersRule.ts1
-rw-r--r--packages/tslint-config/tslint.json75
-rw-r--r--packages/types/CHANGELOG.json5
-rw-r--r--packages/types/package.json10
-rw-r--r--packages/typescript-typings/CHANGELOG.json16
-rw-r--r--packages/typescript-typings/CHANGELOG.md4
-rw-r--r--packages/typescript-typings/package.json6
-rw-r--r--packages/typescript-typings/types/ethereumjs-abi/index.d.ts7
-rw-r--r--packages/typescript-typings/types/lerna-get-packages/index.d.ts16
-rw-r--r--packages/utils/CHANGELOG.json28
-rw-r--r--packages/utils/CHANGELOG.md4
-rw-r--r--packages/utils/package.json15
-rw-r--r--packages/utils/src/abi_decoder.ts2
-rw-r--r--packages/utils/src/abi_utils.ts6
-rw-r--r--packages/utils/src/fetchAsync.ts3
-rw-r--r--packages/web3-wrapper/CHANGELOG.json16
-rw-r--r--packages/web3-wrapper/CHANGELOG.md4
-rw-r--r--packages/web3-wrapper/package.json18
-rw-r--r--packages/web3-wrapper/src/index.ts4
-rw-r--r--packages/web3-wrapper/src/marshaller.ts12
-rw-r--r--packages/web3-wrapper/src/types.ts6
-rw-r--r--packages/web3-wrapper/src/utils.ts4
-rw-r--r--packages/web3-wrapper/src/web3_wrapper.ts13
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/async.md (renamed from packages/website/md/docs/0xjs/async.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/errors.md (renamed from packages/website/md/docs/0xjs/errors.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/installation.md (renamed from packages/website/md/docs/0xjs/installation.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/introduction.md (renamed from packages/website/md/docs/0xjs/introduction.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/versioning.md (renamed from packages/website/md/docs/0xjs/versioning.md)0
-rw-r--r--packages/website/md/docs/0xjs/2.0.0/introduction.md3
-rw-r--r--packages/website/md/docs/0xjs/2.0.0/versioning.md1
-rw-r--r--packages/website/md/docs/connect/1.0.0/installation.md (renamed from packages/website/md/docs/connect/installation.md)0
-rw-r--r--packages/website/md/docs/connect/1.0.0/introduction.md (renamed from packages/website/md/docs/connect/introduction.md)0
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/installation.md (renamed from packages/website/md/docs/json_schemas/installation.md)0
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/introduction.md (renamed from packages/website/md/docs/json_schemas/introduction.md)2
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/schemas.md (renamed from packages/website/md/docs/json_schemas/schemas.md)0
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/usage.md (renamed from packages/website/md/docs/json_schemas/usage.md)0
-rw-r--r--packages/website/md/docs/order_utils/1.0.0/installation.md (renamed from packages/website/md/docs/order_utils/installation.md)0
-rw-r--r--packages/website/md/docs/order_utils/1.0.0/introduction.md (renamed from packages/website/md/docs/order_utils/introduction.md)0
-rw-r--r--packages/website/md/docs/smart_contracts/1.0.0/introduction.md (renamed from packages/website/md/docs/smart_contracts/introduction.md)0
-rw-r--r--packages/website/md/docs/sol_cov/usage.md4
-rw-r--r--packages/website/package.json20
-rw-r--r--packages/website/ts/blockchain.ts43
-rw-r--r--packages/website/ts/blockchain_watcher.ts6
-rw-r--r--packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx6
-rw-r--r--packages/website/ts/components/dialogs/send_dialog.tsx40
-rw-r--r--packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx4
-rw-r--r--packages/website/ts/components/eth_weth_conversion_button.tsx2
-rw-r--r--packages/website/ts/components/fill_warning_dialog.tsx6
-rw-r--r--packages/website/ts/components/flash_messages/asset_send_completed.tsx (renamed from packages/website/ts/components/flash_messages/token_send_completed.tsx)14
-rw-r--r--packages/website/ts/components/generate_order/asset_picker.tsx2
-rw-r--r--packages/website/ts/components/inputs/allowance_toggle.tsx2
-rw-r--r--packages/website/ts/components/inputs/balance_bounded_input.tsx4
-rw-r--r--packages/website/ts/components/inputs/eth_amount_input.tsx3
-rw-r--r--packages/website/ts/components/inputs/expiration_input.tsx2
-rw-r--r--packages/website/ts/components/order_json.tsx2
-rw-r--r--packages/website/ts/components/portal/portal.tsx4
-rw-r--r--packages/website/ts/components/send_button.tsx14
-rw-r--r--packages/website/ts/components/token_balances.tsx23
-rw-r--r--packages/website/ts/components/ui/menu_item.tsx2
-rw-r--r--packages/website/ts/components/ui/overlay.tsx2
-rw-r--r--packages/website/ts/components/ui/simple_menu.tsx2
-rw-r--r--packages/website/ts/components/wallet/wallet.tsx2
-rw-r--r--packages/website/ts/components/wallet/wrap_ether_item.tsx8
-rw-r--r--packages/website/ts/containers/connect_documentation.ts12
-rw-r--r--packages/website/ts/containers/ethereum_types_documentation.ts8
-rw-r--r--packages/website/ts/containers/inputs/eth_amount_input.ts36
-rw-r--r--packages/website/ts/containers/json_schemas_documentation.ts20
-rw-r--r--packages/website/ts/containers/order_utils_documentation.ts12
-rw-r--r--packages/website/ts/containers/smart_contracts_documentation.ts8
-rw-r--r--packages/website/ts/containers/sol_compiler_documentation.ts14
-rw-r--r--packages/website/ts/containers/sol_cov_documentation.ts14
-rw-r--r--packages/website/ts/containers/subproviders_documentation.ts14
-rw-r--r--packages/website/ts/containers/web3_wrapper_documentation.ts12
-rw-r--r--packages/website/ts/containers/zero_ex_js_documentation.ts61
-rw-r--r--packages/website/ts/local_storage/local_storage.ts8
-rw-r--r--packages/website/ts/local_storage/tracked_token_storage.ts4
-rw-r--r--packages/website/ts/local_storage/trade_history_storage.tsx18
-rw-r--r--packages/website/ts/pages/about/about.tsx16
-rw-r--r--packages/website/ts/pages/jobs/jobs.tsx2
-rw-r--r--packages/website/ts/pages/landing/landing.tsx2
-rw-r--r--packages/website/ts/redux/dispatcher.ts2
-rw-r--r--packages/website/ts/utils/constants.ts2
-rw-r--r--packages/website/ts/utils/doc_utils.ts3
-rw-r--r--packages/website/ts/utils/utils.ts12
-rw-r--r--tsconfig.json1
-rw-r--r--yarn.lock1309
322 files changed, 5602 insertions, 5116 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 3393da379..a1c237122 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -64,7 +64,7 @@ jobs:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- - run: yarn wsrun test:circleci @0xproject/0x.js
+ - run: yarn wsrun test:circleci 0x.js
- run: yarn wsrun test:circleci @0xproject/abi-gen
- run: yarn wsrun test:circleci @0xproject/assert
- run: yarn wsrun test:circleci @0xproject/base-contract
diff --git a/lerna.json b/lerna.json
index 5f975fff9..39905618d 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "lerna": "2.5.1",
+ "lerna": "3.0.0-beta.14",
"packages": ["packages/*"],
"commands": {
"publish": {
diff --git a/package.json b/package.json
index 6dc8542fd..66f9a9e0c 100644
--- a/package.json
+++ b/package.json
@@ -30,8 +30,7 @@
"test": "wsrun test $PKG --fast-exit --serial --exclude-missing",
"stage_docs": "wsrun docs:stage $PKG --fast-exit --parallel --exclude-missing",
"lint": "wsrun lint $PKG --fast-exit --parallel --exclude-missing",
- "comment:postinstall": "HACK: For some reason `yarn` is not setting up symlinks properly for order-utils. We temporarily set them manually. Remove this after V2 refactor is complete.",
- "postinstall": "rm -rf `pwd`/packages/0x.js/node_modules/@0xproject; mkdir `pwd`/packages/0x.js/node_modules/@0xproject; ln -s `pwd`/packages/contract-wrappers `pwd`/packages/0x.js/node_modules/@0xproject/contract-wrappers; ln -s `pwd`/packages/order-utils `pwd`/packages/0x.js/node_modules/@0xproject/order-utils; ln -s `pwd`/packages/types `pwd`/packages/0x.js/node_modules/@0xproject/types; rm -rf `pwd`/packages/order-utils/node_modules/@0xproject; mkdir `pwd`/packages/order-utils/node_modules/@0xproject; ln -s `pwd`/packages/json-schemas `pwd`/packages/order-utils/node_modules/@0xproject/json-schemas; ln -s `pwd`/packages/assert `pwd`/packages/order-utils/node_modules/@0xproject/assert; ln -s `pwd`/packages/types `pwd`/packages/order-utils/node_modules/@0xproject/types; rm -f `pwd`/packages/contracts/node_modules/@0xproject/types; ln -s `pwd`/packages/types `pwd`/packages/contracts/node_modules/@0xproject/types; rm -rf `pwd`/packages/fill-scenarios/node_modules/@0xproject; mkdir -p `pwd`/packages/fill-scenarios/node_modules/@0xproject; ln -s `pwd`/packages/types `pwd`/packages/fill-scenarios/node_modules/@0xproject/types; ln -s `pwd`/packages/json-schemas `pwd`/packages/fill-scenarios/node_modules/@0xproject/json-schemas; ln -s `pwd`/packages/order-utils `pwd`/packages/fill-scenarios/node_modules/@0xproject/order-utils; rm -rf `pwd`/packages/contract-wrappers/node_modules/@0xproject; mkdir -p `pwd`/packages/contract-wrappers/node_modules/@0xproject; ln -s `pwd`/packages/order-utils `pwd`/packages/contract-wrappers/node_modules/@0xproject/order-utils; ln -s `pwd`/packages/assert `pwd`/packages/contract-wrappers/node_modules/@0xproject/assert; ln -s `pwd`/packages/json-schemas `pwd`/packages/contract-wrappers/node_modules/@0xproject/json-schemas; ln -s `pwd`/packages/types `pwd`/packages/contract-wrappers/node_modules/@0xproject/types; ln -s `pwd`/packages/fill-scenarios `pwd`/packages/contract-wrappers/node_modules/@0xproject/fill-scenarios; rm -rf `pwd`/packages/assert/node_modules/@0xproject; mkdir -p `pwd`/packages/assert/node_modules/@0xproject; ln -s `pwd`/packages/json-schemas `pwd`/packages/assert/node_modules/@0xproject/json-schemas"
+ "comment:postinstall": "HACK: For some reason `yarn` is not setting up symlinks properly for order-utils. We temporarily set them manually. Remove this after V2 refactor is complete."
},
"config": {
"mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic"
@@ -41,7 +40,7 @@
"coveralls": "^3.0.0",
"ganache-cli": "6.1.3",
"lcov-result-merger": "^3.0.0",
- "lerna": "^2.5.1",
+ "lerna": "3.0.0-beta.14",
"npm-run-all": "^4.1.2",
"prettier": "^1.11.1",
"wsrun": "^2.2.0",
diff --git a/packages/0x.js/CHANGELOG.json b/packages/0x.js/CHANGELOG.json
index 3ec09cd7e..c3b8728c6 100644
--- a/packages/0x.js/CHANGELOG.json
+++ b/packages/0x.js/CHANGELOG.json
@@ -1,37 +1,60 @@
[
{
- "version": "1.0.0",
+ "timestamp": 1532043100,
+ "version": "1.0.0-rc.2",
+ "changes": [
+ {
+ "note": "Remove `zeroEx.assetData` and instead re-export it's static functions directly off `ZeroEx`"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
"changes": [
{
"note": "Remove tokenRegistry wrapper",
"pr": 863
},
{
- "note": "Rename zeroEx.token to zeroEx.erc20Token, and add zeroEx.erc721Token",
+ "note": "Rename `zeroEx.token` to `zeroEx.erc20Token`, and add `zeroEx.erc721Token`",
"pr": 863
},
{
- "note": "Rename zeroEx.proxy to zeroEx.erc20Proxy and add zeroEx.erc721Proxy",
+ "note": "Rename `zeroEx.proxy` to `zeroEx.erc20Proxy` and add `zeroEx.erc721Proxy`",
"pr": 863
},
{
"note":
- "Refactored ZeroEx.isValidSignature to zeroEx.isValidSignatureAsync. It is now async so that it can verify contract-dependent signature types",
+ "Refactored `ZeroEx.isValidSignature` to `zeroEx.isValidSignatureAsync`. It is now async so that it can verify contract-dependent signature types",
"pr": 863
},
{
"note":
- "Refactored signOrderHashAsync to ecSignOrderHashAsync. There are now many non-ECSignature ways to sign orders too.",
+ "Refactored `signOrderHashAsync` to `ecSignOrderHashAsync`. There are now many non-ECSignature ways to sign orders too.",
"pr": 863
},
{
"note":
- "Removed createOrderWatcherAsync method. Will be added back once OrderWatcher is refactored for V2",
+ "Removed `createOrderWatcherAsync` method. Will be added back once OrderWatcher is refactored for V2",
"pr": 863
},
{
"note": "0x.js exports renamed contract events and event arg types",
"pr": 863
+ },
+ {
+ "note": "Export `ZeroEx.assetData` with methods to decode/encode assetData fields found in 0x orders",
+ "pr": 884
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.38.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
}
]
},
diff --git a/packages/0x.js/CHANGELOG.md b/packages/0x.js/CHANGELOG.md
index 00048f610..f38529715 100644
--- a/packages/0x.js/CHANGELOG.md
+++ b/packages/0x.js/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.38.6 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.38.5 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json
index 966770cf0..06ffe2daf 100644
--- a/packages/0x.js/package.json
+++ b/packages/0x.js/package.json
@@ -1,6 +1,6 @@
{
"name": "0x.js",
- "version": "0.38.5",
+ "version": "1.0.0-rc.2",
"engines": {
"node": ">=6.12"
},
@@ -41,8 +41,8 @@
"contracts": "ZRXToken",
"postpublish": {
"assets": [
- "packages/0x.js/_bundles/index.js",
- "packages/0x.js/_bundles/index.min.js"
+ "_bundles/index.js",
+ "_bundles/index.min.js"
],
"docPublishConfigs": {
"extraFileIncludes": [
@@ -51,13 +51,11 @@
"../contract-wrappers/src/types.ts",
"../contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts",
"../contract-wrappers/src/contract_wrappers/exchange_wrapper.ts",
- "../contract-wrappers/src/contract_wrappers/token_registry_wrapper.ts",
- "../contract-wrappers/src/contract_wrappers/token_transfer_proxy_wrapper.ts",
- "../contract-wrappers/src/contract_wrappers/token_wrapper.ts",
- "../order-watcher/src/order_watcher/order_watcher.ts",
- "./src/generated_contract_wrappers/ether_token.ts",
- "./src/generated_contract_wrappers/token.ts",
- "./src/generated_contract_wrappers/exchange.ts"
+ "../contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts",
+ "../contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts",
+ "../contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts",
+ "../contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts",
+ "../order-watcher/src/order_watcher/order_watcher.ts"
],
"s3BucketPath": "s3://doc-jsons/0x.js/",
"s3StagingBucketPath": "s3://staging-doc-jsons/0x.js/"
@@ -70,11 +68,11 @@
},
"license": "Apache-2.0",
"devDependencies": {
- "@0xproject/abi-gen": "^0.3.3",
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/migrations": "^0.0.9",
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/abi-gen": "^1.0.0",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/migrations": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"@types/node": "^8.0.53",
@@ -94,23 +92,23 @@
"shx": "^0.2.2",
"sinon": "^4.0.0",
"source-map-support": "^0.5.0",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
"typescript": "2.7.1",
"webpack": "^3.1.0"
},
"dependencies": {
- "@0xproject/assert": "^0.2.13",
- "@0xproject/base-contract": "^0.3.5",
- "@0xproject/contract-wrappers": "^0.1.0",
- "@0xproject/order-utils": "^1.0.0",
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/subproviders": "^0.10.5",
- "@0xproject/types": "^1.0.0",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
- "ethereum-types": "^0.0.2",
+ "@0xproject/assert": "^1.0.0",
+ "@0xproject/base-contract": "^1.0.0",
+ "@0xproject/contract-wrappers": "^1.0.0-rc.1",
+ "@0xproject/order-utils": "^1.0.0-rc.1",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/subproviders": "^1.0.0",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
+ "ethereum-types": "^1.0.0",
"ethers": "3.0.22",
"lodash": "^4.17.4"
},
diff --git a/packages/0x.js/src/0x.ts b/packages/0x.js/src/0x.ts
index 5d9a03719..2a2b82f63 100644
--- a/packages/0x.js/src/0x.ts
+++ b/packages/0x.js/src/0x.ts
@@ -10,13 +10,17 @@ import {
ExchangeWrapper,
} from '@0xproject/contract-wrappers';
import {
+ assetDataUtils,
ecSignOrderHashAsync,
generatePseudoRandomSalt,
isValidSignatureAsync,
MessagePrefixOpts,
orderHashUtils,
} from '@0xproject/order-utils';
-import { ECSignature, Order, SignedOrder } from '@0xproject/types';
+// HACK: Since we export assetDataUtils from ZeroEx and it has AssetProxyId, ERC20AssetData and ERC721AssetData
+// in it's public interface, we need to import these types here.
+// tslint:disable-next-line:no-unused-variable
+import { AssetProxyId, ECSignature, ERC20AssetData, ERC721AssetData, Order, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import { Provider, TransactionReceiptWithDecodedLogs } from 'ethereum-types';
@@ -61,7 +65,7 @@ export class ZeroEx {
* ERC721 proxy smart contract.
*/
public erc721Proxy: ERC721ProxyWrapper;
- private _contractWrappers: ContractWrappers;
+ private readonly _contractWrappers: ContractWrappers;
/**
* Generates a pseudo-random 256-bit salt.
* The salt can be included in a 0x order, ensuring that the order generates a unique orderHash
@@ -118,6 +122,57 @@ export class ZeroEx {
return baseUnitAmount;
}
/**
+ * Encodes an ERC20 token address into a hex encoded assetData string, usable in the makerAssetData or
+ * takerAssetData fields in a 0x order.
+ * @param tokenAddress The ERC20 token address to encode
+ * @return The hex encoded assetData string
+ */
+ public static encodeERC20AssetData(tokenAddress: string): string {
+ return assetDataUtils.encodeERC20AssetData(tokenAddress);
+ }
+ /**
+ * Decodes an ERC20 assetData hex string into it's corresponding ERC20 tokenAddress & assetProxyId
+ * @param assetData Hex encoded assetData string to decode
+ * @return An object containing the decoded tokenAddress & assetProxyId
+ */
+ public static decodeERC20AssetData(assetData: string): ERC20AssetData {
+ return assetDataUtils.decodeERC20AssetData(assetData);
+ }
+ /**
+ * Encodes an ERC721 token address into a hex encoded assetData string, usable in the makerAssetData or
+ * takerAssetData fields in a 0x order.
+ * @param tokenAddress The ERC721 token address to encode
+ * @param tokenId The ERC721 tokenId to encode
+ * @return The hex encoded assetData string
+ */
+ public static encodeERC721AssetData(tokenAddress: string, tokenId: BigNumber): string {
+ return assetDataUtils.encodeERC721AssetData(tokenAddress, tokenId);
+ }
+ /**
+ * Decodes an ERC721 assetData hex string into it's corresponding ERC721 tokenAddress, tokenId & assetProxyId
+ * @param assetData Hex encoded assetData string to decode
+ * @return An object containing the decoded tokenAddress, tokenId & assetProxyId
+ */
+ public static decodeERC721AssetData(assetData: string): ERC721AssetData {
+ return assetDataUtils.decodeERC721AssetData(assetData);
+ }
+ /**
+ * Decode and return the assetProxyId from the assetData
+ * @param assetData Hex encoded assetData string to decode
+ * @return The assetProxyId
+ */
+ public static decodeAssetProxyId(assetData: string): AssetProxyId {
+ return assetDataUtils.decodeAssetProxyId(assetData);
+ }
+ /**
+ * Decode any assetData into it's corresponding assetData object
+ * @param assetData Hex encoded assetData string to decode
+ * @return Either a ERC20 or ERC721 assetData object
+ */
+ public static decodeAssetDataOrThrow(assetData: string): ERC20AssetData | ERC721AssetData {
+ return assetDataUtils.decodeAssetDataOrThrow(assetData);
+ }
+ /**
* Instantiates a new ZeroEx instance that provides the public interface to the 0x.js library.
* @param provider The Provider instance you would like the 0x.js library to use for interacting with
* the Ethereum network.
diff --git a/packages/0x.js/src/index.ts b/packages/0x.js/src/index.ts
index 95faa860d..95ca07eea 100644
--- a/packages/0x.js/src/index.ts
+++ b/packages/0x.js/src/index.ts
@@ -12,6 +12,9 @@ export {
OrderStateInvalid,
OrderState,
Token,
+ ERC20AssetData,
+ ERC721AssetData,
+ AssetProxyId,
} from '@0xproject/types';
export {
@@ -59,4 +62,5 @@ export {
ExchangeCancelEventArgs,
ExchangeEventArgs,
ContractWrappersConfig,
+ OrderInfo,
} from '@0xproject/contract-wrappers';
diff --git a/packages/0x.js/test/global_hooks.ts b/packages/0x.js/test/global_hooks.ts
index 3d74634fe..364828231 100644
--- a/packages/0x.js/test/global_hooks.ts
+++ b/packages/0x.js/test/global_hooks.ts
@@ -7,7 +7,7 @@ before('migrate contracts', async function(): Promise<void> {
// HACK: Since the migrations take longer then our global mocha timeout limit
// we manually increase it for this before hook.
const mochaTestTimeoutMs = 20000;
- this.timeout(mochaTestTimeoutMs);
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
const txDefaults = {
gas: devConstants.GAS_LIMIT,
from: devConstants.TESTRPC_FIRST_ADDRESS,
diff --git a/packages/abi-gen/CHANGELOG.json b/packages/abi-gen/CHANGELOG.json
index ef8f5dd39..4162b943f 100644
--- a/packages/abi-gen/CHANGELOG.json
+++ b/packages/abi-gen/CHANGELOG.json
@@ -1,15 +1,16 @@
[
{
- "version": "0.4.1",
+ "version": "1.0.1",
"changes": [
{
- "note": "skip generation of wrappers that are already up to date",
- "pr": 788
+ "note": "Fix the abi-gen entry point in package.json",
+ "pr": 901
}
]
},
{
- "version": "0.4.0",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
"note": "Convert e_r_c to erc in generated file names",
@@ -18,6 +19,19 @@
{
"note": "Remove the output directory before writing to it",
"pr": 822
+ },
+ {
+ "note": "skip generation of wrappers that are already up to date",
+ "pr": 788
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.3.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
}
]
},
diff --git a/packages/abi-gen/CHANGELOG.md b/packages/abi-gen/CHANGELOG.md
index 33bc3276a..d7de561c8 100644
--- a/packages/abi-gen/CHANGELOG.md
+++ b/packages/abi-gen/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.3.4 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.3.3 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/abi-gen/bin/abi-gen.js b/packages/abi-gen/bin/abi-gen.js
index 8d6bdccf8..73ffe76ed 100755
--- a/packages/abi-gen/bin/abi-gen.js
+++ b/packages/abi-gen/bin/abi-gen.js
@@ -1,2 +1,2 @@
#!/usr/bin/env node
-require('../lib/src/index.js')
+require('../lib/src/index.js');
diff --git a/packages/abi-gen/package.json b/packages/abi-gen/package.json
index 4fb335545..d40db09b9 100644
--- a/packages/abi-gen/package.json
+++ b/packages/abi-gen/package.json
@@ -1,12 +1,12 @@
{
"name": "@0xproject/abi-gen",
- "version": "0.3.3",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
"description": "Generate contract wrappers from ABI and handlebars templates",
- "main": "lib/index.js",
- "types": "lib/index.d.ts",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
"scripts": {
"watch_without_deps": "tsc -w",
"lint": "tslint --project .",
@@ -32,11 +32,10 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md",
"dependencies": {
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "ethereum-types": "^0.0.2",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"chalk": "^2.3.0",
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"glob": "^7.1.2",
"handlebars": "^4.0.11",
"lodash": "^4.17.4",
@@ -47,8 +46,8 @@
"yargs": "^10.0.3"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/glob": "5.0.35",
"@types/handlebars": "^4.0.36",
"@types/mkdirp": "^0.5.1",
@@ -63,7 +62,7 @@
"mocha": "^5.2.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"publishConfig": {
diff --git a/packages/assert/CHANGELOG.json b/packages/assert/CHANGELOG.json
index 1ddc6d280..f06901a44 100644
--- a/packages/assert/CHANGELOG.json
+++ b/packages/assert/CHANGELOG.json
@@ -1,6 +1,7 @@
[
{
- "version": "0.2.14",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
"note":
@@ -10,6 +11,15 @@
]
},
{
+ "timestamp": 1531919263,
+ "version": "0.2.14",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.2.13",
"changes": [
diff --git a/packages/assert/CHANGELOG.md b/packages/assert/CHANGELOG.md
index f0d2f55b0..663b06c0f 100644
--- a/packages/assert/CHANGELOG.md
+++ b/packages/assert/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.2.14 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.2.13 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/assert/package.json b/packages/assert/package.json
index 3b9ecbb49..1094cba85 100644
--- a/packages/assert/package.json
+++ b/packages/assert/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/assert",
- "version": "0.3.0",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -31,8 +31,8 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/assert/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"@types/valid-url": "^1.0.2",
@@ -44,13 +44,13 @@
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/json-schemas": "^1.0.0",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
+ "@0xproject/json-schemas": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"lodash": "^4.17.4",
"valid-url": "^1.0.9"
},
diff --git a/packages/assert/src/index.ts b/packages/assert/src/index.ts
index 8e18416c5..ccf2c9ad8 100644
--- a/packages/assert/src/index.ts
+++ b/packages/assert/src/index.ts
@@ -8,33 +8,33 @@ const HEX_REGEX = /^0x[0-9A-F]*$/i;
export const assert = {
isBigNumber(variableName: string, value: BigNumber): void {
const isBigNumber = _.isObject(value) && (value as any).isBigNumber;
- this.assert(isBigNumber, this.typeAssertionMessage(variableName, 'BigNumber', value));
+ assert.assert(isBigNumber, assert.typeAssertionMessage(variableName, 'BigNumber', value));
},
isValidBaseUnitAmount(variableName: string, value: BigNumber): void {
assert.isBigNumber(variableName, value);
const isNegative = value.lessThan(0);
- this.assert(!isNegative, `${variableName} cannot be a negative number, found value: ${value.toNumber()}`);
+ assert.assert(!isNegative, `${variableName} cannot be a negative number, found value: ${value.toNumber()}`);
const hasDecimals = value.decimalPlaces() !== 0;
- this.assert(
+ assert.assert(
!hasDecimals,
`${variableName} should be in baseUnits (no decimals), found value: ${value.toNumber()}`,
);
},
isString(variableName: string, value: string): void {
- this.assert(_.isString(value), this.typeAssertionMessage(variableName, 'string', value));
+ assert.assert(_.isString(value), assert.typeAssertionMessage(variableName, 'string', value));
},
isFunction(variableName: string, value: any): void {
- this.assert(_.isFunction(value), this.typeAssertionMessage(variableName, 'function', value));
+ assert.assert(_.isFunction(value), assert.typeAssertionMessage(variableName, 'function', value));
},
isHexString(variableName: string, value: string): void {
- this.assert(
+ assert.assert(
_.isString(value) && HEX_REGEX.test(value),
- this.typeAssertionMessage(variableName, 'HexString', value),
+ assert.typeAssertionMessage(variableName, 'HexString', value),
);
},
isETHAddressHex(variableName: string, value: string): void {
- this.assert(_.isString(value), this.typeAssertionMessage(variableName, 'string', value));
- this.assert(addressUtils.isAddress(value), this.typeAssertionMessage(variableName, 'ETHAddressHex', value));
+ assert.assert(_.isString(value), assert.typeAssertionMessage(variableName, 'string', value));
+ assert.assert(addressUtils.isAddress(value), assert.typeAssertionMessage(variableName, 'ETHAddressHex', value));
},
doesBelongToStringEnum(
variableName: string,
@@ -51,17 +51,17 @@ export const assert = {
);
},
hasAtMostOneUniqueValue(value: any[], errMsg: string): void {
- this.assert(_.uniq(value).length <= 1, errMsg);
+ assert.assert(_.uniq(value).length <= 1, errMsg);
},
isNumber(variableName: string, value: number): void {
- this.assert(_.isFinite(value), this.typeAssertionMessage(variableName, 'number', value));
+ assert.assert(_.isFinite(value), assert.typeAssertionMessage(variableName, 'number', value));
},
isBoolean(variableName: string, value: boolean): void {
- this.assert(_.isBoolean(value), this.typeAssertionMessage(variableName, 'boolean', value));
+ assert.assert(_.isBoolean(value), assert.typeAssertionMessage(variableName, 'boolean', value));
},
isWeb3Provider(variableName: string, value: any): void {
const isWeb3Provider = _.isFunction(value.send) || _.isFunction(value.sendAsync);
- this.assert(isWeb3Provider, this.typeAssertionMessage(variableName, 'Provider', value));
+ assert.assert(isWeb3Provider, assert.typeAssertionMessage(variableName, 'Provider', value));
},
doesConformToSchema(variableName: string, value: any, schema: Schema, subSchemas?: Schema[]): void {
if (_.isUndefined(value)) {
@@ -76,15 +76,15 @@ export const assert = {
const msg = `Expected ${variableName} to conform to schema ${schema.id}
Encountered: ${JSON.stringify(value, null, '\t')}
Validation errors: ${validationResult.errors.join(', ')}`;
- this.assert(!hasValidationErrors, msg);
+ assert.assert(!hasValidationErrors, msg);
},
isWebUri(variableName: string, value: any): void {
const isValidUrl = !_.isUndefined(validUrl.isWebUri(value));
- this.assert(isValidUrl, this.typeAssertionMessage(variableName, 'web uri', value));
+ assert.assert(isValidUrl, assert.typeAssertionMessage(variableName, 'web uri', value));
},
isUri(variableName: string, value: any): void {
const isValidUri = !_.isUndefined(validUrl.isUri(value));
- this.assert(isValidUri, this.typeAssertionMessage(variableName, 'uri', value));
+ assert.assert(isValidUri, assert.typeAssertionMessage(variableName, 'uri', value));
},
assert(condition: boolean, message: string): void {
if (!condition) {
diff --git a/packages/assert/test/assert_test.ts b/packages/assert/test/assert_test.ts
index 15fd3e6a8..cbbfe39db 100644
--- a/packages/assert/test/assert_test.ts
+++ b/packages/assert/test/assert_test.ts
@@ -49,7 +49,7 @@ describe('Assertions', () => {
});
describe('#isFunction', () => {
it('should not throw for valid input', () => {
- const validInputs = [BigNumber, assert.isString];
+ const validInputs = [BigNumber, assert.isString.bind(assert)];
validInputs.forEach(input => expect(assert.isFunction.bind(assert, variableName, input)).to.not.throw());
});
it('should throw for invalid input', () => {
diff --git a/packages/base-contract/CHANGELOG.json b/packages/base-contract/CHANGELOG.json
index 400489afa..f427f0fe5 100644
--- a/packages/base-contract/CHANGELOG.json
+++ b/packages/base-contract/CHANGELOG.json
@@ -1,5 +1,23 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.3.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.3.5",
"changes": [
diff --git a/packages/base-contract/CHANGELOG.md b/packages/base-contract/CHANGELOG.md
index ad73a1863..3118bc0d7 100644
--- a/packages/base-contract/CHANGELOG.md
+++ b/packages/base-contract/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.3.6 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.3.5 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/base-contract/package.json b/packages/base-contract/package.json
index afde81561..ebd7e1bc3 100644
--- a/packages/base-contract/package.json
+++ b/packages/base-contract/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/base-contract",
- "version": "0.3.5",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -9,7 +9,7 @@
"types": "lib/src/index.d.ts",
"scripts": {
"watch_without_deps": "tsc -w",
- "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib scripts",
"test": "yarn run_mocha",
"rebuild_and_test": "run-s clean build test",
@@ -30,8 +30,8 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/base-contract/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"chai": "^4.0.1",
"copyfiles": "^1.2.0",
@@ -39,14 +39,14 @@
"mocha": "^4.0.1",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "ethereum-types": "^0.0.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "ethereum-types": "^1.0.0",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"ethers": "3.0.22",
"lodash": "^4.17.4"
},
diff --git a/packages/base-contract/src/index.ts b/packages/base-contract/src/index.ts
index 6b970ec27..a240fb8b6 100644
--- a/packages/base-contract/src/index.ts
+++ b/packages/base-contract/src/index.ts
@@ -72,15 +72,13 @@ export class BaseContract {
// 1. Optional param passed in to public method call
// 2. Global config passed in at library instantiation
// 3. Gas estimate calculation + safety margin
- const removeUndefinedProperties = _.pickBy;
- const txDataWithDefaults: TxData = {
+ const removeUndefinedProperties = _.pickBy.bind(_);
+ const txDataWithDefaults = {
...removeUndefinedProperties(txDefaults),
- ...removeUndefinedProperties(txData as any),
- // HACK: TS can't prove that T is spreadable.
- // Awaiting https://github.com/Microsoft/TypeScript/pull/13288 to be merged
- } as any;
+ ...removeUndefinedProperties(txData),
+ };
if (_.isUndefined(txDataWithDefaults.gas) && !_.isUndefined(estimateGasAsync)) {
- txDataWithDefaults.gas = await estimateGasAsync(txDataWithDefaults as any);
+ txDataWithDefaults.gas = await estimateGasAsync(txDataWithDefaults);
}
return txDataWithDefaults;
}
diff --git a/packages/connect/CHANGELOG.json b/packages/connect/CHANGELOG.json
index 7b747f167..8ed147e76 100644
--- a/packages/connect/CHANGELOG.json
+++ b/packages/connect/CHANGELOG.json
@@ -1,10 +1,20 @@
[
{
+ "timestamp": 1532043000,
"version": "1.0.0",
"changes": [
{
"note":
- "Remove WebSocketOrderbookChannel from the public interface and replace with orderbookChannelFactory"
+ "Remove `WebSocketOrderbookChannel` from the public interface and replace with `orderbookChannelFactory`"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.6.17",
+ "changes": [
+ {
+ "note": "Dependencies updated"
}
]
},
diff --git a/packages/connect/CHANGELOG.md b/packages/connect/CHANGELOG.md
index 5ae4cfbe3..acef109e0 100644
--- a/packages/connect/CHANGELOG.md
+++ b/packages/connect/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.6.17 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.6.16 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/connect/package.json b/packages/connect/package.json
index 343df4031..dfa15c3d8 100644
--- a/packages/connect/package.json
+++ b/packages/connect/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/connect",
- "version": "0.6.16",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -51,19 +51,19 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/connect/README.md",
"dependencies": {
- "@0xproject/assert": "^0.2.13",
- "@0xproject/json-schemas": "0.8.2",
+ "@0xproject/assert": "^0.2.14",
+ "@0xproject/json-schemas": "^0.8.3",
"@0xproject/types": "^0.8.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"lodash": "^4.17.4",
"query-string": "^5.0.1",
"sinon": "^4.0.0",
"websocket": "^1.0.25"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/fetch-mock": "^5.12.2",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
@@ -81,7 +81,7 @@
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "~0.8.0",
"typescript": "2.7.1"
},
diff --git a/packages/connect/src/http_client.ts b/packages/connect/src/http_client.ts
index f3800d581..03cc590e4 100644
--- a/packages/connect/src/http_client.ts
+++ b/packages/connect/src/http_client.ts
@@ -38,7 +38,7 @@ const OPTS_TO_QUERY_FIELD_MAP = {
* that implement the standard relayer API v0
*/
export class HttpClient implements Client {
- private _apiEndpointUrl: string;
+ private readonly _apiEndpointUrl: string;
/**
* Format parameters to be appended to http requests into query string form
*/
diff --git a/packages/connect/src/utils/type_converters.ts b/packages/connect/src/utils/type_converters.ts
index c1808ce8a..210d452b9 100644
--- a/packages/connect/src/utils/type_converters.ts
+++ b/packages/connect/src/utils/type_converters.ts
@@ -6,12 +6,12 @@ export const typeConverters = {
const bids = _.get(orderbook, 'bids', []);
const asks = _.get(orderbook, 'asks', []);
return {
- bids: bids.map((order: any) => this.convertOrderStringFieldsToBigNumber(order)),
- asks: asks.map((order: any) => this.convertOrderStringFieldsToBigNumber(order)),
+ bids: bids.map((order: any) => typeConverters.convertOrderStringFieldsToBigNumber(order)),
+ asks: asks.map((order: any) => typeConverters.convertOrderStringFieldsToBigNumber(order)),
};
},
convertOrderStringFieldsToBigNumber(order: any): any {
- return this.convertStringsFieldsToBigNumbers(order, [
+ return typeConverters.convertStringsFieldsToBigNumbers(order, [
'makerTokenAmount',
'takerTokenAmount',
'makerFee',
diff --git a/packages/connect/src/ws_orderbook_channel.ts b/packages/connect/src/ws_orderbook_channel.ts
index e1c55cce3..fa9f5e37f 100644
--- a/packages/connect/src/ws_orderbook_channel.ts
+++ b/packages/connect/src/ws_orderbook_channel.ts
@@ -15,9 +15,9 @@ import { orderbookChannelMessageParser } from './utils/orderbook_channel_message
* that implements the standard relayer API v0
*/
export class WebSocketOrderbookChannel implements OrderbookChannel {
- private _client: WebSocket.w3cwebsocket;
- private _handler: OrderbookChannelHandler;
- private _subscriptionOptsList: OrderbookChannelSubscriptionOpts[] = [];
+ private readonly _client: WebSocket.w3cwebsocket;
+ private readonly _handler: OrderbookChannelHandler;
+ private readonly _subscriptionOptsList: OrderbookChannelSubscriptionOpts[] = [];
/**
* Instantiates a new WebSocketOrderbookChannel instance
* @param client A WebSocket client
diff --git a/packages/connect/test/ws_orderbook_channel_test.ts b/packages/connect/test/ws_orderbook_channel_test.ts
index fed4f2217..5a63cbdcc 100644
--- a/packages/connect/test/ws_orderbook_channel_test.ts
+++ b/packages/connect/test/ws_orderbook_channel_test.ts
@@ -29,7 +29,7 @@ describe('WebSocketOrderbookChannel', () => {
const websocketUrl = 'ws://localhost:8080';
const openClient = new WebSocket.w3cwebsocket(websocketUrl);
Sinon.stub(openClient, 'readyState').get(() => WebSocket.w3cwebsocket.OPEN);
- Sinon.stub(openClient, 'send').callsFake(_.noop);
+ Sinon.stub(openClient, 'send').callsFake(_.noop.bind(_));
const openOrderbookChannel = new WebSocketOrderbookChannel(openClient, emptyOrderbookChannelHandler);
const subscriptionOpts = {
baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
diff --git a/packages/contract-wrappers/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json
index 24f722f15..1e82522df 100644
--- a/packages/contract-wrappers/CHANGELOG.json
+++ b/packages/contract-wrappers/CHANGELOG.json
@@ -1,16 +1,26 @@
[
{
- "version": "1.0.0",
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
"changes": [
{
- "note": "Update blockstream to v5.0 and propogate up caught errors to active subscriptions"
+ "note": "Update blockstream to v5.0 and propogate up caught errors to active subscriptions",
+ "pr": 815
},
{
"note": "Update to v2 of 0x rpotocol",
"pr": 822
}
- ],
- "timestamp": 1531149657
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.1.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
},
{
"timestamp": 1529397769,
diff --git a/packages/contract-wrappers/CHANGELOG.md b/packages/contract-wrappers/CHANGELOG.md
index a2cc44f0d..822d0b486 100644
--- a/packages/contract-wrappers/CHANGELOG.md
+++ b/packages/contract-wrappers/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.1.1 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.1.0 - _July 9, 2018_
* Update Blockstream dep. to V5.0 and no longer force unsubscribe on blockstream error (which are not recoverable)
diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json
index a781496ab..4f2f773fd 100644
--- a/packages/contract-wrappers/package.json
+++ b/packages/contract-wrappers/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/contract-wrappers",
- "version": "0.1.0",
+ "version": "1.0.0-rc.1",
"description": "Smart TS wrappers for 0x smart contracts",
"keywords": [
"0xproject",
@@ -26,14 +26,6 @@
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js lib/test/global_hooks.js --timeout 10000 --bail --exit",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
- "config": {
- "postpublish": {
- "assets": [
- "packages/contract-wrappers/_bundles/index.js",
- "packages/contract-wrappers/_bundles/index.min.js"
- ]
- }
- },
"repository": {
"type": "git",
"url": "https://github.com/0xProject/0x-monorepo"
@@ -43,13 +35,13 @@
"node": ">=6.0.0"
},
"devDependencies": {
- "@0xproject/abi-gen": "^0.3.3",
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/migrations": "^0.0.9",
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/subproviders": "^0.10.5",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/abi-gen": "^1.0.0",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/migrations": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/subproviders": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"@types/node": "^8.0.53",
@@ -69,20 +61,21 @@
"shx": "^0.2.2",
"sinon": "^4.0.0",
"source-map-support": "^0.5.0",
- "tslint": "5.8.0",
+ "web3-provider-engine": "14.0.6",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/assert": "^0.3.0",
- "@0xproject/base-contract": "^0.3.5",
- "@0xproject/order-utils": "^1.0.0",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
- "@0xproject/fill-scenarios": "^1.0.0",
- "@0xproject/json-schemas": "^1.0.0",
- "@0xproject/types": "^1.0.0",
- "ethereum-types": "^0.0.2",
+ "@0xproject/assert": "^1.0.0",
+ "@0xproject/base-contract": "^1.0.0",
+ "@0xproject/order-utils": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
+ "@0xproject/fill-scenarios": "^1.0.0-rc.1",
+ "@0xproject/json-schemas": "^1.0.0-rc.1",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "ethereum-types": "^1.0.0",
"ethereumjs-blockstream": "5.0.0",
"ethereumjs-util": "^5.1.1",
"ethers": "3.0.22",
diff --git a/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts
index b8ca4d29b..daf70253a 100644
--- a/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts
+++ b/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts
@@ -1,5 +1,5 @@
import { ContractArtifact } from '@0xproject/sol-compiler';
-import { AbiDecoder, intervalUtils } from '@0xproject/utils';
+import { AbiDecoder, intervalUtils, logUtils } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import { BlockParamLiteral, ContractAbi, FilterObject, LogEntry, LogWithDecodedArgs, RawLog } from 'ethereum-types';
import { Block, BlockAndLogStreamer, Log } from 'ethereumjs-blockstream';
@@ -41,6 +41,13 @@ export abstract class ContractWrapper {
};
private _onLogAddedSubscriptionToken: string | undefined;
private _onLogRemovedSubscriptionToken: string | undefined;
+ private static _onBlockAndLogStreamerError(isVerbose: boolean, err: Error): void {
+ // Since Blockstream errors are all recoverable, we simply log them if the verbose
+ // config is passed in.
+ if (isVerbose) {
+ logUtils.warn(err);
+ }
+ }
constructor(web3Wrapper: Web3Wrapper, networkId: number, blockPollingIntervalMs?: number) {
this._web3Wrapper = web3Wrapper;
this._networkId = networkId;
@@ -79,10 +86,11 @@ export abstract class ContractWrapper {
indexFilterValues: IndexedFilterValues,
abi: ContractAbi,
callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
): string {
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi);
if (_.isUndefined(this._blockAndLogStreamerIfExists)) {
- this._startBlockAndLogStream();
+ this._startBlockAndLogStream(isVerbose);
}
const filterToken = filterUtils.generateUUID();
this._filters[filterToken] = filter;
@@ -151,21 +159,21 @@ export abstract class ContractWrapper {
}
});
}
- private _startBlockAndLogStream(): void {
+ private _startBlockAndLogStream(isVerbose: boolean): void {
if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
throw new Error(ContractWrappersError.SubscriptionAlreadyPresent);
}
this._blockAndLogStreamerIfExists = new BlockAndLogStreamer(
this._web3Wrapper.getBlockAsync.bind(this._web3Wrapper),
this._web3Wrapper.getLogsAsync.bind(this._web3Wrapper),
- this._onBlockAndLogStreamerError.bind(this),
+ ContractWrapper._onBlockAndLogStreamerError.bind(this, isVerbose),
);
const catchAllLogFilter = {};
this._blockAndLogStreamerIfExists.addLogFilter(catchAllLogFilter);
this._blockAndLogStreamIntervalIfExists = intervalUtils.setAsyncExcludingInterval(
this._reconcileBlockAsync.bind(this),
this._blockPollingIntervalMs,
- this._onReconcileBlockError.bind(this),
+ ContractWrapper._onBlockAndLogStreamerError.bind(this, isVerbose),
);
let isRemoved = false;
this._onLogAddedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogAdded(
@@ -176,20 +184,10 @@ export abstract class ContractWrapper {
this._onLogStateChanged.bind(this, isRemoved),
);
}
- private _onBlockAndLogStreamerError(err: Error): void {
- // Propogate all Blockstream subscriber errors to all
- // top-level subscriptions
- const filterCallbacks = _.values(this._filterCallbacks);
- _.each(filterCallbacks, filterCallback => {
- filterCallback(err);
- });
- }
- private _onReconcileBlockError(err: Error): void {
- const filterTokens = _.keys(this._filterCallbacks);
- _.each(filterTokens, filterToken => {
- this._unsubscribe(filterToken, err);
- });
- }
+ // HACK: This should be a package-scoped method (which doesn't exist in TS)
+ // We don't want this method available in the public interface for all classes
+ // who inherit from ContractWrapper, and it is only used by the internal implementation
+ // of those higher classes.
// tslint:disable-next-line:no-unused-variable
private _setNetworkId(networkId: number): void {
this._networkId = networkId;
diff --git a/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts
index 29c63564e..17bda5085 100644
--- a/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts
+++ b/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts
@@ -347,6 +347,7 @@ export class ERC20TokenWrapper extends ContractWrapper {
* @param indexFilterValues An object where the keys are indexed args returned by the event and
* the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
* @param callback Callback that gets called when a log is added/removed
+ * @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
* @return Subscription token used later to unsubscribe
*/
public subscribe<ArgsType extends ERC20TokenEventArgs>(
@@ -354,6 +355,7 @@ export class ERC20TokenWrapper extends ContractWrapper {
eventName: ERC20TokenEvents,
indexFilterValues: IndexedFilterValues,
callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
): string {
assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.doesBelongToStringEnum('eventName', eventName, ERC20TokenEvents);
@@ -366,6 +368,7 @@ export class ERC20TokenWrapper extends ContractWrapper {
indexFilterValues,
artifacts.ERC20Token.compilerOutput.abi,
callback,
+ isVerbose,
);
return subscriptionToken;
}
diff --git a/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts
index b7e5519c4..7c2b41c62 100644
--- a/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts
+++ b/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts
@@ -342,15 +342,17 @@ export class ERC721TokenWrapper extends ContractWrapper {
const normalizedSenderAddress = senderAddress.toLowerCase();
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
const ownerAddress = await this.getOwnerOfAsync(tokenAddress, tokenId);
- const isApprovedForAll = await this.isApprovedForAllAsync(
- normalizedTokenAddress,
- ownerAddress,
- normalizedSenderAddress,
- );
- if (!isApprovedForAll) {
- const approvedAddress = await this.getApprovedIfExistsAsync(normalizedTokenAddress, tokenId);
- if (approvedAddress !== senderAddress) {
- throw new Error(ContractWrappersError.ERC721NoApproval);
+ if (normalizedSenderAddress !== ownerAddress) {
+ const isApprovedForAll = await this.isApprovedForAllAsync(
+ normalizedTokenAddress,
+ ownerAddress,
+ normalizedSenderAddress,
+ );
+ if (!isApprovedForAll) {
+ const approvedAddress = await this.getApprovedIfExistsAsync(normalizedTokenAddress, tokenId);
+ if (approvedAddress !== normalizedSenderAddress) {
+ throw new Error(ContractWrappersError.ERC721NoApproval);
+ }
}
}
const txHash = await tokenContract.transferFrom.sendTransactionAsync(
@@ -372,6 +374,7 @@ export class ERC721TokenWrapper extends ContractWrapper {
* @param indexFilterValues An object where the keys are indexed args returned by the event and
* the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
* @param callback Callback that gets called when a log is added/removed
+ * @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
* @return Subscription token used later to unsubscribe
*/
public subscribe<ArgsType extends ERC721TokenEventArgs>(
@@ -379,6 +382,7 @@ export class ERC721TokenWrapper extends ContractWrapper {
eventName: ERC721TokenEvents,
indexFilterValues: IndexedFilterValues,
callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
): string {
assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.doesBelongToStringEnum('eventName', eventName, ERC721TokenEvents);
@@ -391,6 +395,7 @@ export class ERC721TokenWrapper extends ContractWrapper {
indexFilterValues,
artifacts.ERC721Token.compilerOutput.abi,
callback,
+ isVerbose,
);
return subscriptionToken;
}
diff --git a/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts
index 01440a5e1..5046d3667 100644
--- a/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts
+++ b/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts
@@ -146,6 +146,7 @@ export class EtherTokenWrapper extends ContractWrapper {
* @param indexFilterValues An object where the keys are indexed args returned by the event and
* the value is the value you are interested in. E.g `{_owner: aUserAddressHex}`
* @param callback Callback that gets called when a log is added/removed
+ * @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
* @return Subscription token used later to unsubscribe
*/
public subscribe<ArgsType extends WETH9EventArgs>(
@@ -153,6 +154,7 @@ export class EtherTokenWrapper extends ContractWrapper {
eventName: WETH9Events,
indexFilterValues: IndexedFilterValues,
callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
): string {
assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
@@ -165,6 +167,7 @@ export class EtherTokenWrapper extends ContractWrapper {
indexFilterValues,
artifacts.EtherToken.compilerOutput.abi,
callback,
+ isVerbose,
);
return subscriptionToken;
}
diff --git a/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts
index 8b7148aed..3e7619228 100644
--- a/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts
+++ b/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts
@@ -1,4 +1,5 @@
import { schemas } from '@0xproject/json-schemas';
+import { assetDataUtils } from '@0xproject/order-utils';
import { AssetProxyId, Order, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
@@ -988,12 +989,14 @@ export class ExchangeWrapper extends ContractWrapper {
* @param indexFilterValues An object where the keys are indexed args returned by the event and
* the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
* @param callback Callback that gets called when a log is added/removed
+ * @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
* @return Subscription token used later to unsubscribe
*/
public subscribe<ArgsType extends ExchangeEventArgs>(
eventName: ExchangeEvents,
indexFilterValues: IndexedFilterValues,
callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
): string {
assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents);
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
@@ -1005,6 +1008,7 @@ export class ExchangeWrapper extends ContractWrapper {
indexFilterValues,
artifacts.Exchange.compilerOutput.abi,
callback,
+ isVerbose,
);
return subscriptionToken;
}
@@ -1068,9 +1072,9 @@ export class ExchangeWrapper extends ContractWrapper {
* Returns the ZRX asset data used by the exchange contract.
* @return ZRX asset data
*/
- public async getZRXAssetDataAsync(): Promise<string> {
- const exchangeInstance = await this._getExchangeContractAsync();
- const zrxAssetData = exchangeInstance.ZRX_ASSET_DATA.callAsync();
+ public getZRXAssetData(): string {
+ const zrxTokenAddress = this.getZRXTokenAddress();
+ const zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxTokenAddress);
return zrxAssetData;
}
// tslint:disable:no-unused-variable
diff --git a/packages/contract-wrappers/src/index.ts b/packages/contract-wrappers/src/index.ts
index d8e597ed1..e5485d7a6 100644
--- a/packages/contract-wrappers/src/index.ts
+++ b/packages/contract-wrappers/src/index.ts
@@ -1,9 +1,9 @@
export { ContractWrappers } from './contract_wrappers';
export { ERC20TokenWrapper } from './contract_wrappers/erc20_token_wrapper';
+export { ERC721TokenWrapper } from './contract_wrappers/erc721_token_wrapper';
export { EtherTokenWrapper } from './contract_wrappers/ether_token_wrapper';
-export { ERC20ProxyWrapper } from './contract_wrappers/erc20_proxy_wrapper';
export { ExchangeWrapper } from './contract_wrappers/exchange_wrapper';
-export { ERC721TokenWrapper } from './contract_wrappers/erc721_token_wrapper';
+export { ERC20ProxyWrapper } from './contract_wrappers/erc20_proxy_wrapper';
export { ERC721ProxyWrapper } from './contract_wrappers/erc721_proxy_wrapper';
export {
@@ -26,7 +26,15 @@ export {
OrderInfo,
} from './types';
-export { Order, SignedOrder, ECSignature, OrderStateValid, OrderStateInvalid, OrderState } from '@0xproject/types';
+export {
+ Order,
+ SignedOrder,
+ ECSignature,
+ OrderStateValid,
+ OrderStateInvalid,
+ OrderState,
+ AssetProxyId,
+} from '@0xproject/types';
export {
BlockParamLiteral,
@@ -60,6 +68,7 @@ export {
ERC721TokenApprovalForAllEventArgs,
ERC721TokenTransferEventArgs,
ERC721TokenEvents,
+ ERC721TokenEventArgs,
} from './contract_wrappers/generated/erc721_token';
export {
diff --git a/packages/contract-wrappers/test/exchange_wrapper_test.ts b/packages/contract-wrappers/test/exchange_wrapper_test.ts
index b2c716008..dca212f65 100644
--- a/packages/contract-wrappers/test/exchange_wrapper_test.ts
+++ b/packages/contract-wrappers/test/exchange_wrapper_test.ts
@@ -1,6 +1,6 @@
import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
import { FillScenarios } from '@0xproject/fill-scenarios';
-import { assetProxyUtils, orderHashUtils } from '@0xproject/order-utils';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
import { DoneCallback, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
@@ -53,7 +53,6 @@ describe('ExchangeWrapper', () => {
await blockchainLifecycle.startAsync();
contractWrappers = new ContractWrappers(provider, config);
exchangeContractAddress = contractWrappers.exchange.getContractAddress();
- const erc20ProxyAddress = contractWrappers.erc20Proxy.getContractAddress();
userAddresses = await web3Wrapper.getAvailableAddressesAsync();
zrxTokenAddress = tokenUtils.getProtocolTokenAddress();
fillScenarios = new FillScenarios(
@@ -61,13 +60,14 @@ describe('ExchangeWrapper', () => {
userAddresses,
zrxTokenAddress,
exchangeContractAddress,
- erc20ProxyAddress,
+ contractWrappers.erc20Proxy.getContractAddress(),
+ contractWrappers.erc721Proxy.getContractAddress(),
);
[coinbase, makerAddress, takerAddress, feeRecipient, anotherMakerAddress] = userAddresses;
[makerTokenAddress, takerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses();
[makerAssetData, takerAssetData] = [
- assetProxyUtils.encodeERC20AssetData(makerTokenAddress),
- assetProxyUtils.encodeERC20AssetData(takerTokenAddress),
+ assetDataUtils.encodeERC20AssetData(makerTokenAddress),
+ assetDataUtils.encodeERC20AssetData(takerTokenAddress),
];
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
makerAssetData,
@@ -264,8 +264,8 @@ describe('ExchangeWrapper', () => {
});
});
describe('#getZRXAssetData', () => {
- it('should get the asset data', async () => {
- const ZRX_ASSET_DATA = await contractWrappers.exchange.getZRXAssetDataAsync();
+ it('should get the asset data', () => {
+ const ZRX_ASSET_DATA = contractWrappers.exchange.getZRXAssetData();
const ASSET_DATA_HEX_LENGTH = 74;
expect(ZRX_ASSET_DATA).to.have.length(ASSET_DATA_HEX_LENGTH);
});
diff --git a/packages/contract-wrappers/test/global_hooks.ts b/packages/contract-wrappers/test/global_hooks.ts
index bf80e0908..05b23d5b8 100644
--- a/packages/contract-wrappers/test/global_hooks.ts
+++ b/packages/contract-wrappers/test/global_hooks.ts
@@ -7,7 +7,7 @@ before('migrate contracts', async function(): Promise<void> {
// HACK: Since the migrations take longer then our global mocha timeout limit
// we manually increase it for this before hook.
const mochaTestTimeoutMs = 50000;
- this.timeout(mochaTestTimeoutMs);
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
const txDefaults = {
gas: devConstants.GAS_LIMIT,
from: devConstants.TESTRPC_FIRST_ADDRESS,
diff --git a/packages/contract-wrappers/test/subscription_test.ts b/packages/contract-wrappers/test/subscription_test.ts
index adda4ab78..80d17576f 100644
--- a/packages/contract-wrappers/test/subscription_test.ts
+++ b/packages/contract-wrappers/test/subscription_test.ts
@@ -49,44 +49,6 @@ describe('SubscriptionTest', () => {
_.each(stubs, s => s.restore());
stubs = [];
});
- it('Should receive the Error when an error occurs while fetching the block', (done: DoneCallback) => {
- (async () => {
- const errMsg = 'Error fetching block';
- const callback = callbackErrorReporter.assertNodeCallbackError(done, errMsg);
- stubs = [Sinon.stub((contractWrappers as any)._web3Wrapper, 'getBlockAsync').throws(new Error(errMsg))];
- contractWrappers.erc20Token.subscribe(
- tokenAddress,
- ERC20TokenEvents.Approval,
- indexFilterValues,
- callback,
- );
- await contractWrappers.erc20Token.setAllowanceAsync(
- tokenAddress,
- coinbase,
- addressWithoutFunds,
- allowanceAmount,
- );
- })().catch(done);
- });
- it('Should receive the Error when an error occurs while reconciling the new block', (done: DoneCallback) => {
- (async () => {
- const errMsg = 'Error fetching logs';
- const callback = callbackErrorReporter.assertNodeCallbackError(done, errMsg);
- stubs = [Sinon.stub((contractWrappers as any)._web3Wrapper, 'getLogsAsync').throws(new Error(errMsg))];
- contractWrappers.erc20Token.subscribe(
- tokenAddress,
- ERC20TokenEvents.Approval,
- indexFilterValues,
- callback,
- );
- await contractWrappers.erc20Token.setAllowanceAsync(
- tokenAddress,
- coinbase,
- addressWithoutFunds,
- allowanceAmount,
- );
- })().catch(done);
- });
it('Should allow unsubscribeAll to be called successfully after an error', (done: DoneCallback) => {
(async () => {
const callback = (err: Error | null, _logEvent?: DecodedLogEvent<ERC20TokenApprovalEventArgs>) =>
diff --git a/packages/contracts/compiler.json b/packages/contracts/compiler.json
index 5ace566d8..2a7f8bbb9 100644
--- a/packages/contracts/compiler.json
+++ b/packages/contracts/compiler.json
@@ -25,6 +25,7 @@
"DummyERC721Token",
"ERC20Proxy",
"ERC20Token",
+ "ERC721Token",
"ERC721Proxy",
"Exchange",
"ExchangeWrapper",
diff --git a/packages/contracts/package.json b/packages/contracts/package.json
index 98b133e63..066f9b41a 100644
--- a/packages/contracts/package.json
+++ b/packages/contracts/package.json
@@ -1,7 +1,7 @@
{
"private": true,
"name": "contracts",
- "version": "2.1.34",
+ "version": "2.1.35",
"engines": {
"node": ">=6.12"
},
@@ -46,11 +46,11 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/contracts/README.md",
"devDependencies": {
- "@0xproject/abi-gen": "^0.3.3",
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/tslint-config": "^0.4.21",
- "@0xproject/subproviders": "^0.10.5",
- "@0xproject/sol-cov": "^0.1.2",
+ "@0xproject/abi-gen": "^1.0.0",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
+ "@0xproject/subproviders": "^1.0.0",
+ "@0xproject/sol-cov": "^1.0.0",
"@types/lodash": "4.14.104",
"@types/bn.js": "^4.11.0",
"@types/node": "^8.0.53",
@@ -67,23 +67,23 @@
"shx": "^0.2.2",
"solc": "^0.4.24",
"solhint": "^1.2.1",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1",
"yargs": "^10.0.3"
},
"dependencies": {
- "@0xproject/base-contract": "^0.3.5",
- "@0xproject/order-utils": "^1.0.0",
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/types": "^1.0.0",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
- "ethereum-types": "^0.0.2",
+ "@0xproject/base-contract": "^1.0.0",
+ "@0xproject/order-utils": "^1.0.0-rc.1",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
+ "ethereum-types": "^1.0.0",
"bn.js": "^4.11.8",
- "ethereumjs-abi": "^0.6.4",
+ "ethereumjs-abi": "0.6.5",
"ethereumjs-util": "^5.1.1",
"ethers": "3.0.22",
"lodash": "^4.17.4"
}
-} \ No newline at end of file
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol b/packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol
index ec84b1e19..6f435892b 100644
--- a/packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol
@@ -154,6 +154,9 @@ contract MixinExchangeCore is
// Compute the order hash
orderInfo.orderHash = getOrderHash(order);
+ // Fetch filled amount
+ orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];
+
// If order.makerAssetAmount is zero, we also reject the order.
// While the Exchange contract handles them correctly, they create
// edge cases in the supporting infrastructure because they have
@@ -172,6 +175,12 @@ contract MixinExchangeCore is
return orderInfo;
}
+ // Validate order availability
+ if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {
+ orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);
+ return orderInfo;
+ }
+
// Validate order expiration
// solhint-disable-next-line not-rely-on-time
if (block.timestamp >= order.expirationTimeSeconds) {
@@ -189,13 +198,6 @@ contract MixinExchangeCore is
return orderInfo;
}
- // Fetch filled amount and validate order availability
- orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];
- if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {
- orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);
- return orderInfo;
- }
-
// All other statuses are ruled out: order is Fillable
orderInfo.orderStatus = uint8(OrderStatus.FILLABLE);
return orderInfo;
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol b/packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol
index a16d2f897..567f26c52 100644
--- a/packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol
@@ -22,12 +22,14 @@ pragma experimental ABIEncoderV2;
import "./libs/LibMath.sol";
import "./libs/LibOrder.sol";
import "./libs/LibFillResults.sol";
+import "./libs/LibAbiEncoder.sol";
import "./mixins/MExchangeCore.sol";
contract MixinWrapperFunctions is
LibMath,
LibFillResults,
+ LibAbiEncoder,
MExchangeCore
{
/// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.
@@ -68,177 +70,21 @@ contract MixinWrapperFunctions is
public
returns (FillResults memory fillResults)
{
- // We need to call MExchangeCore.fillOrder using a delegatecall in
- // assembly so that we can intercept a call that throws. For this, we
- // need the input encoded in memory in the Ethereum ABIv2 format [1].
-
- // | Area | Offset | Length | Contents |
- // | -------- |--------|---------|-------------------------------------------- |
- // | Header | 0x00 | 4 | function selector |
- // | Params | | 3 * 32 | function parameters: |
- // | | 0x00 | | 1. offset to order (*) |
- // | | 0x20 | | 2. takerAssetFillAmount |
- // | | 0x40 | | 3. offset to signature (*) |
- // | Data | | 12 * 32 | order: |
- // | | 0x000 | | 1. senderAddress |
- // | | 0x020 | | 2. makerAddress |
- // | | 0x040 | | 3. takerAddress |
- // | | 0x060 | | 4. feeRecipientAddress |
- // | | 0x080 | | 5. makerAssetAmount |
- // | | 0x0A0 | | 6. takerAssetAmount |
- // | | 0x0C0 | | 7. makerFeeAmount |
- // | | 0x0E0 | | 8. takerFeeAmount |
- // | | 0x100 | | 9. expirationTimeSeconds |
- // | | 0x120 | | 10. salt |
- // | | 0x140 | | 11. Offset to makerAssetData (*) |
- // | | 0x160 | | 12. Offset to takerAssetData (*) |
- // | | 0x180 | 32 | makerAssetData Length |
- // | | 0x1A0 | ** | makerAssetData Contents |
- // | | 0x1C0 | 32 | takerAssetData Length |
- // | | 0x1E0 | ** | takerAssetData Contents |
- // | | 0x200 | 32 | signature Length |
- // | | 0x220 | ** | signature Contents |
-
- // * Offsets are calculated from the beginning of the current area: Header, Params, Data:
- // An offset stored in the Params area is calculated from the beginning of the Params section.
- // An offset stored in the Data area is calculated from the beginning of the Data section.
-
- // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.
-
- // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html
-
- bytes4 fillOrderSelector = this.fillOrder.selector;
+ // ABI encode calldata for `fillOrder`
+ bytes memory fillOrderCalldata = abiEncodeFillOrder(
+ order,
+ takerAssetFillAmount,
+ signature
+ );
+ // Delegate to `fillOrder` and handle any exceptions gracefully
assembly {
-
- // Areas below may use the following variables:
- // 1. <area>Start -- Start of this area in memory
- // 2. <area>End -- End of this area in memory. This value may
- // be precomputed (before writing contents),
- // or it may be computed as contents are written.
- // 3. <area>Offset -- Current offset into area. If an area's End
- // is precomputed, this variable tracks the
- // offsets of contents as they are written.
-
- /////// Setup Header Area ///////
- // Load free memory pointer
- let headerAreaStart := mload(0x40)
- mstore(headerAreaStart, fillOrderSelector)
- let headerAreaEnd := add(headerAreaStart, 0x4)
-
- /////// Setup Params Area ///////
- // This area is preallocated and written to later.
- // This is because we need to fill in offsets that have not yet been calculated.
- let paramsAreaStart := headerAreaEnd
- let paramsAreaEnd := add(paramsAreaStart, 0x60)
- let paramsAreaOffset := paramsAreaStart
-
- /////// Setup Data Area ///////
- let dataAreaStart := paramsAreaEnd
- let dataAreaEnd := dataAreaStart
-
- // Offset from the source data we're reading from
- let sourceOffset := order
- // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.
- let arrayLenBytes := 0
- let arrayLenWords := 0
-
- /////// Write order Struct ///////
- // Write memory location of Order, relative to the start of the
- // parameter list, then increment the paramsAreaOffset respectively.
- mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))
- paramsAreaOffset := add(paramsAreaOffset, 0x20)
-
- // Write values for each field in the order
- // It would be nice to use a loop, but we save on gas by writing
- // the stores sequentially.
- mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress
- mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress
- mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress
- mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress
- mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount
- mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount
- mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount
- mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount
- mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds
- mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt
- mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData
- mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData
- dataAreaEnd := add(dataAreaEnd, 0x180)
- sourceOffset := add(sourceOffset, 0x180)
-
- // Write offset to <order.makerAssetData>
- mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))
-
- // Calculate length of <order.makerAssetData>
- sourceOffset := mload(add(order, 0x140)) // makerAssetData
- arrayLenBytes := mload(sourceOffset)
- sourceOffset := add(sourceOffset, 0x20)
- arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
-
- // Write length of <order.makerAssetData>
- mstore(dataAreaEnd, arrayLenBytes)
- dataAreaEnd := add(dataAreaEnd, 0x20)
-
- // Write contents of <order.makerAssetData>
- for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
- mstore(dataAreaEnd, mload(sourceOffset))
- dataAreaEnd := add(dataAreaEnd, 0x20)
- sourceOffset := add(sourceOffset, 0x20)
- }
-
- // Write offset to <order.takerAssetData>
- mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))
-
- // Calculate length of <order.takerAssetData>
- sourceOffset := mload(add(order, 0x160)) // takerAssetData
- arrayLenBytes := mload(sourceOffset)
- sourceOffset := add(sourceOffset, 0x20)
- arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
-
- // Write length of <order.takerAssetData>
- mstore(dataAreaEnd, arrayLenBytes)
- dataAreaEnd := add(dataAreaEnd, 0x20)
-
- // Write contents of <order.takerAssetData>
- for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
- mstore(dataAreaEnd, mload(sourceOffset))
- dataAreaEnd := add(dataAreaEnd, 0x20)
- sourceOffset := add(sourceOffset, 0x20)
- }
-
- /////// Write takerAssetFillAmount ///////
- mstore(paramsAreaOffset, takerAssetFillAmount)
- paramsAreaOffset := add(paramsAreaOffset, 0x20)
-
- /////// Write signature ///////
- // Write offset to paramsArea
- mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))
-
- // Calculate length of signature
- sourceOffset := signature
- arrayLenBytes := mload(sourceOffset)
- sourceOffset := add(sourceOffset, 0x20)
- arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
-
- // Write length of signature
- mstore(dataAreaEnd, arrayLenBytes)
- dataAreaEnd := add(dataAreaEnd, 0x20)
-
- // Write contents of signature
- for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
- mstore(dataAreaEnd, mload(sourceOffset))
- dataAreaEnd := add(dataAreaEnd, 0x20)
- sourceOffset := add(sourceOffset, 0x20)
- }
-
- // Execute delegatecall
let success := delegatecall(
gas, // forward all gas, TODO: look into gas consumption of assert/throw
address, // call address of this contract
- headerAreaStart, // pointer to start of input
- sub(dataAreaEnd, headerAreaStart), // length of input
- headerAreaStart, // write output over input
+ add(fillOrderCalldata, 32), // pointer to start of input (skip array length in first 32 bytes)
+ mload(fillOrderCalldata), // length of input
+ fillOrderCalldata, // write output over input
128 // output size is 128 bytes
)
switch success
@@ -249,10 +95,10 @@ contract MixinWrapperFunctions is
mstore(add(fillResults, 96), 0)
}
case 1 {
- mstore(fillResults, mload(headerAreaStart))
- mstore(add(fillResults, 32), mload(add(headerAreaStart, 32)))
- mstore(add(fillResults, 64), mload(add(headerAreaStart, 64)))
- mstore(add(fillResults, 96), mload(add(headerAreaStart, 96)))
+ mstore(fillResults, mload(fillOrderCalldata))
+ mstore(add(fillResults, 32), mload(add(fillOrderCalldata, 32)))
+ mstore(add(fillResults, 64), mload(add(fillOrderCalldata, 64)))
+ mstore(add(fillResults, 96), mload(add(fillOrderCalldata, 96)))
}
}
return fillResults;
@@ -529,4 +375,20 @@ contract MixinWrapperFunctions is
cancelOrder(orders[i]);
}
}
+
+ /// @dev Fetches information for all passed in orders.
+ /// @param orders Array of order specifications.
+ /// @return Array of OrderInfo instances that correspond to each order.
+ function getOrdersInfo(LibOrder.Order[] memory orders)
+ public
+ view
+ returns (LibOrder.OrderInfo[] memory)
+ {
+ uint256 length = orders.length;
+ LibOrder.OrderInfo[] memory ordersInfo = new LibOrder.OrderInfo[](length);
+ for (uint256 i = 0; i < length; i++) {
+ ordersInfo[i] = getOrderInfo(orders[i]);
+ }
+ return ordersInfo;
+ }
}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol
index ad7a56a06..56a533646 100644
--- a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol
@@ -149,4 +149,12 @@ contract IWrapperFunctions {
/// @param orders Array of order specifications.
function batchCancelOrders(LibOrder.Order[] memory orders)
public;
+
+ /// @dev Fetches information for all passed in orders
+ /// @param orders Array of order specifications.
+ /// @return Array of OrderInfo instances that correspond to each order.
+ function getOrdersInfo(LibOrder.Order[] memory orders)
+ public
+ view
+ returns (LibOrder.OrderInfo[] memory);
}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol
new file mode 100644
index 000000000..704c7061c
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol
@@ -0,0 +1,218 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ 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.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./LibOrder.sol";
+
+
+contract LibAbiEncoder {
+
+ /// @dev ABI encodes calldata for `fillOrder` in memory and returns the address range.
+ /// This range can be passed into `call` or `delegatecall` to invoke an external
+ /// call to `fillOrder`.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ /// @return calldataBegin Memory address of ABI encoded calldata.
+ /// @return calldataLength Lenfgth of ABI encoded calldata.
+ function abiEncodeFillOrder(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ public
+ pure
+ returns (bytes memory fillOrderCalldata)
+ {
+ // We need to call MExchangeCore.fillOrder using a delegatecall in
+ // assembly so that we can intercept a call that throws. For this, we
+ // need the input encoded in memory in the Ethereum ABIv2 format [1].
+
+ // | Area | Offset | Length | Contents |
+ // | -------- |--------|---------|-------------------------------------------- |
+ // | Header | 0x00 | 4 | function selector |
+ // | Params | | 3 * 32 | function parameters: |
+ // | | 0x00 | | 1. offset to order (*) |
+ // | | 0x20 | | 2. takerAssetFillAmount |
+ // | | 0x40 | | 3. offset to signature (*) |
+ // | Data | | 12 * 32 | order: |
+ // | | 0x000 | | 1. senderAddress |
+ // | | 0x020 | | 2. makerAddress |
+ // | | 0x040 | | 3. takerAddress |
+ // | | 0x060 | | 4. feeRecipientAddress |
+ // | | 0x080 | | 5. makerAssetAmount |
+ // | | 0x0A0 | | 6. takerAssetAmount |
+ // | | 0x0C0 | | 7. makerFeeAmount |
+ // | | 0x0E0 | | 8. takerFeeAmount |
+ // | | 0x100 | | 9. expirationTimeSeconds |
+ // | | 0x120 | | 10. salt |
+ // | | 0x140 | | 11. Offset to makerAssetData (*) |
+ // | | 0x160 | | 12. Offset to takerAssetData (*) |
+ // | | 0x180 | 32 | makerAssetData Length |
+ // | | 0x1A0 | ** | makerAssetData Contents |
+ // | | 0x1C0 | 32 | takerAssetData Length |
+ // | | 0x1E0 | ** | takerAssetData Contents |
+ // | | 0x200 | 32 | signature Length |
+ // | | 0x220 | ** | signature Contents |
+
+ // * Offsets are calculated from the beginning of the current area: Header, Params, Data:
+ // An offset stored in the Params area is calculated from the beginning of the Params section.
+ // An offset stored in the Data area is calculated from the beginning of the Data section.
+
+ // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.
+
+ // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html
+
+ assembly {
+
+ // Areas below may use the following variables:
+ // 1. <area>Start -- Start of this area in memory
+ // 2. <area>End -- End of this area in memory. This value may
+ // be precomputed (before writing contents),
+ // or it may be computed as contents are written.
+ // 3. <area>Offset -- Current offset into area. If an area's End
+ // is precomputed, this variable tracks the
+ // offsets of contents as they are written.
+
+ /////// Setup Header Area ///////
+ // Load free memory pointer
+ fillOrderCalldata := mload(0x40)
+ // bytes4(keccak256("fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)"))
+ // = 0xb4be83d5
+ // Leave 0x20 bytes to store the length
+ mstore(add(fillOrderCalldata, 0x20), 0xb4be83d500000000000000000000000000000000000000000000000000000000)
+ let headerAreaEnd := add(fillOrderCalldata, 0x24)
+
+ /////// Setup Params Area ///////
+ // This area is preallocated and written to later.
+ // This is because we need to fill in offsets that have not yet been calculated.
+ let paramsAreaStart := headerAreaEnd
+ let paramsAreaEnd := add(paramsAreaStart, 0x60)
+ let paramsAreaOffset := paramsAreaStart
+
+ /////// Setup Data Area ///////
+ let dataAreaStart := paramsAreaEnd
+ let dataAreaEnd := dataAreaStart
+
+ // Offset from the source data we're reading from
+ let sourceOffset := order
+ // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.
+ let arrayLenBytes := 0
+ let arrayLenWords := 0
+
+ /////// Write order Struct ///////
+ // Write memory location of Order, relative to the start of the
+ // parameter list, then increment the paramsAreaOffset respectively.
+ mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))
+ paramsAreaOffset := add(paramsAreaOffset, 0x20)
+
+ // Write values for each field in the order
+ // It would be nice to use a loop, but we save on gas by writing
+ // the stores sequentially.
+ mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress
+ mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress
+ mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress
+ mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress
+ mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount
+ mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount
+ mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount
+ mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount
+ mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds
+ mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt
+ mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData
+ mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData
+ dataAreaEnd := add(dataAreaEnd, 0x180)
+ sourceOffset := add(sourceOffset, 0x180)
+
+ // Write offset to <order.makerAssetData>
+ mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))
+
+ // Calculate length of <order.makerAssetData>
+ sourceOffset := mload(add(order, 0x140)) // makerAssetData
+ arrayLenBytes := mload(sourceOffset)
+ sourceOffset := add(sourceOffset, 0x20)
+ arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
+
+ // Write length of <order.makerAssetData>
+ mstore(dataAreaEnd, arrayLenBytes)
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+
+ // Write contents of <order.makerAssetData>
+ for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
+ mstore(dataAreaEnd, mload(sourceOffset))
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+ sourceOffset := add(sourceOffset, 0x20)
+ }
+
+ // Write offset to <order.takerAssetData>
+ mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))
+
+ // Calculate length of <order.takerAssetData>
+ sourceOffset := mload(add(order, 0x160)) // takerAssetData
+ arrayLenBytes := mload(sourceOffset)
+ sourceOffset := add(sourceOffset, 0x20)
+ arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
+
+ // Write length of <order.takerAssetData>
+ mstore(dataAreaEnd, arrayLenBytes)
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+
+ // Write contents of <order.takerAssetData>
+ for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
+ mstore(dataAreaEnd, mload(sourceOffset))
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+ sourceOffset := add(sourceOffset, 0x20)
+ }
+
+ /////// Write takerAssetFillAmount ///////
+ mstore(paramsAreaOffset, takerAssetFillAmount)
+ paramsAreaOffset := add(paramsAreaOffset, 0x20)
+
+ /////// Write signature ///////
+ // Write offset to paramsArea
+ mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))
+
+ // Calculate length of signature
+ sourceOffset := signature
+ arrayLenBytes := mload(sourceOffset)
+ sourceOffset := add(sourceOffset, 0x20)
+ arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
+
+ // Write length of signature
+ mstore(dataAreaEnd, arrayLenBytes)
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+
+ // Write contents of signature
+ for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
+ mstore(dataAreaEnd, mload(sourceOffset))
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+ sourceOffset := add(sourceOffset, 0x20)
+ }
+
+ // Set length of calldata
+ mstore(
+ fillOrderCalldata,
+ sub(dataAreaEnd, add(fillOrderCalldata, 0x20))
+ )
+ }
+
+ return fillOrderCalldata;
+ }
+}
diff --git a/packages/contracts/test/asset_proxy/proxies.ts b/packages/contracts/test/asset_proxy/proxies.ts
index 36e0800d6..39674a030 100644
--- a/packages/contracts/test/asset_proxy/proxies.ts
+++ b/packages/contracts/test/asset_proxy/proxies.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { assetDataUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
import { RevertReason } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
@@ -23,6 +23,7 @@ import { constants } from '../utils/constants';
import { ERC20Wrapper } from '../utils/erc20_wrapper';
import { ERC721Wrapper } from '../utils/erc721_wrapper';
import { LogDecoder } from '../utils/log_decoder';
+import { typeEncodingUtils } from '../utils/type_encoding_utils';
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
chaiSetup.configure();
@@ -107,7 +108,7 @@ describe('Asset Transfer Proxies', () => {
describe('transferFrom', () => {
it('should successfully transfer tokens', async () => {
// Construct ERC20 asset data
- const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
// Perform a transfer from makerAddress to takerAddress
const erc20Balances = await erc20Wrapper.getBalancesAsync();
const amount = new BigNumber(10);
@@ -137,7 +138,7 @@ describe('Asset Transfer Proxies', () => {
it('should do nothing if transferring 0 amount of a token', async () => {
// Construct ERC20 asset data
- const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
// Perform a transfer from makerAddress to takerAddress
const erc20Balances = await erc20Wrapper.getBalancesAsync();
const amount = new BigNumber(0);
@@ -167,7 +168,7 @@ describe('Asset Transfer Proxies', () => {
it('should throw if allowances are too low', async () => {
// Construct ERC20 asset data
- const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
// Create allowance less than transfer amount. Set allowance on proxy.
const allowance = new BigNumber(0);
const amount = new BigNumber(10);
@@ -196,7 +197,7 @@ describe('Asset Transfer Proxies', () => {
it('should throw if requesting address is not authorized', async () => {
// Construct ERC20 asset data
- const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
// Perform a transfer from makerAddress to takerAddress
const amount = new BigNumber(10);
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
@@ -227,7 +228,7 @@ describe('Asset Transfer Proxies', () => {
describe('transferFrom', () => {
it('should successfully transfer tokens', async () => {
// Construct ERC721 asset data
- const encodedAssetData = assetProxyUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
// Verify pre-condition
const ownerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
expect(ownerMakerAsset).to.be.bignumber.equal(makerAddress);
@@ -254,7 +255,7 @@ describe('Asset Transfer Proxies', () => {
it('should call onERC721Received when transferring to a smart contract without receiver data', async () => {
// Construct ERC721 asset data
- const encodedAssetData = assetProxyUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
// Verify pre-condition
const ownerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
expect(ownerMakerAsset).to.be.bignumber.equal(makerAddress);
@@ -288,8 +289,8 @@ describe('Asset Transfer Proxies', () => {
it('should call onERC721Received when transferring to a smart contract with receiver data', async () => {
// Construct ERC721 asset data
- const receiverData = ethUtil.bufferToHex(assetProxyUtils.encodeUint256(generatePseudoRandomSalt()));
- const encodedAssetData = assetProxyUtils.encodeERC721AssetData(
+ const receiverData = ethUtil.bufferToHex(typeEncodingUtils.encodeUint256(generatePseudoRandomSalt()));
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(
erc721Token.address,
erc721MakerTokenId,
receiverData,
@@ -327,8 +328,8 @@ describe('Asset Transfer Proxies', () => {
it('should throw if there is receiver data but contract does not have onERC721Received', async () => {
// Construct ERC721 asset data
- const receiverData = ethUtil.bufferToHex(assetProxyUtils.encodeUint256(generatePseudoRandomSalt()));
- const encodedAssetData = assetProxyUtils.encodeERC721AssetData(
+ const receiverData = ethUtil.bufferToHex(typeEncodingUtils.encodeUint256(generatePseudoRandomSalt()));
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(
erc721Token.address,
erc721MakerTokenId,
receiverData,
@@ -357,7 +358,7 @@ describe('Asset Transfer Proxies', () => {
it('should throw if transferring 0 amount of a token', async () => {
// Construct ERC721 asset data
- const encodedAssetData = assetProxyUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
// Verify pre-condition
const ownerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
expect(ownerMakerAsset).to.be.bignumber.equal(makerAddress);
@@ -381,7 +382,7 @@ describe('Asset Transfer Proxies', () => {
it('should throw if transferring > 1 amount of a token', async () => {
// Construct ERC721 asset data
- const encodedAssetData = assetProxyUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
// Verify pre-condition
const ownerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
expect(ownerMakerAsset).to.be.bignumber.equal(makerAddress);
@@ -405,7 +406,7 @@ describe('Asset Transfer Proxies', () => {
it('should throw if allowances are too low', async () => {
// Construct ERC721 asset data
- const encodedAssetData = assetProxyUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
// Remove transfer approval for makerAddress.
await web3Wrapper.awaitTransactionSuccessAsync(
await erc721Token.approve.sendTransactionAsync(constants.NULL_ADDRESS, erc721MakerTokenId, {
@@ -433,7 +434,7 @@ describe('Asset Transfer Proxies', () => {
it('should throw if requesting address is not authorized', async () => {
// Construct ERC721 asset data
- const encodedAssetData = assetProxyUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
// Perform a transfer from makerAddress to takerAddress
const amount = new BigNumber(1);
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
diff --git a/packages/contracts/test/exchange/core.ts b/packages/contracts/test/exchange/core.ts
index d9f3851d1..33246a681 100644
--- a/packages/contracts/test/exchange/core.ts
+++ b/packages/contracts/test/exchange/core.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils, orderHashUtils } from '@0xproject/order-utils';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
import { RevertReason, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
@@ -15,13 +15,14 @@ import { ERC721ProxyContract } from '../../generated_contract_wrappers/erc721_pr
import { ExchangeCancelEventArgs, ExchangeContract } from '../../generated_contract_wrappers/exchange';
import { artifacts } from '../utils/artifacts';
import { expectTransactionFailedAsync } from '../utils/assertions';
+import { getLatestBlockTimestampAsync, increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
import { chaiSetup } from '../utils/chai_setup';
import { constants } from '../utils/constants';
import { ERC20Wrapper } from '../utils/erc20_wrapper';
import { ERC721Wrapper } from '../utils/erc721_wrapper';
import { ExchangeWrapper } from '../utils/exchange_wrapper';
import { OrderFactory } from '../utils/order_factory';
-import { ERC20BalancesByOwner } from '../utils/types';
+import { ERC20BalancesByOwner, OrderStatus } from '../utils/types';
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
chaiSetup.configure();
@@ -87,7 +88,7 @@ describe('Exchange core', () => {
artifacts.Exchange,
provider,
txDefaults,
- assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
);
exchangeWrapper = new ExchangeWrapper(exchange, provider);
await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
@@ -114,8 +115,8 @@ describe('Exchange core', () => {
exchangeAddress: exchange.address,
makerAddress,
feeRecipientAddress,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultMakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultTakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress),
};
const privateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
orderFactory = new OrderFactory(privateKey, defaultOrderParams);
@@ -129,11 +130,11 @@ describe('Exchange core', () => {
describe('fillOrder', () => {
beforeEach(async () => {
erc20Balances = await erc20Wrapper.getBalancesAsync();
- signedOrder = orderFactory.newSignedOrder();
+ signedOrder = await orderFactory.newSignedOrderAsync();
});
it('should throw if signature is invalid', async () => {
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
});
@@ -151,7 +152,7 @@ describe('Exchange core', () => {
});
it('should throw if no value is filled', async () => {
- signedOrder = orderFactory.newSignedOrder();
+ signedOrder = await orderFactory.newSignedOrderAsync();
await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress);
return expectTransactionFailedAsync(
exchangeWrapper.fillOrderAsync(signedOrder, takerAddress),
@@ -163,7 +164,7 @@ describe('Exchange core', () => {
describe('cancelOrder', () => {
beforeEach(async () => {
erc20Balances = await erc20Wrapper.getBalancesAsync();
- signedOrder = orderFactory.newSignedOrder();
+ signedOrder = await orderFactory.newSignedOrderAsync();
});
it('should throw if not sent by maker', async () => {
@@ -174,7 +175,7 @@ describe('Exchange core', () => {
});
it('should throw if makerAssetAmount is 0', async () => {
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(0),
});
@@ -185,7 +186,7 @@ describe('Exchange core', () => {
});
it('should throw if takerAssetAmount is 0', async () => {
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
takerAssetAmount: new BigNumber(0),
});
@@ -229,8 +230,9 @@ describe('Exchange core', () => {
});
it('should throw if order is expired', async () => {
- signedOrder = orderFactory.newSignedOrder({
- expirationTimeSeconds: new BigNumber(Math.floor((Date.now() - 10000) / 1000)),
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ expirationTimeSeconds: new BigNumber(currentTimestamp).sub(10),
});
return expectTransactionFailedAsync(
exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress),
@@ -239,7 +241,7 @@ describe('Exchange core', () => {
});
it('should throw if rounding error is greater than 0.1%', async () => {
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1001),
takerAssetAmount: new BigNumber(3),
});
@@ -288,22 +290,22 @@ describe('Exchange core', () => {
// Since we cancelled with orderEpoch=1, orders with orderEpoch<=1 will not be processed
erc20Balances = await erc20Wrapper.getBalancesAsync();
const signedOrders = [
- orderFactory.newSignedOrder({
+ await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(9), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(9), 18),
salt: new BigNumber(0),
}),
- orderFactory.newSignedOrder({
+ await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(79), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(79), 18),
salt: new BigNumber(1),
}),
- orderFactory.newSignedOrder({
+ await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(979), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(979), 18),
salt: new BigNumber(2),
}),
- orderFactory.newSignedOrder({
+ await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(7979), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(7979), 18),
salt: new BigNumber(3),
@@ -350,11 +352,11 @@ describe('Exchange core', () => {
// Construct Exchange parameters
const makerAssetId = erc721TakerAssetIds[0];
const takerAssetId = erc721TakerAssetIds[1];
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerAssetAmount: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
- takerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
});
// Verify pre-conditions
const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
@@ -373,11 +375,11 @@ describe('Exchange core', () => {
// Construct Exchange parameters
const makerAssetId = erc721MakerAssetIds[0];
const takerAssetId = erc721MakerAssetIds[1];
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerAssetAmount: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
- takerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
});
// Verify pre-conditions
const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
@@ -396,11 +398,11 @@ describe('Exchange core', () => {
// Construct Exchange parameters
const makerAssetId = erc721MakerAssetIds[0];
const takerAssetId = erc721TakerAssetIds[0];
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(2),
takerAssetAmount: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
- takerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
});
// Verify pre-conditions
const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
@@ -419,11 +421,11 @@ describe('Exchange core', () => {
// Construct Exchange parameters
const makerAssetId = erc721MakerAssetIds[0];
const takerAssetId = erc721TakerAssetIds[0];
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerAssetAmount: new BigNumber(500),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
- takerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
});
// Verify pre-conditions
const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
@@ -441,11 +443,11 @@ describe('Exchange core', () => {
it('should throw on partial fill', async () => {
// Construct Exchange parameters
const makerAssetId = erc721MakerAssetIds[0];
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultTakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress),
});
// Call Exchange
const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
@@ -459,14 +461,12 @@ describe('Exchange core', () => {
// Construct Exchange parameters
const makerAssetId = erc721MakerAssetIds[0];
const takerAssetId = erc721TakerAssetIds[0];
- const makerAssetData = assetProxyUtils
- .encodeERC721AssetData(erc721Token.address, makerAssetId)
- .slice(0, -2);
- signedOrder = orderFactory.newSignedOrder({
+ const makerAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId).slice(0, -2);
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerAssetAmount: new BigNumber(1),
makerAssetData,
- takerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
});
// Verify pre-conditions
const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
@@ -481,6 +481,124 @@ describe('Exchange core', () => {
);
});
});
+
+ describe('getOrderInfo', () => {
+ beforeEach(async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync();
+ });
+ it('should return the correct orderInfo for an unfilled valid order', async () => {
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.FILLABLE;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for a fully filled order', async () => {
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount;
+ const expectedOrderStatus = OrderStatus.FULLY_FILLED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for a partially filled order', async () => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount });
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = takerAssetFillAmount;
+ const expectedOrderStatus = OrderStatus.FILLABLE;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for a cancelled and unfilled order', async () => {
+ await exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.CANCELLED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for a cancelled and partially filled order', async () => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount });
+ await exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = takerAssetFillAmount;
+ const expectedOrderStatus = OrderStatus.CANCELLED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an expired and unfilled order', async () => {
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrder.expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.EXPIRED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an expired and partially filled order', async () => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount });
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrder.expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = takerAssetFillAmount;
+ const expectedOrderStatus = OrderStatus.EXPIRED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an expired and fully filled order', async () => {
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress);
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrder.expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount;
+ // FULLY_FILLED takes precedence over EXPIRED
+ const expectedOrderStatus = OrderStatus.FULLY_FILLED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an order with a makerAssetAmount of 0', async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync({ makerAssetAmount: new BigNumber(0) });
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.INVALID_MAKER_ASSET_AMOUNT;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an order with a takerAssetAmount of 0', async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync({ takerAssetAmount: new BigNumber(0) });
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.INVALID_TAKER_ASSET_AMOUNT;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
});
// tslint:disable:max-file-line-count
// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/contracts/test/exchange/dispatcher.ts b/packages/contracts/test/exchange/dispatcher.ts
index 11f74d776..81d142ca4 100644
--- a/packages/contracts/test/exchange/dispatcher.ts
+++ b/packages/contracts/test/exchange/dispatcher.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils } from '@0xproject/order-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
import { AssetProxyId, RevertReason } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
@@ -180,7 +180,7 @@ describe('AssetProxyDispatcher', () => {
constants.AWAIT_TRANSACTION_MINED_MS,
);
// Construct metadata for ERC20 proxy
- const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
// Perform a transfer from makerAddress to takerAddress
const erc20Balances = await erc20Wrapper.getBalancesAsync();
@@ -207,7 +207,7 @@ describe('AssetProxyDispatcher', () => {
it('should throw if dispatching to unregistered proxy', async () => {
// Construct metadata for ERC20 proxy
- const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
// Perform a transfer from makerAddress to takerAddress
const amount = new BigNumber(10);
return expectTransactionFailedAsync(
diff --git a/packages/contracts/test/exchange/libs.ts b/packages/contracts/test/exchange/libs.ts
index 6ded6329c..2e95fa96c 100644
--- a/packages/contracts/test/exchange/libs.ts
+++ b/packages/contracts/test/exchange/libs.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils, EIP712Utils, orderHashUtils } from '@0xproject/order-utils';
+import { assetDataUtils, EIP712Utils, orderHashUtils } from '@0xproject/order-utils';
import { SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
@@ -38,8 +38,8 @@ describe('Exchange libs', () => {
exchangeAddress: libs.address,
makerAddress,
feeRecipientAddress: addressUtils.generatePseudoRandomAddress(),
- makerAssetData: assetProxyUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
};
const privateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
orderFactory = new OrderFactory(privateKey, defaultOrderParams);
@@ -71,7 +71,7 @@ describe('Exchange libs', () => {
});
describe('getOrderHash', () => {
it('should output the correct orderHash', async () => {
- signedOrder = orderFactory.newSignedOrder();
+ signedOrder = await orderFactory.newSignedOrderAsync();
const orderHashHex = await libs.publicGetOrderHash.callAsync(signedOrder);
expect(orderHashUtils.getOrderHashHex(signedOrder)).to.be.equal(orderHashHex);
});
diff --git a/packages/contracts/test/exchange/match_orders.ts b/packages/contracts/test/exchange/match_orders.ts
index 16041e968..440097562 100644
--- a/packages/contracts/test/exchange/match_orders.ts
+++ b/packages/contracts/test/exchange/match_orders.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils } from '@0xproject/order-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
import { RevertReason } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
@@ -100,7 +100,7 @@ describe('matchOrders', () => {
artifacts.Exchange,
provider,
txDefaults,
- assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
);
exchangeWrapper = new ExchangeWrapper(exchange, provider);
await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
@@ -126,8 +126,8 @@ describe('matchOrders', () => {
const defaultOrderParams = {
...constants.STATIC_ORDER_PARAMS,
exchangeAddress: exchange.address,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
};
const privateKeyLeft = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddressLeft)];
orderFactoryLeft = new OrderFactory(privateKeyLeft, defaultOrderParams);
@@ -150,16 +150,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts when orders completely fill each other', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -182,16 +182,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts when orders completely fill each other and taker doesnt take a profit', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -225,16 +225,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts when left order is completely filled and right order is partially filled', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(20), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -257,16 +257,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts when right order is completely filled and left order is partially filled', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -289,16 +289,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts when consecutive calls are used to completely fill the left order', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -326,10 +326,10 @@ describe('matchOrders', () => {
// Note: This order needs makerAssetAmount=90/takerAssetAmount=[anything <= 45] to fully fill the right order.
// However, we use 100/50 to ensure a partial fill as we want to go down the "left fill"
// branch in the contract twice for this test.
- const signedOrderRight2 = orderFactoryRight.newSignedOrder({
+ const signedOrderRight2 = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -356,17 +356,17 @@ describe('matchOrders', () => {
it('should transfer the correct amounts when consecutive calls are used to completely fill the right order', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -394,7 +394,7 @@ describe('matchOrders', () => {
// Note: This order needs makerAssetAmount=96/takerAssetAmount=48 to fully fill the right order.
// However, we use 100/50 to ensure a partial fill as we want to go down the "right fill"
// branch in the contract twice for this test.
- const signedOrderLeft2 = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft2 = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
@@ -425,16 +425,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts if fee recipient is the same across both matched orders', async () => {
const feeRecipientAddress = feeRecipientAddressLeft;
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress,
@@ -451,16 +451,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts if taker is also the left order maker', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -478,16 +478,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts if taker is also the right order maker', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -505,16 +505,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts if taker is also the left fee recipient', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -532,16 +532,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts if taker is also the right fee recipient', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -559,16 +559,16 @@ describe('matchOrders', () => {
it('should transfer the correct amounts if left maker is the left fee recipient and right maker is the right fee recipient', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: makerAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: makerAddressRight,
@@ -585,16 +585,16 @@ describe('matchOrders', () => {
it('Should throw if left order is not fillable', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -610,16 +610,16 @@ describe('matchOrders', () => {
it('Should throw if right order is not fillable', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -635,16 +635,16 @@ describe('matchOrders', () => {
it('should throw if there is not a positive spread', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -658,16 +658,16 @@ describe('matchOrders', () => {
it('should throw if the left maker asset is not equal to the right taker asset ', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -685,18 +685,18 @@ describe('matchOrders', () => {
it('should throw if the right maker asset is not equal to the left taker asset', async () => {
// Create orders to match
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feeRecipientAddress: feeRecipientAddressRight,
@@ -711,18 +711,18 @@ describe('matchOrders', () => {
it('should transfer correct amounts when left order maker asset is an ERC721 token', async () => {
// Create orders to match
const erc721TokenToTransfer = erc721LeftMakerAssetIds[0];
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
- makerAssetData: assetProxyUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
makerAssetAmount: new BigNumber(1),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: new BigNumber(1),
feeRecipientAddress: feeRecipientAddressRight,
@@ -746,18 +746,18 @@ describe('matchOrders', () => {
it('should transfer correct amounts when right order maker asset is an ERC721 token', async () => {
// Create orders to match
const erc721TokenToTransfer = erc721RightMakerAssetIds[0];
- const signedOrderLeft = orderFactoryLeft.newSignedOrder({
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
makerAddress: makerAddressLeft,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
takerAssetAmount: new BigNumber(1),
feeRecipientAddress: feeRecipientAddressLeft,
});
- const signedOrderRight = orderFactoryRight.newSignedOrder({
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight,
- makerAssetData: assetProxyUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: new BigNumber(1),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
feeRecipientAddress: feeRecipientAddressRight,
diff --git a/packages/contracts/test/exchange/signature_validator.ts b/packages/contracts/test/exchange/signature_validator.ts
index 8cd6409a5..ef154bf9b 100644
--- a/packages/contracts/test/exchange/signature_validator.ts
+++ b/packages/contracts/test/exchange/signature_validator.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { addSignedMessagePrefix, assetProxyUtils, MessagePrefixType, orderHashUtils } from '@0xproject/order-utils';
+import { addSignedMessagePrefix, assetDataUtils, MessagePrefixType, orderHashUtils } from '@0xproject/order-utils';
import { RevertReason, SignatureType, SignedOrder } from '@0xproject/types';
import * as chai from 'chai';
import { LogWithDecodedArgs } from 'ethereum-types';
@@ -78,8 +78,8 @@ describe('MixinSignatureValidator', () => {
exchangeAddress: signatureValidator.address,
makerAddress,
feeRecipientAddress: addressUtils.generatePseudoRandomAddress(),
- makerAssetData: assetProxyUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
};
signerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
notSignerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(notSignerAddress)];
@@ -95,7 +95,7 @@ describe('MixinSignatureValidator', () => {
describe('isValidSignature', () => {
beforeEach(async () => {
- signedOrder = orderFactory.newSignedOrder();
+ signedOrder = await orderFactory.newSignedOrderAsync();
});
it('should revert when signature is empty', async () => {
diff --git a/packages/contracts/test/exchange/transactions.ts b/packages/contracts/test/exchange/transactions.ts
index 0d66b11b8..2bdd96b16 100644
--- a/packages/contracts/test/exchange/transactions.ts
+++ b/packages/contracts/test/exchange/transactions.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { assetDataUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
import { OrderWithoutExchangeAddress, RevertReason, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
@@ -88,7 +88,7 @@ describe('Exchange transactions', () => {
artifacts.Exchange,
provider,
txDefaults,
- assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
);
exchangeWrapper = new ExchangeWrapper(exchange, provider);
await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
@@ -107,8 +107,8 @@ describe('Exchange transactions', () => {
exchangeAddress: exchange.address,
makerAddress,
feeRecipientAddress,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultMakerTokenAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultTakerTokenAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerTokenAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerTokenAddress),
};
makerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
takerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(takerAddress)];
@@ -121,7 +121,7 @@ describe('Exchange transactions', () => {
let takerAssetFillAmount: BigNumber;
beforeEach(async () => {
erc20Balances = await erc20Wrapper.getBalancesAsync();
- signedOrder = orderFactory.newSignedOrder();
+ signedOrder = await orderFactory.newSignedOrderAsync();
orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
@@ -226,7 +226,7 @@ describe('Exchange transactions', () => {
it("should cancel an order if called from the order's sender", async () => {
const orderSalt = new BigNumber(0);
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
senderAddress: exchangeWrapperContract.address,
salt: orderSalt,
});
@@ -265,7 +265,7 @@ describe('Exchange transactions', () => {
it("should not cancel an order if not called from the order's sender", async () => {
const orderSalt = new BigNumber(0);
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
senderAddress: exchangeWrapperContract.address,
salt: orderSalt,
});
@@ -349,14 +349,14 @@ describe('Exchange transactions', () => {
exchangeAddress: exchange.address,
makerAddress,
feeRecipientAddress,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultMakerTokenAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultTakerTokenAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerTokenAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerTokenAddress),
};
whitelistOrderFactory = new OrderFactory(makerPrivateKey, defaultOrderParams);
});
beforeEach(async () => {
- signedOrder = whitelistOrderFactory.newSignedOrder();
+ signedOrder = await whitelistOrderFactory.newSignedOrderAsync();
erc20Balances = await erc20Wrapper.getBalancesAsync();
});
diff --git a/packages/contracts/test/exchange/wrapper.ts b/packages/contracts/test/exchange/wrapper.ts
index 655d55b83..d48441dca 100644
--- a/packages/contracts/test/exchange/wrapper.ts
+++ b/packages/contracts/test/exchange/wrapper.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils } from '@0xproject/order-utils';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
import { RevertReason, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
@@ -13,13 +13,14 @@ import { ERC721ProxyContract } from '../../generated_contract_wrappers/erc721_pr
import { ExchangeContract } from '../../generated_contract_wrappers/exchange';
import { artifacts } from '../utils/artifacts';
import { expectTransactionFailedAsync } from '../utils/assertions';
+import { getLatestBlockTimestampAsync, increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
import { chaiSetup } from '../utils/chai_setup';
import { constants } from '../utils/constants';
import { ERC20Wrapper } from '../utils/erc20_wrapper';
import { ERC721Wrapper } from '../utils/erc721_wrapper';
import { ExchangeWrapper } from '../utils/exchange_wrapper';
import { OrderFactory } from '../utils/order_factory';
-import { ERC20BalancesByOwner } from '../utils/types';
+import { ERC20BalancesByOwner, OrderStatus } from '../utils/types';
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
chaiSetup.configure();
@@ -84,7 +85,7 @@ describe('Exchange wrappers', () => {
artifacts.Exchange,
provider,
txDefaults,
- assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
);
exchangeWrapper = new ExchangeWrapper(exchange, provider);
await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
@@ -111,8 +112,8 @@ describe('Exchange wrappers', () => {
exchangeAddress: exchange.address,
makerAddress,
feeRecipientAddress,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultMakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultTakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress),
};
const privateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
orderFactory = new OrderFactory(privateKey, defaultOrderParams);
@@ -126,7 +127,7 @@ describe('Exchange wrappers', () => {
});
describe('fillOrKillOrder', () => {
it('should transfer the correct amounts', async () => {
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
});
@@ -170,8 +171,9 @@ describe('Exchange wrappers', () => {
});
it('should throw if a signedOrder is expired', async () => {
- const signedOrder = orderFactory.newSignedOrder({
- expirationTimeSeconds: new BigNumber(Math.floor((Date.now() - 10000) / 1000)),
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ expirationTimeSeconds: new BigNumber(currentTimestamp).sub(10),
});
return expectTransactionFailedAsync(
@@ -181,7 +183,7 @@ describe('Exchange wrappers', () => {
});
it('should throw if entire takerAssetFillAmount not filled', async () => {
- const signedOrder = orderFactory.newSignedOrder();
+ const signedOrder = await orderFactory.newSignedOrderAsync();
await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, {
takerAssetFillAmount: signedOrder.takerAssetAmount.div(2),
@@ -196,7 +198,7 @@ describe('Exchange wrappers', () => {
describe('fillOrderNoThrow', () => {
it('should transfer the correct amounts', async () => {
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
});
@@ -245,7 +247,7 @@ describe('Exchange wrappers', () => {
});
it('should not change erc20Balances if maker erc20Balances are too low to fill order', async () => {
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18),
});
@@ -255,7 +257,7 @@ describe('Exchange wrappers', () => {
});
it('should not change erc20Balances if taker erc20Balances are too low to fill order', async () => {
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18),
});
@@ -265,7 +267,7 @@ describe('Exchange wrappers', () => {
});
it('should not change erc20Balances if maker allowances are too low to fill order', async () => {
- const signedOrder = orderFactory.newSignedOrder();
+ const signedOrder = await orderFactory.newSignedOrderAsync();
await web3Wrapper.awaitTransactionSuccessAsync(
await erc20TokenA.approve.sendTransactionAsync(erc20Proxy.address, new BigNumber(0), {
from: makerAddress,
@@ -285,7 +287,7 @@ describe('Exchange wrappers', () => {
});
it('should not change erc20Balances if taker allowances are too low to fill order', async () => {
- const signedOrder = orderFactory.newSignedOrder();
+ const signedOrder = await orderFactory.newSignedOrderAsync();
await web3Wrapper.awaitTransactionSuccessAsync(
await erc20TokenB.approve.sendTransactionAsync(erc20Proxy.address, new BigNumber(0), {
from: takerAddress,
@@ -306,10 +308,10 @@ describe('Exchange wrappers', () => {
it('should not change erc20Balances if makerAssetAddress is ZRX, makerAssetAmount + makerFee > maker balance', async () => {
const makerZRXBalance = new BigNumber(erc20Balances[makerAddress][zrxToken.address]);
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: makerZRXBalance,
makerFee: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
});
await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
const newBalances = await erc20Wrapper.getBalancesAsync();
@@ -318,10 +320,10 @@ describe('Exchange wrappers', () => {
it('should not change erc20Balances if makerAssetAddress is ZRX, makerAssetAmount + makerFee > maker allowance', async () => {
const makerZRXAllowance = await zrxToken.allowance.callAsync(makerAddress, erc20Proxy.address);
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(makerZRXAllowance),
makerFee: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
});
await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
const newBalances = await erc20Wrapper.getBalancesAsync();
@@ -330,10 +332,10 @@ describe('Exchange wrappers', () => {
it('should not change erc20Balances if takerAssetAddress is ZRX, takerAssetAmount + takerFee > taker balance', async () => {
const takerZRXBalance = new BigNumber(erc20Balances[takerAddress][zrxToken.address]);
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
takerAssetAmount: takerZRXBalance,
takerFee: new BigNumber(1),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
});
await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
const newBalances = await erc20Wrapper.getBalancesAsync();
@@ -342,10 +344,10 @@ describe('Exchange wrappers', () => {
it('should not change erc20Balances if takerAssetAddress is ZRX, takerAssetAmount + takerFee > taker allowance', async () => {
const takerZRXAllowance = await zrxToken.allowance.callAsync(takerAddress, erc20Proxy.address);
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
takerAssetAmount: new BigNumber(takerZRXAllowance),
takerFee: new BigNumber(1),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
});
await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
const newBalances = await erc20Wrapper.getBalancesAsync();
@@ -356,11 +358,11 @@ describe('Exchange wrappers', () => {
// Construct Exchange parameters
const makerAssetId = erc721MakerAssetId;
const takerAssetId = erc721TakerAssetId;
- const signedOrder = orderFactory.newSignedOrder({
+ const signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerAssetAmount: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
- takerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
});
// Verify pre-conditions
const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
@@ -388,9 +390,9 @@ describe('Exchange wrappers', () => {
let signedOrders: SignedOrder[];
beforeEach(async () => {
signedOrders = [
- orderFactory.newSignedOrder(),
- orderFactory.newSignedOrder(),
- orderFactory.newSignedOrder(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
];
});
@@ -696,11 +698,11 @@ describe('Exchange wrappers', () => {
it('should throw when a signedOrder does not use the same takerAssetAddress', async () => {
signedOrders = [
- orderFactory.newSignedOrder(),
- orderFactory.newSignedOrder({
- takerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync({
+ takerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
}),
- orderFactory.newSignedOrder(),
+ await orderFactory.newSignedOrderAsync(),
];
return expectTransactionFailedAsync(
@@ -796,10 +798,10 @@ describe('Exchange wrappers', () => {
it('should not fill a signedOrder that does not use the same takerAssetAddress', async () => {
signedOrders = [
- orderFactory.newSignedOrder(),
- orderFactory.newSignedOrder(),
- orderFactory.newSignedOrder({
- takerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync({
+ takerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
}),
];
const takerAssetFillAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18);
@@ -914,11 +916,11 @@ describe('Exchange wrappers', () => {
it('should throw when a signedOrder does not use the same makerAssetAddress', async () => {
signedOrders = [
- orderFactory.newSignedOrder(),
- orderFactory.newSignedOrder({
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
}),
- orderFactory.newSignedOrder(),
+ await orderFactory.newSignedOrderAsync(),
];
return expectTransactionFailedAsync(
@@ -1012,10 +1014,10 @@ describe('Exchange wrappers', () => {
it('should not fill a signedOrder that does not use the same makerAssetAddress', async () => {
signedOrders = [
- orderFactory.newSignedOrder(),
- orderFactory.newSignedOrder(),
- orderFactory.newSignedOrder({
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
}),
];
@@ -1069,5 +1071,189 @@ describe('Exchange wrappers', () => {
expect(erc20Balances).to.be.deep.equal(newBalances);
});
});
+
+ describe('getOrdersInfo', () => {
+ beforeEach(async () => {
+ signedOrders = [
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ ];
+ });
+ it('should get the correct information for multiple unfilled orders', async () => {
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.FILLABLE;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple partially filled orders', async () => {
+ const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
+ const expectedOrderStatus = OrderStatus.FILLABLE;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple fully filled orders', async () => {
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount;
+ const expectedOrderStatus = OrderStatus.FULLY_FILLED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple cancelled and unfilled orders', async () => {
+ await exchangeWrapper.batchCancelOrdersAsync(signedOrders, makerAddress);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.CANCELLED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple cancelled and partially filled orders', async () => {
+ const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
+ await exchangeWrapper.batchCancelOrdersAsync(signedOrders, makerAddress);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
+ const expectedOrderStatus = OrderStatus.CANCELLED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple expired and unfilled orders', async () => {
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrders[0].expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.EXPIRED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple expired and partially filled orders', async () => {
+ const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrders[0].expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
+ const expectedOrderStatus = OrderStatus.EXPIRED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for a mix of unfilled, partially filled, fully filled, cancelled, and expired orders', async () => {
+ const unfilledOrder = await orderFactory.newSignedOrderAsync();
+ const partiallyFilledOrder = await orderFactory.newSignedOrderAsync();
+ await exchangeWrapper.fillOrderAsync(partiallyFilledOrder, takerAddress, {
+ takerAssetFillAmount: partiallyFilledOrder.takerAssetAmount.div(2),
+ });
+ const fullyFilledOrder = await orderFactory.newSignedOrderAsync();
+ await exchangeWrapper.fillOrderAsync(fullyFilledOrder, takerAddress);
+ const cancelledOrder = await orderFactory.newSignedOrderAsync();
+ await exchangeWrapper.cancelOrderAsync(cancelledOrder, makerAddress);
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const expiredOrder = await orderFactory.newSignedOrderAsync({
+ expirationTimeSeconds: new BigNumber(currentTimestamp),
+ });
+ signedOrders = [unfilledOrder, partiallyFilledOrder, fullyFilledOrder, cancelledOrder, expiredOrder];
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(5);
+
+ const expectedUnfilledOrderHash = orderHashUtils.getOrderHashHex(unfilledOrder);
+ const expectedUnfilledTakerAssetFilledAmount = new BigNumber(0);
+ const expectedUnfilledOrderStatus = OrderStatus.FILLABLE;
+ const unfilledOrderInfo = ordersInfo[0];
+ expect(unfilledOrderInfo.orderHash).to.be.equal(expectedUnfilledOrderHash);
+ expect(unfilledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedUnfilledTakerAssetFilledAmount,
+ );
+ expect(unfilledOrderInfo.orderStatus).to.be.equal(expectedUnfilledOrderStatus);
+
+ const expectedPartialOrderHash = orderHashUtils.getOrderHashHex(partiallyFilledOrder);
+ const expectedPartialTakerAssetFilledAmount = partiallyFilledOrder.takerAssetAmount.div(2);
+ const expectedPartialOrderStatus = OrderStatus.FILLABLE;
+ const partialOrderInfo = ordersInfo[1];
+ expect(partialOrderInfo.orderHash).to.be.equal(expectedPartialOrderHash);
+ expect(partialOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedPartialTakerAssetFilledAmount,
+ );
+ expect(partialOrderInfo.orderStatus).to.be.equal(expectedPartialOrderStatus);
+
+ const expectedFilledOrderHash = orderHashUtils.getOrderHashHex(fullyFilledOrder);
+ const expectedFilledTakerAssetFilledAmount = fullyFilledOrder.takerAssetAmount;
+ const expectedFilledOrderStatus = OrderStatus.FULLY_FILLED;
+ const filledOrderInfo = ordersInfo[2];
+ expect(filledOrderInfo.orderHash).to.be.equal(expectedFilledOrderHash);
+ expect(filledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedFilledTakerAssetFilledAmount,
+ );
+ expect(filledOrderInfo.orderStatus).to.be.equal(expectedFilledOrderStatus);
+
+ const expectedCancelledOrderHash = orderHashUtils.getOrderHashHex(cancelledOrder);
+ const expectedCancelledTakerAssetFilledAmount = new BigNumber(0);
+ const expectedCancelledOrderStatus = OrderStatus.CANCELLED;
+ const cancelledOrderInfo = ordersInfo[3];
+ expect(cancelledOrderInfo.orderHash).to.be.equal(expectedCancelledOrderHash);
+ expect(cancelledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedCancelledTakerAssetFilledAmount,
+ );
+ expect(cancelledOrderInfo.orderStatus).to.be.equal(expectedCancelledOrderStatus);
+
+ const expectedExpiredOrderHash = orderHashUtils.getOrderHashHex(expiredOrder);
+ const expectedExpiredTakerAssetFilledAmount = new BigNumber(0);
+ const expectedExpiredOrderStatus = OrderStatus.EXPIRED;
+ const expiredOrderInfo = ordersInfo[4];
+ expect(expiredOrderInfo.orderHash).to.be.equal(expectedExpiredOrderHash);
+ expect(expiredOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedExpiredTakerAssetFilledAmount,
+ );
+ expect(expiredOrderInfo.orderStatus).to.be.equal(expectedExpiredOrderStatus);
+ });
+ });
});
}); // tslint:disable-line:max-file-line-count
diff --git a/packages/contracts/test/forwarder/forwarder.ts b/packages/contracts/test/forwarder/forwarder.ts
index f0bf6ac03..0256d7d81 100644
--- a/packages/contracts/test/forwarder/forwarder.ts
+++ b/packages/contracts/test/forwarder/forwarder.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils } from '@0xproject/order-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
import { RevertReason, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
@@ -88,8 +88,8 @@ describe(ContractName.Forwarder, () => {
weth = new DummyERC20TokenContract(wethContract.abi, wethContract.address, provider);
erc20Wrapper.addDummyTokenContract(weth);
- const wethAssetData = assetProxyUtils.encodeERC20AssetData(wethContract.address);
- const zrxAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
+ const wethAssetData = assetDataUtils.encodeERC20AssetData(wethContract.address);
+ const zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
const exchangeInstance = await ExchangeContract.deployFrom0xArtifactAsync(
artifacts.Exchange,
provider,
@@ -114,8 +114,8 @@ describe(ContractName.Forwarder, () => {
exchangeAddress: exchangeInstance.address,
makerAddress,
feeRecipientAddress,
- makerAssetData: assetProxyUtils.encodeERC20AssetData(defaultMakerAssetAddress),
- takerAssetData: assetProxyUtils.encodeERC20AssetData(defaultTakerAssetAddress),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), DECIMALS_DEFAULT),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), DECIMALS_DEFAULT),
makerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
@@ -148,14 +148,14 @@ describe(ContractName.Forwarder, () => {
await blockchainLifecycle.startAsync();
feeProportion = 0;
erc20Balances = await erc20Wrapper.getBalancesAsync();
- signedOrder = orderFactory.newSignedOrder();
+ signedOrder = await orderFactory.newSignedOrderAsync();
signedOrders = [signedOrder];
- feeOrder = orderFactory.newSignedOrder({
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ feeOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
});
feeOrders = [feeOrder];
- orderWithFee = orderFactory.newSignedOrder({
+ orderWithFee = await orderFactory.newSignedOrderAsync({
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
});
signedOrdersWithFee = [orderWithFee];
@@ -238,8 +238,8 @@ describe(ContractName.Forwarder, () => {
expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(new BigNumber(0));
});
it('should fill the order when token is ZRX with fees', async () => {
- orderWithFee = orderFactory.newSignedOrder({
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ orderWithFee = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
});
signedOrdersWithFee = [orderWithFee];
@@ -260,8 +260,8 @@ describe(ContractName.Forwarder, () => {
expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(new BigNumber(0));
});
it('should fail if sent an ETH amount too high', async () => {
- signedOrder = orderFactory.newSignedOrder({
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
});
const fillAmount = signedOrder.takerAssetAmount.times(2);
@@ -274,12 +274,12 @@ describe(ContractName.Forwarder, () => {
);
});
it('should fail if fee abstraction amount is too high', async () => {
- orderWithFee = orderFactory.newSignedOrder({
+ orderWithFee = await orderFactory.newSignedOrderAsync({
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), DECIMALS_DEFAULT),
});
signedOrdersWithFee = [orderWithFee];
- feeOrder = orderFactory.newSignedOrder({
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ feeOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
});
feeOrders = [feeOrder];
@@ -294,11 +294,11 @@ describe(ContractName.Forwarder, () => {
});
it('throws when mixed ERC721 and ERC20 assets with ERC20 first', async () => {
const makerAssetId = erc721MakerAssetIds[0];
- const erc721SignedOrder = orderFactory.newSignedOrder({
+ const erc721SignedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
});
- const erc20SignedOrder = orderFactory.newSignedOrder();
+ const erc20SignedOrder = await orderFactory.newSignedOrderAsync();
signedOrders = [erc20SignedOrder, erc721SignedOrder];
const fillAmountWei = erc20SignedOrder.takerAssetAmount.plus(erc721SignedOrder.takerAssetAmount);
return expectTransactionFailedAsync(
@@ -418,8 +418,8 @@ describe(ContractName.Forwarder, () => {
expect(takerBalanceAfter).to.be.bignumber.eq(takerBalanceBefore.plus(makerAssetAmount));
});
it('should buy the exact amount of assets when buying zrx with fee abstraction', async () => {
- signedOrder = orderFactory.newSignedOrder({
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
});
signedOrdersWithFee = [signedOrder];
@@ -447,8 +447,8 @@ describe(ContractName.Forwarder, () => {
expect(takerWeiBalanceAfter).to.be.bignumber.equal(takerWeiBalanceBefore.minus(expectedCostAfterGas));
});
it('throws if fees are higher than 5% when buying zrx', async () => {
- const highFeeZRXOrder = orderFactory.newSignedOrder({
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ const highFeeZRXOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
makerAssetAmount: signedOrder.makerAssetAmount,
takerFee: signedOrder.makerAssetAmount.times(0.06),
});
@@ -470,7 +470,7 @@ describe(ContractName.Forwarder, () => {
);
});
it('throws if fees are higher than 5% when buying erc20', async () => {
- const highFeeERC20Order = orderFactory.newSignedOrder({
+ const highFeeERC20Order = await orderFactory.newSignedOrderAsync({
takerFee: signedOrder.makerAssetAmount.times(0.06),
});
signedOrdersWithFee = [highFeeERC20Order];
@@ -544,9 +544,9 @@ describe(ContractName.Forwarder, () => {
describe('marketBuyTokensWithEth - ERC721', async () => {
it('buys ERC721 assets', async () => {
const makerAssetId = erc721MakerAssetIds[0];
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
});
feeOrders = [];
signedOrders = [signedOrder];
@@ -566,10 +566,10 @@ describe(ContractName.Forwarder, () => {
});
it('buys ERC721 assets with fee abstraction', async () => {
const makerAssetId = erc721MakerAssetIds[0];
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
});
signedOrders = [signedOrder];
const makerAssetAmount = new BigNumber(signedOrders.length);
@@ -588,10 +588,10 @@ describe(ContractName.Forwarder, () => {
});
it('buys ERC721 assets with fee abstraction and pays fee to fee recipient', async () => {
const makerAssetId = erc721MakerAssetIds[0];
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
});
signedOrders = [signedOrder];
feeProportion = 100;
@@ -630,15 +630,15 @@ describe(ContractName.Forwarder, () => {
it('buys multiple ERC721 assets with fee abstraction and pays fee to fee recipient', async () => {
const makerAssetId1 = erc721MakerAssetIds[0];
const makerAssetId2 = erc721MakerAssetIds[1];
- const signedOrder1 = orderFactory.newSignedOrder({
+ const signedOrder1 = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId1),
});
- const signedOrder2 = orderFactory.newSignedOrder({
+ const signedOrder2 = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId2),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId2),
});
signedOrders = [signedOrder1, signedOrder2];
feeProportion = 10;
@@ -665,23 +665,23 @@ describe(ContractName.Forwarder, () => {
// There are two fee orders, but the first fee order is partially filled while
// the Forwarding contract tx is in the mempool.
const erc721MakerAssetAmount = new BigNumber(1);
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: erc721MakerAssetAmount,
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), DECIMALS_DEFAULT),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(6), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
});
signedOrders = [signedOrder];
- const firstFeeOrder = orderFactory.newSignedOrder({
+ const firstFeeOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(8), DECIMALS_DEFAULT),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(0.1), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), DECIMALS_DEFAULT),
});
- const secondFeeOrder = orderFactory.newSignedOrder({
+ const secondFeeOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(8), DECIMALS_DEFAULT),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(0.12), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), DECIMALS_DEFAULT),
});
feeOrders = [firstFeeOrder, secondFeeOrder];
@@ -729,24 +729,24 @@ describe(ContractName.Forwarder, () => {
// There are two fee orders, but the first fee order is partially filled while
// the Forwarding contract tx is in the mempool.
const erc721MakerAssetAmount = new BigNumber(1);
- signedOrder = orderFactory.newSignedOrder({
+ signedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: erc721MakerAssetAmount,
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), DECIMALS_DEFAULT),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(6), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
});
const zrxMakerAssetAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(8), DECIMALS_DEFAULT);
signedOrders = [signedOrder];
- const firstFeeOrder = orderFactory.newSignedOrder({
+ const firstFeeOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: zrxMakerAssetAmount,
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(0.1), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), DECIMALS_DEFAULT),
});
- const secondFeeOrder = orderFactory.newSignedOrder({
+ const secondFeeOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: zrxMakerAssetAmount,
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(0.12), DECIMALS_DEFAULT),
- makerAssetData: assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), DECIMALS_DEFAULT),
});
feeOrders = [firstFeeOrder, secondFeeOrder];
@@ -778,11 +778,11 @@ describe(ContractName.Forwarder, () => {
});
it('throws when mixed ERC721 and ERC20 assets', async () => {
const makerAssetId = erc721MakerAssetIds[0];
- const erc721SignedOrder = orderFactory.newSignedOrder({
+ const erc721SignedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
});
- const erc20SignedOrder = orderFactory.newSignedOrder();
+ const erc20SignedOrder = await orderFactory.newSignedOrderAsync();
signedOrders = [erc721SignedOrder, erc20SignedOrder];
const makerAssetAmount = new BigNumber(signedOrders.length);
const fillAmountWei = erc20SignedOrder.takerAssetAmount.plus(erc721SignedOrder.takerAssetAmount);
@@ -796,11 +796,11 @@ describe(ContractName.Forwarder, () => {
});
it('throws when mixed ERC721 and ERC20 assets with ERC20 first', async () => {
const makerAssetId = erc721MakerAssetIds[0];
- const erc721SignedOrder = orderFactory.newSignedOrder({
+ const erc721SignedOrder = await orderFactory.newSignedOrderAsync({
makerAssetAmount: new BigNumber(1),
- makerAssetData: assetProxyUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
});
- const erc20SignedOrder = orderFactory.newSignedOrder();
+ const erc20SignedOrder = await orderFactory.newSignedOrderAsync();
signedOrders = [erc20SignedOrder, erc721SignedOrder];
const makerAssetAmount = new BigNumber(signedOrders.length);
const fillAmountWei = erc20SignedOrder.takerAssetAmount.plus(erc721SignedOrder.takerAssetAmount);
diff --git a/packages/contracts/test/libraries/lib_bytes.ts b/packages/contracts/test/libraries/lib_bytes.ts
index c80b61e19..1c497a226 100644
--- a/packages/contracts/test/libraries/lib_bytes.ts
+++ b/packages/contracts/test/libraries/lib_bytes.ts
@@ -1,5 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
-import { assetProxyUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { generatePseudoRandomSalt } from '@0xproject/order-utils';
import { RevertReason } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import BN = require('bn.js');
@@ -12,6 +12,7 @@ import { artifacts } from '../utils/artifacts';
import { expectContractCallFailed } from '../utils/assertions';
import { chaiSetup } from '../utils/chai_setup';
import { constants } from '../utils/constants';
+import { typeEncodingUtils } from '../utils/type_encoding_utils';
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
chaiSetup.configure();
@@ -74,20 +75,20 @@ describe('LibBytes', () => {
shortData = '0xffffaa';
const encodedShortData = ethUtil.toBuffer(shortData);
const shortDataLength = new BigNumber(encodedShortData.byteLength);
- const encodedShortDataLength = assetProxyUtils.encodeUint256(shortDataLength);
+ const encodedShortDataLength = typeEncodingUtils.encodeUint256(shortDataLength);
shortTestBytesAsBuffer = Buffer.concat([encodedShortDataLength, encodedShortData]);
shortTestBytes = ethUtil.bufferToHex(shortTestBytesAsBuffer);
// Create test bytes one word in length
- wordOfData = ethUtil.bufferToHex(assetProxyUtils.encodeUint256(generatePseudoRandomSalt()));
+ wordOfData = ethUtil.bufferToHex(typeEncodingUtils.encodeUint256(generatePseudoRandomSalt()));
const encodedWordOfData = ethUtil.toBuffer(wordOfData);
const wordOfDataLength = new BigNumber(encodedWordOfData.byteLength);
- const encodedWordOfDataLength = assetProxyUtils.encodeUint256(wordOfDataLength);
+ const encodedWordOfDataLength = typeEncodingUtils.encodeUint256(wordOfDataLength);
wordOfTestBytesAsBuffer = Buffer.concat([encodedWordOfDataLength, encodedWordOfData]);
wordOfTestBytes = ethUtil.bufferToHex(wordOfTestBytesAsBuffer);
// Create long test bytes (combines short test bytes with word of test bytes)
longData = ethUtil.bufferToHex(Buffer.concat([encodedShortData, encodedWordOfData]));
const longDataLength = new BigNumber(encodedShortData.byteLength + encodedWordOfData.byteLength);
- const encodedLongDataLength = assetProxyUtils.encodeUint256(longDataLength);
+ const encodedLongDataLength = typeEncodingUtils.encodeUint256(longDataLength);
longTestBytesAsBuffer = Buffer.concat([encodedLongDataLength, encodedShortData, encodedWordOfData]);
longTestBytes = ethUtil.bufferToHex(longTestBytesAsBuffer);
});
diff --git a/packages/contracts/test/multisig/asset_proxy_owner.ts b/packages/contracts/test/multisig/asset_proxy_owner.ts
index 6a9843153..6b98605d3 100644
--- a/packages/contracts/test/multisig/asset_proxy_owner.ts
+++ b/packages/contracts/test/multisig/asset_proxy_owner.ts
@@ -18,9 +18,9 @@ import {
expectContractCreationFailedWithoutReason,
expectTransactionFailedWithoutReasonAsync,
} from '../utils/assertions';
+import { increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
import { chaiSetup } from '../utils/chai_setup';
import { constants } from '../utils/constants';
-import { increaseTimeAndMineBlockAsync } from '../utils/increase_time';
import { MultiSigWrapper } from '../utils/multi_sig_wrapper';
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
diff --git a/packages/contracts/test/multisig/multi_sig_with_time_lock.ts b/packages/contracts/test/multisig/multi_sig_with_time_lock.ts
index a8e9243a9..8eeeeca6b 100644
--- a/packages/contracts/test/multisig/multi_sig_with_time_lock.ts
+++ b/packages/contracts/test/multisig/multi_sig_with_time_lock.ts
@@ -9,9 +9,9 @@ import {
} from '../../generated_contract_wrappers/multi_sig_wallet_with_time_lock';
import { artifacts } from '../utils/artifacts';
import { expectTransactionFailedWithoutReasonAsync } from '../utils/assertions';
+import { increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
import { chaiSetup } from '../utils/chai_setup';
import { constants } from '../utils/constants';
-import { increaseTimeAndMineBlockAsync } from '../utils/increase_time';
import { MultiSigWrapper } from '../utils/multi_sig_wrapper';
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
diff --git a/packages/contracts/test/utils/asset_wrapper.ts b/packages/contracts/test/utils/asset_wrapper.ts
index f291170a2..e3a4800c6 100644
--- a/packages/contracts/test/utils/asset_wrapper.ts
+++ b/packages/contracts/test/utils/asset_wrapper.ts
@@ -1,4 +1,4 @@
-import { assetProxyUtils } from '@0xproject/order-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
import { AssetProxyId } from '@0xproject/types';
import { BigNumber, errorUtils } from '@0xproject/utils';
import * as _ from 'lodash';
@@ -17,7 +17,7 @@ interface ProxyIdToAssetWrappers {
* the logic that uses it does not need to care what standard a token belongs to.
*/
export class AssetWrapper {
- private _proxyIdToAssetWrappers: ProxyIdToAssetWrappers;
+ private readonly _proxyIdToAssetWrappers: ProxyIdToAssetWrappers;
constructor(assetWrappers: AbstractAssetWrapper[]) {
this._proxyIdToAssetWrappers = {};
_.each(assetWrappers, assetWrapper => {
@@ -26,7 +26,7 @@ export class AssetWrapper {
});
}
public async getBalanceAsync(userAddress: string, assetData: string): Promise<BigNumber> {
- const proxyId = assetProxyUtils.decodeAssetDataId(assetData);
+ const proxyId = assetDataUtils.decodeAssetProxyId(assetData);
switch (proxyId) {
case AssetProxyId.ERC20: {
const erc20Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC20Wrapper;
@@ -35,7 +35,7 @@ export class AssetWrapper {
}
case AssetProxyId.ERC721: {
const assetWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
- const assetProxyData = assetProxyUtils.decodeERC721AssetData(assetData);
+ const assetProxyData = assetDataUtils.decodeERC721AssetData(assetData);
const isOwner = await assetWrapper.isOwnerAsync(
userAddress,
assetProxyData.tokenAddress,
@@ -49,7 +49,7 @@ export class AssetWrapper {
}
}
public async setBalanceAsync(userAddress: string, assetData: string, desiredBalance: BigNumber): Promise<void> {
- const proxyId = assetProxyUtils.decodeAssetDataId(assetData);
+ const proxyId = assetDataUtils.decodeAssetProxyId(assetData);
switch (proxyId) {
case AssetProxyId.ERC20: {
const erc20Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC20Wrapper;
@@ -61,7 +61,7 @@ export class AssetWrapper {
throw new Error(`Balance for ERC721 token can only be set to 0 or 1. Got: ${desiredBalance}`);
}
const erc721Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
- const assetProxyData = assetProxyUtils.decodeERC721AssetData(assetData);
+ const assetProxyData = assetDataUtils.decodeERC721AssetData(assetData);
const doesTokenExist = erc721Wrapper.doesTokenExistAsync(
assetProxyData.tokenAddress,
assetProxyData.tokenId,
@@ -107,7 +107,7 @@ export class AssetWrapper {
}
}
public async getProxyAllowanceAsync(userAddress: string, assetData: string): Promise<BigNumber> {
- const proxyId = assetProxyUtils.decodeAssetDataId(assetData);
+ const proxyId = assetDataUtils.decodeAssetProxyId(assetData);
switch (proxyId) {
case AssetProxyId.ERC20: {
const erc20Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC20Wrapper;
@@ -116,7 +116,7 @@ export class AssetWrapper {
}
case AssetProxyId.ERC721: {
const assetWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
- const erc721ProxyData = assetProxyUtils.decodeERC721AssetData(assetData);
+ const erc721ProxyData = assetDataUtils.decodeERC721AssetData(assetData);
const isProxyApprovedForAll = await assetWrapper.isProxyApprovedForAllAsync(
userAddress,
erc721ProxyData.tokenAddress,
@@ -141,7 +141,7 @@ export class AssetWrapper {
assetData: string,
desiredAllowance: BigNumber,
): Promise<void> {
- const proxyId = assetProxyUtils.decodeAssetDataId(assetData);
+ const proxyId = assetDataUtils.decodeAssetProxyId(assetData);
switch (proxyId) {
case AssetProxyId.ERC20: {
const erc20Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC20Wrapper;
@@ -159,7 +159,7 @@ export class AssetWrapper {
);
}
const erc721Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
- const assetProxyData = assetProxyUtils.decodeERC721AssetData(assetData);
+ const assetProxyData = assetDataUtils.decodeERC721AssetData(assetData);
const doesTokenExist = await erc721Wrapper.doesTokenExistAsync(
assetProxyData.tokenAddress,
diff --git a/packages/contracts/test/utils/increase_time.ts b/packages/contracts/test/utils/block_timestamp.ts
index 4565d8dbc..1159792c4 100644
--- a/packages/contracts/test/utils/increase_time.ts
+++ b/packages/contracts/test/utils/block_timestamp.ts
@@ -29,3 +29,12 @@ export async function increaseTimeAndMineBlockAsync(seconds: number): Promise<nu
return offset;
}
+
+/**
+ * Returns the timestamp of the latest block in seconds since the Unix epoch.
+ * @returns a new Promise which will resolve with the timestamp in seconds.
+ */
+export async function getLatestBlockTimestampAsync(): Promise<number> {
+ const currentBlock = await web3Wrapper.getBlockAsync('latest');
+ return currentBlock.timestamp;
+}
diff --git a/packages/contracts/test/utils/constants.ts b/packages/contracts/test/utils/constants.ts
index e8995f9d6..7dac38f56 100644
--- a/packages/contracts/test/utils/constants.ts
+++ b/packages/contracts/test/utils/constants.ts
@@ -17,6 +17,7 @@ const TESTRPC_PRIVATE_KEYS_STRINGS = [
];
export const constants = {
+ BASE_16: 16,
INVALID_OPCODE: 'invalid opcode',
TESTRPC_NETWORK_ID: 50,
// Note(albrow): In practice V8 and most other engines limit the minimum
@@ -47,4 +48,5 @@ export const constants = {
makerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18),
takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18),
},
+ WORD_LENGTH: 32,
};
diff --git a/packages/contracts/test/utils/core_combinatorial_utils.ts b/packages/contracts/test/utils/core_combinatorial_utils.ts
index 7c16ef201..44a5199c0 100644
--- a/packages/contracts/test/utils/core_combinatorial_utils.ts
+++ b/packages/contracts/test/utils/core_combinatorial_utils.ts
@@ -1,5 +1,5 @@
import {
- assetProxyUtils,
+ assetDataUtils,
BalanceAndProxyAllowanceLazyStore,
ExchangeTransferSimulator,
orderHashUtils,
@@ -72,7 +72,7 @@ export async function coreCombinatorialUtilsFactoryAsync(
erc20EighteenDecimalTokenB,
zrxToken,
] = await erc20Wrapper.deployDummyTokensAsync(erc20EighteenDecimalTokenCount, eighteenDecimals);
- const zrxAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
+ const zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
const erc20FiveDecimalTokenCount = 2;
const fiveDecimals = new BigNumber(5);
@@ -598,8 +598,8 @@ export class CoreCombinatorialUtils {
break;
case TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount:
- const takerAssetProxyId = assetProxyUtils.decodeAssetDataId(signedOrder.takerAssetData);
- const makerAssetProxyId = assetProxyUtils.decodeAssetDataId(signedOrder.makerAssetData);
+ const takerAssetProxyId = assetDataUtils.decodeAssetProxyId(signedOrder.takerAssetData);
+ const makerAssetProxyId = assetDataUtils.decodeAssetProxyId(signedOrder.makerAssetData);
const isEitherAssetERC721 =
takerAssetProxyId === AssetProxyId.ERC721 || makerAssetProxyId === AssetProxyId.ERC721;
if (isEitherAssetERC721) {
diff --git a/packages/contracts/test/utils/erc20_wrapper.ts b/packages/contracts/test/utils/erc20_wrapper.ts
index cf1433791..424aae579 100644
--- a/packages/contracts/test/utils/erc20_wrapper.ts
+++ b/packages/contracts/test/utils/erc20_wrapper.ts
@@ -1,4 +1,4 @@
-import { assetProxyUtils } from '@0xproject/order-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import { Provider } from 'ethereum-types';
@@ -13,11 +13,11 @@ import { ERC20BalancesByOwner } from './types';
import { txDefaults } from './web3_wrapper';
export class ERC20Wrapper {
- private _tokenOwnerAddresses: string[];
- private _contractOwnerAddress: string;
- private _web3Wrapper: Web3Wrapper;
- private _provider: Provider;
- private _dummyTokenContracts: DummyERC20TokenContract[];
+ private readonly _tokenOwnerAddresses: string[];
+ private readonly _contractOwnerAddress: string;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _provider: Provider;
+ private readonly _dummyTokenContracts: DummyERC20TokenContract[];
private _proxyContract?: ERC20ProxyContract;
private _proxyIdIfExists?: string;
constructor(provider: Provider, tokenOwnerAddresses: string[], contractOwnerAddress: string) {
@@ -154,7 +154,7 @@ export class ERC20Wrapper {
return tokenAddresses;
}
private _getTokenContractFromAssetData(assetData: string): DummyERC20TokenContract {
- const erc20ProxyData = assetProxyUtils.decodeERC20AssetData(assetData);
+ const erc20ProxyData = assetDataUtils.decodeERC20AssetData(assetData);
const tokenAddress = erc20ProxyData.tokenAddress;
const tokenContractIfExists = _.find(this._dummyTokenContracts, c => c.address === tokenAddress);
if (_.isUndefined(tokenContractIfExists)) {
diff --git a/packages/contracts/test/utils/erc721_wrapper.ts b/packages/contracts/test/utils/erc721_wrapper.ts
index a38dfb811..d023b4d02 100644
--- a/packages/contracts/test/utils/erc721_wrapper.ts
+++ b/packages/contracts/test/utils/erc721_wrapper.ts
@@ -13,11 +13,11 @@ import { ERC721TokenIdsByOwner } from './types';
import { txDefaults } from './web3_wrapper';
export class ERC721Wrapper {
- private _tokenOwnerAddresses: string[];
- private _contractOwnerAddress: string;
- private _web3Wrapper: Web3Wrapper;
- private _provider: Provider;
- private _dummyTokenContracts: DummyERC721TokenContract[];
+ private readonly _tokenOwnerAddresses: string[];
+ private readonly _contractOwnerAddress: string;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _provider: Provider;
+ private readonly _dummyTokenContracts: DummyERC721TokenContract[];
private _proxyContract?: ERC721ProxyContract;
private _proxyIdIfExists?: string;
private _initialTokenIdsByOwner: ERC721TokenIdsByOwner = {};
diff --git a/packages/contracts/test/utils/exchange_wrapper.ts b/packages/contracts/test/utils/exchange_wrapper.ts
index 155d0eeb0..490ea959b 100644
--- a/packages/contracts/test/utils/exchange_wrapper.ts
+++ b/packages/contracts/test/utils/exchange_wrapper.ts
@@ -11,9 +11,9 @@ import { orderUtils } from './order_utils';
import { OrderInfo, SignedTransaction } from './types';
export class ExchangeWrapper {
- private _exchange: ExchangeContract;
- private _web3Wrapper: Web3Wrapper;
- private _logDecoder: LogDecoder;
+ private readonly _exchange: ExchangeContract;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _logDecoder: LogDecoder;
constructor(exchangeContract: ExchangeContract, provider: Provider) {
this._exchange = exchangeContract;
this._web3Wrapper = new Web3Wrapper(provider);
@@ -223,6 +223,10 @@ export class ExchangeWrapper {
const orderInfo = (await this._exchange.getOrderInfo.callAsync(signedOrder)) as OrderInfo;
return orderInfo;
}
+ public async getOrdersInfoAsync(signedOrders: SignedOrder[]): Promise<OrderInfo[]> {
+ const ordersInfo = (await this._exchange.getOrdersInfo.callAsync(signedOrders)) as OrderInfo[];
+ return ordersInfo;
+ }
public async matchOrdersAsync(
signedOrderLeft: SignedOrder,
signedOrderRight: SignedOrder,
diff --git a/packages/contracts/test/utils/forwarder_wrapper.ts b/packages/contracts/test/utils/forwarder_wrapper.ts
index d227420ee..e39df14b1 100644
--- a/packages/contracts/test/utils/forwarder_wrapper.ts
+++ b/packages/contracts/test/utils/forwarder_wrapper.ts
@@ -1,4 +1,4 @@
-import { assetProxyUtils } from '@0xproject/order-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
import { AssetProxyId, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
@@ -18,13 +18,13 @@ const ZERO_AMOUNT = new BigNumber(0);
const INSUFFICENT_ORDERS_FOR_MAKER_AMOUNT = 'Unable to satisfy makerAssetFillAmount with provided orders';
export class ForwarderWrapper {
- private _web3Wrapper: Web3Wrapper;
- private _forwarderContract: ForwarderContract;
- private _logDecoder: LogDecoder;
- private _zrxAddress: string;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _forwarderContract: ForwarderContract;
+ private readonly _logDecoder: LogDecoder;
+ private readonly _zrxAddress: string;
private static _createOptimizedSellOrders(signedOrders: SignedOrder[]): MarketSellOrders {
const marketSellOrders = formatters.createMarketSellOrders(signedOrders, ZERO_AMOUNT);
- const assetDataId = assetProxyUtils.decodeAssetDataId(signedOrders[0].makerAssetData);
+ const assetDataId = assetDataUtils.decodeAssetProxyId(signedOrders[0].makerAssetData);
// Contract will fill this in for us as all of the assetData is assumed to be the same
for (let i = 0; i < signedOrders.length; i++) {
if (i !== 0 && assetDataId === AssetProxyId.ERC20) {
@@ -90,7 +90,7 @@ export class ForwarderWrapper {
txData: TxDataPayable,
opts: { feeProportion?: number; feeRecipient?: string } = {},
): Promise<TransactionReceiptWithDecodedLogs> {
- const assetDataId = assetProxyUtils.decodeAssetDataId(orders[0].makerAssetData);
+ const assetDataId = assetDataUtils.decodeAssetProxyId(orders[0].makerAssetData);
if (assetDataId !== AssetProxyId.ERC20) {
throw new Error('Asset type not supported by marketSellEthForERC20');
}
@@ -116,7 +116,7 @@ export class ForwarderWrapper {
feeProportion: number,
makerAssetFillAmount: BigNumber,
): Promise<BigNumber> {
- const assetProxyId = assetProxyUtils.decodeAssetDataId(orders[0].makerAssetData);
+ const assetProxyId = assetDataUtils.decodeAssetProxyId(orders[0].makerAssetData);
switch (assetProxyId) {
case AssetProxyId.ERC20: {
const fillAmountWei = this._calculateMarketBuyERC20FillAmountAsync(
@@ -145,7 +145,7 @@ export class ForwarderWrapper {
feeProportion: number,
makerAssetFillAmount: BigNumber,
): Promise<BigNumber> {
- const makerAssetData = assetProxyUtils.decodeAssetData(orders[0].makerAssetData);
+ const makerAssetData = assetDataUtils.decodeAssetDataOrThrow(orders[0].makerAssetData);
const makerAssetToken = makerAssetData.tokenAddress;
const params = formatters.createMarketBuyOrders(orders, makerAssetFillAmount);
diff --git a/packages/contracts/test/utils/log_decoder.ts b/packages/contracts/test/utils/log_decoder.ts
index 07127ba79..5a4801319 100644
--- a/packages/contracts/test/utils/log_decoder.ts
+++ b/packages/contracts/test/utils/log_decoder.ts
@@ -15,9 +15,9 @@ import { artifacts } from './artifacts';
import { constants } from './constants';
export class LogDecoder {
- private _web3Wrapper: Web3Wrapper;
- private _contractAddress: string;
- private _abiDecoder: AbiDecoder;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _contractAddress: string;
+ private readonly _abiDecoder: AbiDecoder;
public static wrapLogBigNumbers(log: any): any {
const argNames = _.keys(log.args);
for (const argName of argNames) {
diff --git a/packages/contracts/test/utils/match_order_tester.ts b/packages/contracts/test/utils/match_order_tester.ts
index 6145779b0..fa2eabc12 100644
--- a/packages/contracts/test/utils/match_order_tester.ts
+++ b/packages/contracts/test/utils/match_order_tester.ts
@@ -1,4 +1,4 @@
-import { assetProxyUtils, orderHashUtils } from '@0xproject/order-utils';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
import { AssetProxyId, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
@@ -14,10 +14,10 @@ chaiSetup.configure();
const expect = chai.expect;
export class MatchOrderTester {
- private _exchangeWrapper: ExchangeWrapper;
- private _erc20Wrapper: ERC20Wrapper;
- private _erc721Wrapper: ERC721Wrapper;
- private _feeTokenAddress: string;
+ private readonly _exchangeWrapper: ExchangeWrapper;
+ private readonly _erc20Wrapper: ERC20Wrapper;
+ private readonly _erc721Wrapper: ERC721Wrapper;
+ private readonly _feeTokenAddress: string;
/// @dev Compares a pair of ERC20 balances and a pair of ERC721 token owners.
/// @param expectedNewERC20BalancesByOwner Expected ERC20 balances.
@@ -233,10 +233,10 @@ export class MatchOrderTester {
const expectedNewERC20BalancesByOwner = _.cloneDeep(erc20BalancesByOwner);
const expectedNewERC721TokenIdsByOwner = _.cloneDeep(erc721TokenIdsByOwner);
// Left Maker Asset (Right Taker Asset)
- const makerAssetProxyIdLeft = assetProxyUtils.decodeAssetDataId(signedOrderLeft.makerAssetData);
+ const makerAssetProxyIdLeft = assetDataUtils.decodeAssetProxyId(signedOrderLeft.makerAssetData);
if (makerAssetProxyIdLeft === AssetProxyId.ERC20) {
// Decode asset data
- const erc20AssetData = assetProxyUtils.decodeERC20AssetData(signedOrderLeft.makerAssetData);
+ const erc20AssetData = assetDataUtils.decodeERC20AssetData(signedOrderLeft.makerAssetData);
const makerAssetAddressLeft = erc20AssetData.tokenAddress;
const takerAssetAddressRight = makerAssetAddressLeft;
// Left Maker
@@ -255,7 +255,7 @@ export class MatchOrderTester {
][makerAssetAddressLeft].add(expectedTransferAmounts.amountReceivedByTaker);
} else if (makerAssetProxyIdLeft === AssetProxyId.ERC721) {
// Decode asset data
- const erc721AssetData = assetProxyUtils.decodeERC721AssetData(signedOrderLeft.makerAssetData);
+ const erc721AssetData = assetDataUtils.decodeERC721AssetData(signedOrderLeft.makerAssetData);
const makerAssetAddressLeft = erc721AssetData.tokenAddress;
const makerAssetIdLeft = erc721AssetData.tokenId;
const takerAssetAddressRight = makerAssetAddressLeft;
@@ -268,10 +268,10 @@ export class MatchOrderTester {
}
// Left Taker Asset (Right Maker Asset)
// Note: This exchange is only between the order makers: the Taker does not receive any of the left taker asset.
- const takerAssetProxyIdLeft = assetProxyUtils.decodeAssetDataId(signedOrderLeft.takerAssetData);
+ const takerAssetProxyIdLeft = assetDataUtils.decodeAssetProxyId(signedOrderLeft.takerAssetData);
if (takerAssetProxyIdLeft === AssetProxyId.ERC20) {
// Decode asset data
- const erc20AssetData = assetProxyUtils.decodeERC20AssetData(signedOrderLeft.takerAssetData);
+ const erc20AssetData = assetDataUtils.decodeERC20AssetData(signedOrderLeft.takerAssetData);
const takerAssetAddressLeft = erc20AssetData.tokenAddress;
const makerAssetAddressRight = takerAssetAddressLeft;
// Left Maker
@@ -286,7 +286,7 @@ export class MatchOrderTester {
);
} else if (takerAssetProxyIdLeft === AssetProxyId.ERC721) {
// Decode asset data
- const erc721AssetData = assetProxyUtils.decodeERC721AssetData(signedOrderRight.makerAssetData);
+ const erc721AssetData = assetDataUtils.decodeERC721AssetData(signedOrderRight.makerAssetData);
const makerAssetAddressRight = erc721AssetData.tokenAddress;
const makerAssetIdRight = erc721AssetData.tokenId;
const takerAssetAddressLeft = makerAssetAddressRight;
diff --git a/packages/contracts/test/utils/multi_sig_wrapper.ts b/packages/contracts/test/utils/multi_sig_wrapper.ts
index 2024c177d..8c8055d4a 100644
--- a/packages/contracts/test/utils/multi_sig_wrapper.ts
+++ b/packages/contracts/test/utils/multi_sig_wrapper.ts
@@ -10,9 +10,9 @@ import { constants } from './constants';
import { LogDecoder } from './log_decoder';
export class MultiSigWrapper {
- private _multiSig: MultiSigWalletContract;
- private _web3Wrapper: Web3Wrapper;
- private _logDecoder: LogDecoder;
+ private readonly _multiSig: MultiSigWalletContract;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _logDecoder: LogDecoder;
constructor(multiSigContract: MultiSigWalletContract, provider: Provider) {
this._multiSig = multiSigContract;
this._web3Wrapper = new Web3Wrapper(provider);
diff --git a/packages/contracts/test/utils/order_factory.ts b/packages/contracts/test/utils/order_factory.ts
index 009dbc396..63a893695 100644
--- a/packages/contracts/test/utils/order_factory.ts
+++ b/packages/contracts/test/utils/order_factory.ts
@@ -2,25 +2,26 @@ import { generatePseudoRandomSalt, orderHashUtils } from '@0xproject/order-utils
import { Order, SignatureType, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
+import { getLatestBlockTimestampAsync } from './block_timestamp';
import { constants } from './constants';
import { signingUtils } from './signing_utils';
export class OrderFactory {
- private _defaultOrderParams: Partial<Order>;
- private _privateKey: Buffer;
+ private readonly _defaultOrderParams: Partial<Order>;
+ private readonly _privateKey: Buffer;
constructor(privateKey: Buffer, defaultOrderParams: Partial<Order>) {
this._defaultOrderParams = defaultOrderParams;
this._privateKey = privateKey;
}
- public newSignedOrder(
+ public async newSignedOrderAsync(
customOrderParams: Partial<Order> = {},
signatureType: SignatureType = SignatureType.EthSign,
- ): SignedOrder {
- const tenMinutes = 10 * 60 * 1000;
- const randomExpiration = new BigNumber(Date.now() + tenMinutes);
+ ): Promise<SignedOrder> {
+ const tenMinutesInSeconds = 10 * 60;
+ const currentBlockTimestamp = await getLatestBlockTimestampAsync();
const order = ({
senderAddress: constants.NULL_ADDRESS,
- expirationTimeSeconds: randomExpiration,
+ expirationTimeSeconds: new BigNumber(currentBlockTimestamp).add(tenMinutesInSeconds),
salt: generatePseudoRandomSalt(),
takerAddress: constants.NULL_ADDRESS,
...this._defaultOrderParams,
diff --git a/packages/contracts/test/utils/order_factory_from_scenario.ts b/packages/contracts/test/utils/order_factory_from_scenario.ts
index 526505871..a908140b9 100644
--- a/packages/contracts/test/utils/order_factory_from_scenario.ts
+++ b/packages/contracts/test/utils/order_factory_from_scenario.ts
@@ -1,4 +1,4 @@
-import { assetProxyUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { assetDataUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
import { Order } from '@0xproject/types';
import { BigNumber, errorUtils } from '@0xproject/utils';
@@ -24,13 +24,13 @@ const FIVE_UNITS_FIVE_DECIMALS = new BigNumber(500_000);
const ONE_NFT_UNIT = new BigNumber(1);
export class OrderFactoryFromScenario {
- private _userAddresses: string[];
- private _zrxAddress: string;
- private _nonZrxERC20EighteenDecimalTokenAddresses: string[];
- private _erc20FiveDecimalTokenAddresses: string[];
- private _erc721Token: DummyERC721TokenContract;
- private _erc721Balances: ERC721TokenIdsByOwner;
- private _exchangeAddress: string;
+ private readonly _userAddresses: string[];
+ private readonly _zrxAddress: string;
+ private readonly _nonZrxERC20EighteenDecimalTokenAddresses: string[];
+ private readonly _erc20FiveDecimalTokenAddresses: string[];
+ private readonly _erc721Token: DummyERC721TokenContract;
+ private readonly _erc721Balances: ERC721TokenIdsByOwner;
+ private readonly _exchangeAddress: string;
constructor(
userAddresses: string[],
zrxAddress: string,
@@ -75,18 +75,16 @@ export class OrderFactoryFromScenario {
switch (orderScenario.makerAssetDataScenario) {
case AssetDataScenario.ZRXFeeToken:
- makerAssetData = assetProxyUtils.encodeERC20AssetData(this._zrxAddress);
+ makerAssetData = assetDataUtils.encodeERC20AssetData(this._zrxAddress);
break;
case AssetDataScenario.ERC20NonZRXEighteenDecimals:
- makerAssetData = assetProxyUtils.encodeERC20AssetData(
- this._nonZrxERC20EighteenDecimalTokenAddresses[0],
- );
+ makerAssetData = assetDataUtils.encodeERC20AssetData(this._nonZrxERC20EighteenDecimalTokenAddresses[0]);
break;
case AssetDataScenario.ERC20FiveDecimals:
- makerAssetData = assetProxyUtils.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[0]);
+ makerAssetData = assetDataUtils.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[0]);
break;
case AssetDataScenario.ERC721:
- makerAssetData = assetProxyUtils.encodeERC721AssetData(
+ makerAssetData = assetDataUtils.encodeERC721AssetData(
this._erc721Token.address,
erc721MakerAssetIds[0],
);
@@ -97,18 +95,16 @@ export class OrderFactoryFromScenario {
switch (orderScenario.takerAssetDataScenario) {
case AssetDataScenario.ZRXFeeToken:
- takerAssetData = assetProxyUtils.encodeERC20AssetData(this._zrxAddress);
+ takerAssetData = assetDataUtils.encodeERC20AssetData(this._zrxAddress);
break;
case AssetDataScenario.ERC20NonZRXEighteenDecimals:
- takerAssetData = assetProxyUtils.encodeERC20AssetData(
- this._nonZrxERC20EighteenDecimalTokenAddresses[1],
- );
+ takerAssetData = assetDataUtils.encodeERC20AssetData(this._nonZrxERC20EighteenDecimalTokenAddresses[1]);
break;
case AssetDataScenario.ERC20FiveDecimals:
- takerAssetData = assetProxyUtils.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[1]);
+ takerAssetData = assetDataUtils.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[1]);
break;
case AssetDataScenario.ERC721:
- takerAssetData = assetProxyUtils.encodeERC721AssetData(
+ takerAssetData = assetDataUtils.encodeERC721AssetData(
this._erc721Token.address,
erc721TakerAssetIds[0],
);
diff --git a/packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts b/packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts
index a295a40c4..598ee6d29 100644
--- a/packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts
+++ b/packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts
@@ -4,7 +4,7 @@ import { BigNumber } from '@0xproject/utils';
import { AssetWrapper } from './asset_wrapper';
export class SimpleAssetBalanceAndProxyAllowanceFetcher implements AbstractBalanceAndProxyAllowanceFetcher {
- private _assetWrapper: AssetWrapper;
+ private readonly _assetWrapper: AssetWrapper;
constructor(assetWrapper: AssetWrapper) {
this._assetWrapper = assetWrapper;
}
diff --git a/packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts b/packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts
index 24afe36b7..ed69ecc63 100644
--- a/packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts
+++ b/packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts
@@ -4,8 +4,8 @@ import { BigNumber } from '@0xproject/utils';
import { ExchangeWrapper } from './exchange_wrapper';
export class SimpleOrderFilledCancelledFetcher implements AbstractOrderFilledCancelledFetcher {
- private _exchangeWrapper: ExchangeWrapper;
- private _zrxAssetData: string;
+ private readonly _exchangeWrapper: ExchangeWrapper;
+ private readonly _zrxAssetData: string;
constructor(exchange: ExchangeWrapper, zrxAssetData: string) {
this._exchangeWrapper = exchange;
this._zrxAssetData = zrxAssetData;
diff --git a/packages/contracts/test/utils/token_registry_wrapper.ts b/packages/contracts/test/utils/token_registry_wrapper.ts
index 0abf20e03..f1c40e8ff 100644
--- a/packages/contracts/test/utils/token_registry_wrapper.ts
+++ b/packages/contracts/test/utils/token_registry_wrapper.ts
@@ -8,8 +8,8 @@ import { Token } from './types';
import { constants } from './constants';
export class TokenRegWrapper {
- private _tokenReg: TokenRegistryContract;
- private _web3Wrapper: Web3Wrapper;
+ private readonly _tokenReg: TokenRegistryContract;
+ private readonly _web3Wrapper: Web3Wrapper;
constructor(tokenRegContract: TokenRegistryContract, provider: Provider) {
this._tokenReg = tokenRegContract;
this._web3Wrapper = new Web3Wrapper(provider);
diff --git a/packages/contracts/test/utils/transaction_factory.ts b/packages/contracts/test/utils/transaction_factory.ts
index 348c0715d..281c1e30d 100644
--- a/packages/contracts/test/utils/transaction_factory.ts
+++ b/packages/contracts/test/utils/transaction_factory.ts
@@ -15,9 +15,9 @@ const EIP712_ZEROEX_TRANSACTION_SCHEMA: EIP712Schema = {
};
export class TransactionFactory {
- private _signerBuff: Buffer;
- private _exchangeAddress: string;
- private _privateKey: Buffer;
+ private readonly _signerBuff: Buffer;
+ private readonly _exchangeAddress: string;
+ private readonly _privateKey: Buffer;
constructor(privateKey: Buffer, exchangeAddress: string) {
this._privateKey = privateKey;
this._exchangeAddress = exchangeAddress;
diff --git a/packages/contracts/test/utils/type_encoding_utils.ts b/packages/contracts/test/utils/type_encoding_utils.ts
new file mode 100644
index 000000000..75307b9bd
--- /dev/null
+++ b/packages/contracts/test/utils/type_encoding_utils.ts
@@ -0,0 +1,21 @@
+import { BigNumber } from '@0xproject/utils';
+import BN = require('bn.js');
+import ethUtil = require('ethereumjs-util');
+
+import { constants } from './constants';
+
+export const typeEncodingUtils = {
+ encodeUint256(value: BigNumber): Buffer {
+ const base = 10;
+ const formattedValue = new BN(value.toString(base));
+ const encodedValue = ethUtil.toBuffer(formattedValue);
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const paddedValue = ethUtil.setLengthLeft(encodedValue, constants.WORD_LENGTH);
+ return paddedValue;
+ },
+ decodeUint256(encodedValue: Buffer): BigNumber {
+ const formattedValue = ethUtil.bufferToHex(encodedValue);
+ const value = new BigNumber(formattedValue, constants.BASE_16);
+ return value;
+ },
+};
diff --git a/packages/contracts/test/utils/web3_wrapper.ts b/packages/contracts/test/utils/web3_wrapper.ts
index c9d83a02d..acb3103b7 100644
--- a/packages/contracts/test/utils/web3_wrapper.ts
+++ b/packages/contracts/test/utils/web3_wrapper.ts
@@ -51,8 +51,10 @@ export const provider = web3Factory.getRpcProvider(providerConfigs);
const isCoverageEnabled = env.parseBoolean(EnvVars.SolidityCoverage);
const isProfilerEnabled = env.parseBoolean(EnvVars.SolidityProfiler);
const isRevertTraceEnabled = env.parseBoolean(EnvVars.SolidityRevertTrace);
-const enabledSubproviderCount = _.filter([isCoverageEnabled, isProfilerEnabled, isRevertTraceEnabled], _.identity)
- .length;
+const enabledSubproviderCount = _.filter(
+ [isCoverageEnabled, isProfilerEnabled, isRevertTraceEnabled],
+ _.identity.bind(_),
+).length;
if (enabledSubproviderCount > 1) {
throw new Error(`Only one of coverage, profiler, or revert trace subproviders can be enabled at a time`);
}
diff --git a/packages/dev-utils/CHANGELOG.json b/packages/dev-utils/CHANGELOG.json
index 56ecd023e..f94fd5f30 100644
--- a/packages/dev-utils/CHANGELOG.json
+++ b/packages/dev-utils/CHANGELOG.json
@@ -1,5 +1,23 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.4.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.4.5",
"changes": [
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index 55e12b2dd..de9287478 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.4.6 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.4.5 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index f0ef24684..7a1f3c4ff 100644
--- a/packages/dev-utils/package.json
+++ b/packages/dev-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/dev-utils",
- "version": "0.4.5",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -30,8 +30,8 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/dev-utils/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"chai": "^4.0.1",
@@ -41,16 +41,16 @@
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/subproviders": "^0.10.5",
- "@0xproject/types": "^0.8.2",
- "@0xproject/utils": "^0.7.2",
- "ethereum-types": "^0.0.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "@0xproject/subproviders": "^1.0.0",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/utils": "^1.0.0",
+ "ethereum-types": "^1.0.0",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"lodash": "^4.17.4"
},
"publishConfig": {
diff --git a/packages/dev-utils/src/blockchain_lifecycle.ts b/packages/dev-utils/src/blockchain_lifecycle.ts
index 9bd65ee5d..a48cb0856 100644
--- a/packages/dev-utils/src/blockchain_lifecycle.ts
+++ b/packages/dev-utils/src/blockchain_lifecycle.ts
@@ -10,8 +10,8 @@ import * as _ from 'lodash';
const MINIMUM_BLOCKS = 3;
export class BlockchainLifecycle {
- private _web3Wrapper: Web3Wrapper;
- private _snapshotIdsStack: number[];
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _snapshotIdsStack: number[];
private _addresses: string[] = [];
private _nodeType: NodeType | undefined;
constructor(web3Wrapper: Web3Wrapper) {
@@ -34,6 +34,12 @@ export class BlockchainLifecycle {
blockNumber = await this._web3Wrapper.getBlockNumberAsync();
}
this._snapshotIdsStack.push(blockNumber);
+ // HACK(albrow) It's possible that we applied a time offset but
+ // the transaction we mined to put that time offset into the
+ // blockchain was reverted. As a workaround, we mine a new dummy
+ // block so that the latest block timestamp accounts for any
+ // possible time offsets.
+ await this._mineDummyBlockAsync();
break;
default:
throw new Error(`Unknown node type: ${nodeType}`);
@@ -59,22 +65,9 @@ export class BlockchainLifecycle {
}
private async _mineMinimumBlocksAsync(): Promise<void> {
logUtils.warn('WARNING: minimum block number for tests not met. Mining additional blocks...');
- if (this._addresses.length === 0) {
- this._addresses = await this._web3Wrapper.getAvailableAddressesAsync();
- if (this._addresses.length === 0) {
- throw new Error('No accounts found');
- }
- }
while ((await this._web3Wrapper.getBlockNumberAsync()) < MINIMUM_BLOCKS) {
logUtils.warn('Mining block...');
- await this._web3Wrapper.awaitTransactionMinedAsync(
- await this._web3Wrapper.sendTransactionAsync({
- from: this._addresses[0],
- to: this._addresses[0],
- value: '0',
- }),
- 0,
- );
+ await this._mineDummyBlockAsync();
}
logUtils.warn('Done mining the minimum number of blocks.');
}
@@ -84,4 +77,22 @@ export class BlockchainLifecycle {
}
return this._nodeType;
}
+ // Sends a transaction that has no real effect on the state and waits for it
+ // to be mined.
+ private async _mineDummyBlockAsync(): Promise<void> {
+ if (this._addresses.length === 0) {
+ this._addresses = await this._web3Wrapper.getAvailableAddressesAsync();
+ if (this._addresses.length === 0) {
+ throw new Error('No accounts found');
+ }
+ }
+ await this._web3Wrapper.awaitTransactionMinedAsync(
+ await this._web3Wrapper.sendTransactionAsync({
+ from: this._addresses[0],
+ to: this._addresses[0],
+ value: '0',
+ }),
+ 0,
+ );
+ }
}
diff --git a/packages/ethereum-types/CHANGELOG.json b/packages/ethereum-types/CHANGELOG.json
index 351e9c23f..70a2ffcb0 100644
--- a/packages/ethereum-types/CHANGELOG.json
+++ b/packages/ethereum-types/CHANGELOG.json
@@ -1,6 +1,7 @@
[
{
- "version": "0.0.3",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
"note": "Add `TraceParams` interface for `debug_traceTransaction` parameters",
diff --git a/packages/ethereum-types/package.json b/packages/ethereum-types/package.json
index 9d4930826..5a3a8c0f3 100644
--- a/packages/ethereum-types/package.json
+++ b/packages/ethereum-types/package.json
@@ -1,6 +1,6 @@
{
"name": "ethereum-types",
- "version": "0.0.2",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -35,12 +35,12 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/ethereum-types/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.1",
- "@0xproject/tslint-config": "^0.4.20",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"copyfiles": "^1.2.0",
"make-promises-safe": "^1.1.0",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
diff --git a/packages/fill-scenarios/CHANGELOG.json b/packages/fill-scenarios/CHANGELOG.json
index cf36adf16..e1e8a9d6d 100644
--- a/packages/fill-scenarios/CHANGELOG.json
+++ b/packages/fill-scenarios/CHANGELOG.json
@@ -1,6 +1,7 @@
[
{
- "version": "1.0.0",
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
"changes": [
{
"note": "Make fill-scenarios compatible with V2 of 0x protocol",
@@ -9,6 +10,15 @@
]
},
{
+ "timestamp": 1531919263,
+ "version": "0.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.0.5",
"changes": [
diff --git a/packages/fill-scenarios/CHANGELOG.md b/packages/fill-scenarios/CHANGELOG.md
index 02618b89c..8b83a04f3 100644
--- a/packages/fill-scenarios/CHANGELOG.md
+++ b/packages/fill-scenarios/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.0.6 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.0.5 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/fill-scenarios/package.json b/packages/fill-scenarios/package.json
index 4e1ceeac0..b6b1d8dce 100644
--- a/packages/fill-scenarios/package.json
+++ b/packages/fill-scenarios/package.json
@@ -1,22 +1,22 @@
{
"name": "@0xproject/fill-scenarios",
- "version": "1.0.0",
+ "version": "1.0.0-rc.1",
"description": "0x order fill scenario generator",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"scripts": {
"watch_without_deps": "yarn pre_build && tsc -w",
- "build": "yarn pre_build && tsc",
+ "build": "yarn pre_build && tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
"pre_build": "run-s update_artifacts generate_contract_wrappers",
"update_artifacts": "for i in ${npm_package_config_contracts}; do copyfiles -u 4 ../migrations/artifacts/2.0.0/$i.json lib/artifacts; done;",
- "generate_contract_wrappers": "abi-gen --abis 'lib/artifacts/@(Exchange|ERC20Token).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/generated_contract_wrappers --backend ethers",
+ "generate_contract_wrappers": "abi-gen --abis 'lib/artifacts/@(Exchange|DummyERC20Token|DummyERC721Token).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/generated_contract_wrappers --backend ethers",
"copy_monorepo_scripts": "copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib scripts src/generated_contract_wrappers",
"lint": "tslint --project . --exclude **/src/generated_contract_wrappers/**/*",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"config": {
- "contracts": "Exchange ERC20Token"
+ "contracts": "Exchange DummyERC20Token DummyERC721Token"
},
"license": "Apache-2.0",
"repository": {
@@ -28,26 +28,26 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/fill-scenarios/README.md",
"devDependencies": {
- "@0xproject/abi-gen": "^0.3.3",
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/abi-gen": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"copyfiles": "^1.2.0",
"make-promises-safe": "^1.1.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/base-contract": "^0.3.5",
- "@0xproject/order-utils": "^1.0.0",
- "@0xproject/types": "1.0.0",
- "ethereum-types": "^0.0.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "@0xproject/base-contract": "^1.0.0",
+ "@0xproject/order-utils": "^1.0.0-rc.1",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "ethereum-types": "^1.0.0",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"ethers": "3.0.22",
"lodash": "^4.17.4"
},
diff --git a/packages/fill-scenarios/src/artifacts.ts b/packages/fill-scenarios/src/artifacts.ts
index f75374ba2..7f68ae26a 100644
--- a/packages/fill-scenarios/src/artifacts.ts
+++ b/packages/fill-scenarios/src/artifacts.ts
@@ -1,9 +1,11 @@
import { ContractArtifact } from '@0xproject/sol-compiler';
-import * as ERC20Token from './artifacts/ERC20Token.json';
+import * as DummyERC20Token from './artifacts/DummyERC20Token.json';
+import * as DummyERC721Token from './artifacts/DummyERC721Token.json';
import * as Exchange from './artifacts/Exchange.json';
export const artifacts = {
- ERC20Token: (ERC20Token as any) as ContractArtifact,
+ DummyERC20Token: (DummyERC20Token as any) as ContractArtifact,
+ DummyERC721Token: (DummyERC721Token as any) as ContractArtifact,
Exchange: (Exchange as any) as ContractArtifact,
};
diff --git a/packages/fill-scenarios/src/constants.ts b/packages/fill-scenarios/src/constants.ts
index ec2fe744a..5661b059f 100644
--- a/packages/fill-scenarios/src/constants.ts
+++ b/packages/fill-scenarios/src/constants.ts
@@ -1,3 +1,4 @@
export const constants = {
+ AWAIT_TRANSACTION_MINED_MS: 0,
NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
};
diff --git a/packages/fill-scenarios/src/fill_scenarios.ts b/packages/fill-scenarios/src/fill_scenarios.ts
new file mode 100644
index 000000000..8f2766e24
--- /dev/null
+++ b/packages/fill-scenarios/src/fill_scenarios.ts
@@ -0,0 +1,300 @@
+import { assetDataUtils, orderFactory } from '@0xproject/order-utils';
+import { AssetProxyId, ERC721AssetData, OrderWithoutExchangeAddress, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from './artifacts';
+import { constants } from './constants';
+import { DummyERC20TokenContract } from './generated_contract_wrappers/dummy_erc20_token';
+import { DummyERC721TokenContract } from './generated_contract_wrappers/dummy_erc721_token';
+import { ExchangeContract } from './generated_contract_wrappers/exchange';
+
+export class FillScenarios {
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _userAddresses: string[];
+ private readonly _coinbase: string;
+ private readonly _zrxTokenAddress: string;
+ private readonly _exchangeAddress: string;
+ private readonly _erc20ProxyAddress: string;
+ private readonly _erc721ProxyAddress: string;
+ constructor(
+ provider: Provider,
+ userAddresses: string[],
+ zrxTokenAddress: string,
+ exchangeAddress: string,
+ erc20ProxyAddress: string,
+ erc721ProxyAddress: string,
+ ) {
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._userAddresses = userAddresses;
+ this._coinbase = userAddresses[0];
+ this._zrxTokenAddress = zrxTokenAddress;
+ this._exchangeAddress = exchangeAddress;
+ this._erc20ProxyAddress = erc20ProxyAddress;
+ this._erc721ProxyAddress = erc721ProxyAddress;
+ }
+ public async createFillableSignedOrderAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ makerAddress: string,
+ takerAddress: string,
+ fillableAmount: BigNumber,
+ expirationTimeSeconds?: BigNumber,
+ ): Promise<SignedOrder> {
+ return this.createAsymmetricFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ fillableAmount,
+ expirationTimeSeconds,
+ );
+ }
+ public async createFillableSignedOrderWithFeesAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ makerFee: BigNumber,
+ takerFee: BigNumber,
+ makerAddress: string,
+ takerAddress: string,
+ fillableAmount: BigNumber,
+ feeRecepientAddress: string,
+ expirationTimeSeconds?: BigNumber,
+ ): Promise<SignedOrder> {
+ return this._createAsymmetricFillableSignedOrderWithFeesAsync(
+ makerAssetData,
+ takerAssetData,
+ makerFee,
+ takerFee,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ fillableAmount,
+ feeRecepientAddress,
+ expirationTimeSeconds,
+ );
+ }
+ public async createAsymmetricFillableSignedOrderAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ makerAddress: string,
+ takerAddress: string,
+ makerFillableAmount: BigNumber,
+ takerFillableAmount: BigNumber,
+ expirationTimeSeconds?: BigNumber,
+ ): Promise<SignedOrder> {
+ const makerFee = new BigNumber(0);
+ const takerFee = new BigNumber(0);
+ const feeRecepientAddress = constants.NULL_ADDRESS;
+ return this._createAsymmetricFillableSignedOrderWithFeesAsync(
+ makerAssetData,
+ takerAssetData,
+ makerFee,
+ takerFee,
+ makerAddress,
+ takerAddress,
+ makerFillableAmount,
+ takerFillableAmount,
+ feeRecepientAddress,
+ expirationTimeSeconds,
+ );
+ }
+ public async createPartiallyFilledSignedOrderAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ takerAddress: string,
+ fillableAmount: BigNumber,
+ partialFillAmount: BigNumber,
+ ): Promise<SignedOrder> {
+ const [makerAddress] = this._userAddresses;
+ const signedOrder = await this.createAsymmetricFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ fillableAmount,
+ );
+ const exchangeInstance = new ExchangeContract(
+ artifacts.Exchange.compilerOutput.abi,
+ signedOrder.exchangeAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+
+ const orderWithoutExchangeAddress = _.omit(signedOrder, [
+ 'signature',
+ 'exchangeAddress',
+ ]) as OrderWithoutExchangeAddress;
+
+ const txHash = await exchangeInstance.fillOrder.sendTransactionAsync(
+ orderWithoutExchangeAddress,
+ partialFillAmount,
+ signedOrder.signature,
+ { from: takerAddress },
+ );
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ return signedOrder;
+ }
+ private async _createAsymmetricFillableSignedOrderWithFeesAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ makerFee: BigNumber,
+ takerFee: BigNumber,
+ makerAddress: string,
+ takerAddress: string,
+ makerFillableAmount: BigNumber,
+ takerFillableAmount: BigNumber,
+ feeRecepientAddress: string,
+ expirationTimeSeconds?: BigNumber,
+ ): Promise<SignedOrder> {
+ const decodedMakerAssetData = assetDataUtils.decodeAssetDataOrThrow(makerAssetData);
+ if (decodedMakerAssetData.assetProxyId === AssetProxyId.ERC20) {
+ await this._increaseERC20BalanceAndAllowanceAsync(
+ decodedMakerAssetData.tokenAddress,
+ makerAddress,
+ makerFillableAmount,
+ );
+ } else {
+ if (!makerFillableAmount.equals(1)) {
+ throw new Error(`ERC721 makerFillableAmount should be equal 1. Found: ${makerFillableAmount}`);
+ }
+ await this._increaseERC721BalanceAndAllowanceAsync(
+ decodedMakerAssetData.tokenAddress,
+ makerAddress,
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ (decodedMakerAssetData as ERC721AssetData).tokenId,
+ );
+ }
+ const decodedTakerAssetData = assetDataUtils.decodeAssetDataOrThrow(takerAssetData);
+ if (decodedTakerAssetData.assetProxyId === AssetProxyId.ERC20) {
+ const takerTokenAddress = decodedTakerAssetData.tokenAddress;
+ await this._increaseERC20BalanceAndAllowanceAsync(takerTokenAddress, takerAddress, takerFillableAmount);
+ } else {
+ if (!takerFillableAmount.equals(1)) {
+ throw new Error(`ERC721 takerFillableAmount should be equal 1. Found: ${takerFillableAmount}`);
+ }
+ await this._increaseERC721BalanceAndAllowanceAsync(
+ decodedTakerAssetData.tokenAddress,
+ takerAddress,
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ (decodedMakerAssetData as ERC721AssetData).tokenId,
+ );
+ }
+ // Fees
+ await Promise.all([
+ this._increaseERC20BalanceAndAllowanceAsync(this._zrxTokenAddress, makerAddress, makerFee),
+ this._increaseERC20BalanceAndAllowanceAsync(this._zrxTokenAddress, takerAddress, takerFee),
+ ]);
+ const senderAddress = constants.NULL_ADDRESS;
+
+ const signedOrder = await orderFactory.createSignedOrderAsync(
+ this._web3Wrapper.getProvider(),
+ makerAddress,
+ takerAddress,
+ senderAddress,
+ makerFee,
+ takerFee,
+ makerFillableAmount,
+ makerAssetData,
+ takerFillableAmount,
+ takerAssetData,
+ this._exchangeAddress,
+ feeRecepientAddress,
+ expirationTimeSeconds,
+ );
+ return signedOrder;
+ }
+ private async _increaseERC721BalanceAndAllowanceAsync(
+ tokenAddress: string,
+ address: string,
+ tokenId: BigNumber,
+ ): Promise<void> {
+ await this._increaseERC721BalanceAsync(tokenAddress, address, tokenId);
+ await this._increaseERC721AllowanceAsync(tokenAddress, address, tokenId);
+ }
+ private async _increaseERC721AllowanceAsync(
+ tokenAddress: string,
+ address: string,
+ tokenId: BigNumber,
+ ): Promise<void> {
+ const erc721Token = new DummyERC721TokenContract(
+ artifacts.DummyERC721Token.compilerOutput.abi,
+ tokenAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ const txHash = await erc721Token.approve.sendTransactionAsync(this._erc721ProxyAddress, tokenId, {
+ from: address,
+ });
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ }
+ private async _increaseERC721BalanceAsync(
+ tokenAddress: string,
+ address: string,
+ tokenId: BigNumber,
+ ): Promise<void> {
+ const erc721Token = new DummyERC721TokenContract(
+ artifacts.DummyERC721Token.compilerOutput.abi,
+ tokenAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ try {
+ const currentOwner = await erc721Token.ownerOf.callAsync(tokenId);
+ if (currentOwner !== address) {
+ throw new Error(`Token ${tokenAddress}:${tokenId} is already owner by ${currentOwner}`);
+ }
+ } catch (err) {
+ const txHash = await erc721Token.mint.sendTransactionAsync(address, tokenId, { from: this._coinbase });
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ }
+ }
+ private async _increaseERC20BalanceAndAllowanceAsync(
+ tokenAddress: string,
+ address: string,
+ amount: BigNumber,
+ ): Promise<void> {
+ if (amount.isZero() || address === constants.NULL_ADDRESS) {
+ return; // noop
+ }
+ await Promise.all([
+ this._increaseERC20BalanceAsync(tokenAddress, address, amount),
+ this._increaseERC20AllowanceAsync(tokenAddress, address, amount),
+ ]);
+ }
+ private async _increaseERC20BalanceAsync(tokenAddress: string, address: string, amount: BigNumber): Promise<void> {
+ const erc20Token = new DummyERC20TokenContract(
+ artifacts.DummyERC20Token.compilerOutput.abi,
+ tokenAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ const txHash = await erc20Token.transfer.sendTransactionAsync(address, amount, {
+ from: this._coinbase,
+ });
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ }
+ private async _increaseERC20AllowanceAsync(
+ tokenAddress: string,
+ address: string,
+ amount: BigNumber,
+ ): Promise<void> {
+ const erc20Token = new DummyERC20TokenContract(
+ artifacts.DummyERC20Token.compilerOutput.abi,
+ tokenAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ const oldMakerAllowance = await erc20Token.allowance.callAsync(address, this._erc20ProxyAddress);
+ const newMakerAllowance = oldMakerAllowance.plus(amount);
+
+ const txHash = await erc20Token.approve.sendTransactionAsync(this._erc20ProxyAddress, newMakerAllowance, {
+ from: address,
+ });
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ }
+}
diff --git a/packages/fill-scenarios/src/index.ts b/packages/fill-scenarios/src/index.ts
index f9b69e1f3..c51145cdb 100644
--- a/packages/fill-scenarios/src/index.ts
+++ b/packages/fill-scenarios/src/index.ts
@@ -1,222 +1 @@
-import { assetProxyUtils, orderFactory } from '@0xproject/order-utils';
-import { OrderWithoutExchangeAddress, SignedOrder } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import { Provider } from 'ethereum-types';
-import * as _ from 'lodash';
-
-import { artifacts } from './artifacts';
-import { constants } from './constants';
-import { ERC20TokenContract } from './generated_contract_wrappers/erc20_token';
-import { ExchangeContract } from './generated_contract_wrappers/exchange';
-
-export class FillScenarios {
- private _web3Wrapper: Web3Wrapper;
- private _userAddresses: string[];
- private _coinbase: string;
- private _zrxTokenAddress: string;
- private _exchangeAddress: string;
- private _erc20ProxyAddress: string;
- constructor(
- provider: Provider,
- userAddresses: string[],
- zrxTokenAddress: string,
- exchangeAddress: string,
- erc20ProxyAddress: string,
- ) {
- this._web3Wrapper = new Web3Wrapper(provider);
- this._userAddresses = userAddresses;
- this._coinbase = userAddresses[0];
- this._zrxTokenAddress = zrxTokenAddress;
- this._exchangeAddress = exchangeAddress;
- this._erc20ProxyAddress = erc20ProxyAddress;
- }
- public async createFillableSignedOrderAsync(
- makerAssetData: string,
- takerAssetData: string,
- makerAddress: string,
- takerAddress: string,
- fillableAmount: BigNumber,
- expirationTimeSeconds?: BigNumber,
- ): Promise<SignedOrder> {
- return this.createAsymmetricFillableSignedOrderAsync(
- makerAssetData,
- takerAssetData,
- makerAddress,
- takerAddress,
- fillableAmount,
- fillableAmount,
- expirationTimeSeconds,
- );
- }
- public async createFillableSignedOrderWithFeesAsync(
- makerAssetData: string,
- takerAssetData: string,
- makerFee: BigNumber,
- takerFee: BigNumber,
- makerAddress: string,
- takerAddress: string,
- fillableAmount: BigNumber,
- feeRecepientAddress: string,
- expirationTimeSeconds?: BigNumber,
- ): Promise<SignedOrder> {
- return this._createAsymmetricFillableSignedOrderWithFeesAsync(
- makerAssetData,
- takerAssetData,
- makerFee,
- takerFee,
- makerAddress,
- takerAddress,
- fillableAmount,
- fillableAmount,
- feeRecepientAddress,
- expirationTimeSeconds,
- );
- }
- public async createAsymmetricFillableSignedOrderAsync(
- makerAssetData: string,
- takerAssetData: string,
- makerAddress: string,
- takerAddress: string,
- makerFillableAmount: BigNumber,
- takerFillableAmount: BigNumber,
- expirationTimeSeconds?: BigNumber,
- ): Promise<SignedOrder> {
- const makerFee = new BigNumber(0);
- const takerFee = new BigNumber(0);
- const feeRecepientAddress = constants.NULL_ADDRESS;
- return this._createAsymmetricFillableSignedOrderWithFeesAsync(
- makerAssetData,
- takerAssetData,
- makerFee,
- takerFee,
- makerAddress,
- takerAddress,
- makerFillableAmount,
- takerFillableAmount,
- feeRecepientAddress,
- expirationTimeSeconds,
- );
- }
- public async createPartiallyFilledSignedOrderAsync(
- makerAssetData: string,
- takerAssetData: string,
- takerAddress: string,
- fillableAmount: BigNumber,
- partialFillAmount: BigNumber,
- ): Promise<SignedOrder> {
- const [makerAddress] = this._userAddresses;
- const signedOrder = await this.createAsymmetricFillableSignedOrderAsync(
- makerAssetData,
- takerAssetData,
- makerAddress,
- takerAddress,
- fillableAmount,
- fillableAmount,
- );
- const exchangeInstance = new ExchangeContract(
- artifacts.Exchange.compilerOutput.abi,
- signedOrder.exchangeAddress,
- this._web3Wrapper.getProvider(),
- this._web3Wrapper.getContractDefaults(),
- );
-
- const orderWithoutExchangeAddress = _.omit(signedOrder, [
- 'signature',
- 'exchangeAddress',
- ]) as OrderWithoutExchangeAddress;
-
- await exchangeInstance.fillOrder.sendTransactionAsync(
- orderWithoutExchangeAddress,
- partialFillAmount,
- signedOrder.signature,
- { from: takerAddress },
- );
- return signedOrder;
- }
- private async _createAsymmetricFillableSignedOrderWithFeesAsync(
- makerAssetData: string,
- takerAssetData: string,
- makerFee: BigNumber,
- takerFee: BigNumber,
- makerAddress: string,
- takerAddress: string,
- makerFillableAmount: BigNumber,
- takerFillableAmount: BigNumber,
- feeRecepientAddress: string,
- expirationTimeSeconds?: BigNumber,
- ): Promise<SignedOrder> {
- const makerERC20AssetData = assetProxyUtils.decodeERC20AssetData(makerAssetData);
- const makerTokenAddress = makerERC20AssetData.tokenAddress;
- const takerERC20AssetData = assetProxyUtils.decodeERC20AssetData(takerAssetData);
- const takerTokenAddress = takerERC20AssetData.tokenAddress;
- await Promise.all([
- this._increaseERC20BalanceAndAllowanceAsync(makerTokenAddress, makerAddress, makerFillableAmount),
- this._increaseERC20BalanceAndAllowanceAsync(takerTokenAddress, takerAddress, takerFillableAmount),
- ]);
- await Promise.all([
- this._increaseERC20BalanceAndAllowanceAsync(this._zrxTokenAddress, makerAddress, makerFee),
- this._increaseERC20BalanceAndAllowanceAsync(this._zrxTokenAddress, takerAddress, takerFee),
- ]);
- const senderAddress = constants.NULL_ADDRESS;
-
- const signedOrder = await orderFactory.createSignedOrderAsync(
- this._web3Wrapper.getProvider(),
- makerAddress,
- takerAddress,
- senderAddress,
- makerFee,
- takerFee,
- makerFillableAmount,
- makerAssetData,
- takerFillableAmount,
- takerAssetData,
- this._exchangeAddress,
- feeRecepientAddress,
- expirationTimeSeconds,
- );
- return signedOrder;
- }
- private async _increaseERC20BalanceAndAllowanceAsync(
- tokenAddress: string,
- address: string,
- amount: BigNumber,
- ): Promise<void> {
- if (amount.isZero() || address === constants.NULL_ADDRESS) {
- return; // noop
- }
- await Promise.all([
- this._increaseERC20BalanceAsync(tokenAddress, address, amount),
- this._increaseERC20AllowanceAsync(tokenAddress, address, amount),
- ]);
- }
- private async _increaseERC20BalanceAsync(tokenAddress: string, address: string, amount: BigNumber): Promise<void> {
- const token = new ERC20TokenContract(
- artifacts.ERC20Token.compilerOutput.abi,
- tokenAddress,
- this._web3Wrapper.getProvider(),
- this._web3Wrapper.getContractDefaults(),
- );
- await token.transfer.sendTransactionAsync(address, amount, {
- from: this._coinbase,
- });
- }
- private async _increaseERC20AllowanceAsync(
- tokenAddress: string,
- address: string,
- amount: BigNumber,
- ): Promise<void> {
- const tokenInstance = new ERC20TokenContract(
- artifacts.ERC20Token.compilerOutput.abi,
- tokenAddress,
- this._web3Wrapper.getProvider(),
- this._web3Wrapper.getContractDefaults(),
- );
- const oldMakerAllowance = await tokenInstance.allowance.callAsync(address, this._erc20ProxyAddress);
- const newMakerAllowance = oldMakerAllowance.plus(amount);
-
- await tokenInstance.approve.sendTransactionAsync(this._erc20ProxyAddress, newMakerAllowance, {
- from: address,
- });
- }
-}
+export { FillScenarios } from './fill_scenarios';
diff --git a/packages/json-schemas/CHANGELOG.json b/packages/json-schemas/CHANGELOG.json
index 42ef2065e..8bffe6955 100644
--- a/packages/json-schemas/CHANGELOG.json
+++ b/packages/json-schemas/CHANGELOG.json
@@ -1,14 +1,28 @@
[
{
- "version": "1.0.0",
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
"changes": [
{
- "note": "Update schemas for V2",
+ "note": "Update schemas for V2 or 0x Protocol",
"pr": 615
},
{
"note": "Added CallData schema",
"pr": 821
+ },
+ {
+ "note": "Update CallData schema id to CallData",
+ "pr": 894
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.8.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
}
]
},
diff --git a/packages/json-schemas/CHANGELOG.md b/packages/json-schemas/CHANGELOG.md
index 2524cd768..df3150dba 100644
--- a/packages/json-schemas/CHANGELOG.md
+++ b/packages/json-schemas/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.8.3 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.8.2 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/json-schemas/package.json b/packages/json-schemas/package.json
index 8ecb41721..87182831f 100644
--- a/packages/json-schemas/package.json
+++ b/packages/json-schemas/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/json-schemas",
- "version": "1.0.0",
+ "version": "1.0.0-rc.1",
"engines": {
"node": ">=6.12"
},
@@ -47,15 +47,15 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/json-schemas/README.md",
"dependencies": {
- "@0xproject/typescript-typings": "^0.4.2",
+ "@0xproject/typescript-typings": "^1.0.0",
"@types/node": "^8.0.53",
"jsonschema": "^1.2.0",
"lodash.values": "^4.3.0"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
- "@0xproject/utils": "^0.7.2",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"@types/lodash.foreach": "^4.5.3",
"@types/lodash.values": "^4.3.3",
"@types/mocha": "^2.2.42",
@@ -68,7 +68,7 @@
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
"typescript": "2.7.1"
},
diff --git a/packages/json-schemas/schemas/call_data_schema.ts b/packages/json-schemas/schemas/call_data_schema.ts
index e8fcc7512..b9d00ad2a 100644
--- a/packages/json-schemas/schemas/call_data_schema.ts
+++ b/packages/json-schemas/schemas/call_data_schema.ts
@@ -1,5 +1,5 @@
export const callDataSchema = {
- id: '/TxData',
+ id: '/CallData',
properties: {
from: { $ref: '/Address' },
to: { $ref: '/Address' },
diff --git a/packages/json-schemas/src/schema_validator.ts b/packages/json-schemas/src/schema_validator.ts
index f0392d1d1..3f303137b 100644
--- a/packages/json-schemas/src/schema_validator.ts
+++ b/packages/json-schemas/src/schema_validator.ts
@@ -7,7 +7,7 @@ import { schemas } from './schemas';
* A validator for [JSON-schemas](http://json-schema.org/)
*/
export class SchemaValidator {
- private _validator: Validator;
+ private readonly _validator: Validator;
/**
* Instantiates a SchemaValidator instance
*/
diff --git a/packages/metacoin/package.json b/packages/metacoin/package.json
index 744e9e69a..66e0e5cf0 100644
--- a/packages/metacoin/package.json
+++ b/packages/metacoin/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/metacoin",
- "version": "0.0.9",
+ "version": "0.0.10",
"engines": {
"node": ">=6.12"
},
@@ -29,25 +29,25 @@
"author": "",
"license": "Apache-2.0",
"dependencies": {
- "@0xproject/abi-gen": "^0.3.3",
- "@0xproject/base-contract": "^0.3.5",
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/sol-cov": "^0.1.2",
- "@0xproject/subproviders": "^0.10.5",
- "@0xproject/tslint-config": "^0.4.21",
- "@0xproject/types": "^0.8.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "@0xproject/abi-gen": "^1.0.0",
+ "@0xproject/base-contract": "^1.0.0",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/sol-cov": "^1.0.0",
+ "@0xproject/subproviders": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"@types/mocha": "^5.2.2",
"copyfiles": "^2.0.0",
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"ethers": "3.0.22",
"lodash": "^4.17.4",
"run-s": "^0.0.0"
},
"devDependencies": {
- "@0xproject/dev-utils": "^0.4.5",
+ "@0xproject/dev-utils": "^1.0.0",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-bignumber": "^2.0.1",
@@ -55,7 +55,7 @@
"make-promises-safe": "^1.1.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
}
}
diff --git a/packages/migrations/CHANGELOG.json b/packages/migrations/CHANGELOG.json
index 9852eeb11..e0a5c8a52 100644
--- a/packages/migrations/CHANGELOG.json
+++ b/packages/migrations/CHANGELOG.json
@@ -1,5 +1,23 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Added migrations for 0x Protocol v2"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.0.9",
"changes": [
diff --git a/packages/migrations/CHANGELOG.md b/packages/migrations/CHANGELOG.md
index e97b1fdec..9ec030ada 100644
--- a/packages/migrations/CHANGELOG.md
+++ b/packages/migrations/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.0.10 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.0.9 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/migrations/artifacts/2.0.0/ERC721Token.json b/packages/migrations/artifacts/2.0.0/ERC721Token.json
index 87eca3183..ea18faed9 100644
--- a/packages/migrations/artifacts/2.0.0/ERC721Token.json
+++ b/packages/migrations/artifacts/2.0.0/ERC721Token.json
@@ -321,39 +321,39 @@
"evm": {
"bytecode": {
"linkReferences": {},
- "object": "0x608060405234801561001057600080fd5b50604051610f60380380610f608339810160405280516020808301519183018051909392909201916100489160009190850190610064565b50805161005c906001906020840190610064565b5050506100ff565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a557805160ff19168380011785556100d2565b828001600101855582156100d2579182015b828111156100d25782518255916020019190600101906100b7565b506100de9291506100e2565b5090565b6100fc91905b808211156100de57600081556001016100e8565b90565b610e528061010e6000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063081812fc14610148578063095ea7b31461018957806323b872dd146101bc57806342842e0e146101f35780634f558e791461022a5780636352211e1461025657806370a082311461026e57806395d89b41146102ae578063a22cb465146102c3578063b88d4fde146102f6578063e985e9c514610372575b600080fd5b3480156100ca57600080fd5b506100d36103a6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010d5781810151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015457600080fd5b5061016060043561045a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561019557600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff60043516602435610482565b005b3480156101c857600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356105c0565b3480156101ff57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356106a3565b34801561023657600080fd5b506102426004356106db565b604080519115158252519081900360200190f35b34801561026257600080fd5b50610160600435610705565b34801561027a57600080fd5b5061029c73ffffffffffffffffffffffffffffffffffffffff6004351661073c565b60408051918252519081900360200190f35b3480156102ba57600080fd5b506100d3610789565b3480156102cf57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435166024351515610807565b34801561030257600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101ba9473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506108c39650505050505050565b34801561037e57600080fd5b5061024273ffffffffffffffffffffffffffffffffffffffff60043581169060243516610902565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b820191906000526020600020905b81548152906001019060200180831161043357829003601f168201915b5050505050905090565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061048d82610705565b905073ffffffffffffffffffffffffffffffffffffffff83811690821614156104b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806104de57506104de8133610902565b15156104e957600080fd5b60006104f48361045a565b73ffffffffffffffffffffffffffffffffffffffff1614158061052c575073ffffffffffffffffffffffffffffffffffffffff831615155b156105bb5760008281526003602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b806105cb338261093d565b15156105d657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841615156105f857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316151561061a57600080fd5b61062484836109d0565b61062e8483610abd565b6106388383610b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b806106ae338261093d565b15156106b957600080fd5b6106d584848460206040519081016040528060008152506108c3565b50505050565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561073657600080fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216151561076057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b73ffffffffffffffffffffffffffffffffffffffff821633141561082a57600080fd5b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b816108ce338261093d565b15156108d957600080fd5b6108e48585856105c0565b6108f085858585610c4f565b15156108fb57600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60008061094983610705565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806109b857508373ffffffffffffffffffffffffffffffffffffffff166109a08461045a565b73ffffffffffffffffffffffffffffffffffffffff16145b806109c857506109c88185610902565b949350505050565b8173ffffffffffffffffffffffffffffffffffffffff166109f082610705565b73ffffffffffffffffffffffffffffffffffffffff1614610a1057600080fd5b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610ab957600081815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558051848152905173ffffffffffffffffffffffffffffffffffffffff8616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b5050565b8173ffffffffffffffffffffffffffffffffffffffff16610add82610705565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054610b2e906001610df6565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602090815260408083209490945591815260029091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610bbb57600080fd5b600081815260026020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871690811790915583526004909152902054610c22906001610e08565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602052604090209190915550565b600080610c5b85610e1e565b1515610c6a5760019150610ded565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d29578181015183820152602001610d11565b50505050905090810190601f168015610d565780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505050506040513d6020811015610da157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b600082821115610e0257fe5b50900390565b600082820183811015610e1757fe5b9392505050565b6000903b11905600a165627a7a7230582004558fc9858a51e11dc082481a3160384756a03fb45a249a2295bf567358fb3c0029",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0xF60 CODESIZE SUB DUP1 PUSH2 0xF60 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP2 DUP4 ADD DUP1 MLOAD SWAP1 SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x48 SWAP2 PUSH1 0x0 SWAP2 SWAP1 DUP6 ADD SWAP1 PUSH2 0x64 JUMP JUMPDEST POP DUP1 MLOAD PUSH2 0x5C SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH2 0x64 JUMP JUMPDEST POP POP POP PUSH2 0xFF JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xA5 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xD2 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xD2 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xD2 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xB7 JUMP JUMPDEST POP PUSH2 0xDE SWAP3 SWAP2 POP PUSH2 0xE2 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xFC SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xDE JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xE8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE52 DUP1 PUSH2 0x10E PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x148 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BC JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x4F558E79 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2AE JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x2F6 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x372 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x3A6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x13A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x482 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x5C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x6A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH1 0x4 CALLDATALOAD PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x705 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x73C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x789 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x807 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0x1BA SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP6 PUSH1 0x44 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x8C3 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x902 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x433 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48D DUP3 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP3 AND EQ ISZERO PUSH2 0x4B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH2 0x4DE DUP2 CALLER PUSH2 0x902 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4F4 DUP4 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 PUSH2 0x52C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP2 DUP3 OR SWAP1 SWAP3 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP1 SWAP4 SWAP2 DUP6 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x5CB CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND ISZERO ISZERO PUSH2 0x5F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x624 DUP5 DUP4 PUSH2 0x9D0 JUMP JUMPDEST PUSH2 0x62E DUP5 DUP4 PUSH2 0xABD JUMP JUMPDEST PUSH2 0x638 DUP4 DUP4 PUSH2 0xB8C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6AE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x6B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D5 DUP5 DUP5 DUP5 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 DUP8 DUP10 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH2 0x8CE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8E4 DUP6 DUP6 DUP6 PUSH2 0x5C0 JUMP JUMPDEST PUSH2 0x8F0 DUP6 DUP6 DUP6 DUP6 PUSH2 0xC4F JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x949 DUP4 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x9B8 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9A0 DUP5 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST DUP1 PUSH2 0x9C8 JUMPI POP PUSH2 0x9C8 DUP2 DUP6 PUSH2 0x902 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9F0 DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xAB9 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xADD DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xB2E SWAP1 PUSH1 0x1 PUSH2 0xDF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xBBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP4 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0xC22 SWAP1 PUSH1 0x1 PUSH2 0xE08 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC5B DUP6 PUSH2 0xE1E JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC6A JUMPI PUSH1 0x1 SWAP2 POP PUSH2 0xDED JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF0B9E5BA DUP8 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD29 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD11 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD56 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xDA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 EQ SWAP3 POP SWAP1 POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xE02 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xE17 JUMPI INVALID JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 EXTCODESIZE GT SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DIV SSTORE DUP16 0xc9 DUP6 DUP11 MLOAD 0xe1 SAR 0xc0 DUP3 0x48 BYTE BALANCE PUSH1 0x38 0x47 JUMP LOG0 0x3f 0xb4 GAS 0x24 SWAP11 0x22 SWAP6 0xbf JUMP PUSH20 0x58FB3C0029000000000000000000000000000000 ",
- "sourceMap": "1506:12635:0:-;;;2788:144;8:9:-1;5:2;;;30:1;27;20:12;5:2;2788:144:0;;;;;;;;;;;;;;;;;;;;;;;;2885:13;;2788:144;;;;;;;2885:13;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;2908:17:0;;;;:7;;:17;;;;;:::i;:::-;;2788:144;;1506:12635;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1506:12635:0;;;-1:-1:-1;1506:12635:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ "object": "0x608060405234801561001057600080fd5b506040516200102d3803806200102d83398101604052805160208083015191830180519093929092019161004a9160009190850190610066565b50805161005e906001906020840190610066565b505050610101565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a757805160ff19168380011785556100d4565b828001600101855582156100d4579182015b828111156100d45782518255916020019190600101906100b9565b506100e09291506100e4565b5090565b6100fe91905b808211156100e057600081556001016100ea565b90565b610f1c80620001116000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063081812fc14610148578063095ea7b31461018957806323b872dd146101bc57806342842e0e146101f35780634f558e791461022a5780636352211e1461025657806370a082311461026e57806395d89b41146102ae578063a22cb465146102c3578063b88d4fde146102f6578063e985e9c514610372575b600080fd5b3480156100ca57600080fd5b506100d36103a6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010d5781810151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015457600080fd5b5061016060043561045a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561019557600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff60043516602435610482565b005b3480156101c857600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356105c0565b3480156101ff57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356106a3565b34801561023657600080fd5b506102426004356106db565b604080519115158252519081900360200190f35b34801561026257600080fd5b50610160600435610705565b34801561027a57600080fd5b5061029c73ffffffffffffffffffffffffffffffffffffffff6004351661073c565b60408051918252519081900360200190f35b3480156102ba57600080fd5b506100d3610789565b3480156102cf57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435166024351515610807565b34801561030257600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101ba9473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506108c39650505050505050565b34801561037e57600080fd5b5061024273ffffffffffffffffffffffffffffffffffffffff60043581169060243516610902565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b820191906000526020600020905b81548152906001019060200180831161043357829003601f168201915b5050505050905090565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061048d82610705565b905073ffffffffffffffffffffffffffffffffffffffff83811690821614156104b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806104de57506104de8133610902565b15156104e957600080fd5b60006104f48361045a565b73ffffffffffffffffffffffffffffffffffffffff1614158061052c575073ffffffffffffffffffffffffffffffffffffffff831615155b156105bb5760008281526003602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b806105cb338261093d565b15156105d657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841615156105f857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316151561061a57600080fd5b61062484836109d0565b61062e8483610abd565b6106388383610b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b806106ae338261093d565b15156106b957600080fd5b6106d584848460206040519081016040528060008152506108c3565b50505050565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561073657600080fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216151561076057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b73ffffffffffffffffffffffffffffffffffffffff821633141561082a57600080fd5b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b816108ce338261093d565b15156108d957600080fd5b6108e48585856105c0565b6108f085858585610c4f565b15156108fb57600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60008061094983610705565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806109b857508373ffffffffffffffffffffffffffffffffffffffff166109a08461045a565b73ffffffffffffffffffffffffffffffffffffffff16145b806109c857506109c88185610902565b949350505050565b8173ffffffffffffffffffffffffffffffffffffffff166109f082610705565b73ffffffffffffffffffffffffffffffffffffffff1614610a1057600080fd5b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610ab957600081815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558051848152905173ffffffffffffffffffffffffffffffffffffffff8616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b5050565b8173ffffffffffffffffffffffffffffffffffffffff16610add82610705565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054610b2e906001610df6565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602090815260408083209490945591815260029091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610bbb57600080fd5b600081815260026020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871690811790915583526004909152902054610c22906001610e6d565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602052604090209190915550565b600080610c5b85610ee8565b1515610c6a5760019150610ded565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d29578181015183820152602001610d11565b50505050905090810190601f168015610d565780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505050506040513d6020811015610da157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b600082821115610e6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600082820183811015610ee157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b6000903b11905600a165627a7a723058203b8ccc1829015734ddfc23ae46887a4de96066aa5a523d21ce4645ac878c6b5d0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x102D CODESIZE SUB DUP1 PUSH3 0x102D DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP2 DUP4 ADD DUP1 MLOAD SWAP1 SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x4A SWAP2 PUSH1 0x0 SWAP2 SWAP1 DUP6 ADD SWAP1 PUSH2 0x66 JUMP JUMPDEST POP DUP1 MLOAD PUSH2 0x5E SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH2 0x66 JUMP JUMPDEST POP POP POP PUSH2 0x101 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xA7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xD4 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xD4 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xD4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xB9 JUMP JUMPDEST POP PUSH2 0xE0 SWAP3 SWAP2 POP PUSH2 0xE4 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xFE SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xEA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF1C DUP1 PUSH3 0x111 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x148 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BC JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x4F558E79 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2AE JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x2F6 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x372 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x3A6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x13A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x482 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x5C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x6A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH1 0x4 CALLDATALOAD PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x705 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x73C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x789 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x807 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0x1BA SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP6 PUSH1 0x44 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x8C3 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x902 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x433 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48D DUP3 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP3 AND EQ ISZERO PUSH2 0x4B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH2 0x4DE DUP2 CALLER PUSH2 0x902 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4F4 DUP4 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 PUSH2 0x52C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP2 DUP3 OR SWAP1 SWAP3 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP1 SWAP4 SWAP2 DUP6 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x5CB CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND ISZERO ISZERO PUSH2 0x5F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x624 DUP5 DUP4 PUSH2 0x9D0 JUMP JUMPDEST PUSH2 0x62E DUP5 DUP4 PUSH2 0xABD JUMP JUMPDEST PUSH2 0x638 DUP4 DUP4 PUSH2 0xB8C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6AE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x6B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D5 DUP5 DUP5 DUP5 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 DUP8 DUP10 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH2 0x8CE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8E4 DUP6 DUP6 DUP6 PUSH2 0x5C0 JUMP JUMPDEST PUSH2 0x8F0 DUP6 DUP6 DUP6 DUP6 PUSH2 0xC4F JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x949 DUP4 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x9B8 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9A0 DUP5 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST DUP1 PUSH2 0x9C8 JUMPI POP PUSH2 0x9C8 DUP2 DUP6 PUSH2 0x902 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9F0 DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xAB9 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xADD DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xB2E SWAP1 PUSH1 0x1 PUSH2 0xDF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xBBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP4 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0xC22 SWAP1 PUSH1 0x1 PUSH2 0xE6D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC5B DUP6 PUSH2 0xEE8 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC6A JUMPI PUSH1 0x1 SWAP2 POP PUSH2 0xDED JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF0B9E5BA DUP8 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD29 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD11 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD56 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xDA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 EQ SWAP3 POP SWAP1 POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xE67 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xEE1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 EXTCODESIZE GT SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 EXTCODESIZE DUP13 0xcc XOR 0x29 ADD JUMPI CALLVALUE 0xdd 0xfc 0x23 0xae 0x46 DUP9 PUSH27 0x4DE96066AA5A523D21CE4645AC878C6B5D00290000000000000000 ",
+ "sourceMap": "1506:12636:0:-;;;2797:136;8:9:-1;5:2;;;30:1;27;20:12;5:2;2797:136:0;;;;;;;;;;;;;;;;;;;;;;;;2886:13;;2797:136;;;;;;;2886:13;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;2909:17:0;;;;:7;;:17;;;;;:::i;:::-;;2797:136;;1506:12636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1506:12636:0;;;-1:-1:-1;1506:12636:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
- "object": "0x6080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063081812fc14610148578063095ea7b31461018957806323b872dd146101bc57806342842e0e146101f35780634f558e791461022a5780636352211e1461025657806370a082311461026e57806395d89b41146102ae578063a22cb465146102c3578063b88d4fde146102f6578063e985e9c514610372575b600080fd5b3480156100ca57600080fd5b506100d36103a6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010d5781810151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015457600080fd5b5061016060043561045a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561019557600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff60043516602435610482565b005b3480156101c857600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356105c0565b3480156101ff57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356106a3565b34801561023657600080fd5b506102426004356106db565b604080519115158252519081900360200190f35b34801561026257600080fd5b50610160600435610705565b34801561027a57600080fd5b5061029c73ffffffffffffffffffffffffffffffffffffffff6004351661073c565b60408051918252519081900360200190f35b3480156102ba57600080fd5b506100d3610789565b3480156102cf57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435166024351515610807565b34801561030257600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101ba9473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506108c39650505050505050565b34801561037e57600080fd5b5061024273ffffffffffffffffffffffffffffffffffffffff60043581169060243516610902565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b820191906000526020600020905b81548152906001019060200180831161043357829003601f168201915b5050505050905090565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061048d82610705565b905073ffffffffffffffffffffffffffffffffffffffff83811690821614156104b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806104de57506104de8133610902565b15156104e957600080fd5b60006104f48361045a565b73ffffffffffffffffffffffffffffffffffffffff1614158061052c575073ffffffffffffffffffffffffffffffffffffffff831615155b156105bb5760008281526003602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b806105cb338261093d565b15156105d657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841615156105f857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316151561061a57600080fd5b61062484836109d0565b61062e8483610abd565b6106388383610b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b806106ae338261093d565b15156106b957600080fd5b6106d584848460206040519081016040528060008152506108c3565b50505050565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561073657600080fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216151561076057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b73ffffffffffffffffffffffffffffffffffffffff821633141561082a57600080fd5b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b816108ce338261093d565b15156108d957600080fd5b6108e48585856105c0565b6108f085858585610c4f565b15156108fb57600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60008061094983610705565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806109b857508373ffffffffffffffffffffffffffffffffffffffff166109a08461045a565b73ffffffffffffffffffffffffffffffffffffffff16145b806109c857506109c88185610902565b949350505050565b8173ffffffffffffffffffffffffffffffffffffffff166109f082610705565b73ffffffffffffffffffffffffffffffffffffffff1614610a1057600080fd5b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610ab957600081815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558051848152905173ffffffffffffffffffffffffffffffffffffffff8616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b5050565b8173ffffffffffffffffffffffffffffffffffffffff16610add82610705565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054610b2e906001610df6565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602090815260408083209490945591815260029091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610bbb57600080fd5b600081815260026020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871690811790915583526004909152902054610c22906001610e08565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602052604090209190915550565b600080610c5b85610e1e565b1515610c6a5760019150610ded565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d29578181015183820152602001610d11565b50505050905090810190601f168015610d565780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505050506040513d6020811015610da157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b600082821115610e0257fe5b50900390565b600082820183811015610e1757fe5b9392505050565b6000903b11905600a165627a7a7230582004558fc9858a51e11dc082481a3160384756a03fb45a249a2295bf567358fb3c0029",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x148 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BC JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x4F558E79 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2AE JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x2F6 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x372 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x3A6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x13A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x482 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x5C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x6A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH1 0x4 CALLDATALOAD PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x705 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x73C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x789 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x807 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0x1BA SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP6 PUSH1 0x44 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x8C3 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x902 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x433 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48D DUP3 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP3 AND EQ ISZERO PUSH2 0x4B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH2 0x4DE DUP2 CALLER PUSH2 0x902 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4F4 DUP4 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 PUSH2 0x52C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP2 DUP3 OR SWAP1 SWAP3 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP1 SWAP4 SWAP2 DUP6 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x5CB CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND ISZERO ISZERO PUSH2 0x5F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x624 DUP5 DUP4 PUSH2 0x9D0 JUMP JUMPDEST PUSH2 0x62E DUP5 DUP4 PUSH2 0xABD JUMP JUMPDEST PUSH2 0x638 DUP4 DUP4 PUSH2 0xB8C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6AE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x6B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D5 DUP5 DUP5 DUP5 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 DUP8 DUP10 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH2 0x8CE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8E4 DUP6 DUP6 DUP6 PUSH2 0x5C0 JUMP JUMPDEST PUSH2 0x8F0 DUP6 DUP6 DUP6 DUP6 PUSH2 0xC4F JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x949 DUP4 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x9B8 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9A0 DUP5 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST DUP1 PUSH2 0x9C8 JUMPI POP PUSH2 0x9C8 DUP2 DUP6 PUSH2 0x902 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9F0 DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xAB9 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xADD DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xB2E SWAP1 PUSH1 0x1 PUSH2 0xDF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xBBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP4 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0xC22 SWAP1 PUSH1 0x1 PUSH2 0xE08 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC5B DUP6 PUSH2 0xE1E JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC6A JUMPI PUSH1 0x1 SWAP2 POP PUSH2 0xDED JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF0B9E5BA DUP8 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD29 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD11 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD56 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xDA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 EQ SWAP3 POP SWAP1 POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xE02 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xE17 JUMPI INVALID JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 EXTCODESIZE GT SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DIV SSTORE DUP16 0xc9 DUP6 DUP11 MLOAD 0xe1 SAR 0xc0 DUP3 0x48 BYTE BALANCE PUSH1 0x38 0x47 JUMP LOG0 0x3f 0xb4 GAS 0x24 SWAP11 0x22 SWAP6 0xbf JUMP PUSH20 0x58FB3C0029000000000000000000000000000000 ",
- "sourceMap": "1506:12635:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3033:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3033:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3033:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5586:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5586:145:0;;;;;;;;;;;;;;;;;;;;;;;;4948:401;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4948:401:0;;;;;;;;;;;7190:362;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7190:362:0;;;;;;;;;;;;;;8183:254;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8183:254:0;;;;;;;;;;;;;;4339:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4339:178:0;;;;;;;;;;;;;;;;;;;;;;;3947:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3947:206:0;;;;;3546:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3546:180:0;;;;;;;;;;;;;;;;;;;;;;;3240:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3240:106:0;;;;6025:231;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6025:231:0;;;;;;;;;;;9139:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9139:339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9139:339:0;;-1:-1:-1;9139:339:0;;-1:-1:-1;;;;;;;9139:339:0;6574:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6574:176:0;;;;;;;;;;;;3033:102;3123:5;3116:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:6;;3116:12;;3123:5;;3116:12;;3123:5;3116:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3033:102;:::o;5586:145::-;5670:7;5700:24;;;:14;:24;;;;;;;;;5586:145::o;4948:401::-;5025:13;5041:17;5049:8;5041:7;:17::i;:::-;5025:33;-1:-1:-1;5076:12:0;;;;;;;;;5068:21;;;;;;5107:10;:19;;;;;:58;;;5130:35;5147:5;5154:10;5130:16;:35::i;:::-;5099:67;;;;;;;;5214:1;5181:21;5193:8;5181:11;:21::i;:::-;:35;;;;:56;;;-1:-1:-1;5220:17:0;;;;;5181:56;5177:166;;;5253:24;;;;:14;:24;;;;;;;;;:30;;;;;;;;;;;;;;5302;;;;;;;5253;;5302;;;;;;;;;;;;5177:166;4948:401;;;:::o;7190:362::-;7293:8;2724:39;2742:10;2754:8;2724:17;:39::i;:::-;2716:48;;;;;;;;7325:19;;;;;7317:28;;;;;;7363:17;;;;;7355:26;;;;;;7392:30;7406:5;7413:8;7392:13;:30::i;:::-;7432:32;7448:5;7455:8;7432:15;:32::i;:::-;7474:25;7485:3;7490:8;7474:10;:25::i;:::-;7531:3;7515:30;;7524:5;7515:30;;;7536:8;7515:30;;;;;;;;;;;;;;;;;;7190:362;;;;:::o;8183:254::-;8315:8;2724:39;2742:10;2754:8;2724:17;:39::i;:::-;2716:48;;;;;;;;8388:42;8405:5;8412:3;8417:8;8388:42;;;;;;;;;;;;;:16;:42::i;:::-;8183:254;;;;:::o;4339:178::-;4418:4;4454:20;;;:10;:20;;;;;;;;4491:19;;;4339:178::o;3947:206::-;4027:7;4066:20;;;:10;:20;;;;;;;;4104:19;;;4096:28;;;;;;4141:5;3947:206;-1:-1:-1;;3947:206:0:o;3546:180::-;3626:7;3657:20;;;;;3649:29;;;;;;-1:-1:-1;3695:24:0;;;;;;:16;:24;;;;;;;3546:180::o;3240:106::-;3332:7;3325:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3303:6;;3325:14;;3332:7;;3325:14;;3332:7;3325:14;;;;;;;;;;;;;;;;;;;;;;;;6025:231;6118:17;;;6125:10;6118:17;;6110:26;;;;;;6164:10;6146:29;;;;:17;:29;;;;;;;;;:34;;;;;;;;;;;;:46;;;;;;;;;;;;;6207:42;;;;;;;6146:34;;6164:10;6207:42;;;;;;;;;;;6025:231;;:::o;9139:339::-;9292:8;2724:39;2742:10;2754:8;2724:17;:39::i;:::-;2716:48;;;;;;;;9316:34;9329:5;9336:3;9341:8;9316:12;:34::i;:::-;9417:53;9442:5;9449:3;9454:8;9464:5;9417:24;:53::i;:::-;9409:62;;;;;;;;9139:339;;;;;:::o;6574:176::-;6707:25;;;;6680:4;6707:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;6574:176::o;9835:278::-;9945:4;9965:13;9981:17;9989:8;9981:7;:17::i;:::-;9965:33;;10027:5;10015:17;;:8;:17;;;:54;;;;10061:8;10036:33;;:21;10048:8;10036:11;:21::i;:::-;:33;;;10015:54;:91;;;;10073:33;10090:5;10097:8;10073:16;:33::i;:::-;10008:98;9835:278;-1:-1:-1;;;;9835:278:0:o;11260:303::-;11377:6;11356:27;;:17;11364:8;11356:7;:17::i;:::-;:27;;;11348:36;;;;;;11434:1;11398:24;;;:14;:24;;;;;;:38;:24;:38;11394:163;;11487:1;11452:24;;;:14;:24;;;;;;;;:37;;;;;;11508:38;;;;;;;11452:37;11508:38;;;;;;;;;;;11394:163;11260:303;;:::o;12356:245::-;12474:5;12453:26;;:17;12461:8;12453:7;:17::i;:::-;:26;;;12445:35;;;;;;12524:23;;;;;;;:16;:23;;;;;;12516:35;;12549:1;12516:7;:35::i;:::-;12490:23;;;;;;;;:16;:23;;;;;;;;:61;;;;12561:20;;;:10;:20;;;;:33;;;;;;12356:245::o;11834:235::-;11956:1;11924:20;;;:10;:20;;;;;;:34;:20;:34;11916:43;;;;;;11969:20;;;;:10;:20;;;;;;;;:26;;;;;;;;;;;;;12037:21;;:16;:21;;;;;;12029:33;;-1:-1:-1;12029:7:0;:33::i;:::-;12005:21;;;;;;;;:16;:21;;;;;:57;;;;-1:-1:-1;11834:235:0:o;13124:375::-;13284:4;13371:13;13309:15;13320:3;13309:10;:15::i;:::-;13308:16;13304:58;;;13347:4;13340:11;;;;13304:58;13403:3;13387:37;;;13425:5;13432:8;13442:5;13387:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13387:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13387:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13387:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13387:61:0;13466:25;;;13476:15;13466:25;;-1:-1:-1;13387:61:0;-1:-1:-1;13124:375:0;;;;;;;;:::o;418:146:3:-;498:7;528:6;;;;521:14;;;;-1:-1:-1;552:5:3;;;418:146::o;570:166::-;650:7;682:5;;;704:6;;;;697:14;;;;728:1;570:166;-1:-1:-1;;;570:166:3:o;13505:634:0:-;13586:4;14037:17;;14124:8;;13505:634::o"
+ "object": "0x6080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063081812fc14610148578063095ea7b31461018957806323b872dd146101bc57806342842e0e146101f35780634f558e791461022a5780636352211e1461025657806370a082311461026e57806395d89b41146102ae578063a22cb465146102c3578063b88d4fde146102f6578063e985e9c514610372575b600080fd5b3480156100ca57600080fd5b506100d36103a6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010d5781810151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015457600080fd5b5061016060043561045a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561019557600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff60043516602435610482565b005b3480156101c857600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356105c0565b3480156101ff57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356106a3565b34801561023657600080fd5b506102426004356106db565b604080519115158252519081900360200190f35b34801561026257600080fd5b50610160600435610705565b34801561027a57600080fd5b5061029c73ffffffffffffffffffffffffffffffffffffffff6004351661073c565b60408051918252519081900360200190f35b3480156102ba57600080fd5b506100d3610789565b3480156102cf57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435166024351515610807565b34801561030257600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101ba9473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506108c39650505050505050565b34801561037e57600080fd5b5061024273ffffffffffffffffffffffffffffffffffffffff60043581169060243516610902565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b820191906000526020600020905b81548152906001019060200180831161043357829003601f168201915b5050505050905090565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061048d82610705565b905073ffffffffffffffffffffffffffffffffffffffff83811690821614156104b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806104de57506104de8133610902565b15156104e957600080fd5b60006104f48361045a565b73ffffffffffffffffffffffffffffffffffffffff1614158061052c575073ffffffffffffffffffffffffffffffffffffffff831615155b156105bb5760008281526003602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b806105cb338261093d565b15156105d657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841615156105f857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316151561061a57600080fd5b61062484836109d0565b61062e8483610abd565b6106388383610b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b806106ae338261093d565b15156106b957600080fd5b6106d584848460206040519081016040528060008152506108c3565b50505050565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561073657600080fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216151561076057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b73ffffffffffffffffffffffffffffffffffffffff821633141561082a57600080fd5b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b816108ce338261093d565b15156108d957600080fd5b6108e48585856105c0565b6108f085858585610c4f565b15156108fb57600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60008061094983610705565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806109b857508373ffffffffffffffffffffffffffffffffffffffff166109a08461045a565b73ffffffffffffffffffffffffffffffffffffffff16145b806109c857506109c88185610902565b949350505050565b8173ffffffffffffffffffffffffffffffffffffffff166109f082610705565b73ffffffffffffffffffffffffffffffffffffffff1614610a1057600080fd5b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610ab957600081815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558051848152905173ffffffffffffffffffffffffffffffffffffffff8616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b5050565b8173ffffffffffffffffffffffffffffffffffffffff16610add82610705565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054610b2e906001610df6565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602090815260408083209490945591815260029091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610bbb57600080fd5b600081815260026020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871690811790915583526004909152902054610c22906001610e6d565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602052604090209190915550565b600080610c5b85610ee8565b1515610c6a5760019150610ded565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d29578181015183820152602001610d11565b50505050905090810190601f168015610d565780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505050506040513d6020811015610da157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b600082821115610e6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600082820183811015610ee157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b6000903b11905600a165627a7a723058203b8ccc1829015734ddfc23ae46887a4de96066aa5a523d21ce4645ac878c6b5d0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x148 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BC JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x4F558E79 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2AE JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x2F6 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x372 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x3A6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x13A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x482 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x5C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x6A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH1 0x4 CALLDATALOAD PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x705 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x73C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x789 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x807 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0x1BA SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP6 PUSH1 0x44 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x8C3 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x902 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x433 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48D DUP3 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP3 AND EQ ISZERO PUSH2 0x4B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH2 0x4DE DUP2 CALLER PUSH2 0x902 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4F4 DUP4 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 PUSH2 0x52C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP2 DUP3 OR SWAP1 SWAP3 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP1 SWAP4 SWAP2 DUP6 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x5CB CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND ISZERO ISZERO PUSH2 0x5F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x624 DUP5 DUP4 PUSH2 0x9D0 JUMP JUMPDEST PUSH2 0x62E DUP5 DUP4 PUSH2 0xABD JUMP JUMPDEST PUSH2 0x638 DUP4 DUP4 PUSH2 0xB8C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6AE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x6B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D5 DUP5 DUP5 DUP5 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 DUP8 DUP10 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH2 0x8CE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8E4 DUP6 DUP6 DUP6 PUSH2 0x5C0 JUMP JUMPDEST PUSH2 0x8F0 DUP6 DUP6 DUP6 DUP6 PUSH2 0xC4F JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x949 DUP4 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x9B8 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9A0 DUP5 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST DUP1 PUSH2 0x9C8 JUMPI POP PUSH2 0x9C8 DUP2 DUP6 PUSH2 0x902 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9F0 DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xAB9 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xADD DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xB2E SWAP1 PUSH1 0x1 PUSH2 0xDF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xBBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP4 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0xC22 SWAP1 PUSH1 0x1 PUSH2 0xE6D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC5B DUP6 PUSH2 0xEE8 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC6A JUMPI PUSH1 0x1 SWAP2 POP PUSH2 0xDED JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF0B9E5BA DUP8 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD29 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD11 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD56 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xDA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 EQ SWAP3 POP SWAP1 POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xE67 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xEE1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 EXTCODESIZE GT SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 EXTCODESIZE DUP13 0xcc XOR 0x29 ADD JUMPI CALLVALUE 0xdd 0xfc 0x23 0xae 0x46 DUP9 PUSH27 0x4DE96066AA5A523D21CE4645AC878C6B5D00290000000000000000 ",
+ "sourceMap": "1506:12636:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3034:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3034:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3034:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5587:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5587:145:0;;;;;;;;;;;;;;;;;;;;;;;;4949:401;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4949:401:0;;;;;;;;;;;7191:362;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7191:362:0;;;;;;;;;;;;;;8184:254;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8184:254:0;;;;;;;;;;;;;;4340:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4340:178:0;;;;;;;;;;;;;;;;;;;;;;;3948:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3948:206:0;;;;;3547:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3547:180:0;;;;;;;;;;;;;;;;;;;;;;;3241:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3241:106:0;;;;6026:231;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6026:231:0;;;;;;;;;;;9140:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9140:339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9140:339:0;;-1:-1:-1;9140:339:0;;-1:-1:-1;;;;;;;9140:339:0;6575:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6575:176:0;;;;;;;;;;;;3034:102;3124:5;3117:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3095:6;;3117:12;;3124:5;;3117:12;;3124:5;3117:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3034:102;:::o;5587:145::-;5671:7;5701:24;;;:14;:24;;;;;;;;;5587:145::o;4949:401::-;5026:13;5042:17;5050:8;5042:7;:17::i;:::-;5026:33;-1:-1:-1;5077:12:0;;;;;;;;;5069:21;;;;;;5108:10;:19;;;;;:58;;;5131:35;5148:5;5155:10;5131:16;:35::i;:::-;5100:67;;;;;;;;5215:1;5182:21;5194:8;5182:11;:21::i;:::-;:35;;;;:56;;;-1:-1:-1;5221:17:0;;;;;5182:56;5178:166;;;5254:24;;;;:14;:24;;;;;;;;;:30;;;;;;;;;;;;;;5303;;;;;;;5254;;5303;;;;;;;;;;;;5178:166;4949:401;;;:::o;7191:362::-;7294:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;7326:19;;;;;7318:28;;;;;;7364:17;;;;;7356:26;;;;;;7393:30;7407:5;7414:8;7393:13;:30::i;:::-;7433:32;7449:5;7456:8;7433:15;:32::i;:::-;7475:25;7486:3;7491:8;7475:10;:25::i;:::-;7532:3;7516:30;;7525:5;7516:30;;;7537:8;7516:30;;;;;;;;;;;;;;;;;;7191:362;;;;:::o;8184:254::-;8316:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;8389:42;8406:5;8413:3;8418:8;8389:42;;;;;;;;;;;;;:16;:42::i;:::-;8184:254;;;;:::o;4340:178::-;4419:4;4455:20;;;:10;:20;;;;;;;;4492:19;;;4340:178::o;3948:206::-;4028:7;4067:20;;;:10;:20;;;;;;;;4105:19;;;4097:28;;;;;;4142:5;3948:206;-1:-1:-1;;3948:206:0:o;3547:180::-;3627:7;3658:20;;;;;3650:29;;;;;;-1:-1:-1;3696:24:0;;;;;;:16;:24;;;;;;;3547:180::o;3241:106::-;3333:7;3326:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3304:6;;3326:14;;3333:7;;3326:14;;3333:7;3326:14;;;;;;;;;;;;;;;;;;;;;;;;6026:231;6119:17;;;6126:10;6119:17;;6111:26;;;;;;6165:10;6147:29;;;;:17;:29;;;;;;;;;:34;;;;;;;;;;;;:46;;;;;;;;;;;;;6208:42;;;;;;;6147:34;;6165:10;6208:42;;;;;;;;;;;6026:231;;:::o;9140:339::-;9293:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;9317:34;9330:5;9337:3;9342:8;9317:12;:34::i;:::-;9418:53;9443:5;9450:3;9455:8;9465:5;9418:24;:53::i;:::-;9410:62;;;;;;;;9140:339;;;;;:::o;6575:176::-;6708:25;;;;6681:4;6708:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;6575:176::o;9836:278::-;9946:4;9966:13;9982:17;9990:8;9982:7;:17::i;:::-;9966:33;;10028:5;10016:17;;:8;:17;;;:54;;;;10062:8;10037:33;;:21;10049:8;10037:11;:21::i;:::-;:33;;;10016:54;:91;;;;10074:33;10091:5;10098:8;10074:16;:33::i;:::-;10009:98;9836:278;-1:-1:-1;;;;9836:278:0:o;11261:303::-;11378:6;11357:27;;:17;11365:8;11357:7;:17::i;:::-;:27;;;11349:36;;;;;;11435:1;11399:24;;;:14;:24;;;;;;:38;:24;:38;11395:163;;11488:1;11453:24;;;:14;:24;;;;;;;;:37;;;;;;11509:38;;;;;;;11453:37;11509:38;;;;;;;;;;;11395:163;11261:303;;:::o;12357:245::-;12475:5;12454:26;;:17;12462:8;12454:7;:17::i;:::-;:26;;;12446:35;;;;;;12525:23;;;;;;;:16;:23;;;;;;12517:35;;12550:1;12517:7;:35::i;:::-;12491:23;;;;;;;;:16;:23;;;;;;;;:61;;;;12562:20;;;:10;:20;;;;:33;;;;;;12357:245::o;11835:235::-;11957:1;11925:20;;;:10;:20;;;;;;:34;:20;:34;11917:43;;;;;;11970:20;;;;:10;:20;;;;;;;;:26;;;;;;;;;;;;;12038:21;;:16;:21;;;;;;12030:33;;-1:-1:-1;12030:7:0;:33::i;:::-;12006:21;;;;;;;;:16;:21;;;;;:57;;;;-1:-1:-1;11835:235:0:o;13125:375::-;13285:4;13372:13;13310:15;13321:3;13310:10;:15::i;:::-;13309:16;13305:58;;;13348:4;13341:11;;;;13305:58;13404:3;13388:37;;;13426:5;13433:8;13443:5;13388:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13388:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13388:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13388:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13388:61:0;13467:25;;;13477:15;13467:25;;-1:-1:-1;13388:61:0;-1:-1:-1;13125:375:0;;;;;;;;:::o;501:207:3:-;587:7;631:6;;;;610:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;696:5:3;;;501:207::o;714:230::-;800:7;835:5;;;871:6;;;;850:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;936:1;714:230;-1:-1:-1;;;714:230:3:o;13506:634:0:-;13587:4;14038:17;;14125:8;;13506:634::o"
}
}
},
"sources": {
- "current/tokens/ERC721Token/ERC721Token.sol": {
+ "2.0.0/tokens/ERC721Token/ERC721Token.sol": {
"id": 0
},
- "current/tokens/ERC721Token/IERC721Receiver.sol": {
+ "2.0.0/tokens/ERC721Token/IERC721Receiver.sol": {
"id": 1
},
- "current/tokens/ERC721Token/IERC721Token.sol": {
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": {
"id": 2
},
- "current/utils/SafeMath/SafeMath.sol": {
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
"id": 3
}
},
"sourceCodes": {
- "current/tokens/ERC721Token/ERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\nimport \"./IERC721Token.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic implementation\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721BasicToken.sol\n */\ncontract ERC721Token is\n IERC721Token,\n SafeMath\n{\n // Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;\n\n // Mapping from token ID to owner\n mapping (uint256 => address) internal tokenOwner;\n\n // Mapping from token ID to approved address\n mapping (uint256 => address) internal tokenApprovals;\n\n // Mapping from owner to number of owned token\n mapping (address => uint256) internal ownedTokensCount;\n\n // Mapping from owner to operator approvals\n mapping (address => mapping (address => bool)) internal operatorApprovals;\n\n /**\n * @dev Guarantees msg.sender is owner of the given token\n * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender\n */\n modifier onlyOwnerOf(uint256 _tokenId) {\n require(ownerOf(_tokenId) == msg.sender);\n _;\n }\n\n /**\n * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator\n * @param _tokenId uint256 ID of the token to validate\n */\n modifier canTransfer(uint256 _tokenId) {\n require(isApprovedOrOwner(msg.sender, _tokenId));\n _;\n }\n\n function ERC721Token(\n string _name,\n string _symbol)\n public\n {\n name_ = _name;\n symbol_ = _symbol;\n }\n\n /**\n * @dev Gets the token name\n * @return string representing the token name\n */\n function name()\n public\n view\n returns (string)\n {\n return name_;\n }\n\n /**\n * @dev Gets the token symbol\n * @return string representing the token symbol\n */\n function symbol()\n public\n view\n returns (string)\n {\n return symbol_;\n }\n\n /**\n * @dev Gets the balance of the specified address\n * @param _owner address to query the balance of\n * @return uint256 representing the amount owned by the passed address\n */\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n require(_owner != address(0));\n return ownedTokensCount[_owner];\n }\n\n /**\n * @dev Gets the owner of the specified token ID\n * @param _tokenId uint256 ID of the token to query the owner of\n * @return owner address currently marked as the owner of the given token ID\n */\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address)\n {\n address owner = tokenOwner[_tokenId];\n require(owner != address(0));\n return owner;\n }\n\n /**\n * @dev Returns whether the specified token exists\n * @param _tokenId uint256 ID of the token to query the existance of\n * @return whether the token exists\n */\n function exists(uint256 _tokenId)\n public\n view\n returns (bool)\n {\n address owner = tokenOwner[_tokenId];\n return owner != address(0);\n }\n\n /**\n * @dev Approves another address to transfer the given token ID\n * @dev The zero address indicates there is no approved address.\n * @dev There can only be one approved address per token at a given time.\n * @dev Can only be called by the token owner or an approved operator.\n * @param _to address to be approved for the given token ID\n * @param _tokenId uint256 ID of the token to be approved\n */\n function approve(address _to, uint256 _tokenId)\n public\n {\n address owner = ownerOf(_tokenId);\n require(_to != owner);\n require(msg.sender == owner || isApprovedForAll(owner, msg.sender));\n\n if (getApproved(_tokenId) != address(0) || _to != address(0)) {\n tokenApprovals[_tokenId] = _to;\n emit Approval(owner, _to, _tokenId);\n }\n }\n\n /**\n * @dev Gets the approved address for a token ID, or zero if no address set\n * @param _tokenId uint256 ID of the token to query the approval of\n * @return address currently approved for a the given token ID\n */\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address)\n {\n return tokenApprovals[_tokenId];\n }\n\n /**\n * @dev Sets or unsets the approval of a given operator\n * @dev An operator is allowed to transfer all tokens of the sender on their behalf\n * @param _to operator address to set the approval\n * @param _approved representing the status of the approval to be set\n */\n function setApprovalForAll(address _to, bool _approved)\n public\n {\n require(_to != msg.sender);\n operatorApprovals[msg.sender][_to] = _approved;\n emit ApprovalForAll(msg.sender, _to, _approved);\n }\n\n /**\n * @dev Tells whether an operator is approved by a given owner\n * @param _owner owner address which you want to query the approval of\n * @param _operator operator address which you want to query the approval of\n * @return bool whether the given operator is approved by the given owner\n */\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool)\n {\n return operatorApprovals[_owner][_operator];\n }\n\n /**\n * @dev Transfers the ownership of a given token ID to another address\n * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function transferFrom(address _from, address _to, uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n require(_from != address(0));\n require(_to != address(0));\n\n clearApproval(_from, _tokenId);\n removeTokenFrom(_from, _tokenId);\n addTokenTo(_to, _tokenId);\n\n emit Transfer(_from, _to, _tokenId);\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n // solium-disable-next-line arg-overflow\n safeTransferFrom(_from, _to, _tokenId, \"\");\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes data to send along with a safe transfer check\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public\n canTransfer(_tokenId)\n {\n transferFrom(_from, _to, _tokenId);\n // solium-disable-next-line arg-overflow\n require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));\n }\n\n /**\n * @dev Returns whether the given spender can transfer a given token ID\n * @param _spender address of the spender to query\n * @param _tokenId uint256 ID of the token to be transferred\n * @return bool whether the msg.sender is approved for the given token ID,\n * is an operator of the owner, or is the owner of the token\n */\n function isApprovedOrOwner(address _spender, uint256 _tokenId)\n internal\n view\n returns (bool)\n {\n address owner = ownerOf(_tokenId);\n return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);\n }\n\n /**\n * @dev Internal function to mint a new token\n * @dev Reverts if the given token ID already exists\n * @param _to The address that will own the minted token\n * @param _tokenId uint256 ID of the token to be minted by the msg.sender\n */\n function _mint(address _to, uint256 _tokenId)\n internal\n {\n require(_to != address(0));\n addTokenTo(_to, _tokenId);\n emit Transfer(address(0), _to, _tokenId);\n }\n\n /**\n * @dev Internal function to burn a specific token\n * @dev Reverts if the token does not exist\n * @param _tokenId uint256 ID of the token being burned by the msg.sender\n */\n function _burn(address _owner, uint256 _tokenId)\n internal\n {\n clearApproval(_owner, _tokenId);\n removeTokenFrom(_owner, _tokenId);\n emit Transfer(_owner, address(0), _tokenId);\n }\n\n /**\n * @dev Internal function to clear current approval of a given token ID\n * @dev Reverts if the given address is not indeed the owner of the token\n * @param _owner owner of the token\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function clearApproval(address _owner, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _owner);\n if (tokenApprovals[_tokenId] != address(0)) {\n tokenApprovals[_tokenId] = address(0);\n emit Approval(_owner, address(0), _tokenId);\n }\n }\n\n /**\n * @dev Internal function to add a token ID to the list of a given address\n * @param _to address representing the new owner of the given token ID\n * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address\n */\n function addTokenTo(address _to, uint256 _tokenId)\n internal\n {\n require(tokenOwner[_tokenId] == address(0));\n tokenOwner[_tokenId] = _to;\n ownedTokensCount[_to] = safeAdd(ownedTokensCount[_to], 1);\n }\n\n /**\n * @dev Internal function to remove a token ID from the list of a given address\n * @param _from address representing the previous owner of the given token ID\n * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address\n */\n function removeTokenFrom(address _from, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _from);\n ownedTokensCount[_from] = safeSub(ownedTokensCount[_from], 1);\n tokenOwner[_tokenId] = address(0);\n }\n\n /**\n * @dev Internal function to invoke `onERC721Received` on a target address\n * @dev The call is not executed if the target address is not a contract\n * @param _from address representing the previous owner of the given token ID\n * @param _to target address that will receive the tokens\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes optional data to send along with the call\n * @return whether the call correctly returned the expected magic value\n */\n function checkAndCallSafeTransfer(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n internal\n returns (bool)\n {\n if (!isContract(_to)) {\n return true;\n }\n bytes4 retval = IERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);\n return (retval == ERC721_RECEIVED);\n }\n\n function isContract(address addr)\n internal\n view\n returns (bool)\n {\n uint256 size;\n // XXX Currently there is no better way to check if there is a contract in an address\n // than to check the size of the code at that address.\n // See https://ethereum.stackexchange.com/a/14016/36603\n // for more details about how this works.\n // TODO Check this again before the Serenity release, because all addresses will be\n // contracts then.\n assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly\n return size > 0;\n }\n}\n",
- "current/tokens/ERC721Token/IERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * rom ERC721 asset contracts.\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol\n */\ncontract IERC721Receiver {\n /**\n * @dev Magic value to be returned upon successful reception of an NFT\n * Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`,\n * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n */\n bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;\n\n /**\n * @notice Handle the receipt of an NFT\n * @dev The ERC721 smart contract calls this function on the recipient\n * after a `safetransfer`. This function MAY throw to revert and reject the\n * transfer. This function MUST use 50,000 gas or less. Return of other\n * than the magic value MUST result in the transaction being reverted.\n * Note: the contract address is always the message sender.\n * @param _from The sending address\n * @param _tokenId The NFT identifier which is being transfered\n * @param _data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n */\n function onERC721Received(\n address _from,\n uint256 _tokenId,\n bytes _data)\n public\n returns (bytes4);\n}\n",
- "current/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public;\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public;\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public;\n}\n",
- "current/utils/SafeMath/SafeMath.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract SafeMath {\n function safeMul(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function safeDiv(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a / b;\n return c;\n }\n\n function safeSub(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a + b;\n assert(c >= a);\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ "2.0.0/tokens/ERC721Token/ERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\nimport \"./IERC721Token.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic implementation\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721BasicToken.sol\n */\ncontract ERC721Token is\n IERC721Token,\n SafeMath\n{\n // Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;\n\n // Mapping from token ID to owner\n mapping (uint256 => address) internal tokenOwner;\n\n // Mapping from token ID to approved address\n mapping (uint256 => address) internal tokenApprovals;\n\n // Mapping from owner to number of owned token\n mapping (address => uint256) internal ownedTokensCount;\n\n // Mapping from owner to operator approvals\n mapping (address => mapping (address => bool)) internal operatorApprovals;\n\n /**\n * @dev Guarantees msg.sender is owner of the given token\n * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender\n */\n modifier onlyOwnerOf(uint256 _tokenId) {\n require(ownerOf(_tokenId) == msg.sender);\n _;\n }\n\n /**\n * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator\n * @param _tokenId uint256 ID of the token to validate\n */\n modifier canTransfer(uint256 _tokenId) {\n require(isApprovedOrOwner(msg.sender, _tokenId));\n _;\n }\n\n constructor (\n string _name,\n string _symbol)\n public\n {\n name_ = _name;\n symbol_ = _symbol;\n }\n\n /**\n * @dev Gets the token name\n * @return string representing the token name\n */\n function name()\n public\n view\n returns (string)\n {\n return name_;\n }\n\n /**\n * @dev Gets the token symbol\n * @return string representing the token symbol\n */\n function symbol()\n public\n view\n returns (string)\n {\n return symbol_;\n }\n\n /**\n * @dev Gets the balance of the specified address\n * @param _owner address to query the balance of\n * @return uint256 representing the amount owned by the passed address\n */\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n require(_owner != address(0));\n return ownedTokensCount[_owner];\n }\n\n /**\n * @dev Gets the owner of the specified token ID\n * @param _tokenId uint256 ID of the token to query the owner of\n * @return owner address currently marked as the owner of the given token ID\n */\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address)\n {\n address owner = tokenOwner[_tokenId];\n require(owner != address(0));\n return owner;\n }\n\n /**\n * @dev Returns whether the specified token exists\n * @param _tokenId uint256 ID of the token to query the existance of\n * @return whether the token exists\n */\n function exists(uint256 _tokenId)\n public\n view\n returns (bool)\n {\n address owner = tokenOwner[_tokenId];\n return owner != address(0);\n }\n\n /**\n * @dev Approves another address to transfer the given token ID\n * @dev The zero address indicates there is no approved address.\n * @dev There can only be one approved address per token at a given time.\n * @dev Can only be called by the token owner or an approved operator.\n * @param _to address to be approved for the given token ID\n * @param _tokenId uint256 ID of the token to be approved\n */\n function approve(address _to, uint256 _tokenId)\n public\n {\n address owner = ownerOf(_tokenId);\n require(_to != owner);\n require(msg.sender == owner || isApprovedForAll(owner, msg.sender));\n\n if (getApproved(_tokenId) != address(0) || _to != address(0)) {\n tokenApprovals[_tokenId] = _to;\n emit Approval(owner, _to, _tokenId);\n }\n }\n\n /**\n * @dev Gets the approved address for a token ID, or zero if no address set\n * @param _tokenId uint256 ID of the token to query the approval of\n * @return address currently approved for a the given token ID\n */\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address)\n {\n return tokenApprovals[_tokenId];\n }\n\n /**\n * @dev Sets or unsets the approval of a given operator\n * @dev An operator is allowed to transfer all tokens of the sender on their behalf\n * @param _to operator address to set the approval\n * @param _approved representing the status of the approval to be set\n */\n function setApprovalForAll(address _to, bool _approved)\n public\n {\n require(_to != msg.sender);\n operatorApprovals[msg.sender][_to] = _approved;\n emit ApprovalForAll(msg.sender, _to, _approved);\n }\n\n /**\n * @dev Tells whether an operator is approved by a given owner\n * @param _owner owner address which you want to query the approval of\n * @param _operator operator address which you want to query the approval of\n * @return bool whether the given operator is approved by the given owner\n */\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool)\n {\n return operatorApprovals[_owner][_operator];\n }\n\n /**\n * @dev Transfers the ownership of a given token ID to another address\n * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function transferFrom(address _from, address _to, uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n require(_from != address(0));\n require(_to != address(0));\n\n clearApproval(_from, _tokenId);\n removeTokenFrom(_from, _tokenId);\n addTokenTo(_to, _tokenId);\n\n emit Transfer(_from, _to, _tokenId);\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n // solium-disable-next-line arg-overflow\n safeTransferFrom(_from, _to, _tokenId, \"\");\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes data to send along with a safe transfer check\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public\n canTransfer(_tokenId)\n {\n transferFrom(_from, _to, _tokenId);\n // solium-disable-next-line arg-overflow\n require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));\n }\n\n /**\n * @dev Returns whether the given spender can transfer a given token ID\n * @param _spender address of the spender to query\n * @param _tokenId uint256 ID of the token to be transferred\n * @return bool whether the msg.sender is approved for the given token ID,\n * is an operator of the owner, or is the owner of the token\n */\n function isApprovedOrOwner(address _spender, uint256 _tokenId)\n internal\n view\n returns (bool)\n {\n address owner = ownerOf(_tokenId);\n return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);\n }\n\n /**\n * @dev Internal function to mint a new token\n * @dev Reverts if the given token ID already exists\n * @param _to The address that will own the minted token\n * @param _tokenId uint256 ID of the token to be minted by the msg.sender\n */\n function _mint(address _to, uint256 _tokenId)\n internal\n {\n require(_to != address(0));\n addTokenTo(_to, _tokenId);\n emit Transfer(address(0), _to, _tokenId);\n }\n\n /**\n * @dev Internal function to burn a specific token\n * @dev Reverts if the token does not exist\n * @param _tokenId uint256 ID of the token being burned by the msg.sender\n */\n function _burn(address _owner, uint256 _tokenId)\n internal\n {\n clearApproval(_owner, _tokenId);\n removeTokenFrom(_owner, _tokenId);\n emit Transfer(_owner, address(0), _tokenId);\n }\n\n /**\n * @dev Internal function to clear current approval of a given token ID\n * @dev Reverts if the given address is not indeed the owner of the token\n * @param _owner owner of the token\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function clearApproval(address _owner, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _owner);\n if (tokenApprovals[_tokenId] != address(0)) {\n tokenApprovals[_tokenId] = address(0);\n emit Approval(_owner, address(0), _tokenId);\n }\n }\n\n /**\n * @dev Internal function to add a token ID to the list of a given address\n * @param _to address representing the new owner of the given token ID\n * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address\n */\n function addTokenTo(address _to, uint256 _tokenId)\n internal\n {\n require(tokenOwner[_tokenId] == address(0));\n tokenOwner[_tokenId] = _to;\n ownedTokensCount[_to] = safeAdd(ownedTokensCount[_to], 1);\n }\n\n /**\n * @dev Internal function to remove a token ID from the list of a given address\n * @param _from address representing the previous owner of the given token ID\n * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address\n */\n function removeTokenFrom(address _from, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _from);\n ownedTokensCount[_from] = safeSub(ownedTokensCount[_from], 1);\n tokenOwner[_tokenId] = address(0);\n }\n\n /**\n * @dev Internal function to invoke `onERC721Received` on a target address\n * @dev The call is not executed if the target address is not a contract\n * @param _from address representing the previous owner of the given token ID\n * @param _to target address that will receive the tokens\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes optional data to send along with the call\n * @return whether the call correctly returned the expected magic value\n */\n function checkAndCallSafeTransfer(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n internal\n returns (bool)\n {\n if (!isContract(_to)) {\n return true;\n }\n bytes4 retval = IERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);\n return (retval == ERC721_RECEIVED);\n }\n\n function isContract(address addr)\n internal\n view\n returns (bool)\n {\n uint256 size;\n // XXX Currently there is no better way to check if there is a contract in an address\n // than to check the size of the code at that address.\n // See https://ethereum.stackexchange.com/a/14016/36603\n // for more details about how this works.\n // TODO Check this again before the Serenity release, because all addresses will be\n // contracts then.\n assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly\n return size > 0;\n }\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * rom ERC721 asset contracts.\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol\n */\ncontract IERC721Receiver {\n /**\n * @dev Magic value to be returned upon successful reception of an NFT\n * Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`,\n * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n */\n bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;\n\n /**\n * @notice Handle the receipt of an NFT\n * @dev The ERC721 smart contract calls this function on the recipient\n * after a `safetransfer`. This function MAY throw to revert and reject the\n * transfer. This function MUST use 50,000 gas or less. Return of other\n * than the magic value MUST result in the transaction being reverted.\n * Note: the contract address is always the message sender.\n * @param _from The sending address\n * @param _tokenId The NFT identifier which is being transfered\n * @param _data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n */\n function onERC721Received(\n address _from,\n uint256 _tokenId,\n bytes _data)\n public\n returns (bytes4);\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data\n )\n public;\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_OVERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
},
- "sourceTreeHashHex": "0x0226236808262ce8e54893f2f9307018ab4de14b78f2caf193eed21ed008d926",
+ "sourceTreeHashHex": "0xf19917b6dd59b2d042f807298df297bf8b885ac33b0be8d986dac91271e13176",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
diff --git a/packages/migrations/artifacts/2.0.0/Exchange.json b/packages/migrations/artifacts/2.0.0/Exchange.json
index eb16981b7..3add148b5 100644
--- a/packages/migrations/artifacts/2.0.0/Exchange.json
+++ b/packages/migrations/artifacts/2.0.0/Exchange.json
@@ -1008,6 +1008,89 @@
"constant": true,
"inputs": [
{
+ "components": [
+ {
+ "name": "makerAddress",
+ "type": "address"
+ },
+ {
+ "name": "takerAddress",
+ "type": "address"
+ },
+ {
+ "name": "feeRecipientAddress",
+ "type": "address"
+ },
+ {
+ "name": "senderAddress",
+ "type": "address"
+ },
+ {
+ "name": "makerAssetAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFee",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFee",
+ "type": "uint256"
+ },
+ {
+ "name": "expirationTimeSeconds",
+ "type": "uint256"
+ },
+ {
+ "name": "salt",
+ "type": "uint256"
+ },
+ {
+ "name": "makerAssetData",
+ "type": "bytes"
+ },
+ {
+ "name": "takerAssetData",
+ "type": "bytes"
+ }
+ ],
+ "name": "orders",
+ "type": "tuple[]"
+ }
+ ],
+ "name": "getOrdersInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "orderStatus",
+ "type": "uint8"
+ },
+ {
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "name": "orderTakerAssetFilledAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "",
+ "type": "tuple[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
"name": "",
"type": "bytes32"
},
@@ -1903,15 +1986,15 @@
"evm": {
"bytecode": {
"linkReferences": {},
- "object": "0x60806040523480156200001157600080fd5b506040516200553938038062005539833981018060405262000037919081019062000433565b805181906200004e90600090602084019062000332565b5050604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b60208310620001585780518252601f19909201916020918201910162000137565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208285018552600b8084527f30782050726f746f636f6c000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b60208310620001e25780518252601f199092019160209182019101620001c1565b51815160209384036101000a600019018019909216911617905260408051929094018290038220828501855260018084527f3200000000000000000000000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106200026c5780518252601f1990920191602091820191016200024b565b51815160209384036101000a6000190180199092169116179052604051919093018190038120620002a797969550935030920190506200048f565b6040516020818303038152906040526040518082805190602001908083835b60208310620002e75780518252601f199092019160209182019101620002c6565b5181516000196020949094036101000a939093019283169219169190911790526040519201829003909120600155505060028054600160a060020a0319163317905550620005639050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200037557805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a557825182559160200191906001019062000388565b50620003b3929150620003b7565b5090565b620003d491905b80821115620003b35760008155600101620003be565b90565b6000601f82018313620003e957600080fd5b815162000400620003fa82620004fc565b620004d5565b915080825260208301602083018583830111156200041d57600080fd5b6200042a83828462000530565b50505092915050565b6000602082840312156200044657600080fd5b81516001604060020a038111156200045d57600080fd5b6200046b84828501620003d7565b949350505050565b6200047e8162000524565b82525050565b6200047e81620003d4565b608081016200049f828762000484565b620004ae602083018662000484565b620004bd604083018562000484565b620004cc606083018462000473565b95945050505050565b6040518181016001604060020a0381118282101715620004f457600080fd5b604052919050565b60006001604060020a038211156200051357600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b60005b838110156200054d57818101518382015260200162000533565b838111156200055d576000848401525b50505050565b614fc680620005736000396000f3006080604052600436106101b65763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632624b2d981146101bb578063288cdc91146101e6578063297bb70b146102065780632ac12622146102335780633683ef8e146102605780633c28d861146102825780633e228bae146102af5780633fd3c997146102cf5780634ac14782146102fc5780634d0ae5461461031c5780634f9559b11461033c57806350dde1901461035c578063607041081461037c578063642f2eaf146103a957806364a3bc15146103c957806377fcce68146103e95780637b8e3514146104095780637e1d98081461042957806382c174d0146104495780638da5cb5b14610469578063936347021461047e578063a3e203801461049e578063b4be83d5146104be578063bfc8bfce146104de578063c585bb93146104fe578063c75e0a811461051e578063d46b02c31461054b578063d9bfa73e1461056b578063db123b1a1461058b578063dd1c7d18146105ad578063e306f779146105cd578063e5fa431b146105e2578063eea086ba14610602578063f2fde38b14610617578063ffa1ad7414610637575b600080fd5b3480156101c757600080fd5b506101d061064c565b6040516101dd9190614b8e565b60405180910390f35b3480156101f257600080fd5b506101d06102013660046140c1565b6107a0565b34801561021257600080fd5b50610226610221366004613fc6565b6107b2565b6040516101dd9190614e18565b34801561023f57600080fd5b5061025361024e3660046140c1565b610842565b6040516101dd9190614b80565b34801561026c57600080fd5b5061028061027b3660046140fe565b610857565b005b34801561028e57600080fd5b506102a261029d366004614232565b610930565b6040516101dd9190614e26565b3480156102bb57600080fd5b506102266102ca3660046142f2565b610a1c565b3480156102db57600080fd5b506102ef6102ea3660046141c1565b610c2c565b6040516101dd9190614c4a565b34801561030857600080fd5b50610280610317366004613f91565b610c54565b34801561032857600080fd5b50610226610337366004613fc6565b610c8c565b34801561034857600080fd5b506102806103573660046140c1565b610d13565b34801561036857600080fd5b50610226610377366004613fc6565b610e37565b34801561038857600080fd5b5061039c6103973660046141c1565b610ebe565b6040516101dd9190614ab1565b3480156103b557600080fd5b506102536103c43660046140c1565b610f0c565b3480156103d557600080fd5b506102266103e43660046142f2565b610f21565b3480156103f557600080fd5b50610280610404366004613f61565b610f7b565b34801561041557600080fd5b50610253610424366004613f27565b611026565b34801561043557600080fd5b5061022661044436600461405a565b611046565b34801561045557600080fd5b506102536104643660046140df565b611117565b34801561047557600080fd5b5061039c611137565b34801561048a57600080fd5b50610253610499366004614166565b611153565b3480156104aa57600080fd5b506102266104b936600461405a565b611979565b3480156104ca57600080fd5b506102266104d93660046142f2565b611a89565b3480156104ea57600080fd5b506102806104f936600461433b565b611b0d565b34801561050a57600080fd5b50610280610519366004613f09565b611da6565b34801561052a57600080fd5b5061053e6105393660046141fd565b611fd1565b6040516101dd9190614e35565b34801561055757600080fd5b506102806105663660046141fd565b6120cc565b34801561057757600080fd5b506101d0610586366004613f27565b6120f7565b34801561059757600080fd5b506105a0612114565b6040516101dd9190614c39565b3480156105b957600080fd5b506102266105c836600461405a565b6121c0565b3480156105d957600080fd5b506101d0612286565b3480156105ee57600080fd5b506102266105fd36600461405a565b61228c565b34801561060e57600080fd5b5061039c612360565b34801561062357600080fd5b50610280610632366004613f09565b61237c565b34801561064357600080fd5b506105a061242d565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b6020831061077057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610733565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902081565b60036020526000908152604090205481565b6107ba613b2f565b60006107c4613b2f565b600091505b85518210156108395761082286838151811015156107e357fe5b9060200190602002015186848151811015156107fb57fe5b90602001906020020151868581518110151561081357fe5b90602001906020020151611a89565b905061082e8382612464565b6001909101906107c9565b50509392505050565b60046020526000908152604090205460ff1681565b610892848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750611153945050505050565b15156108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614ce8565b60405180910390fd5b5050600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff9093168452919052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610938613b58565b610940613b87565b610948613b87565b610160808801516101408089019190915288015190870152600061096b88611fd1565b925061097687611fd1565b91506109806124c6565b905061098c888861250f565b6109a088888560400151856040015161256b565b8051602001519094506109ba90899085908490808b61262f565b60208085015101516109d390889084908490808a61262f565b6109ec888285602001518660400151886000015161284c565b610a05878284602001518560400151886020015161284c565b610a11888883876128f8565b505050949350505050565b610a24613b2f565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000008082526060600483018181528851606485019081526020808b01516084870152958a015160a48601529189015160c4850152608089015160e485015260a089015161010485015260c089015161012485015260e0890151610144850152610100890151610164850152610120890151610184850152610140890180516101a486019081526101608b01516101c487015261018090525180516101e48601819052939591938493926024870192849261020489019291820191601f82010460005b81811015610b27578351855260209485019490930192600101610b09565b50505050818103610160808401919091528c0151805180835260209283019291820191601f82010460005b81811015610b70578351855260209485019490930192600101610b52565b5050508b84525084810360209384019081528a518083529093918201918b81019190601f82010460005b81811015610bb8578351855260209485019490930192600101610b9a565b5060808a8b86038c305af4808015610bd75760018114610bf557610c18565b60008e52600060208f0152600060408f0152600060608f0152610c18565b8b518e5260208c015160208f015260408c015160408f015260608c015160608f01525b505050505050505050505050509392505050565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60005b8151811015610c8857610c808282815181101515610c7157fe5b906020019060200201516120cc565b600101610c57565b5050565b610c94613b2f565b6000610c9e613b2f565b600091505b855182101561083957610cfc8683815181101515610cbd57fe5b906020019060200201518684815181101515610cd557fe5b906020019060200201518685815181101515610ced57fe5b90602001906020020151610f21565b9050610d088382612464565b600190910190610ca3565b600080600080610d216124c6565b935073ffffffffffffffffffffffffffffffffffffffff84163314610d465733610d49565b60005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600560209081526040808320938516835292905220549093506001860192509050808211610dc0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d68565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526005602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610e28908690614b8e565b60405180910390a35050505050565b610e3f613b2f565b6000610e49613b2f565b600091505b855182101561083957610ea78683815181101515610e6857fe5b906020019060200201518684815181101515610e8057fe5b906020019060200201518685815181101515610e9857fe5b90602001906020020151610a1c565b9050610eb38382612464565b600190910190610e4e565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60086020526000908152604090205460ff1681565b610f29613b2f565b610f34848484611a89565b60208101519091508314610f74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d88565b9392505050565b6000610f856124c6565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600760209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190611019908690614b80565b60405180910390a3505050565b600760209081526000928352604080842090915290825290205460ff1681565b61104e613b2f565b606060008061105b613b2f565b87600081518110151561106a57fe5b9060200190602002015161016001519350600092505b875183101561110c5783888481518110151561109857fe5b9060200190602002015161016001819052506110b8878660200151612ad8565b91506110e488848151811015156110cb57fe5b9060200190602002015183888681518110151561081357fe5b90506110f08582612464565b86856020015114156111015761110c565b600190920191611080565b505050509392505050565b600660209081526000928352604080842090915290825290205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000895111151561119c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d58565b6111a589612b1a565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff881610611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c98565b8660ff16600981111561121657fe5b9550600086600981111561122657fe5b141561125e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d48565b600186600981111561126c57fe5b14156112b4578851156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614e08565b6000975061196b565b60028660098111156112c257fe5b14156113fd578851604114611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c58565b88600081518110151561131257fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061135289600163ffffffff612bde16565b935061136589602163ffffffff612bde16565b925060018b8686866040516000815260200160405260405161138a9493929190614be9565b60206040516020810390808403906000865af11580156113ae573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c8116908216149950925061196b9050565b600386600981111561140b57fe5b14156115b157885160411461144c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c58565b88600081518110151561145b57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061149b89600163ffffffff612bde16565b93506114ae89602163ffffffff612bde16565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061154f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611512565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382206000835291019283905261138a9450925089918991508890614be9565b60048660098111156115bf57fe5b141561161e578851156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614e08565b73ffffffffffffffffffffffffffffffffffffffff8a163314975061196b565b600586600981111561162c57fe5b14156116df576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90611686908e908d90600401614bc9565b602060405180830381600087803b1580156116a057600080fd5b505af11580156116b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116d891908101906140a3565b975061196b565b60068660098111156116ed57fe5b141561179a576116fc89612c29565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526007602090815260408083209385168352929052205490915060ff161515611744576000975061196b565b6040517f9363470200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690639363470290611686908e908e908e90600401614b9c565b60078660098111156117a857fe5b14156117e85760008b815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff16975061196b565b60088660098111156117f657fe5b1415611939578851604114611837576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c58565b88600081518110151561184657fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061188689600163ffffffff612bde16565b935061189989602163ffffffff612bde16565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083836020831061154f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611512565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c98565b505050505050509392505050565b611981613b2f565b60606000806000611990613b2f565b88600081518110151561199f57fe5b9060200190602002015161014001519450600093505b8851841015611a7d578489858151811015156119cd57fe5b60209081029091010151610140015285516119e9908990612ad8565b9250611a2c89858151811015156119fc57fe5b9060200190602002015160a001518a86815181101515611a1857fe5b906020019060200201516080015185612ca2565b9150611a588985815181101515611a3f57fe5b90602001906020020151838987815181101515610e9857fe5b9050611a648682612464565b8551881415611a7257611a7d565b6001909301926119b5565b50505050509392505050565b611a91613b2f565b611a99613b87565b6000806000611aa788611fd1565b9350611ab16124c6565b9250611ac58860a001518560400151612ad8565b9150611ad18783612cbf565b9050611ae18885858a858b61262f565b611aeb8882612cd5565b9450611b028884866020015187604001518961284c565b61110c888487612d35565b60095460009073ffffffffffffffffffffffffffffffffffffffff1615611b60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d98565b611ba3611b9e888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843750612e4a945050505050565b61308b565b60008181526008602052604090205490915060ff1615611bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cd8565b73ffffffffffffffffffffffffffffffffffffffff86163314611cc057611c47818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611153945050505050565b1515611c7f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614df8565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600860205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af49150501515611d57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d08565b73ffffffffffffffffffffffffffffffffffffffff86163314611d9d57600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b6002546000908190819073ffffffffffffffffffffffffffffffffffffffff163314611dfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614da8565b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611e6557600080fd5b505af1158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e9d91908101906141df565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1690508015611f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c78565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600a60205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c0319490611fc39084908790614c1e565b60405180910390a150505050565b611fd9613b87565b611fe28261320b565b602082015260808201511515611fff5760015b60ff168152610f07565b60a08201511515612011576002611ff5565b6101008201514210612024576004611ff5565b60208082015160009081526004909152604090205460ff1615612048576006611ff5565b610120820151825173ffffffffffffffffffffffffffffffffffffffff90811660009081526005602090815260408083206060880151909416835292905220541115612095576006611ff5565b602080820151600090815260039091526040908190205490820181905260a0830151116120c3576005611ff5565b60038152919050565b6120d4613b87565b6120dd82611fd1565b90506120e98282613219565b610c88828260200151613330565b600560209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156121b85780601f1061218d576101008083540402835291602001916121b8565b820191906000526020600020905b81548152906001019060200180831161219b57829003601f168201915b505050505081565b6121c8613b2f565b60606000806121d5613b2f565b8760008151811015156121e457fe5b9060200190602002015161016001519350600092505b875183101561110c5783888481518110151561221257fe5b906020019060200201516101600181905250612232878660200151612ad8565b915061225e888481518110151561224557fe5b90602001906020020151838886815181101515610e9857fe5b905061226a8582612464565b868560200151141561227b5761110c565b6001909201916121fa565b60015481565b612294613b2f565b606060008060006122a3613b2f565b8860008151811015156122b257fe5b9060200190602002015161014001519450600093505b8851841015611a7d578489858151811015156122e057fe5b60209081029091010151610140015285516122fc908990612ad8565b925061230f89858151811015156119fc57fe5b915061233b898581518110151561232257fe5b9060200190602002015183898781518110151561081357fe5b90506123478682612464565b855188141561235557611a7d565b6001909301926122c8565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614da8565b73ffffffffffffffffffffffffffffffffffffffff81161561242a57600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b8151815161247291906133d7565b82526020808301519082015161248891906133d7565b6020830152604080830151908201516124a191906133d7565b6040830152606080830151908201516124ba91906133d7565b60609092019190915250565b600954600090819073ffffffffffffffffffffffffffffffffffffffff16156125075760095473ffffffffffffffffffffffffffffffffffffffff16612509565b335b92915050565b6125218260a001518260a00151613421565b61253383608001518360800151613421565b1015610c88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614de8565b612573613b58565b6000806000806125878960a0015188612ad8565b93506125978860a0015187612ad8565b92506125a7838960800151613421565b6125b5858a60a00151613421565b116125d7578391506125d08860a00151896080015184612ca2565b90506125f0565b8290506125ed88608001518960a0015183612ca2565b91505b6125fa8983612cd5565b85526126068882612cd5565b602080870182905286515191015161261e9190612ad8565b604086015250505050949350505050565b845160ff1660031461266d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614dc8565b8215156126a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d18565b606086015173ffffffffffffffffffffffffffffffffffffffff161561271957606086015173ffffffffffffffffffffffffffffffffffffffff163314612719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614dd8565b602086015173ffffffffffffffffffffffffffffffffffffffff16156127a4578373ffffffffffffffffffffffffffffffffffffffff16866020015173ffffffffffffffffffffffffffffffffffffffff161415156127a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c68565b604085015115156127fa576127c28560200151876000015183611153565b15156127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614ca8565b61280d828760a00151886080015161347c565b15612844576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cf8565b505050505050565b61285a8282602001516133d7565b600084815260036020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b9873ffffffffffffffffffffffffffffffffffffffff9788169897909616967f0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c371129966128e9968f96339692959194909390614abf565b60405180910390a45050505050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156129a25780601f10612977576101008083540402835291602001916129a2565b820191906000526020600020905b81548152906001019060200180831161298557829003601f168201915b505050505090506129ca856101400151866000015186600001518560200151602001516134cd565b610140840151845186518451602001516129e6939291906134cd565b6129ff85610140015186600001518585604001516134cd565b612a1b81866000015187604001518560000151604001516134cd565b612a3781856000015186604001518560200151604001516134cd565b836040015173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff161415612aa157612a9c81848760400151612a978660000151606001518760200151606001516133d7565b6134cd565b612ad1565b612ab9818487604001518560000151606001516134cd565b612ad1818486604001518560200151606001516134cd565b5050505050565b600082821115612b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cc8565b50900390565b6000808251111515612b58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d38565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612b8857fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515612c20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c88565b50016020015190565b60006014825110151515612c69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614db8565b612c7782601484510361365e565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000612cb7612cb18584613421565b846136bf565b949350505050565b6000818310612cce5781610f74565b5090919050565b612cdd613b2f565b6020810182905260a08301516080840151612cf9918491612ca2565b815260a083015160c0840151612d10918491612ca2565b604082015260a083015160e0840151612d2a918491612ca2565b606082015292915050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612ddf5780601f10612db457610100808354040283529160200191612ddf565b820191906000526020600020905b815481529060010190602001808311612dc257829003601f168201915b50505050509050612dff84610140015185600001518585600001516134cd565b612e1884610160015184866000015185602001516134cd565b612e30818560000151866040015185604001516134cd565b612e448184866040015185606001516134cd565b50505050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b60208310612f7357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612f36565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b6020831061300957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612fcc565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822097825281019a909a525073ffffffffffffffffffffffffffffffffffffffff97909716968801969096525050606085015250506080909120919050565b60006040805190810160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250600154836040516020018084805190602001908083835b6020831061311757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016130da565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250838101929092525060408051808403830181529281019081905282519293509182918401908083835b602083106131bb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161317e565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912095945050505050565b6000612509611b9e836136d6565b805160009060ff1660031461325a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614dc8565b606083015173ffffffffffffffffffffffffffffffffffffffff16156132cd57606083015173ffffffffffffffffffffffffffffffffffffffff1633146132cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614dd8565b6132d56124c6565b835190915073ffffffffffffffffffffffffffffffffffffffff80831691161461332b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cb8565b505050565b6000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927fdc47b3613d9fe400085f6dbdc99453462279057e6207385042827ed6b1a62cf7926133cb92339290614b43565b60405180910390a45050565b600082820183811015613416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cc8565b8091505b5092915050565b600080831515613434576000915061341a565b5082820282848281151561344457fe5b0414613416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cc8565b60008060008480151561348b57fe5b86850991508115156134a05760009250610839565b6134bf6134b083620f4240613421565b6134ba8887613421565b6136bf565b6103e8109695505050505050565b6000806000831115612844578551600310613514576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d78565b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600a90925260409091205473ffffffffffffffffffffffffffffffffffffffff1680151561359d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d28565b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b8181101561363957895181526020998a019901613621565b61020084858403866000895af1801515613651573d85fd5b5050505050505050505050565b6000816014018351101515156136a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614db8565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60008082848115156136cd57fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b6020831061395e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613921565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b602083106139f957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016139bc565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310613a9457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613a57565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b61012060405190810160405280613b6d613b2f565b8152602001613b7a613b2f565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610f748235614ed5565b6000601f82018313613bc457600080fd5b8135613bd7613bd282614e6a565b614e43565b81815260209384019390925082018360005b83811015613c155781358601613bff8882613d71565b8452506020928301929190910190600101613be9565b5050505092915050565b6000601f82018313613c3057600080fd5b8135613c3e613bd282614e6a565b81815260209384019390925082018360005b83811015613c155781358601613c668882613dc0565b8452506020928301929190910190600101613c50565b6000601f82018313613c8d57600080fd5b8135613c9b613bd282614e6a565b91508181835260208401935060208101905083856020840282011115613cc057600080fd5b60005b83811015613c155781613cd68882613d04565b8452506020928301929190910190600101613cc3565b6000610f748235614eee565b6000610f748251614eee565b6000610f748235614ef3565b6000610f748235614ef6565b6000610f748251614ef6565b600080601f83018413613d3a57600080fd5b50813567ffffffffffffffff811115613d5257600080fd5b602083019150836001820283011115613d6a57600080fd5b9250929050565b6000601f82018313613d8257600080fd5b8135613d90613bd282614e8b565b91508082526020830160208301858383011115613dac57600080fd5b613db7838284614f2c565b50505092915050565b60006101808284031215613dd357600080fd5b613dde610180614e43565b90506000613dec8484613ba7565b8252506020613dfd84848301613ba7565b6020830152506040613e1184828501613ba7565b6040830152506060613e2584828501613ba7565b6060830152506080613e3984828501613d04565b60808301525060a0613e4d84828501613d04565b60a08301525060c0613e6184828501613d04565b60c08301525060e0613e7584828501613d04565b60e083015250610100613e8a84828501613d04565b61010083015250610120613ea084828501613d04565b6101208301525061014082013567ffffffffffffffff811115613ec257600080fd5b613ece84828501613d71565b6101408301525061016082013567ffffffffffffffff811115613ef057600080fd5b613efc84828501613d71565b6101608301525092915050565b600060208284031215613f1b57600080fd5b6000612cb78484613ba7565b60008060408385031215613f3a57600080fd5b6000613f468585613ba7565b9250506020613f5785828601613ba7565b9150509250929050565b60008060408385031215613f7457600080fd5b6000613f808585613ba7565b9250506020613f5785828601613cec565b600060208284031215613fa357600080fd5b813567ffffffffffffffff811115613fba57600080fd5b612cb784828501613c1f565b600080600060608486031215613fdb57600080fd5b833567ffffffffffffffff811115613ff257600080fd5b613ffe86828701613c1f565b935050602084013567ffffffffffffffff81111561401b57600080fd5b61402786828701613c7c565b925050604084013567ffffffffffffffff81111561404457600080fd5b61405086828701613bb3565b9150509250925092565b60008060006060848603121561406f57600080fd5b833567ffffffffffffffff81111561408657600080fd5b61409286828701613c1f565b935050602061402786828701613d04565b6000602082840312156140b557600080fd5b6000612cb78484613cf8565b6000602082840312156140d357600080fd5b6000612cb78484613d04565b600080604083850312156140f257600080fd5b6000613f468585613d04565b6000806000806060858703121561411457600080fd5b60006141208787613d04565b945050602061413187828801613ba7565b935050604085013567ffffffffffffffff81111561414e57600080fd5b61415a87828801613d28565b95989497509550505050565b60008060006060848603121561417b57600080fd5b60006141878686613d04565b935050602061419886828701613ba7565b925050604084013567ffffffffffffffff8111156141b557600080fd5b61405086828701613d71565b6000602082840312156141d357600080fd5b6000612cb78484613d10565b6000602082840312156141f157600080fd5b6000612cb78484613d1c565b60006020828403121561420f57600080fd5b813567ffffffffffffffff81111561422657600080fd5b612cb784828501613dc0565b6000806000806080858703121561424857600080fd5b843567ffffffffffffffff81111561425f57600080fd5b61426b87828801613dc0565b945050602085013567ffffffffffffffff81111561428857600080fd5b61429487828801613dc0565b935050604085013567ffffffffffffffff8111156142b157600080fd5b6142bd87828801613d71565b925050606085013567ffffffffffffffff8111156142da57600080fd5b6142e687828801613d71565b91505092959194509250565b60008060006060848603121561430757600080fd5b833567ffffffffffffffff81111561431e57600080fd5b61432a86828701613dc0565b935050602061419886828701613d04565b6000806000806000806080878903121561435457600080fd5b60006143608989613d04565b965050602061437189828a01613ba7565b955050604087013567ffffffffffffffff81111561438e57600080fd5b61439a89828a01613d28565b9450945050606087013567ffffffffffffffff8111156143b957600080fd5b6143c589828a01613d28565b92509250509295509295509295565b6143dd81614ed5565b82525050565b6143dd81614eee565b6143dd81614ef3565b6143dd81614ef6565b600061440982614ed1565b80845261441d816020860160208601614f38565b61442681614f64565b9093016020019392505050565b6143dd81614f21565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b600d81527f494e56414c49445f54414b455200000000000000000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f414c52454144595f455849535453000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015260400190565b600d81527f494e56414c49445f4d414b455200000000000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f494e56414c49445f54585f484153480000000000000000000000000000000000602082015260400190565b601181527f494e56414c49445f5349474e4154555245000000000000000000000000000000602082015260400190565b600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015260400190565b601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015260400190565b601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b601781527f494e56414c49445f4e45575f4f524445525f45504f4348000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601281527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015260400190565b601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015260400190565b601181527f4c454e4754485f305f5245515549524544000000000000000000000000000000602082015260400190565b805160808301906149ff84826143ec565b506020820151614a1260208501826143ec565b506040820151614a2560408501826143ec565b506060820151612e4460608501826143ec565b8051610120830190614a4a84826149ee565b506020820151614a5d60808501826149ee565b506040820151612e446101008501826143ec565b80516060830190614a828482614aa8565b506020820151614a9560208501826143ec565b506040820151612e4460408501826143ec565b6143dd81614f1b565b6020810161250982846143d4565b6101008101614ace828b6143d4565b614adb602083018a6143d4565b614ae860408301896143ec565b614af560608301886143ec565b614b0260808301876143ec565b614b0f60a08301866143ec565b81810360c0830152614b2181856143fe565b905081810360e0830152614b3581846143fe565b9a9950505050505050505050565b60608101614b5182866143d4565b8181036020830152614b6381856143fe565b90508181036040830152614b7781846143fe565b95945050505050565b6020810161250982846143e3565b6020810161250982846143ec565b60608101614baa82866143ec565b614bb760208301856143d4565b8181036040830152614b7781846143fe565b60408101614bd782856143ec565b8181036020830152612cb781846143fe565b60808101614bf782876143ec565b614c046020830186614aa8565b614c1160408301856143ec565b614b7760608301846143ec565b60408101614c2c82856143f5565b610f7460208301846143d4565b60208082528101610f7481846143fe565b602081016125098284614433565b602080825281016125098161443c565b602080825281016125098161446c565b602080825281016125098161449c565b60208082528101612509816144cc565b6020808252810161250981614522565b6020808252810161250981614552565b6020808252810161250981614582565b60208082528101612509816145b2565b60208082528101612509816145e2565b6020808252810161250981614612565b6020808252810161250981614642565b6020808252810161250981614672565b60208082528101612509816146a2565b60208082528101612509816146d2565b6020808252810161250981614702565b6020808252810161250981614758565b6020808252810161250981614788565b60208082528101612509816147b8565b60208082528101612509816147e8565b6020808252810161250981614818565b6020808252810161250981614848565b6020808252810161250981614878565b60208082528101612509816148a8565b60208082528101612509816148fe565b602080825281016125098161492e565b602080825281016125098161495e565b602080825281016125098161498e565b60208082528101612509816149be565b6080810161250982846149ee565b61012081016125098284614a38565b606081016125098284614a71565b60405181810167ffffffffffffffff81118282101715614e6257600080fd5b604052919050565b600067ffffffffffffffff821115614e8157600080fd5b5060209081020190565b600067ffffffffffffffff821115614ea257600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b600061250982614ed5565b82818337506000910152565b60005b83811015614f53578181015183820152602001614f3b565b83811115612e445750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820eb4d9db5db49f5b86baccdb83b7b22cef2da7cf614368efd0d3e7997f1a2703a6c6578706572696d656e74616cf50037",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x5539 CODESIZE SUB DUP1 PUSH3 0x5539 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x433 JUMP JUMPDEST DUP1 MLOAD DUP2 SWAP1 PUSH3 0x4E SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x332 JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x158 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x137 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0xB DUP1 DUP5 MSTORE PUSH32 0x30782050726F746F636F6C000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x1E2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x1C1 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0x1 DUP1 DUP5 MSTORE PUSH32 0x3200000000000000000000000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x26C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x24B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH3 0x2A7 SWAP8 SWAP7 SWAP6 POP SWAP4 POP ADDRESS SWAP3 ADD SWAP1 POP PUSH3 0x48F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x2E7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x2C6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP SWAP4 SWAP1 SWAP4 ADD SWAP3 DUP4 AND SWAP3 NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x1 SSTORE POP POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE POP PUSH3 0x563 SWAP1 POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x375 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3A5 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3A5 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3A5 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x388 JUMP JUMPDEST POP PUSH3 0x3B3 SWAP3 SWAP2 POP PUSH3 0x3B7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x3D4 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3B3 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3BE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x400 PUSH3 0x3FA DUP3 PUSH3 0x4FC JUMP JUMPDEST PUSH3 0x4D5 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x41D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x42A DUP4 DUP3 DUP5 PUSH3 0x530 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x446 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x45D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x46B DUP5 DUP3 DUP6 ADD PUSH3 0x3D7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH3 0x47E DUP2 PUSH3 0x524 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x47E DUP2 PUSH3 0x3D4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH3 0x49F DUP3 DUP8 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4AE PUSH1 0x20 DUP4 ADD DUP7 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4BD PUSH1 0x40 DUP4 ADD DUP6 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4CC PUSH1 0x60 DUP4 ADD DUP5 PUSH3 0x473 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x4F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x54D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x533 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x55D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x4FC6 DUP1 PUSH3 0x573 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1B6 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x2624B2D9 DUP2 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x1E6 JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x206 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x260 JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x282 JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x2AF JUMPI DUP1 PUSH4 0x3FD3C997 EQ PUSH2 0x2CF JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x2FC JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x31C JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x35C JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0x37C JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x3A9 JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x3C9 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3E9 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x409 JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x429 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x449 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x469 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x47E JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x49E JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x4BE JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x4DE JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x4FE JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x51E JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x54B JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x56B JUMPI DUP1 PUSH4 0xDB123B1A EQ PUSH2 0x58B JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x5AD JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x5CD JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x5E2 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x602 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x617 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x637 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x64C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4B8E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x201 CALLDATASIZE PUSH1 0x4 PUSH2 0x40C1 JUMP JUMPDEST PUSH2 0x7A0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x212 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x221 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FC6 JUMP JUMPDEST PUSH2 0x7B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4E18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x24E CALLDATASIZE PUSH1 0x4 PUSH2 0x40C1 JUMP JUMPDEST PUSH2 0x842 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4B80 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x27B CALLDATASIZE PUSH1 0x4 PUSH2 0x40FE JUMP JUMPDEST PUSH2 0x857 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A2 PUSH2 0x29D CALLDATASIZE PUSH1 0x4 PUSH2 0x4232 JUMP JUMPDEST PUSH2 0x930 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4E26 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x2CA CALLDATASIZE PUSH1 0x4 PUSH2 0x42F2 JUMP JUMPDEST PUSH2 0xA1C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2EF PUSH2 0x2EA CALLDATASIZE PUSH1 0x4 PUSH2 0x41C1 JUMP JUMPDEST PUSH2 0xC2C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4C4A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x317 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F91 JUMP JUMPDEST PUSH2 0xC54 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x328 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x337 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FC6 JUMP JUMPDEST PUSH2 0xC8C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x357 CALLDATASIZE PUSH1 0x4 PUSH2 0x40C1 JUMP JUMPDEST PUSH2 0xD13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x377 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FC6 JUMP JUMPDEST PUSH2 0xE37 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x388 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x39C PUSH2 0x397 CALLDATASIZE PUSH1 0x4 PUSH2 0x41C1 JUMP JUMPDEST PUSH2 0xEBE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4AB1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x3C4 CALLDATASIZE PUSH1 0x4 PUSH2 0x40C1 JUMP JUMPDEST PUSH2 0xF0C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x3E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x42F2 JUMP JUMPDEST PUSH2 0xF21 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x404 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F61 JUMP JUMPDEST PUSH2 0xF7B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x424 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F27 JUMP JUMPDEST PUSH2 0x1026 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x435 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x444 CALLDATASIZE PUSH1 0x4 PUSH2 0x405A JUMP JUMPDEST PUSH2 0x1046 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x455 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x464 CALLDATASIZE PUSH1 0x4 PUSH2 0x40DF JUMP JUMPDEST PUSH2 0x1117 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x475 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x39C PUSH2 0x1137 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x499 CALLDATASIZE PUSH1 0x4 PUSH2 0x4166 JUMP JUMPDEST PUSH2 0x1153 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x4B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x405A JUMP JUMPDEST PUSH2 0x1979 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x4D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x42F2 JUMP JUMPDEST PUSH2 0x1A89 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x4F9 CALLDATASIZE PUSH1 0x4 PUSH2 0x433B JUMP JUMPDEST PUSH2 0x1B0D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x519 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F09 JUMP JUMPDEST PUSH2 0x1DA6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x53E PUSH2 0x539 CALLDATASIZE PUSH1 0x4 PUSH2 0x41FD JUMP JUMPDEST PUSH2 0x1FD1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4E35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x557 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x566 CALLDATASIZE PUSH1 0x4 PUSH2 0x41FD JUMP JUMPDEST PUSH2 0x20CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x577 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x586 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F27 JUMP JUMPDEST PUSH2 0x20F7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x597 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5A0 PUSH2 0x2114 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4C39 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x5C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x405A JUMP JUMPDEST PUSH2 0x21C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x2286 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x5FD CALLDATASIZE PUSH1 0x4 PUSH2 0x405A JUMP JUMPDEST PUSH2 0x228C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x60E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x39C PUSH2 0x2360 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x623 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x632 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F09 JUMP JUMPDEST PUSH2 0x237C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x643 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5A0 PUSH2 0x242D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x770 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x733 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x7BA PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7C4 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x839 JUMPI PUSH2 0x822 DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7E3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7FB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x813 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1A89 JUMP JUMPDEST SWAP1 POP PUSH2 0x82E DUP4 DUP3 PUSH2 0x2464 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x7C9 JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x892 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1153 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8D3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CE8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x938 PUSH2 0x3B58 JUMP JUMPDEST PUSH2 0x940 PUSH2 0x3B87 JUMP JUMPDEST PUSH2 0x948 PUSH2 0x3B87 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x96B DUP9 PUSH2 0x1FD1 JUMP JUMPDEST SWAP3 POP PUSH2 0x976 DUP8 PUSH2 0x1FD1 JUMP JUMPDEST SWAP2 POP PUSH2 0x980 PUSH2 0x24C6 JUMP JUMPDEST SWAP1 POP PUSH2 0x98C DUP9 DUP9 PUSH2 0x250F JUMP JUMPDEST PUSH2 0x9A0 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x256B JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x9BA SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x262F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0x9D3 SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x262F JUMP JUMPDEST PUSH2 0x9EC DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x284C JUMP JUMPDEST PUSH2 0xA05 DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x284C JUMP JUMPDEST PUSH2 0xA11 DUP9 DUP9 DUP4 DUP8 PUSH2 0x28F8 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA24 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE PUSH1 0x60 PUSH1 0x4 DUP4 ADD DUP2 DUP2 MSTORE DUP9 MLOAD PUSH1 0x64 DUP6 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 DUP1 DUP12 ADD MLOAD PUSH1 0x84 DUP8 ADD MSTORE SWAP6 DUP11 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP2 DUP10 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE PUSH1 0x80 DUP10 ADD MLOAD PUSH1 0xE4 DUP6 ADD MSTORE PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x104 DUP6 ADD MSTORE PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x124 DUP6 ADD MSTORE PUSH1 0xE0 DUP10 ADD MLOAD PUSH2 0x144 DUP6 ADD MSTORE PUSH2 0x100 DUP10 ADD MLOAD PUSH2 0x164 DUP6 ADD MSTORE PUSH2 0x120 DUP10 ADD MLOAD PUSH2 0x184 DUP6 ADD MSTORE PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x1A4 DUP7 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP12 ADD MLOAD PUSH2 0x1C4 DUP8 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x1E4 DUP7 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP6 SWAP2 SWAP4 DUP5 SWAP4 SWAP3 PUSH1 0x24 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x204 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB27 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB09 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP13 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB70 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB52 JUMP JUMPDEST POP POP POP DUP12 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP11 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP12 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xBB8 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB9A JUMP JUMPDEST POP PUSH1 0x80 DUP11 DUP12 DUP7 SUB DUP13 ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0xBD7 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xBF5 JUMPI PUSH2 0xC18 JUMP JUMPDEST PUSH1 0x0 DUP15 MSTORE PUSH1 0x0 PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP16 ADD MSTORE PUSH2 0xC18 JUMP JUMPDEST DUP12 MLOAD DUP15 MSTORE PUSH1 0x20 DUP13 ADD MLOAD PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x40 DUP13 ADD MLOAD PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x60 DUP13 ADD MLOAD PUSH1 0x60 DUP16 ADD MSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xC88 JUMPI PUSH2 0xC80 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC71 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x20CC JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC57 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xC94 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC9E PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x839 JUMPI PUSH2 0xCFC DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCBD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCD5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCED JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xF21 JUMP JUMPDEST SWAP1 POP PUSH2 0xD08 DUP4 DUP3 PUSH2 0x2464 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xCA3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xD21 PUSH2 0x24C6 JUMP JUMPDEST SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ PUSH2 0xD46 JUMPI CALLER PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH1 0x1 DUP7 ADD SWAP3 POP SWAP1 POP DUP1 DUP3 GT PUSH2 0xDC0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D68 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xE28 SWAP1 DUP7 SWAP1 PUSH2 0x4B8E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE3F PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE49 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x839 JUMPI PUSH2 0xEA7 DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE68 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE80 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE98 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA1C JUMP JUMPDEST SWAP1 POP PUSH2 0xEB3 DUP4 DUP3 PUSH2 0x2464 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xE4E JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF29 PUSH2 0x3B2F JUMP JUMPDEST PUSH2 0xF34 DUP5 DUP5 DUP5 PUSH2 0x1A89 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD SWAP1 SWAP2 POP DUP4 EQ PUSH2 0xF74 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D88 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF85 PUSH2 0x24C6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0x1019 SWAP1 DUP7 SWAP1 PUSH2 0x4B80 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x104E PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x105B PUSH2 0x3B2F JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x106A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x110C JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1098 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x10B8 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2AD8 JUMP JUMPDEST SWAP2 POP PUSH2 0x10E4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10CB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x813 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x10F0 DUP6 DUP3 PUSH2 0x2464 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1101 JUMPI PUSH2 0x110C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1080 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0x119C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D58 JUMP JUMPDEST PUSH2 0x11A5 DUP10 PUSH2 0x2B1A JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0x1207 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C98 JUMP JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1216 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1226 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x125E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D48 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x126C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x12B4 JUMPI DUP9 MLOAD ISZERO PUSH2 0x12AB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4E08 JUMP JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x12C2 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x13FD JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1303 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C58 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1312 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1352 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1365 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x138A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4BE9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13AE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x196B SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x140B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x15B1 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x144C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C58 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x145B JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x149B DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP4 POP PUSH2 0x14AE DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x154F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1512 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x138A SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4BE9 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x15BF JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x161E JUMPI DUP9 MLOAD ISZERO PUSH2 0x15FE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4E08 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x162C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x16DF JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x1686 SWAP1 DUP15 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BC9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16D8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x40A3 JUMP JUMPDEST SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x16ED JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x179A JUMPI PUSH2 0x16FC DUP10 PUSH2 0x2C29 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1744 JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x1686 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B9C JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x17A8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x17E8 JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x17F6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1939 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1837 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C58 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1846 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1886 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1899 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x154F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1512 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C98 JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1981 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1990 PUSH2 0x3B2F JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x199F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1A7D JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19CD JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x19E9 SWAP1 DUP10 SWAP1 PUSH2 0x2AD8 JUMP JUMPDEST SWAP3 POP PUSH2 0x1A2C DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19FC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A18 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2CA2 JUMP JUMPDEST SWAP2 POP PUSH2 0x1A58 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A3F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE98 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1A64 DUP7 DUP3 PUSH2 0x2464 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x1A72 JUMPI PUSH2 0x1A7D JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x19B5 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1A91 PUSH2 0x3B2F JUMP JUMPDEST PUSH2 0x1A99 PUSH2 0x3B87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1AA7 DUP9 PUSH2 0x1FD1 JUMP JUMPDEST SWAP4 POP PUSH2 0x1AB1 PUSH2 0x24C6 JUMP JUMPDEST SWAP3 POP PUSH2 0x1AC5 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2AD8 JUMP JUMPDEST SWAP2 POP PUSH2 0x1AD1 DUP8 DUP4 PUSH2 0x2CBF JUMP JUMPDEST SWAP1 POP PUSH2 0x1AE1 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x262F JUMP JUMPDEST PUSH2 0x1AEB DUP9 DUP3 PUSH2 0x2CD5 JUMP JUMPDEST SWAP5 POP PUSH2 0x1B02 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x284C JUMP JUMPDEST PUSH2 0x110C DUP9 DUP5 DUP8 PUSH2 0x2D35 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x1B60 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D98 JUMP JUMPDEST PUSH2 0x1BA3 PUSH2 0x1B9E DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x2E4A SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x308B JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CD8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1CC0 JUMPI PUSH2 0x1C47 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1153 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1C7F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DF8 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x1D57 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D08 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1D9D JUMPI PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1DFE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DA8 JUMP JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E65 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E79 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1E9D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x41DF JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x1F22 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C78 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x1FC3 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x4C1E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH2 0x1FD9 PUSH2 0x3B87 JUMP JUMPDEST PUSH2 0x1FE2 DUP3 PUSH2 0x320B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1FFF JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0xF07 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x2011 JUMPI PUSH1 0x2 PUSH2 0x1FF5 JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x2024 JUMPI PUSH1 0x4 PUSH2 0x1FF5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x2048 JUMPI PUSH1 0x6 PUSH2 0x1FF5 JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x2095 JUMPI PUSH1 0x6 PUSH2 0x1FF5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD GT PUSH2 0x20C3 JUMPI PUSH1 0x5 PUSH2 0x1FF5 JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x20D4 PUSH2 0x3B87 JUMP JUMPDEST PUSH2 0x20DD DUP3 PUSH2 0x1FD1 JUMP JUMPDEST SWAP1 POP PUSH2 0x20E9 DUP3 DUP3 PUSH2 0x3219 JUMP JUMPDEST PUSH2 0xC88 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3330 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x21B8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x218D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x21B8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x219B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x21C8 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x21D5 PUSH2 0x3B2F JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x21E4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x110C JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2212 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x2232 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2AD8 JUMP JUMPDEST SWAP2 POP PUSH2 0x225E DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2245 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE98 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x226A DUP6 DUP3 PUSH2 0x2464 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x227B JUMPI PUSH2 0x110C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x21FA JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2294 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x22A3 PUSH2 0x3B2F JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x22B2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1A7D JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x22E0 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x22FC SWAP1 DUP10 SWAP1 PUSH2 0x2AD8 JUMP JUMPDEST SWAP3 POP PUSH2 0x230F DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19FC JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x233B DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2322 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x813 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x2347 DUP7 DUP3 PUSH2 0x2464 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x2355 JUMPI PUSH2 0x1A7D JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x22C8 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x23CD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DA8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x242A JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x2472 SWAP2 SWAP1 PUSH2 0x33D7 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2488 SWAP2 SWAP1 PUSH2 0x33D7 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x24A1 SWAP2 SWAP1 PUSH2 0x33D7 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x24BA SWAP2 SWAP1 PUSH2 0x33D7 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2507 JUMPI PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2509 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2521 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x3421 JUMP JUMPDEST PUSH2 0x2533 DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x3421 JUMP JUMPDEST LT ISZERO PUSH2 0xC88 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DE8 JUMP JUMPDEST PUSH2 0x2573 PUSH2 0x3B58 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x2587 DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2AD8 JUMP JUMPDEST SWAP4 POP PUSH2 0x2597 DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2AD8 JUMP JUMPDEST SWAP3 POP PUSH2 0x25A7 DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x3421 JUMP JUMPDEST PUSH2 0x25B5 DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x3421 JUMP JUMPDEST GT PUSH2 0x25D7 JUMPI DUP4 SWAP2 POP PUSH2 0x25D0 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2CA2 JUMP JUMPDEST SWAP1 POP PUSH2 0x25F0 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x25ED DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2CA2 JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x25FA DUP10 DUP4 PUSH2 0x2CD5 JUMP JUMPDEST DUP6 MSTORE PUSH2 0x2606 DUP9 DUP3 PUSH2 0x2CD5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x261E SWAP2 SWAP1 PUSH2 0x2AD8 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x266D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DC8 JUMP JUMPDEST DUP3 ISZERO ISZERO PUSH2 0x26A6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D18 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2719 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2719 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DD8 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x27A4 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x27A4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C68 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x27FA JUMPI PUSH2 0x27C2 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x1153 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x27FA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CA8 JUMP JUMPDEST PUSH2 0x280D DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x347C JUMP JUMPDEST ISZERO PUSH2 0x2844 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CF8 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x285A DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x33D7 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xBCC4C97732E47D9946F229EDB95F5B6323F601300E4690DE719993F3C371129 SWAP7 PUSH2 0x28E9 SWAP7 DUP16 SWAP7 CALLER SWAP7 SWAP3 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 SWAP1 PUSH2 0x4ABF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x29A2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2977 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x29A2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2985 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x29CA DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x140 DUP5 ADD MLOAD DUP5 MLOAD DUP7 MLOAD DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x29E6 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x29FF DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2A1B DUP2 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2A37 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST DUP4 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2AA1 JUMPI PUSH2 0x2A9C DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD PUSH2 0x2A97 DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x33D7 JUMP JUMPDEST PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2AD1 JUMP JUMPDEST PUSH2 0x2AB9 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2AD1 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2B14 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CC8 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x2B58 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D38 JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2B88 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2C20 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C88 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2C69 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DB8 JUMP JUMPDEST PUSH2 0x2C77 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x365E JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 PUSH2 0x2CB1 DUP6 DUP5 PUSH2 0x3421 JUMP JUMPDEST DUP5 PUSH2 0x36BF JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2CCE JUMPI DUP2 PUSH2 0xF74 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CDD PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x2CF9 SWAP2 DUP5 SWAP2 PUSH2 0x2CA2 JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2D10 SWAP2 DUP5 SWAP2 PUSH2 0x2CA2 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xE0 DUP5 ADD MLOAD PUSH2 0x2D2A SWAP2 DUP5 SWAP2 PUSH2 0x2CA2 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2DDF JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2DB4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2DDF JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2DC2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2DFF DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2E18 DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2E30 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2E44 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2F73 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2F36 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3009 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2FCC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 SWAP8 DUP3 MSTORE DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 SWAP1 SWAP8 AND SWAP7 DUP9 ADD SWAP7 SWAP1 SWAP7 MSTORE POP POP PUSH1 0x60 DUP6 ADD MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 SLOAD DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3117 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x30DA JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP DUP4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP5 SUB DUP4 ADD DUP2 MSTORE SWAP3 DUP2 ADD SWAP1 DUP2 SWAP1 MSTORE DUP3 MLOAD SWAP3 SWAP4 POP SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x31BB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x317E JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2509 PUSH2 0x1B9E DUP4 PUSH2 0x36D6 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x325A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DC8 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x32CD JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x32CD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DD8 JUMP JUMPDEST PUSH2 0x32D5 PUSH2 0x24C6 JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x332B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CB8 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xDC47B3613D9FE400085F6DBDC99453462279057E6207385042827ED6B1A62CF7 SWAP3 PUSH2 0x33CB SWAP3 CALLER SWAP3 SWAP1 PUSH2 0x4B43 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x3416 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CC8 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x3434 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x341A JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3444 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x3416 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CC8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x348B JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x34A0 JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x839 JUMP JUMPDEST PUSH2 0x34BF PUSH2 0x34B0 DUP4 PUSH3 0xF4240 PUSH2 0x3421 JUMP JUMPDEST PUSH2 0x34BA DUP9 DUP8 PUSH2 0x3421 JUMP JUMPDEST PUSH2 0x36BF JUMP JUMPDEST PUSH2 0x3E8 LT SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x2844 JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x3514 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D78 JUMP JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x359D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D28 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3639 JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x3621 JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x3651 JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x36A0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DB8 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x36CD JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x395E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3921 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x39F9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x39BC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3A94 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3A57 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x3B6D PUSH2 0x3B2F JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3B7A PUSH2 0x3B2F JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 CALLDATALOAD PUSH2 0x4ED5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3BC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3BD7 PUSH2 0x3BD2 DUP3 PUSH2 0x4E6A JUMP JUMPDEST PUSH2 0x4E43 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C15 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3BFF DUP9 DUP3 PUSH2 0x3D71 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3BE9 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3C30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C3E PUSH2 0x3BD2 DUP3 PUSH2 0x4E6A JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C15 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3C66 DUP9 DUP3 PUSH2 0x3DC0 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3C50 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3C8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C9B PUSH2 0x3BD2 DUP3 PUSH2 0x4E6A JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3CC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C15 JUMPI DUP2 PUSH2 0x3CD6 DUP9 DUP3 PUSH2 0x3D04 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3CC3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 CALLDATALOAD PUSH2 0x4EEE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 MLOAD PUSH2 0x4EEE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 CALLDATALOAD PUSH2 0x4EF3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 CALLDATALOAD PUSH2 0x4EF6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 MLOAD PUSH2 0x4EF6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x3D3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x3D6A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D90 PUSH2 0x3BD2 DUP3 PUSH2 0x4E8B JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3DAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DB7 DUP4 DUP3 DUP5 PUSH2 0x4F2C JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3DD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DDE PUSH2 0x180 PUSH2 0x4E43 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3DEC DUP5 DUP5 PUSH2 0x3BA7 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3DFD DUP5 DUP5 DUP4 ADD PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3E11 DUP5 DUP3 DUP6 ADD PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3E25 DUP5 DUP3 DUP6 ADD PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3E39 DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3E4D DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3E61 DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x3E75 DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x3E8A DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3EA0 DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3EC2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3ECE DUP5 DUP3 DUP6 ADD PUSH2 0x3D71 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3EF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EFC DUP5 DUP3 DUP6 ADD PUSH2 0x3D71 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3F3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3F46 DUP6 DUP6 PUSH2 0x3BA7 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3F57 DUP6 DUP3 DUP7 ADD PUSH2 0x3BA7 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3F74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3F80 DUP6 DUP6 PUSH2 0x3BA7 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3F57 DUP6 DUP3 DUP7 ADD PUSH2 0x3CEC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3FA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2CB7 DUP5 DUP3 DUP6 ADD PUSH2 0x3C1F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3FDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FFE DUP7 DUP3 DUP8 ADD PUSH2 0x3C1F JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x401B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4027 DUP7 DUP3 DUP8 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4044 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4050 DUP7 DUP3 DUP8 ADD PUSH2 0x3BB3 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x406F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4086 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4092 DUP7 DUP3 DUP8 ADD PUSH2 0x3C1F JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4027 DUP7 DUP3 DUP8 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3CF8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x40F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3F46 DUP6 DUP6 PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4114 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4120 DUP8 DUP8 PUSH2 0x3D04 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x4131 DUP8 DUP3 DUP9 ADD PUSH2 0x3BA7 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x414E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x415A DUP8 DUP3 DUP9 ADD PUSH2 0x3D28 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x417B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4187 DUP7 DUP7 PUSH2 0x3D04 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4198 DUP7 DUP3 DUP8 ADD PUSH2 0x3BA7 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x41B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4050 DUP7 DUP3 DUP8 ADD PUSH2 0x3D71 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x41D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3D10 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x41F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3D1C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x420F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4226 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2CB7 DUP5 DUP3 DUP6 ADD PUSH2 0x3DC0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x425F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x426B DUP8 DUP3 DUP9 ADD PUSH2 0x3DC0 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4294 DUP8 DUP3 DUP9 ADD PUSH2 0x3DC0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x42B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x42BD DUP8 DUP3 DUP9 ADD PUSH2 0x3D71 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x42DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x42E6 DUP8 DUP3 DUP9 ADD PUSH2 0x3D71 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4307 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x431E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x432A DUP7 DUP3 DUP8 ADD PUSH2 0x3DC0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4198 DUP7 DUP3 DUP8 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4354 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4360 DUP10 DUP10 PUSH2 0x3D04 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x4371 DUP10 DUP3 DUP11 ADD PUSH2 0x3BA7 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x438E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x439A DUP10 DUP3 DUP11 ADD PUSH2 0x3D28 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43C5 DUP10 DUP3 DUP11 ADD PUSH2 0x3D28 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4ED5 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4EEE JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4EF3 JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4EF6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4409 DUP3 PUSH2 0x4ED1 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x441D DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x4F38 JUMP JUMPDEST PUSH2 0x4426 DUP2 PUSH2 0x4F64 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4F21 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4E45575F4F524445525F45504F4348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x49FF DUP5 DUP3 PUSH2 0x43EC JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4A12 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x4A25 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x2E44 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4A4A DUP5 DUP3 PUSH2 0x49EE JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4A5D PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x49EE JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2E44 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x4A82 DUP5 DUP3 PUSH2 0x4AA8 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4A95 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2E44 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4F1B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x43D4 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x4ACE DUP3 DUP12 PUSH2 0x43D4 JUMP JUMPDEST PUSH2 0x4ADB PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x43D4 JUMP JUMPDEST PUSH2 0x4AE8 PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4AF5 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4B02 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4B0F PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x43EC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x4B21 DUP2 DUP6 PUSH2 0x43FE JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x4B35 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4B51 DUP3 DUP7 PUSH2 0x43D4 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4B63 DUP2 DUP6 PUSH2 0x43FE JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4B77 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x43E3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x43EC JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4BAA DUP3 DUP7 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4BB7 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x43D4 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4B77 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4BD7 DUP3 DUP6 PUSH2 0x43EC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2CB7 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x4BF7 DUP3 DUP8 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4C04 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x4AA8 JUMP JUMPDEST PUSH2 0x4C11 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4B77 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x43EC JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4C2C DUP3 DUP6 PUSH2 0x43F5 JUMP JUMPDEST PUSH2 0xF74 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x43D4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xF74 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x4433 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x443C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x446C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x449C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x44CC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4522 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4552 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4582 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x45B2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x45E2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4612 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4642 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4672 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x46A2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x46D2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4702 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4758 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4788 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x47B8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x47E8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4818 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4848 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4878 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x48A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x48FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x492E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x495E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x498E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x49BE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x49EE JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x4A38 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x4A71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x4E62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4E81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4EA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2509 DUP3 PUSH2 0x4ED5 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4F53 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4F3B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2E44 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xeb 0x4d SWAP14 0xb5 0xdb 0x49 0xf5 0xb8 PUSH12 0xACCDB83B7B22CEF2DA7CF614 CALLDATASIZE DUP15 REVERT 0xd RETURNDATACOPY PUSH26 0x97F1A2703A6C6578706572696D656E74616CF500370000000000 ",
+ "object": "0x60806040523480156200001157600080fd5b506040516200567c3803806200567c833981018060405262000037919081019062000433565b805181906200004e90600090602084019062000332565b5050604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b60208310620001585780518252601f19909201916020918201910162000137565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208285018552600b8084527f30782050726f746f636f6c000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b60208310620001e25780518252601f199092019160209182019101620001c1565b51815160209384036101000a600019018019909216911617905260408051929094018290038220828501855260018084527f3200000000000000000000000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106200026c5780518252601f1990920191602091820191016200024b565b51815160209384036101000a6000190180199092169116179052604051919093018190038120620002a797969550935030920190506200048f565b6040516020818303038152906040526040518082805190602001908083835b60208310620002e75780518252601f199092019160209182019101620002c6565b5181516000196020949094036101000a939093019283169219169190911790526040519201829003909120600155505060028054600160a060020a0319163317905550620005639050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200037557805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a557825182559160200191906001019062000388565b50620003b3929150620003b7565b5090565b620003d491905b80821115620003b35760008155600101620003be565b90565b6000601f82018313620003e957600080fd5b815162000400620003fa82620004fc565b620004d5565b915080825260208301602083018583830111156200041d57600080fd5b6200042a83828462000530565b50505092915050565b6000602082840312156200044657600080fd5b81516001604060020a038111156200045d57600080fd5b6200046b84828501620003d7565b949350505050565b6200047e8162000524565b82525050565b6200047e81620003d4565b608081016200049f828762000484565b620004ae602083018662000484565b620004bd604083018562000484565b620004cc606083018462000473565b95945050505050565b6040518181016001604060020a0381118282101715620004f457600080fd5b604052919050565b60006001604060020a038211156200051357600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b60005b838110156200054d57818101518382015260200162000533565b838111156200055d576000848401525b50505050565b61510980620005736000396000f3006080604052600436106101c15763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632624b2d981146101c6578063288cdc91146101f1578063297bb70b146102115780632ac126221461023e5780633683ef8e1461026b5780633c28d8611461028d5780633e228bae146102ba5780633fd3c997146102da5780634ac14782146103075780634d0ae546146103275780634f9559b11461034757806350dde190146103675780636070410814610387578063642f2eaf146103b457806364a3bc15146103d457806377fcce68146103f45780637b8e3514146104145780637e1d9808146104345780637e9d74dc1461045457806382c174d0146104815780638da5cb5b146104a157806393634702146104b6578063a3e20380146104d6578063b4be83d5146104f6578063bfc8bfce14610516578063c585bb9314610536578063c75e0a8114610556578063d46b02c314610583578063d9bfa73e146105a3578063db123b1a146105c3578063dd1c7d18146105e5578063e306f77914610605578063e5fa431b1461061a578063eea086ba1461063a578063f2fde38b1461064f578063ffa1ad741461066f575b600080fd5b3480156101d257600080fd5b506101db610684565b6040516101e89190614ccb565b60405180910390f35b3480156101fd57600080fd5b506101db61020c366004614196565b6107d8565b34801561021d57600080fd5b5061023161022c36600461409b565b6107ea565b6040516101e89190614f55565b34801561024a57600080fd5b5061025e610259366004614196565b61087a565b6040516101e89190614cbd565b34801561027757600080fd5b5061028b6102863660046141d3565b61088f565b005b34801561029957600080fd5b506102ad6102a8366004614307565b610968565b6040516101e89190614f63565b3480156102c657600080fd5b506102316102d53660046143c7565b610a54565b3480156102e657600080fd5b506102fa6102f5366004614296565b610c64565b6040516101e89190614d87565b34801561031357600080fd5b5061028b610322366004614066565b610c8c565b34801561033357600080fd5b5061023161034236600461409b565b610cc4565b34801561035357600080fd5b5061028b610362366004614196565b610d4b565b34801561037357600080fd5b5061023161038236600461409b565b610e6f565b34801561039357600080fd5b506103a76103a2366004614296565b610ef6565b6040516101e89190614bdd565b3480156103c057600080fd5b5061025e6103cf366004614196565b610f44565b3480156103e057600080fd5b506102316103ef3660046143c7565b610f59565b34801561040057600080fd5b5061028b61040f366004614036565b610fb3565b34801561042057600080fd5b5061025e61042f366004613ffc565b61105e565b34801561044057600080fd5b5061023161044f36600461412f565b61107e565b34801561046057600080fd5b5061047461046f366004614066565b61114f565b6040516101e89190614cac565b34801561048d57600080fd5b5061025e61049c3660046141b4565b6111ed565b3480156104ad57600080fd5b506103a761120d565b3480156104c257600080fd5b5061025e6104d136600461423b565b611229565b3480156104e257600080fd5b506102316104f136600461412f565b611a4f565b34801561050257600080fd5b506102316105113660046143c7565b611b5f565b34801561052257600080fd5b5061028b610531366004614410565b611be3565b34801561054257600080fd5b5061028b610551366004613fde565b611e7c565b34801561056257600080fd5b506105766105713660046142d2565b6120a7565b6040516101e89190614f72565b34801561058f57600080fd5b5061028b61059e3660046142d2565b6121a1565b3480156105af57600080fd5b506101db6105be366004613ffc565b6121cc565b3480156105cf57600080fd5b506105d86121e9565b6040516101e89190614d76565b3480156105f157600080fd5b5061023161060036600461412f565b612295565b34801561061157600080fd5b506101db61235b565b34801561062657600080fd5b5061023161063536600461412f565b612361565b34801561064657600080fd5b506103a7612435565b34801561065b57600080fd5b5061028b61066a366004613fde565b612451565b34801561067b57600080fd5b506105d8612502565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b602083106107a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161076b565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902081565b60036020526000908152604090205481565b6107f2613c04565b60006107fc613c04565b600091505b85518210156108715761085a868381518110151561081b57fe5b90602001906020020151868481518110151561083357fe5b90602001906020020151868581518110151561084b57fe5b90602001906020020151611b5f565b90506108668382612539565b600190910190610801565b50509392505050565b60046020526000908152604090205460ff1681565b6108ca848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750611229945050505050565b151561090b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e25565b60405180910390fd5b5050600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff9093168452919052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610970613c2d565b610978613c5c565b610980613c5c565b61016080880151610140808901919091528801519087015260006109a3886120a7565b92506109ae876120a7565b91506109b861259b565b90506109c488886125e4565b6109d8888885604001518560400151612640565b8051602001519094506109f290899085908490808b612704565b6020808501510151610a0b90889084908490808a612704565b610a248882856020015186604001518860000151612921565b610a3d8782846020015185604001518860200151612921565b610a49888883876129cd565b505050949350505050565b610a5c613c04565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000008082526060600483018181528851606485019081526020808b01516084870152958a015160a48601529189015160c4850152608089015160e485015260a089015161010485015260c089015161012485015260e0890151610144850152610100890151610164850152610120890151610184850152610140890180516101a486019081526101608b01516101c487015261018090525180516101e48601819052939591938493926024870192849261020489019291820191601f82010460005b81811015610b5f578351855260209485019490930192600101610b41565b50505050818103610160808401919091528c0151805180835260209283019291820191601f82010460005b81811015610ba8578351855260209485019490930192600101610b8a565b5050508b84525084810360209384019081528a518083529093918201918b81019190601f82010460005b81811015610bf0578351855260209485019490930192600101610bd2565b5060808a8b86038c305af4808015610c0f5760018114610c2d57610c50565b60008e52600060208f0152600060408f0152600060608f0152610c50565b8b518e5260208c015160208f015260408c015160408f015260608c015160608f01525b505050505050505050505050509392505050565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60005b8151811015610cc057610cb88282815181101515610ca957fe5b906020019060200201516121a1565b600101610c8f565b5050565b610ccc613c04565b6000610cd6613c04565b600091505b855182101561087157610d348683815181101515610cf557fe5b906020019060200201518684815181101515610d0d57fe5b906020019060200201518685815181101515610d2557fe5b90602001906020020151610f59565b9050610d408382612539565b600190910190610cdb565b600080600080610d5961259b565b935073ffffffffffffffffffffffffffffffffffffffff84163314610d7e5733610d81565b60005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600560209081526040808320938516835292905220549093506001860192509050808211610df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ea5565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526005602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610e60908690614ccb565b60405180910390a35050505050565b610e77613c04565b6000610e81613c04565b600091505b855182101561087157610edf8683815181101515610ea057fe5b906020019060200201518684815181101515610eb857fe5b906020019060200201518685815181101515610ed057fe5b90602001906020020151610a54565b9050610eeb8382612539565b600190910190610e86565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60086020526000908152604090205460ff1681565b610f61613c04565b610f6c848484611b5f565b60208101519091508314610fac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ec5565b9392505050565b6000610fbd61259b565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600760209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190611051908690614cbd565b60405180910390a3505050565b600760209081526000928352604080842090915290825290205460ff1681565b611086613c04565b6060600080611093613c04565b8760008151811015156110a257fe5b9060200190602002015161016001519350600092505b8751831015611144578388848151811015156110d057fe5b9060200190602002015161016001819052506110f0878660200151612bad565b915061111c888481518110151561110357fe5b9060200190602002015183888681518110151561084b57fe5b90506111288582612539565b868560200151141561113957611144565b6001909201916110b8565b505050509392505050565b6060600060606000845192508260405190808252806020026020018201604052801561119557816020015b611182613c5c565b81526020019060019003908161117a5790505b509150600090505b828110156111e5576111c585828151811015156111b657fe5b906020019060200201516120a7565b82828151811015156111d357fe5b6020908102909101015260010161119d565b509392505050565b600660209081526000928352604080842090915290825290205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008951111515611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e95565b61127b89612bef565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff8816106112dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614dd5565b8660ff1660098111156112ec57fe5b955060008660098111156112fc57fe5b1415611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e85565b600186600981111561134257fe5b141561138a57885115611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f45565b60009750611a41565b600286600981111561139857fe5b14156114d35788516041146113d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614d95565b8860008151811015156113e857fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061142889600163ffffffff612cb316565b935061143b89602163ffffffff612cb316565b925060018b868686604051600081526020016040526040516114609493929190614d26565b60206040516020810390808403906000865af1158015611484573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c81169082161499509250611a419050565b60038660098111156114e157fe5b1415611687578851604114611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614d95565b88600081518110151561153157fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061157189600163ffffffff612cb316565b935061158489602163ffffffff612cb316565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061162557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115e8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018290038220600083529101928390526114609450925089918991508890614d26565b600486600981111561169557fe5b14156116f4578851156116d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f45565b73ffffffffffffffffffffffffffffffffffffffff8a1633149750611a41565b600586600981111561170257fe5b14156117b5576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e9061175c908e908d90600401614d06565b602060405180830381600087803b15801561177657600080fd5b505af115801561178a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117ae9190810190614178565b9750611a41565b60068660098111156117c357fe5b1415611870576117d289612cfe565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526007602090815260408083209385168352929052205490915060ff16151561181a5760009750611a41565b6040517f9363470200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063936347029061175c908e908e908e90600401614cd9565b600786600981111561187e57fe5b14156118be5760008b815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff169750611a41565b60088660098111156118cc57fe5b1415611a0f57885160411461190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614d95565b88600081518110151561191c57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061195c89600163ffffffff612cb316565b935061196f89602163ffffffff612cb316565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083836020831061162557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115e8565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614dd5565b505050505050509392505050565b611a57613c04565b60606000806000611a66613c04565b886000815181101515611a7557fe5b9060200190602002015161014001519450600093505b8851841015611b5357848985815181101515611aa357fe5b6020908102909101015161014001528551611abf908990612bad565b9250611b028985815181101515611ad257fe5b9060200190602002015160a001518a86815181101515611aee57fe5b906020019060200201516080015185612d77565b9150611b2e8985815181101515611b1557fe5b90602001906020020151838987815181101515610ed057fe5b9050611b3a8682612539565b8551881415611b4857611b53565b600190930192611a8b565b50505050509392505050565b611b67613c04565b611b6f613c5c565b6000806000611b7d886120a7565b9350611b8761259b565b9250611b9b8860a001518560400151612bad565b9150611ba78783612d94565b9050611bb78885858a858b612704565b611bc18882612daa565b9450611bd888848660200151876040015189612921565b611144888487612e0a565b60095460009073ffffffffffffffffffffffffffffffffffffffff1615611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ed5565b611c79611c74888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843750612f1f945050505050565b613160565b60008181526008602052604090205490915060ff1615611cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e15565b73ffffffffffffffffffffffffffffffffffffffff86163314611d9657611d1d818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611229945050505050565b1515611d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f35565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600860205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af49150501515611e2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e45565b73ffffffffffffffffffffffffffffffffffffffff86163314611e7357600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b6002546000908190819073ffffffffffffffffffffffffffffffffffffffff163314611ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ee5565b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611f3b57600080fd5b505af1158015611f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f7391908101906142b4565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1690508015611ff8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614db5565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600a60205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c03194906120999084908790614d5b565b60405180910390a150505050565b6120af613c5c565b6120b8826132e0565b60208083018290526000918252600390526040908190205490820152608082015115156120ec5760015b60ff168152610f3f565b60a082015115156120fe5760026120e2565b60a08201516040820151106121145760056120e2565b61010082015142106121275760046120e2565b60208082015160009081526004909152604090205460ff161561214b5760066120e2565b610120820151825173ffffffffffffffffffffffffffffffffffffffff908116600090815260056020908152604080832060608801519094168352929052205411156121985760066120e2565b60038152919050565b6121a9613c5c565b6121b2826120a7565b90506121be82826132ee565b610cc0828260200151613405565b600560209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561228d5780601f106122625761010080835404028352916020019161228d565b820191906000526020600020905b81548152906001019060200180831161227057829003601f168201915b505050505081565b61229d613c04565b60606000806122aa613c04565b8760008151811015156122b957fe5b9060200190602002015161016001519350600092505b8751831015611144578388848151811015156122e757fe5b906020019060200201516101600181905250612307878660200151612bad565b9150612333888481518110151561231a57fe5b90602001906020020151838886815181101515610ed057fe5b905061233f8582612539565b868560200151141561235057611144565b6001909201916122cf565b60015481565b612369613c04565b60606000806000612378613c04565b88600081518110151561238757fe5b9060200190602002015161014001519450600093505b8851841015611b53578489858151811015156123b557fe5b60209081029091010151610140015285516123d1908990612bad565b92506123e48985815181101515611ad257fe5b915061241089858151811015156123f757fe5b9060200190602002015183898781518110151561084b57fe5b905061241c8682612539565b855188141561242a57611b53565b60019093019261239d565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146124a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ee5565b73ffffffffffffffffffffffffffffffffffffffff8116156124ff57600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b8151815161254791906134ac565b82526020808301519082015161255d91906134ac565b60208301526040808301519082015161257691906134ac565b60408301526060808301519082015161258f91906134ac565b60609092019190915250565b600954600090819073ffffffffffffffffffffffffffffffffffffffff16156125dc5760095473ffffffffffffffffffffffffffffffffffffffff166125de565b335b92915050565b6125f68260a001518260a001516134f6565b612608836080015183608001516134f6565b1015610cc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f25565b612648613c2d565b60008060008061265c8960a0015188612bad565b935061266c8860a0015187612bad565b925061267c8389608001516134f6565b61268a858a60a001516134f6565b116126ac578391506126a58860a00151896080015184612d77565b90506126c5565b8290506126c288608001518960a0015183612d77565b91505b6126cf8983612daa565b85526126db8882612daa565b60208087018290528651519101516126f39190612bad565b604086015250505050949350505050565b845160ff16600314612742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f05565b82151561277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e55565b606086015173ffffffffffffffffffffffffffffffffffffffff16156127ee57606086015173ffffffffffffffffffffffffffffffffffffffff1633146127ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f15565b602086015173ffffffffffffffffffffffffffffffffffffffff1615612879578373ffffffffffffffffffffffffffffffffffffffff16866020015173ffffffffffffffffffffffffffffffffffffffff16141515612879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614da5565b604085015115156128cf576128978560200151876000015183611229565b15156128cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614de5565b6128e2828760a001518860800151613551565b15612919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e35565b505050505050565b61292f8282602001516134ac565b600084815260036020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b9873ffffffffffffffffffffffffffffffffffffffff9788169897909616967f0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c371129966129be968f96339692959194909390614beb565b60405180910390a45050505050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612a775780601f10612a4c57610100808354040283529160200191612a77565b820191906000526020600020905b815481529060010190602001808311612a5a57829003601f168201915b50505050509050612a9f856101400151866000015186600001518560200151602001516135a2565b61014084015184518651845160200151612abb939291906135a2565b612ad485610140015186600001518585604001516135a2565b612af081866000015187604001518560000151604001516135a2565b612b0c81856000015186604001518560200151604001516135a2565b836040015173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff161415612b7657612b7181848760400151612b6c8660000151606001518760200151606001516134ac565b6135a2565b612ba6565b612b8e818487604001518560000151606001516135a2565b612ba6818486604001518560200151606001516135a2565b5050505050565b600082821115612be9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e05565b50900390565b6000808251111515612c2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e75565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612c5d57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515612cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614dc5565b50016020015190565b60006014825110151515612d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ef5565b612d4c826014845103613733565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000612d8c612d8685846134f6565b84613794565b949350505050565b6000818310612da35781610fac565b5090919050565b612db2613c04565b6020810182905260a08301516080840151612dce918491612d77565b815260a083015160c0840151612de5918491612d77565b604082015260a083015160e0840151612dff918491612d77565b606082015292915050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612eb45780601f10612e8957610100808354040283529160200191612eb4565b820191906000526020600020905b815481529060010190602001808311612e9757829003601f168201915b50505050509050612ed484610140015185600001518585600001516135a2565b612eed84610160015184866000015185602001516135a2565b612f05818560000151866040015185604001516135a2565b612f198184866040015185606001516135a2565b50505050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b6020831061304857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161300b565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b602083106130de57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016130a1565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822097825281019a909a525073ffffffffffffffffffffffffffffffffffffffff97909716968801969096525050606085015250506080909120919050565b60006040805190810160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250600154836040516020018084805190602001908083835b602083106131ec57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016131af565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250838101929092525060408051808403830181529281019081905282519293509182918401908083835b6020831061329057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613253565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912095945050505050565b60006125de611c74836137ab565b805160009060ff1660031461332f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f05565b606083015173ffffffffffffffffffffffffffffffffffffffff16156133a257606083015173ffffffffffffffffffffffffffffffffffffffff1633146133a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f15565b6133aa61259b565b835190915073ffffffffffffffffffffffffffffffffffffffff808316911614613400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614df5565b505050565b6000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927fdc47b3613d9fe400085f6dbdc99453462279057e6207385042827ed6b1a62cf7926134a092339290614c6f565b60405180910390a45050565b6000828201838110156134eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e05565b8091505b5092915050565b60008083151561350957600091506134ef565b5082820282848281151561351957fe5b04146134eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e05565b60008060008480151561356057fe5b86850991508115156135755760009250610871565b61359461358583620f42406134f6565b61358f88876134f6565b613794565b6103e8109695505050505050565b60008060008311156129195785516003106135e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614eb5565b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600a90925260409091205473ffffffffffffffffffffffffffffffffffffffff16801515613672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e65565b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b8181101561370e57895181526020998a0199016136f6565b61020084858403866000895af1801515613726573d85fd5b5050505050505050505050565b600081601401835110151515613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ef5565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60008082848115156137a257fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b60208310613a3357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016139f6565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b60208310613ace57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613a91565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310613b6957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613b2c565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b61012060405190810160405280613c42613c04565b8152602001613c4f613c04565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610fac8235615018565b6000601f82018313613c9957600080fd5b8135613cac613ca782614fa7565b614f80565b81815260209384019390925082018360005b83811015613cea5781358601613cd48882613e46565b8452506020928301929190910190600101613cbe565b5050505092915050565b6000601f82018313613d0557600080fd5b8135613d13613ca782614fa7565b81815260209384019390925082018360005b83811015613cea5781358601613d3b8882613e95565b8452506020928301929190910190600101613d25565b6000601f82018313613d6257600080fd5b8135613d70613ca782614fa7565b91508181835260208401935060208101905083856020840282011115613d9557600080fd5b60005b83811015613cea5781613dab8882613dd9565b8452506020928301929190910190600101613d98565b6000610fac8235615031565b6000610fac8251615031565b6000610fac8235615036565b6000610fac8235615039565b6000610fac8251615039565b600080601f83018413613e0f57600080fd5b50813567ffffffffffffffff811115613e2757600080fd5b602083019150836001820283011115613e3f57600080fd5b9250929050565b6000601f82018313613e5757600080fd5b8135613e65613ca782614fc8565b91508082526020830160208301858383011115613e8157600080fd5b613e8c83828461506f565b50505092915050565b60006101808284031215613ea857600080fd5b613eb3610180614f80565b90506000613ec18484613c7c565b8252506020613ed284848301613c7c565b6020830152506040613ee684828501613c7c565b6040830152506060613efa84828501613c7c565b6060830152506080613f0e84828501613dd9565b60808301525060a0613f2284828501613dd9565b60a08301525060c0613f3684828501613dd9565b60c08301525060e0613f4a84828501613dd9565b60e083015250610100613f5f84828501613dd9565b61010083015250610120613f7584828501613dd9565b6101208301525061014082013567ffffffffffffffff811115613f9757600080fd5b613fa384828501613e46565b6101408301525061016082013567ffffffffffffffff811115613fc557600080fd5b613fd184828501613e46565b6101608301525092915050565b600060208284031215613ff057600080fd5b6000612d8c8484613c7c565b6000806040838503121561400f57600080fd5b600061401b8585613c7c565b925050602061402c85828601613c7c565b9150509250929050565b6000806040838503121561404957600080fd5b60006140558585613c7c565b925050602061402c85828601613dc1565b60006020828403121561407857600080fd5b813567ffffffffffffffff81111561408f57600080fd5b612d8c84828501613cf4565b6000806000606084860312156140b057600080fd5b833567ffffffffffffffff8111156140c757600080fd5b6140d386828701613cf4565b935050602084013567ffffffffffffffff8111156140f057600080fd5b6140fc86828701613d51565b925050604084013567ffffffffffffffff81111561411957600080fd5b61412586828701613c88565b9150509250925092565b60008060006060848603121561414457600080fd5b833567ffffffffffffffff81111561415b57600080fd5b61416786828701613cf4565b93505060206140fc86828701613dd9565b60006020828403121561418a57600080fd5b6000612d8c8484613dcd565b6000602082840312156141a857600080fd5b6000612d8c8484613dd9565b600080604083850312156141c757600080fd5b600061401b8585613dd9565b600080600080606085870312156141e957600080fd5b60006141f58787613dd9565b945050602061420687828801613c7c565b935050604085013567ffffffffffffffff81111561422357600080fd5b61422f87828801613dfd565b95989497509550505050565b60008060006060848603121561425057600080fd5b600061425c8686613dd9565b935050602061426d86828701613c7c565b925050604084013567ffffffffffffffff81111561428a57600080fd5b61412586828701613e46565b6000602082840312156142a857600080fd5b6000612d8c8484613de5565b6000602082840312156142c657600080fd5b6000612d8c8484613df1565b6000602082840312156142e457600080fd5b813567ffffffffffffffff8111156142fb57600080fd5b612d8c84828501613e95565b6000806000806080858703121561431d57600080fd5b843567ffffffffffffffff81111561433457600080fd5b61434087828801613e95565b945050602085013567ffffffffffffffff81111561435d57600080fd5b61436987828801613e95565b935050604085013567ffffffffffffffff81111561438657600080fd5b61439287828801613e46565b925050606085013567ffffffffffffffff8111156143af57600080fd5b6143bb87828801613e46565b91505092959194509250565b6000806000606084860312156143dc57600080fd5b833567ffffffffffffffff8111156143f357600080fd5b6143ff86828701613e95565b935050602061426d86828701613dd9565b6000806000806000806080878903121561442957600080fd5b60006144358989613dd9565b965050602061444689828a01613c7c565b955050604087013567ffffffffffffffff81111561446357600080fd5b61446f89828a01613dfd565b9450945050606087013567ffffffffffffffff81111561448e57600080fd5b61449a89828a01613dfd565b92509250509295509295509295565b6144b281615018565b82525050565b60006144c382615014565b8084526020840193506144d58361500e565b60005b82811015614505576144eb868351614b9d565b6144f48261500e565b6060969096019591506001016144d8565b5093949350505050565b6144b281615031565b6144b281615036565b6144b281615039565b600061453582615014565b80845261454981602086016020860161507b565b614552816150a7565b9093016020019392505050565b6144b281615064565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b600d81527f494e56414c49445f54414b455200000000000000000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f414c52454144595f455849535453000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015260400190565b600d81527f494e56414c49445f4d414b455200000000000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f494e56414c49445f54585f484153480000000000000000000000000000000000602082015260400190565b601181527f494e56414c49445f5349474e4154555245000000000000000000000000000000602082015260400190565b600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015260400190565b601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015260400190565b601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b601781527f494e56414c49445f4e45575f4f524445525f45504f4348000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601281527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015260400190565b601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015260400190565b601181527f4c454e4754485f305f5245515549524544000000000000000000000000000000602082015260400190565b80516080830190614b2b8482614518565b506020820151614b3e6020850182614518565b506040820151614b516040850182614518565b506060820151612f196060850182614518565b8051610120830190614b768482614b1a565b506020820151614b896080850182614b1a565b506040820151612f19610100850182614518565b80516060830190614bae8482614bd4565b506020820151614bc16020850182614518565b506040820151612f196040850182614518565b6144b28161505e565b602081016125de82846144a9565b6101008101614bfa828b6144a9565b614c07602083018a6144a9565b614c146040830189614518565b614c216060830188614518565b614c2e6080830187614518565b614c3b60a0830186614518565b81810360c0830152614c4d818561452a565b905081810360e0830152614c61818461452a565b9a9950505050505050505050565b60608101614c7d82866144a9565b8181036020830152614c8f818561452a565b90508181036040830152614ca3818461452a565b95945050505050565b60208082528101610fac81846144b8565b602081016125de828461450f565b602081016125de8284614518565b60608101614ce78286614518565b614cf460208301856144a9565b8181036040830152614ca3818461452a565b60408101614d148285614518565b8181036020830152612d8c818461452a565b60808101614d348287614518565b614d416020830186614bd4565b614d4e6040830185614518565b614ca36060830184614518565b60408101614d698285614521565b610fac60208301846144a9565b60208082528101610fac818461452a565b602081016125de828461455f565b602080825281016125de81614568565b602080825281016125de81614598565b602080825281016125de816145c8565b602080825281016125de816145f8565b602080825281016125de8161464e565b602080825281016125de8161467e565b602080825281016125de816146ae565b602080825281016125de816146de565b602080825281016125de8161470e565b602080825281016125de8161473e565b602080825281016125de8161476e565b602080825281016125de8161479e565b602080825281016125de816147ce565b602080825281016125de816147fe565b602080825281016125de8161482e565b602080825281016125de81614884565b602080825281016125de816148b4565b602080825281016125de816148e4565b602080825281016125de81614914565b602080825281016125de81614944565b602080825281016125de81614974565b602080825281016125de816149a4565b602080825281016125de816149d4565b602080825281016125de81614a2a565b602080825281016125de81614a5a565b602080825281016125de81614a8a565b602080825281016125de81614aba565b602080825281016125de81614aea565b608081016125de8284614b1a565b61012081016125de8284614b64565b606081016125de8284614b9d565b60405181810167ffffffffffffffff81118282101715614f9f57600080fd5b604052919050565b600067ffffffffffffffff821115614fbe57600080fd5b5060209081020190565b600067ffffffffffffffff821115614fdf57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b60006125de82615018565b82818337506000910152565b60005b8381101561509657818101518382015260200161507e565b83811115612f195750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058207c5f5af88134aeeede952e9cdda7741efb0001f235c761ec650b76b231ab60266c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x567C CODESIZE SUB DUP1 PUSH3 0x567C DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x433 JUMP JUMPDEST DUP1 MLOAD DUP2 SWAP1 PUSH3 0x4E SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x332 JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x158 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x137 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0xB DUP1 DUP5 MSTORE PUSH32 0x30782050726F746F636F6C000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x1E2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x1C1 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0x1 DUP1 DUP5 MSTORE PUSH32 0x3200000000000000000000000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x26C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x24B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH3 0x2A7 SWAP8 SWAP7 SWAP6 POP SWAP4 POP ADDRESS SWAP3 ADD SWAP1 POP PUSH3 0x48F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x2E7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x2C6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP SWAP4 SWAP1 SWAP4 ADD SWAP3 DUP4 AND SWAP3 NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x1 SSTORE POP POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE POP PUSH3 0x563 SWAP1 POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x375 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3A5 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3A5 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3A5 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x388 JUMP JUMPDEST POP PUSH3 0x3B3 SWAP3 SWAP2 POP PUSH3 0x3B7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x3D4 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3B3 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3BE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x400 PUSH3 0x3FA DUP3 PUSH3 0x4FC JUMP JUMPDEST PUSH3 0x4D5 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x41D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x42A DUP4 DUP3 DUP5 PUSH3 0x530 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x446 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x45D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x46B DUP5 DUP3 DUP6 ADD PUSH3 0x3D7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH3 0x47E DUP2 PUSH3 0x524 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x47E DUP2 PUSH3 0x3D4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH3 0x49F DUP3 DUP8 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4AE PUSH1 0x20 DUP4 ADD DUP7 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4BD PUSH1 0x40 DUP4 ADD DUP6 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4CC PUSH1 0x60 DUP4 ADD DUP5 PUSH3 0x473 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x4F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x54D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x533 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x55D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x5109 DUP1 PUSH3 0x573 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1C1 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x2624B2D9 DUP2 EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x211 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x26B JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x28D JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x3FD3C997 EQ PUSH2 0x2DA JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x307 JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x347 JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x367 JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0x387 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x3D4 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3F4 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x434 JUMPI DUP1 PUSH4 0x7E9D74DC EQ PUSH2 0x454 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x481 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x4A1 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x4B6 JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x4D6 JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x516 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x536 JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x556 JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x583 JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x5A3 JUMPI DUP1 PUSH4 0xDB123B1A EQ PUSH2 0x5C3 JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x5E5 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x605 JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x61A JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x63A JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x64F JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x66F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x684 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4CCB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x20C CALLDATASIZE PUSH1 0x4 PUSH2 0x4196 JUMP JUMPDEST PUSH2 0x7D8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x22C CALLDATASIZE PUSH1 0x4 PUSH2 0x409B JUMP JUMPDEST PUSH2 0x7EA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4F55 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x259 CALLDATASIZE PUSH1 0x4 PUSH2 0x4196 JUMP JUMPDEST PUSH2 0x87A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4CBD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0x41D3 JUMP JUMPDEST PUSH2 0x88F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x299 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AD PUSH2 0x2A8 CALLDATASIZE PUSH1 0x4 PUSH2 0x4307 JUMP JUMPDEST PUSH2 0x968 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4F63 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x2D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x43C7 JUMP JUMPDEST PUSH2 0xA54 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FA PUSH2 0x2F5 CALLDATASIZE PUSH1 0x4 PUSH2 0x4296 JUMP JUMPDEST PUSH2 0xC64 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D87 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x4066 JUMP JUMPDEST PUSH2 0xC8C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x342 CALLDATASIZE PUSH1 0x4 PUSH2 0x409B JUMP JUMPDEST PUSH2 0xCC4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x353 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x362 CALLDATASIZE PUSH1 0x4 PUSH2 0x4196 JUMP JUMPDEST PUSH2 0xD4B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x382 CALLDATASIZE PUSH1 0x4 PUSH2 0x409B JUMP JUMPDEST PUSH2 0xE6F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x393 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A7 PUSH2 0x3A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x4296 JUMP JUMPDEST PUSH2 0xEF6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4BDD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x3CF CALLDATASIZE PUSH1 0x4 PUSH2 0x4196 JUMP JUMPDEST PUSH2 0xF44 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x3EF CALLDATASIZE PUSH1 0x4 PUSH2 0x43C7 JUMP JUMPDEST PUSH2 0xF59 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x40F CALLDATASIZE PUSH1 0x4 PUSH2 0x4036 JUMP JUMPDEST PUSH2 0xFB3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x42F CALLDATASIZE PUSH1 0x4 PUSH2 0x3FFC JUMP JUMPDEST PUSH2 0x105E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x44F CALLDATASIZE PUSH1 0x4 PUSH2 0x412F JUMP JUMPDEST PUSH2 0x107E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x460 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x474 PUSH2 0x46F CALLDATASIZE PUSH1 0x4 PUSH2 0x4066 JUMP JUMPDEST PUSH2 0x114F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4CAC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x49C CALLDATASIZE PUSH1 0x4 PUSH2 0x41B4 JUMP JUMPDEST PUSH2 0x11ED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A7 PUSH2 0x120D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x4D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x423B JUMP JUMPDEST PUSH2 0x1229 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x4F1 CALLDATASIZE PUSH1 0x4 PUSH2 0x412F JUMP JUMPDEST PUSH2 0x1A4F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x502 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x511 CALLDATASIZE PUSH1 0x4 PUSH2 0x43C7 JUMP JUMPDEST PUSH2 0x1B5F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x522 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x531 CALLDATASIZE PUSH1 0x4 PUSH2 0x4410 JUMP JUMPDEST PUSH2 0x1BE3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x542 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x551 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FDE JUMP JUMPDEST PUSH2 0x1E7C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x562 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x576 PUSH2 0x571 CALLDATASIZE PUSH1 0x4 PUSH2 0x42D2 JUMP JUMPDEST PUSH2 0x20A7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4F72 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x59E CALLDATASIZE PUSH1 0x4 PUSH2 0x42D2 JUMP JUMPDEST PUSH2 0x21A1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x5BE CALLDATASIZE PUSH1 0x4 PUSH2 0x3FFC JUMP JUMPDEST PUSH2 0x21CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5D8 PUSH2 0x21E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D76 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x600 CALLDATASIZE PUSH1 0x4 PUSH2 0x412F JUMP JUMPDEST PUSH2 0x2295 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x611 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x235B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x635 CALLDATASIZE PUSH1 0x4 PUSH2 0x412F JUMP JUMPDEST PUSH2 0x2361 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x646 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A7 PUSH2 0x2435 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x65B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x66A CALLDATASIZE PUSH1 0x4 PUSH2 0x3FDE JUMP JUMPDEST PUSH2 0x2451 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5D8 PUSH2 0x2502 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x7A8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x76B JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x7F2 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7FC PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x871 JUMPI PUSH2 0x85A DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x81B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x833 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x84B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1B5F JUMP JUMPDEST SWAP1 POP PUSH2 0x866 DUP4 DUP3 PUSH2 0x2539 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x801 JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x8CA DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1229 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x90B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E25 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x970 PUSH2 0x3C2D JUMP JUMPDEST PUSH2 0x978 PUSH2 0x3C5C JUMP JUMPDEST PUSH2 0x980 PUSH2 0x3C5C JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x9A3 DUP9 PUSH2 0x20A7 JUMP JUMPDEST SWAP3 POP PUSH2 0x9AE DUP8 PUSH2 0x20A7 JUMP JUMPDEST SWAP2 POP PUSH2 0x9B8 PUSH2 0x259B JUMP JUMPDEST SWAP1 POP PUSH2 0x9C4 DUP9 DUP9 PUSH2 0x25E4 JUMP JUMPDEST PUSH2 0x9D8 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2640 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x9F2 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x2704 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0xA0B SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x2704 JUMP JUMPDEST PUSH2 0xA24 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x2921 JUMP JUMPDEST PUSH2 0xA3D DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x2921 JUMP JUMPDEST PUSH2 0xA49 DUP9 DUP9 DUP4 DUP8 PUSH2 0x29CD JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA5C PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE PUSH1 0x60 PUSH1 0x4 DUP4 ADD DUP2 DUP2 MSTORE DUP9 MLOAD PUSH1 0x64 DUP6 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 DUP1 DUP12 ADD MLOAD PUSH1 0x84 DUP8 ADD MSTORE SWAP6 DUP11 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP2 DUP10 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE PUSH1 0x80 DUP10 ADD MLOAD PUSH1 0xE4 DUP6 ADD MSTORE PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x104 DUP6 ADD MSTORE PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x124 DUP6 ADD MSTORE PUSH1 0xE0 DUP10 ADD MLOAD PUSH2 0x144 DUP6 ADD MSTORE PUSH2 0x100 DUP10 ADD MLOAD PUSH2 0x164 DUP6 ADD MSTORE PUSH2 0x120 DUP10 ADD MLOAD PUSH2 0x184 DUP6 ADD MSTORE PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x1A4 DUP7 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP12 ADD MLOAD PUSH2 0x1C4 DUP8 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x1E4 DUP7 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP6 SWAP2 SWAP4 DUP5 SWAP4 SWAP3 PUSH1 0x24 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x204 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB5F JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB41 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP13 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xBA8 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB8A JUMP JUMPDEST POP POP POP DUP12 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP11 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP12 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xBF0 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xBD2 JUMP JUMPDEST POP PUSH1 0x80 DUP11 DUP12 DUP7 SUB DUP13 ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0xC0F JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xC2D JUMPI PUSH2 0xC50 JUMP JUMPDEST PUSH1 0x0 DUP15 MSTORE PUSH1 0x0 PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP16 ADD MSTORE PUSH2 0xC50 JUMP JUMPDEST DUP12 MLOAD DUP15 MSTORE PUSH1 0x20 DUP13 ADD MLOAD PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x40 DUP13 ADD MLOAD PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x60 DUP13 ADD MLOAD PUSH1 0x60 DUP16 ADD MSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xCC0 JUMPI PUSH2 0xCB8 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCA9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x21A1 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC8F JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xCCC PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCD6 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x871 JUMPI PUSH2 0xD34 DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCF5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD0D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD25 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xF59 JUMP JUMPDEST SWAP1 POP PUSH2 0xD40 DUP4 DUP3 PUSH2 0x2539 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xCDB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xD59 PUSH2 0x259B JUMP JUMPDEST SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ PUSH2 0xD7E JUMPI CALLER PUSH2 0xD81 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH1 0x1 DUP7 ADD SWAP3 POP SWAP1 POP DUP1 DUP3 GT PUSH2 0xDF8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EA5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xE60 SWAP1 DUP7 SWAP1 PUSH2 0x4CCB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE77 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE81 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x871 JUMPI PUSH2 0xEDF DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEA0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEB8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xED0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA54 JUMP JUMPDEST SWAP1 POP PUSH2 0xEEB DUP4 DUP3 PUSH2 0x2539 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xE86 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF61 PUSH2 0x3C04 JUMP JUMPDEST PUSH2 0xF6C DUP5 DUP5 DUP5 PUSH2 0x1B5F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD SWAP1 SWAP2 POP DUP4 EQ PUSH2 0xFAC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EC5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFBD PUSH2 0x259B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0x1051 SWAP1 DUP7 SWAP1 PUSH2 0x4CBD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x1086 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x1093 PUSH2 0x3C04 JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10A2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1144 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10D0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x10F0 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2BAD JUMP JUMPDEST SWAP2 POP PUSH2 0x111C DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1103 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x84B JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1128 DUP6 DUP3 PUSH2 0x2539 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1139 JUMPI PUSH2 0x1144 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x10B8 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP5 MLOAD SWAP3 POP DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1195 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1182 PUSH2 0x3C5C JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x117A JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x11E5 JUMPI PUSH2 0x11C5 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11B6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x20A7 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11D3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x119D JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0x1272 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E95 JUMP JUMPDEST PUSH2 0x127B DUP10 PUSH2 0x2BEF JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0x12DD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DD5 JUMP JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x12EC JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x12FC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1334 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E85 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1342 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x138A JUMPI DUP9 MLOAD ISZERO PUSH2 0x1381 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F45 JUMP JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1398 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x14D3 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x13D9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4D95 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13E8 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1428 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x143B DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1460 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4D26 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1484 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x1A41 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x14E1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1687 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1522 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4D95 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1531 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1571 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1584 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1625 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15E8 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x1460 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4D26 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1695 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x16F4 JUMPI DUP9 MLOAD ISZERO PUSH2 0x16D4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F45 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1702 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x17B5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x175C SWAP1 DUP15 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4D06 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1776 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x178A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x17AE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4178 JUMP JUMPDEST SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1870 JUMPI PUSH2 0x17D2 DUP10 PUSH2 0x2CFE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x181A JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x175C SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x4CD9 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x187E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x18BE JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x18CC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1A0F JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x190D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4D95 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x191C JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x195C DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x196F DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x1625 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DD5 JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1A57 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1A66 PUSH2 0x3C04 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A75 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1B53 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AA3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x1ABF SWAP1 DUP10 SWAP1 PUSH2 0x2BAD JUMP JUMPDEST SWAP3 POP PUSH2 0x1B02 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AD2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AEE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2D77 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B2E DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B15 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xED0 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1B3A DUP7 DUP3 PUSH2 0x2539 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x1B48 JUMPI PUSH2 0x1B53 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1A8B JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1B67 PUSH2 0x3C04 JUMP JUMPDEST PUSH2 0x1B6F PUSH2 0x3C5C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1B7D DUP9 PUSH2 0x20A7 JUMP JUMPDEST SWAP4 POP PUSH2 0x1B87 PUSH2 0x259B JUMP JUMPDEST SWAP3 POP PUSH2 0x1B9B DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2BAD JUMP JUMPDEST SWAP2 POP PUSH2 0x1BA7 DUP8 DUP4 PUSH2 0x2D94 JUMP JUMPDEST SWAP1 POP PUSH2 0x1BB7 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x2704 JUMP JUMPDEST PUSH2 0x1BC1 DUP9 DUP3 PUSH2 0x2DAA JUMP JUMPDEST SWAP5 POP PUSH2 0x1BD8 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x2921 JUMP JUMPDEST PUSH2 0x1144 DUP9 DUP5 DUP8 PUSH2 0x2E0A JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x1C36 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4ED5 JUMP JUMPDEST PUSH2 0x1C79 PUSH2 0x1C74 DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x2F1F SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3160 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x1CC5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1D96 JUMPI PUSH2 0x1D1D DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1229 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1D55 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F35 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x1E2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E45 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1E73 JUMPI PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1ED4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EE5 JUMP JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F3B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F4F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1F73 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x42B4 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x1FF8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DB5 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x2099 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x4D5B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH2 0x20AF PUSH2 0x3C5C JUMP JUMPDEST PUSH2 0x20B8 DUP3 PUSH2 0x32E0 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x20EC JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0xF3F JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x20FE JUMPI PUSH1 0x2 PUSH2 0x20E2 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MLOAD LT PUSH2 0x2114 JUMPI PUSH1 0x5 PUSH2 0x20E2 JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x2127 JUMPI PUSH1 0x4 PUSH2 0x20E2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x214B JUMPI PUSH1 0x6 PUSH2 0x20E2 JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x2198 JUMPI PUSH1 0x6 PUSH2 0x20E2 JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x21A9 PUSH2 0x3C5C JUMP JUMPDEST PUSH2 0x21B2 DUP3 PUSH2 0x20A7 JUMP JUMPDEST SWAP1 POP PUSH2 0x21BE DUP3 DUP3 PUSH2 0x32EE JUMP JUMPDEST PUSH2 0xCC0 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3405 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x228D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2262 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x228D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2270 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x229D PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x22AA PUSH2 0x3C04 JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x22B9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1144 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x22E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x2307 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2BAD JUMP JUMPDEST SWAP2 POP PUSH2 0x2333 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x231A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xED0 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x233F DUP6 DUP3 PUSH2 0x2539 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x2350 JUMPI PUSH2 0x1144 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x22CF JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2369 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2378 PUSH2 0x3C04 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2387 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1B53 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x23B5 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x23D1 SWAP1 DUP10 SWAP1 PUSH2 0x2BAD JUMP JUMPDEST SWAP3 POP PUSH2 0x23E4 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AD2 JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x2410 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x23F7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x84B JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x241C DUP7 DUP3 PUSH2 0x2539 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x242A JUMPI PUSH2 0x1B53 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x239D JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x24A2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EE5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x24FF JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x2547 SWAP2 SWAP1 PUSH2 0x34AC JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x255D SWAP2 SWAP1 PUSH2 0x34AC JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2576 SWAP2 SWAP1 PUSH2 0x34AC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x258F SWAP2 SWAP1 PUSH2 0x34AC JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x25DC JUMPI PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x25DE JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x25F6 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x2608 DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x34F6 JUMP JUMPDEST LT ISZERO PUSH2 0xCC0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F25 JUMP JUMPDEST PUSH2 0x2648 PUSH2 0x3C2D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x265C DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2BAD JUMP JUMPDEST SWAP4 POP PUSH2 0x266C DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2BAD JUMP JUMPDEST SWAP3 POP PUSH2 0x267C DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x268A DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x34F6 JUMP JUMPDEST GT PUSH2 0x26AC JUMPI DUP4 SWAP2 POP PUSH2 0x26A5 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2D77 JUMP JUMPDEST SWAP1 POP PUSH2 0x26C5 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x26C2 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2D77 JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x26CF DUP10 DUP4 PUSH2 0x2DAA JUMP JUMPDEST DUP6 MSTORE PUSH2 0x26DB DUP9 DUP3 PUSH2 0x2DAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x26F3 SWAP2 SWAP1 PUSH2 0x2BAD JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x2742 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F05 JUMP JUMPDEST DUP3 ISZERO ISZERO PUSH2 0x277B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E55 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x27EE JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x27EE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2879 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2879 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DA5 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x28CF JUMPI PUSH2 0x2897 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x1229 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x28CF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DE5 JUMP JUMPDEST PUSH2 0x28E2 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x3551 JUMP JUMPDEST ISZERO PUSH2 0x2919 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E35 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x292F DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x34AC JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xBCC4C97732E47D9946F229EDB95F5B6323F601300E4690DE719993F3C371129 SWAP7 PUSH2 0x29BE SWAP7 DUP16 SWAP7 CALLER SWAP7 SWAP3 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 SWAP1 PUSH2 0x4BEB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2A77 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A4C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2A77 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A5A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2A9F DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x140 DUP5 ADD MLOAD DUP5 MLOAD DUP7 MLOAD DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x2ABB SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2AD4 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2AF0 DUP2 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2B0C DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST DUP4 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2B76 JUMPI PUSH2 0x2B71 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD PUSH2 0x2B6C DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34AC JUMP JUMPDEST PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2BA6 JUMP JUMPDEST PUSH2 0x2B8E DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2BA6 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2BE9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E05 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x2C2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E75 JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2C5D JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2CF5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DC5 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2D3E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EF5 JUMP JUMPDEST PUSH2 0x2D4C DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x3733 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D8C PUSH2 0x2D86 DUP6 DUP5 PUSH2 0x34F6 JUMP JUMPDEST DUP5 PUSH2 0x3794 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2DA3 JUMPI DUP2 PUSH2 0xFAC JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2DB2 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x2DCE SWAP2 DUP5 SWAP2 PUSH2 0x2D77 JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2DE5 SWAP2 DUP5 SWAP2 PUSH2 0x2D77 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xE0 DUP5 ADD MLOAD PUSH2 0x2DFF SWAP2 DUP5 SWAP2 PUSH2 0x2D77 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2EB4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2E89 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2EB4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2E97 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2ED4 DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2EED DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2F05 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2F19 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3048 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x300B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x30DE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x30A1 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 SWAP8 DUP3 MSTORE DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 SWAP1 SWAP8 AND SWAP7 DUP9 ADD SWAP7 SWAP1 SWAP7 MSTORE POP POP PUSH1 0x60 DUP6 ADD MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 SLOAD DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x31EC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x31AF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP DUP4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP5 SUB DUP4 ADD DUP2 MSTORE SWAP3 DUP2 ADD SWAP1 DUP2 SWAP1 MSTORE DUP3 MLOAD SWAP3 SWAP4 POP SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3290 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3253 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x25DE PUSH2 0x1C74 DUP4 PUSH2 0x37AB JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x332F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F05 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x33A2 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x33A2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F15 JUMP JUMPDEST PUSH2 0x33AA PUSH2 0x259B JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x3400 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DF5 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xDC47B3613D9FE400085F6DBDC99453462279057E6207385042827ED6B1A62CF7 SWAP3 PUSH2 0x34A0 SWAP3 CALLER SWAP3 SWAP1 PUSH2 0x4C6F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x34EB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E05 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x3509 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x34EF JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3519 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x34EB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E05 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x3560 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x3575 JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x871 JUMP JUMPDEST PUSH2 0x3594 PUSH2 0x3585 DUP4 PUSH3 0xF4240 PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x358F DUP9 DUP8 PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x3794 JUMP JUMPDEST PUSH2 0x3E8 LT SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x2919 JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x35E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EB5 JUMP JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x3672 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E65 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x370E JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x36F6 JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x3726 JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x3775 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EF5 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x37A2 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3A33 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x39F6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3ACE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3A91 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3B69 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B2C JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x3C42 PUSH2 0x3C04 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3C4F PUSH2 0x3C04 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 CALLDATALOAD PUSH2 0x5018 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3C99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3CAC PUSH2 0x3CA7 DUP3 PUSH2 0x4FA7 JUMP JUMPDEST PUSH2 0x4F80 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3CEA JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3CD4 DUP9 DUP3 PUSH2 0x3E46 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3CBE JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D05 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D13 PUSH2 0x3CA7 DUP3 PUSH2 0x4FA7 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3CEA JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3D3B DUP9 DUP3 PUSH2 0x3E95 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D25 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D70 PUSH2 0x3CA7 DUP3 PUSH2 0x4FA7 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3D95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3CEA JUMPI DUP2 PUSH2 0x3DAB DUP9 DUP3 PUSH2 0x3DD9 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D98 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 CALLDATALOAD PUSH2 0x5031 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 MLOAD PUSH2 0x5031 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 CALLDATALOAD PUSH2 0x5036 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 CALLDATALOAD PUSH2 0x5039 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 MLOAD PUSH2 0x5039 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x3E0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x3E3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3E57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3E65 PUSH2 0x3CA7 DUP3 PUSH2 0x4FC8 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3E81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E8C DUP4 DUP3 DUP5 PUSH2 0x506F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3EA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EB3 PUSH2 0x180 PUSH2 0x4F80 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3EC1 DUP5 DUP5 PUSH2 0x3C7C JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3ED2 DUP5 DUP5 DUP4 ADD PUSH2 0x3C7C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3EE6 DUP5 DUP3 DUP6 ADD PUSH2 0x3C7C JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3EFA DUP5 DUP3 DUP6 ADD PUSH2 0x3C7C JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3F0E DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3F22 DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3F36 DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x3F4A DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x3F5F DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3F75 DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3F97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FA3 DUP5 DUP3 DUP6 ADD PUSH2 0x3E46 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FD1 DUP5 DUP3 DUP6 ADD PUSH2 0x3E46 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3FF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3C7C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x400F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x401B DUP6 DUP6 PUSH2 0x3C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x402C DUP6 DUP3 DUP7 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4049 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4055 DUP6 DUP6 PUSH2 0x3C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x402C DUP6 DUP3 DUP7 ADD PUSH2 0x3DC1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4078 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x408F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2D8C DUP5 DUP3 DUP6 ADD PUSH2 0x3CF4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x40B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x40C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40D3 DUP7 DUP3 DUP8 ADD PUSH2 0x3CF4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x40F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40FC DUP7 DUP3 DUP8 ADD PUSH2 0x3D51 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4119 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4125 DUP7 DUP3 DUP8 ADD PUSH2 0x3C88 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x415B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4167 DUP7 DUP3 DUP8 ADD PUSH2 0x3CF4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x40FC DUP7 DUP3 DUP8 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x418A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3DCD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x41A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x41C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x401B DUP6 DUP6 PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x41E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x41F5 DUP8 DUP8 PUSH2 0x3DD9 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x4206 DUP8 DUP3 DUP9 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4223 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x422F DUP8 DUP3 DUP9 ADD PUSH2 0x3DFD JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4250 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x425C DUP7 DUP7 PUSH2 0x3DD9 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x426D DUP7 DUP3 DUP8 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x428A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4125 DUP7 DUP3 DUP8 ADD PUSH2 0x3E46 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x42A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3DE5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x42C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3DF1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x42E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x42FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2D8C DUP5 DUP3 DUP6 ADD PUSH2 0x3E95 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x431D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4340 DUP8 DUP3 DUP9 ADD PUSH2 0x3E95 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x435D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4369 DUP8 DUP3 DUP9 ADD PUSH2 0x3E95 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4386 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4392 DUP8 DUP3 DUP9 ADD PUSH2 0x3E46 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43BB DUP8 DUP3 DUP9 ADD PUSH2 0x3E46 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x43DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43FF DUP7 DUP3 DUP8 ADD PUSH2 0x3E95 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x426D DUP7 DUP3 DUP8 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4429 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4435 DUP10 DUP10 PUSH2 0x3DD9 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x4446 DUP10 DUP3 DUP11 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x446F DUP10 DUP3 DUP11 ADD PUSH2 0x3DFD JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x448E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x449A DUP10 DUP3 DUP11 ADD PUSH2 0x3DFD JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5018 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x44C3 DUP3 PUSH2 0x5014 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x44D5 DUP4 PUSH2 0x500E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4505 JUMPI PUSH2 0x44EB DUP7 DUP4 MLOAD PUSH2 0x4B9D JUMP JUMPDEST PUSH2 0x44F4 DUP3 PUSH2 0x500E JUMP JUMPDEST PUSH1 0x60 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x44D8 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5031 JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5036 JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5039 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4535 DUP3 PUSH2 0x5014 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x4549 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x507B JUMP JUMPDEST PUSH2 0x4552 DUP2 PUSH2 0x50A7 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5064 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4E45575F4F524445525F45504F4348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x4B2B DUP5 DUP3 PUSH2 0x4518 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4B3E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x4B51 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x2F19 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4B76 DUP5 DUP3 PUSH2 0x4B1A JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4B89 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x4B1A JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2F19 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x4BAE DUP5 DUP3 PUSH2 0x4BD4 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4BC1 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2F19 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x505E JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x44A9 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x4BFA DUP3 DUP12 PUSH2 0x44A9 JUMP JUMPDEST PUSH2 0x4C07 PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x44A9 JUMP JUMPDEST PUSH2 0x4C14 PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4C21 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4C2E PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4C3B PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x4518 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x4C4D DUP2 DUP6 PUSH2 0x452A JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x4C61 DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4C7D DUP3 DUP7 PUSH2 0x44A9 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4C8F DUP2 DUP6 PUSH2 0x452A JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4CA3 DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xFAC DUP2 DUP5 PUSH2 0x44B8 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x450F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x4518 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4CE7 DUP3 DUP7 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4CF4 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x44A9 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4CA3 DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4D14 DUP3 DUP6 PUSH2 0x4518 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2D8C DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x4D34 DUP3 DUP8 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4D41 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x4BD4 JUMP JUMPDEST PUSH2 0x4D4E PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4CA3 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x4518 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4D69 DUP3 DUP6 PUSH2 0x4521 JUMP JUMPDEST PUSH2 0xFAC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x44A9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xFAC DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x455F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4568 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4598 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x45C8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x45F8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x464E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x467E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x46AE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x470E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x473E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x476E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x479E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x47CE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x47FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x482E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4884 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x48B4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x48E4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4914 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4944 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4974 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x49A4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x49D4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4A2A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4A5A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4A8A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4ABA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4AEA JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x4B1A JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x4B64 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x4B9D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x4F9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4FBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4FDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x25DE DUP3 PUSH2 0x5018 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5096 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x507E JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2F19 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH29 0x5F5AF88134AEEEDE952E9CDDA7741EFB0001F235C761EC650B76B231AB PUSH1 0x26 PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
"sourceMap": "931:616:2:-;;;1229:316;8:9:-1;5:2;;;30:1;27;20:12;5:2;1229:316:2;;;;;;;;;;;;;;;;;;;;;;;;997:29:16;;1306:13:2;;997:29:16;;:14;;:29;;;;;:::i;:::-;-1:-1:-1;;1042:148:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1042:148:17;;;;;;;;1032:159;;1042:148;;;;;1032:159;;;;1042:148;1032:159;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1032:159:17;;;;;;;;;;;;1502:18;;;;;;;;;;;;;;;;1486:36;;1032:159;;-1:-1:-1;1032:159:17;;-1:-1:-1;1486:36:17;;;;-1:-1:-1;1502:18:17;1486:36;1502:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1486:36:17;;;;;;;;;;;;1552:21;;;;;274:1:-1;1552:21:17;;;;;;;;;;1536:39;;1486:36;;-1:-1:-1;1486:36:17;;-1:-1:-1;1536:39:17;;;;-1:-1:-1;274:1;1536:39:17;1552:21;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1536:39:17;;;;;;;;;;;1413:199;;;;-1:-1:-1;1536:39:17;-1:-1:-1;1597:4:17;;1413:199;;-1:-1:-1;1413:199:17;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1413:199:17;;;1403:210;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;;254:3;250:22;246:30;;;;340:21;;;311:9;;295:26;377:20;;;;365:33;;1403:210:17;;;;;;;;;;274:1:-1;1382:231:17;-1:-1:-1;;329:5:29;:18;;-1:-1:-1;;;;;;329:18:29;337:10;329:18;;;-1:-1:-1;931:616:2;;-1:-1:-1;931:616:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;931:616:2;;;-1:-1:-1;931:616:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;6:442:-1:-;;111:4;99:17;;95:27;-1:-1;85:2;;136:1;133;126:12;85:2;166:6;160:13;188:64;203:48;244:6;203:48;;;188:64;;;179:73;;272:6;265:5;258:21;308:4;300:6;296:17;341:4;334:5;330:16;376:3;367:6;362:3;358:16;355:25;352:2;;;393:1;390;383:12;352:2;403:39;435:6;430:3;425;403:39;;;78:370;;;;;;;;456:360;;580:2;568:9;559:7;555:23;551:32;548:2;;;596:1;593;586:12;548:2;631:24;;-1:-1;;;;;664:30;;661:2;;;707:1;704;697:12;661:2;727:73;792:7;783:6;772:9;768:22;727:73;;;717:83;542:274;-1:-1;;;;542:274;823:110;896:31;921:5;896:31;;;891:3;884:44;878:55;;;940:110;1013:31;1038:5;1013:31;;1057:497;1249:3;1234:19;;1264:61;1238:9;1298:6;1264:61;;;1336:62;1394:2;1383:9;1379:18;1370:6;1336:62;;;1409;1467:2;1456:9;1452:18;1443:6;1409:62;;;1482;1540:2;1529:9;1525:18;1516:6;1482:62;;;1220:334;;;;;;;;1561:256;1623:2;1617:9;1649:17;;;-1:-1;;;;;1709:34;;1745:22;;;1706:62;1703:2;;;1781:1;1778;1771:12;1703:2;1797;1790:22;1601:216;;-1:-1;1601:216;1824:258;;-1:-1;;;;;1959:6;1956:30;1953:2;;;1999:1;1996;1989:12;1953:2;-1:-1;2072:4;2043;2020:17;;;;-1:-1;;2016:33;2062:15;;1890:192;2089:128;-1:-1;;;;;2158:54;;2141:76;2311:268;2376:1;2383:101;2397:6;2394:1;2391:13;2383:101;;;2464:11;;;2458:18;2445:11;;;2438:39;2419:2;2412:10;2383:101;;;2499:6;2496:1;2493:13;2490:2;;;2564:1;2555:6;2550:3;2546:16;2539:27;2490:2;2360:219;;;;;;931:616:2;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
- "object": "0x6080604052600436106101b65763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632624b2d981146101bb578063288cdc91146101e6578063297bb70b146102065780632ac12622146102335780633683ef8e146102605780633c28d861146102825780633e228bae146102af5780633fd3c997146102cf5780634ac14782146102fc5780634d0ae5461461031c5780634f9559b11461033c57806350dde1901461035c578063607041081461037c578063642f2eaf146103a957806364a3bc15146103c957806377fcce68146103e95780637b8e3514146104095780637e1d98081461042957806382c174d0146104495780638da5cb5b14610469578063936347021461047e578063a3e203801461049e578063b4be83d5146104be578063bfc8bfce146104de578063c585bb93146104fe578063c75e0a811461051e578063d46b02c31461054b578063d9bfa73e1461056b578063db123b1a1461058b578063dd1c7d18146105ad578063e306f779146105cd578063e5fa431b146105e2578063eea086ba14610602578063f2fde38b14610617578063ffa1ad7414610637575b600080fd5b3480156101c757600080fd5b506101d061064c565b6040516101dd9190614b8e565b60405180910390f35b3480156101f257600080fd5b506101d06102013660046140c1565b6107a0565b34801561021257600080fd5b50610226610221366004613fc6565b6107b2565b6040516101dd9190614e18565b34801561023f57600080fd5b5061025361024e3660046140c1565b610842565b6040516101dd9190614b80565b34801561026c57600080fd5b5061028061027b3660046140fe565b610857565b005b34801561028e57600080fd5b506102a261029d366004614232565b610930565b6040516101dd9190614e26565b3480156102bb57600080fd5b506102266102ca3660046142f2565b610a1c565b3480156102db57600080fd5b506102ef6102ea3660046141c1565b610c2c565b6040516101dd9190614c4a565b34801561030857600080fd5b50610280610317366004613f91565b610c54565b34801561032857600080fd5b50610226610337366004613fc6565b610c8c565b34801561034857600080fd5b506102806103573660046140c1565b610d13565b34801561036857600080fd5b50610226610377366004613fc6565b610e37565b34801561038857600080fd5b5061039c6103973660046141c1565b610ebe565b6040516101dd9190614ab1565b3480156103b557600080fd5b506102536103c43660046140c1565b610f0c565b3480156103d557600080fd5b506102266103e43660046142f2565b610f21565b3480156103f557600080fd5b50610280610404366004613f61565b610f7b565b34801561041557600080fd5b50610253610424366004613f27565b611026565b34801561043557600080fd5b5061022661044436600461405a565b611046565b34801561045557600080fd5b506102536104643660046140df565b611117565b34801561047557600080fd5b5061039c611137565b34801561048a57600080fd5b50610253610499366004614166565b611153565b3480156104aa57600080fd5b506102266104b936600461405a565b611979565b3480156104ca57600080fd5b506102266104d93660046142f2565b611a89565b3480156104ea57600080fd5b506102806104f936600461433b565b611b0d565b34801561050a57600080fd5b50610280610519366004613f09565b611da6565b34801561052a57600080fd5b5061053e6105393660046141fd565b611fd1565b6040516101dd9190614e35565b34801561055757600080fd5b506102806105663660046141fd565b6120cc565b34801561057757600080fd5b506101d0610586366004613f27565b6120f7565b34801561059757600080fd5b506105a0612114565b6040516101dd9190614c39565b3480156105b957600080fd5b506102266105c836600461405a565b6121c0565b3480156105d957600080fd5b506101d0612286565b3480156105ee57600080fd5b506102266105fd36600461405a565b61228c565b34801561060e57600080fd5b5061039c612360565b34801561062357600080fd5b50610280610632366004613f09565b61237c565b34801561064357600080fd5b506105a061242d565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b6020831061077057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610733565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902081565b60036020526000908152604090205481565b6107ba613b2f565b60006107c4613b2f565b600091505b85518210156108395761082286838151811015156107e357fe5b9060200190602002015186848151811015156107fb57fe5b90602001906020020151868581518110151561081357fe5b90602001906020020151611a89565b905061082e8382612464565b6001909101906107c9565b50509392505050565b60046020526000908152604090205460ff1681565b610892848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750611153945050505050565b15156108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614ce8565b60405180910390fd5b5050600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff9093168452919052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610938613b58565b610940613b87565b610948613b87565b610160808801516101408089019190915288015190870152600061096b88611fd1565b925061097687611fd1565b91506109806124c6565b905061098c888861250f565b6109a088888560400151856040015161256b565b8051602001519094506109ba90899085908490808b61262f565b60208085015101516109d390889084908490808a61262f565b6109ec888285602001518660400151886000015161284c565b610a05878284602001518560400151886020015161284c565b610a11888883876128f8565b505050949350505050565b610a24613b2f565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000008082526060600483018181528851606485019081526020808b01516084870152958a015160a48601529189015160c4850152608089015160e485015260a089015161010485015260c089015161012485015260e0890151610144850152610100890151610164850152610120890151610184850152610140890180516101a486019081526101608b01516101c487015261018090525180516101e48601819052939591938493926024870192849261020489019291820191601f82010460005b81811015610b27578351855260209485019490930192600101610b09565b50505050818103610160808401919091528c0151805180835260209283019291820191601f82010460005b81811015610b70578351855260209485019490930192600101610b52565b5050508b84525084810360209384019081528a518083529093918201918b81019190601f82010460005b81811015610bb8578351855260209485019490930192600101610b9a565b5060808a8b86038c305af4808015610bd75760018114610bf557610c18565b60008e52600060208f0152600060408f0152600060608f0152610c18565b8b518e5260208c015160208f015260408c015160408f015260608c015160608f01525b505050505050505050505050509392505050565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60005b8151811015610c8857610c808282815181101515610c7157fe5b906020019060200201516120cc565b600101610c57565b5050565b610c94613b2f565b6000610c9e613b2f565b600091505b855182101561083957610cfc8683815181101515610cbd57fe5b906020019060200201518684815181101515610cd557fe5b906020019060200201518685815181101515610ced57fe5b90602001906020020151610f21565b9050610d088382612464565b600190910190610ca3565b600080600080610d216124c6565b935073ffffffffffffffffffffffffffffffffffffffff84163314610d465733610d49565b60005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600560209081526040808320938516835292905220549093506001860192509050808211610dc0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d68565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526005602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610e28908690614b8e565b60405180910390a35050505050565b610e3f613b2f565b6000610e49613b2f565b600091505b855182101561083957610ea78683815181101515610e6857fe5b906020019060200201518684815181101515610e8057fe5b906020019060200201518685815181101515610e9857fe5b90602001906020020151610a1c565b9050610eb38382612464565b600190910190610e4e565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60086020526000908152604090205460ff1681565b610f29613b2f565b610f34848484611a89565b60208101519091508314610f74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d88565b9392505050565b6000610f856124c6565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600760209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190611019908690614b80565b60405180910390a3505050565b600760209081526000928352604080842090915290825290205460ff1681565b61104e613b2f565b606060008061105b613b2f565b87600081518110151561106a57fe5b9060200190602002015161016001519350600092505b875183101561110c5783888481518110151561109857fe5b9060200190602002015161016001819052506110b8878660200151612ad8565b91506110e488848151811015156110cb57fe5b9060200190602002015183888681518110151561081357fe5b90506110f08582612464565b86856020015114156111015761110c565b600190920191611080565b505050509392505050565b600660209081526000928352604080842090915290825290205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000895111151561119c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d58565b6111a589612b1a565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff881610611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c98565b8660ff16600981111561121657fe5b9550600086600981111561122657fe5b141561125e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d48565b600186600981111561126c57fe5b14156112b4578851156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614e08565b6000975061196b565b60028660098111156112c257fe5b14156113fd578851604114611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c58565b88600081518110151561131257fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061135289600163ffffffff612bde16565b935061136589602163ffffffff612bde16565b925060018b8686866040516000815260200160405260405161138a9493929190614be9565b60206040516020810390808403906000865af11580156113ae573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c8116908216149950925061196b9050565b600386600981111561140b57fe5b14156115b157885160411461144c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c58565b88600081518110151561145b57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061149b89600163ffffffff612bde16565b93506114ae89602163ffffffff612bde16565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061154f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611512565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382206000835291019283905261138a9450925089918991508890614be9565b60048660098111156115bf57fe5b141561161e578851156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614e08565b73ffffffffffffffffffffffffffffffffffffffff8a163314975061196b565b600586600981111561162c57fe5b14156116df576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90611686908e908d90600401614bc9565b602060405180830381600087803b1580156116a057600080fd5b505af11580156116b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116d891908101906140a3565b975061196b565b60068660098111156116ed57fe5b141561179a576116fc89612c29565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526007602090815260408083209385168352929052205490915060ff161515611744576000975061196b565b6040517f9363470200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690639363470290611686908e908e908e90600401614b9c565b60078660098111156117a857fe5b14156117e85760008b815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff16975061196b565b60088660098111156117f657fe5b1415611939578851604114611837576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c58565b88600081518110151561184657fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061188689600163ffffffff612bde16565b935061189989602163ffffffff612bde16565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083836020831061154f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611512565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c98565b505050505050509392505050565b611981613b2f565b60606000806000611990613b2f565b88600081518110151561199f57fe5b9060200190602002015161014001519450600093505b8851841015611a7d578489858151811015156119cd57fe5b60209081029091010151610140015285516119e9908990612ad8565b9250611a2c89858151811015156119fc57fe5b9060200190602002015160a001518a86815181101515611a1857fe5b906020019060200201516080015185612ca2565b9150611a588985815181101515611a3f57fe5b90602001906020020151838987815181101515610e9857fe5b9050611a648682612464565b8551881415611a7257611a7d565b6001909301926119b5565b50505050509392505050565b611a91613b2f565b611a99613b87565b6000806000611aa788611fd1565b9350611ab16124c6565b9250611ac58860a001518560400151612ad8565b9150611ad18783612cbf565b9050611ae18885858a858b61262f565b611aeb8882612cd5565b9450611b028884866020015187604001518961284c565b61110c888487612d35565b60095460009073ffffffffffffffffffffffffffffffffffffffff1615611b60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d98565b611ba3611b9e888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843750612e4a945050505050565b61308b565b60008181526008602052604090205490915060ff1615611bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cd8565b73ffffffffffffffffffffffffffffffffffffffff86163314611cc057611c47818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611153945050505050565b1515611c7f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614df8565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600860205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af49150501515611d57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d08565b73ffffffffffffffffffffffffffffffffffffffff86163314611d9d57600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b6002546000908190819073ffffffffffffffffffffffffffffffffffffffff163314611dfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614da8565b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611e6557600080fd5b505af1158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e9d91908101906141df565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1690508015611f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c78565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600a60205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c0319490611fc39084908790614c1e565b60405180910390a150505050565b611fd9613b87565b611fe28261320b565b602082015260808201511515611fff5760015b60ff168152610f07565b60a08201511515612011576002611ff5565b6101008201514210612024576004611ff5565b60208082015160009081526004909152604090205460ff1615612048576006611ff5565b610120820151825173ffffffffffffffffffffffffffffffffffffffff90811660009081526005602090815260408083206060880151909416835292905220541115612095576006611ff5565b602080820151600090815260039091526040908190205490820181905260a0830151116120c3576005611ff5565b60038152919050565b6120d4613b87565b6120dd82611fd1565b90506120e98282613219565b610c88828260200151613330565b600560209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156121b85780601f1061218d576101008083540402835291602001916121b8565b820191906000526020600020905b81548152906001019060200180831161219b57829003601f168201915b505050505081565b6121c8613b2f565b60606000806121d5613b2f565b8760008151811015156121e457fe5b9060200190602002015161016001519350600092505b875183101561110c5783888481518110151561221257fe5b906020019060200201516101600181905250612232878660200151612ad8565b915061225e888481518110151561224557fe5b90602001906020020151838886815181101515610e9857fe5b905061226a8582612464565b868560200151141561227b5761110c565b6001909201916121fa565b60015481565b612294613b2f565b606060008060006122a3613b2f565b8860008151811015156122b257fe5b9060200190602002015161014001519450600093505b8851841015611a7d578489858151811015156122e057fe5b60209081029091010151610140015285516122fc908990612ad8565b925061230f89858151811015156119fc57fe5b915061233b898581518110151561232257fe5b9060200190602002015183898781518110151561081357fe5b90506123478682612464565b855188141561235557611a7d565b6001909301926122c8565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614da8565b73ffffffffffffffffffffffffffffffffffffffff81161561242a57600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b8151815161247291906133d7565b82526020808301519082015161248891906133d7565b6020830152604080830151908201516124a191906133d7565b6040830152606080830151908201516124ba91906133d7565b60609092019190915250565b600954600090819073ffffffffffffffffffffffffffffffffffffffff16156125075760095473ffffffffffffffffffffffffffffffffffffffff16612509565b335b92915050565b6125218260a001518260a00151613421565b61253383608001518360800151613421565b1015610c88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614de8565b612573613b58565b6000806000806125878960a0015188612ad8565b93506125978860a0015187612ad8565b92506125a7838960800151613421565b6125b5858a60a00151613421565b116125d7578391506125d08860a00151896080015184612ca2565b90506125f0565b8290506125ed88608001518960a0015183612ca2565b91505b6125fa8983612cd5565b85526126068882612cd5565b602080870182905286515191015161261e9190612ad8565b604086015250505050949350505050565b845160ff1660031461266d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614dc8565b8215156126a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d18565b606086015173ffffffffffffffffffffffffffffffffffffffff161561271957606086015173ffffffffffffffffffffffffffffffffffffffff163314612719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614dd8565b602086015173ffffffffffffffffffffffffffffffffffffffff16156127a4578373ffffffffffffffffffffffffffffffffffffffff16866020015173ffffffffffffffffffffffffffffffffffffffff161415156127a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c68565b604085015115156127fa576127c28560200151876000015183611153565b15156127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614ca8565b61280d828760a00151886080015161347c565b15612844576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cf8565b505050505050565b61285a8282602001516133d7565b600084815260036020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b9873ffffffffffffffffffffffffffffffffffffffff9788169897909616967f0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c371129966128e9968f96339692959194909390614abf565b60405180910390a45050505050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156129a25780601f10612977576101008083540402835291602001916129a2565b820191906000526020600020905b81548152906001019060200180831161298557829003601f168201915b505050505090506129ca856101400151866000015186600001518560200151602001516134cd565b610140840151845186518451602001516129e6939291906134cd565b6129ff85610140015186600001518585604001516134cd565b612a1b81866000015187604001518560000151604001516134cd565b612a3781856000015186604001518560200151604001516134cd565b836040015173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff161415612aa157612a9c81848760400151612a978660000151606001518760200151606001516133d7565b6134cd565b612ad1565b612ab9818487604001518560000151606001516134cd565b612ad1818486604001518560200151606001516134cd565b5050505050565b600082821115612b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cc8565b50900390565b6000808251111515612b58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d38565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612b8857fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515612c20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614c88565b50016020015190565b60006014825110151515612c69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614db8565b612c7782601484510361365e565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000612cb7612cb18584613421565b846136bf565b949350505050565b6000818310612cce5781610f74565b5090919050565b612cdd613b2f565b6020810182905260a08301516080840151612cf9918491612ca2565b815260a083015160c0840151612d10918491612ca2565b604082015260a083015160e0840151612d2a918491612ca2565b606082015292915050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612ddf5780601f10612db457610100808354040283529160200191612ddf565b820191906000526020600020905b815481529060010190602001808311612dc257829003601f168201915b50505050509050612dff84610140015185600001518585600001516134cd565b612e1884610160015184866000015185602001516134cd565b612e30818560000151866040015185604001516134cd565b612e448184866040015185606001516134cd565b50505050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b60208310612f7357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612f36565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b6020831061300957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612fcc565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822097825281019a909a525073ffffffffffffffffffffffffffffffffffffffff97909716968801969096525050606085015250506080909120919050565b60006040805190810160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250600154836040516020018084805190602001908083835b6020831061311757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016130da565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250838101929092525060408051808403830181529281019081905282519293509182918401908083835b602083106131bb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161317e565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912095945050505050565b6000612509611b9e836136d6565b805160009060ff1660031461325a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614dc8565b606083015173ffffffffffffffffffffffffffffffffffffffff16156132cd57606083015173ffffffffffffffffffffffffffffffffffffffff1633146132cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614dd8565b6132d56124c6565b835190915073ffffffffffffffffffffffffffffffffffffffff80831691161461332b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cb8565b505050565b6000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927fdc47b3613d9fe400085f6dbdc99453462279057e6207385042827ed6b1a62cf7926133cb92339290614b43565b60405180910390a45050565b600082820183811015613416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cc8565b8091505b5092915050565b600080831515613434576000915061341a565b5082820282848281151561344457fe5b0414613416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614cc8565b60008060008480151561348b57fe5b86850991508115156134a05760009250610839565b6134bf6134b083620f4240613421565b6134ba8887613421565b6136bf565b6103e8109695505050505050565b6000806000831115612844578551600310613514576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d78565b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600a90925260409091205473ffffffffffffffffffffffffffffffffffffffff1680151561359d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614d28565b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b8181101561363957895181526020998a019901613621565b61020084858403866000895af1801515613651573d85fd5b5050505050505050505050565b6000816014018351101515156136a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90614db8565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60008082848115156136cd57fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b6020831061395e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613921565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b602083106139f957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016139bc565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310613a9457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613a57565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b61012060405190810160405280613b6d613b2f565b8152602001613b7a613b2f565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610f748235614ed5565b6000601f82018313613bc457600080fd5b8135613bd7613bd282614e6a565b614e43565b81815260209384019390925082018360005b83811015613c155781358601613bff8882613d71565b8452506020928301929190910190600101613be9565b5050505092915050565b6000601f82018313613c3057600080fd5b8135613c3e613bd282614e6a565b81815260209384019390925082018360005b83811015613c155781358601613c668882613dc0565b8452506020928301929190910190600101613c50565b6000601f82018313613c8d57600080fd5b8135613c9b613bd282614e6a565b91508181835260208401935060208101905083856020840282011115613cc057600080fd5b60005b83811015613c155781613cd68882613d04565b8452506020928301929190910190600101613cc3565b6000610f748235614eee565b6000610f748251614eee565b6000610f748235614ef3565b6000610f748235614ef6565b6000610f748251614ef6565b600080601f83018413613d3a57600080fd5b50813567ffffffffffffffff811115613d5257600080fd5b602083019150836001820283011115613d6a57600080fd5b9250929050565b6000601f82018313613d8257600080fd5b8135613d90613bd282614e8b565b91508082526020830160208301858383011115613dac57600080fd5b613db7838284614f2c565b50505092915050565b60006101808284031215613dd357600080fd5b613dde610180614e43565b90506000613dec8484613ba7565b8252506020613dfd84848301613ba7565b6020830152506040613e1184828501613ba7565b6040830152506060613e2584828501613ba7565b6060830152506080613e3984828501613d04565b60808301525060a0613e4d84828501613d04565b60a08301525060c0613e6184828501613d04565b60c08301525060e0613e7584828501613d04565b60e083015250610100613e8a84828501613d04565b61010083015250610120613ea084828501613d04565b6101208301525061014082013567ffffffffffffffff811115613ec257600080fd5b613ece84828501613d71565b6101408301525061016082013567ffffffffffffffff811115613ef057600080fd5b613efc84828501613d71565b6101608301525092915050565b600060208284031215613f1b57600080fd5b6000612cb78484613ba7565b60008060408385031215613f3a57600080fd5b6000613f468585613ba7565b9250506020613f5785828601613ba7565b9150509250929050565b60008060408385031215613f7457600080fd5b6000613f808585613ba7565b9250506020613f5785828601613cec565b600060208284031215613fa357600080fd5b813567ffffffffffffffff811115613fba57600080fd5b612cb784828501613c1f565b600080600060608486031215613fdb57600080fd5b833567ffffffffffffffff811115613ff257600080fd5b613ffe86828701613c1f565b935050602084013567ffffffffffffffff81111561401b57600080fd5b61402786828701613c7c565b925050604084013567ffffffffffffffff81111561404457600080fd5b61405086828701613bb3565b9150509250925092565b60008060006060848603121561406f57600080fd5b833567ffffffffffffffff81111561408657600080fd5b61409286828701613c1f565b935050602061402786828701613d04565b6000602082840312156140b557600080fd5b6000612cb78484613cf8565b6000602082840312156140d357600080fd5b6000612cb78484613d04565b600080604083850312156140f257600080fd5b6000613f468585613d04565b6000806000806060858703121561411457600080fd5b60006141208787613d04565b945050602061413187828801613ba7565b935050604085013567ffffffffffffffff81111561414e57600080fd5b61415a87828801613d28565b95989497509550505050565b60008060006060848603121561417b57600080fd5b60006141878686613d04565b935050602061419886828701613ba7565b925050604084013567ffffffffffffffff8111156141b557600080fd5b61405086828701613d71565b6000602082840312156141d357600080fd5b6000612cb78484613d10565b6000602082840312156141f157600080fd5b6000612cb78484613d1c565b60006020828403121561420f57600080fd5b813567ffffffffffffffff81111561422657600080fd5b612cb784828501613dc0565b6000806000806080858703121561424857600080fd5b843567ffffffffffffffff81111561425f57600080fd5b61426b87828801613dc0565b945050602085013567ffffffffffffffff81111561428857600080fd5b61429487828801613dc0565b935050604085013567ffffffffffffffff8111156142b157600080fd5b6142bd87828801613d71565b925050606085013567ffffffffffffffff8111156142da57600080fd5b6142e687828801613d71565b91505092959194509250565b60008060006060848603121561430757600080fd5b833567ffffffffffffffff81111561431e57600080fd5b61432a86828701613dc0565b935050602061419886828701613d04565b6000806000806000806080878903121561435457600080fd5b60006143608989613d04565b965050602061437189828a01613ba7565b955050604087013567ffffffffffffffff81111561438e57600080fd5b61439a89828a01613d28565b9450945050606087013567ffffffffffffffff8111156143b957600080fd5b6143c589828a01613d28565b92509250509295509295509295565b6143dd81614ed5565b82525050565b6143dd81614eee565b6143dd81614ef3565b6143dd81614ef6565b600061440982614ed1565b80845261441d816020860160208601614f38565b61442681614f64565b9093016020019392505050565b6143dd81614f21565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b600d81527f494e56414c49445f54414b455200000000000000000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f414c52454144595f455849535453000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015260400190565b600d81527f494e56414c49445f4d414b455200000000000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f494e56414c49445f54585f484153480000000000000000000000000000000000602082015260400190565b601181527f494e56414c49445f5349474e4154555245000000000000000000000000000000602082015260400190565b600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015260400190565b601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015260400190565b601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b601781527f494e56414c49445f4e45575f4f524445525f45504f4348000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601281527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015260400190565b601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015260400190565b601181527f4c454e4754485f305f5245515549524544000000000000000000000000000000602082015260400190565b805160808301906149ff84826143ec565b506020820151614a1260208501826143ec565b506040820151614a2560408501826143ec565b506060820151612e4460608501826143ec565b8051610120830190614a4a84826149ee565b506020820151614a5d60808501826149ee565b506040820151612e446101008501826143ec565b80516060830190614a828482614aa8565b506020820151614a9560208501826143ec565b506040820151612e4460408501826143ec565b6143dd81614f1b565b6020810161250982846143d4565b6101008101614ace828b6143d4565b614adb602083018a6143d4565b614ae860408301896143ec565b614af560608301886143ec565b614b0260808301876143ec565b614b0f60a08301866143ec565b81810360c0830152614b2181856143fe565b905081810360e0830152614b3581846143fe565b9a9950505050505050505050565b60608101614b5182866143d4565b8181036020830152614b6381856143fe565b90508181036040830152614b7781846143fe565b95945050505050565b6020810161250982846143e3565b6020810161250982846143ec565b60608101614baa82866143ec565b614bb760208301856143d4565b8181036040830152614b7781846143fe565b60408101614bd782856143ec565b8181036020830152612cb781846143fe565b60808101614bf782876143ec565b614c046020830186614aa8565b614c1160408301856143ec565b614b7760608301846143ec565b60408101614c2c82856143f5565b610f7460208301846143d4565b60208082528101610f7481846143fe565b602081016125098284614433565b602080825281016125098161443c565b602080825281016125098161446c565b602080825281016125098161449c565b60208082528101612509816144cc565b6020808252810161250981614522565b6020808252810161250981614552565b6020808252810161250981614582565b60208082528101612509816145b2565b60208082528101612509816145e2565b6020808252810161250981614612565b6020808252810161250981614642565b6020808252810161250981614672565b60208082528101612509816146a2565b60208082528101612509816146d2565b6020808252810161250981614702565b6020808252810161250981614758565b6020808252810161250981614788565b60208082528101612509816147b8565b60208082528101612509816147e8565b6020808252810161250981614818565b6020808252810161250981614848565b6020808252810161250981614878565b60208082528101612509816148a8565b60208082528101612509816148fe565b602080825281016125098161492e565b602080825281016125098161495e565b602080825281016125098161498e565b60208082528101612509816149be565b6080810161250982846149ee565b61012081016125098284614a38565b606081016125098284614a71565b60405181810167ffffffffffffffff81118282101715614e6257600080fd5b604052919050565b600067ffffffffffffffff821115614e8157600080fd5b5060209081020190565b600067ffffffffffffffff821115614ea257600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b600061250982614ed5565b82818337506000910152565b60005b83811015614f53578181015183820152602001614f3b565b83811115612e445750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820eb4d9db5db49f5b86baccdb83b7b22cef2da7cf614368efd0d3e7997f1a2703a6c6578706572696d656e74616cf50037",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1B6 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x2624B2D9 DUP2 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x1E6 JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x206 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x260 JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x282 JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x2AF JUMPI DUP1 PUSH4 0x3FD3C997 EQ PUSH2 0x2CF JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x2FC JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x31C JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x35C JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0x37C JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x3A9 JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x3C9 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3E9 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x409 JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x429 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x449 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x469 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x47E JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x49E JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x4BE JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x4DE JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x4FE JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x51E JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x54B JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x56B JUMPI DUP1 PUSH4 0xDB123B1A EQ PUSH2 0x58B JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x5AD JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x5CD JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x5E2 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x602 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x617 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x637 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x64C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4B8E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x201 CALLDATASIZE PUSH1 0x4 PUSH2 0x40C1 JUMP JUMPDEST PUSH2 0x7A0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x212 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x221 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FC6 JUMP JUMPDEST PUSH2 0x7B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4E18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x24E CALLDATASIZE PUSH1 0x4 PUSH2 0x40C1 JUMP JUMPDEST PUSH2 0x842 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4B80 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x27B CALLDATASIZE PUSH1 0x4 PUSH2 0x40FE JUMP JUMPDEST PUSH2 0x857 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A2 PUSH2 0x29D CALLDATASIZE PUSH1 0x4 PUSH2 0x4232 JUMP JUMPDEST PUSH2 0x930 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4E26 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x2CA CALLDATASIZE PUSH1 0x4 PUSH2 0x42F2 JUMP JUMPDEST PUSH2 0xA1C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2EF PUSH2 0x2EA CALLDATASIZE PUSH1 0x4 PUSH2 0x41C1 JUMP JUMPDEST PUSH2 0xC2C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4C4A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x317 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F91 JUMP JUMPDEST PUSH2 0xC54 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x328 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x337 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FC6 JUMP JUMPDEST PUSH2 0xC8C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x357 CALLDATASIZE PUSH1 0x4 PUSH2 0x40C1 JUMP JUMPDEST PUSH2 0xD13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x377 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FC6 JUMP JUMPDEST PUSH2 0xE37 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x388 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x39C PUSH2 0x397 CALLDATASIZE PUSH1 0x4 PUSH2 0x41C1 JUMP JUMPDEST PUSH2 0xEBE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4AB1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x3C4 CALLDATASIZE PUSH1 0x4 PUSH2 0x40C1 JUMP JUMPDEST PUSH2 0xF0C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x3E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x42F2 JUMP JUMPDEST PUSH2 0xF21 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x404 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F61 JUMP JUMPDEST PUSH2 0xF7B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x424 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F27 JUMP JUMPDEST PUSH2 0x1026 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x435 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x444 CALLDATASIZE PUSH1 0x4 PUSH2 0x405A JUMP JUMPDEST PUSH2 0x1046 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x455 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x464 CALLDATASIZE PUSH1 0x4 PUSH2 0x40DF JUMP JUMPDEST PUSH2 0x1117 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x475 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x39C PUSH2 0x1137 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x253 PUSH2 0x499 CALLDATASIZE PUSH1 0x4 PUSH2 0x4166 JUMP JUMPDEST PUSH2 0x1153 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x4B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x405A JUMP JUMPDEST PUSH2 0x1979 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x4D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x42F2 JUMP JUMPDEST PUSH2 0x1A89 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x4F9 CALLDATASIZE PUSH1 0x4 PUSH2 0x433B JUMP JUMPDEST PUSH2 0x1B0D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x519 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F09 JUMP JUMPDEST PUSH2 0x1DA6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x53E PUSH2 0x539 CALLDATASIZE PUSH1 0x4 PUSH2 0x41FD JUMP JUMPDEST PUSH2 0x1FD1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4E35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x557 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x566 CALLDATASIZE PUSH1 0x4 PUSH2 0x41FD JUMP JUMPDEST PUSH2 0x20CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x577 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x586 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F27 JUMP JUMPDEST PUSH2 0x20F7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x597 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5A0 PUSH2 0x2114 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD SWAP2 SWAP1 PUSH2 0x4C39 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x5C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x405A JUMP JUMPDEST PUSH2 0x21C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D0 PUSH2 0x2286 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x226 PUSH2 0x5FD CALLDATASIZE PUSH1 0x4 PUSH2 0x405A JUMP JUMPDEST PUSH2 0x228C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x60E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x39C PUSH2 0x2360 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x623 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x280 PUSH2 0x632 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F09 JUMP JUMPDEST PUSH2 0x237C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x643 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5A0 PUSH2 0x242D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x770 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x733 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x7BA PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7C4 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x839 JUMPI PUSH2 0x822 DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7E3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7FB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x813 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1A89 JUMP JUMPDEST SWAP1 POP PUSH2 0x82E DUP4 DUP3 PUSH2 0x2464 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x7C9 JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x892 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1153 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8D3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CE8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x938 PUSH2 0x3B58 JUMP JUMPDEST PUSH2 0x940 PUSH2 0x3B87 JUMP JUMPDEST PUSH2 0x948 PUSH2 0x3B87 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x96B DUP9 PUSH2 0x1FD1 JUMP JUMPDEST SWAP3 POP PUSH2 0x976 DUP8 PUSH2 0x1FD1 JUMP JUMPDEST SWAP2 POP PUSH2 0x980 PUSH2 0x24C6 JUMP JUMPDEST SWAP1 POP PUSH2 0x98C DUP9 DUP9 PUSH2 0x250F JUMP JUMPDEST PUSH2 0x9A0 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x256B JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x9BA SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x262F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0x9D3 SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x262F JUMP JUMPDEST PUSH2 0x9EC DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x284C JUMP JUMPDEST PUSH2 0xA05 DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x284C JUMP JUMPDEST PUSH2 0xA11 DUP9 DUP9 DUP4 DUP8 PUSH2 0x28F8 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA24 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE PUSH1 0x60 PUSH1 0x4 DUP4 ADD DUP2 DUP2 MSTORE DUP9 MLOAD PUSH1 0x64 DUP6 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 DUP1 DUP12 ADD MLOAD PUSH1 0x84 DUP8 ADD MSTORE SWAP6 DUP11 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP2 DUP10 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE PUSH1 0x80 DUP10 ADD MLOAD PUSH1 0xE4 DUP6 ADD MSTORE PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x104 DUP6 ADD MSTORE PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x124 DUP6 ADD MSTORE PUSH1 0xE0 DUP10 ADD MLOAD PUSH2 0x144 DUP6 ADD MSTORE PUSH2 0x100 DUP10 ADD MLOAD PUSH2 0x164 DUP6 ADD MSTORE PUSH2 0x120 DUP10 ADD MLOAD PUSH2 0x184 DUP6 ADD MSTORE PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x1A4 DUP7 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP12 ADD MLOAD PUSH2 0x1C4 DUP8 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x1E4 DUP7 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP6 SWAP2 SWAP4 DUP5 SWAP4 SWAP3 PUSH1 0x24 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x204 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB27 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB09 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP13 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB70 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB52 JUMP JUMPDEST POP POP POP DUP12 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP11 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP12 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xBB8 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB9A JUMP JUMPDEST POP PUSH1 0x80 DUP11 DUP12 DUP7 SUB DUP13 ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0xBD7 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xBF5 JUMPI PUSH2 0xC18 JUMP JUMPDEST PUSH1 0x0 DUP15 MSTORE PUSH1 0x0 PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP16 ADD MSTORE PUSH2 0xC18 JUMP JUMPDEST DUP12 MLOAD DUP15 MSTORE PUSH1 0x20 DUP13 ADD MLOAD PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x40 DUP13 ADD MLOAD PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x60 DUP13 ADD MLOAD PUSH1 0x60 DUP16 ADD MSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xC88 JUMPI PUSH2 0xC80 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC71 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x20CC JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC57 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xC94 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC9E PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x839 JUMPI PUSH2 0xCFC DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCBD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCD5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCED JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xF21 JUMP JUMPDEST SWAP1 POP PUSH2 0xD08 DUP4 DUP3 PUSH2 0x2464 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xCA3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xD21 PUSH2 0x24C6 JUMP JUMPDEST SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ PUSH2 0xD46 JUMPI CALLER PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH1 0x1 DUP7 ADD SWAP3 POP SWAP1 POP DUP1 DUP3 GT PUSH2 0xDC0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D68 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xE28 SWAP1 DUP7 SWAP1 PUSH2 0x4B8E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE3F PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE49 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x839 JUMPI PUSH2 0xEA7 DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE68 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE80 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE98 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA1C JUMP JUMPDEST SWAP1 POP PUSH2 0xEB3 DUP4 DUP3 PUSH2 0x2464 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xE4E JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF29 PUSH2 0x3B2F JUMP JUMPDEST PUSH2 0xF34 DUP5 DUP5 DUP5 PUSH2 0x1A89 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD SWAP1 SWAP2 POP DUP4 EQ PUSH2 0xF74 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D88 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF85 PUSH2 0x24C6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0x1019 SWAP1 DUP7 SWAP1 PUSH2 0x4B80 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x104E PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x105B PUSH2 0x3B2F JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x106A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x110C JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1098 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x10B8 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2AD8 JUMP JUMPDEST SWAP2 POP PUSH2 0x10E4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10CB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x813 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x10F0 DUP6 DUP3 PUSH2 0x2464 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1101 JUMPI PUSH2 0x110C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1080 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0x119C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D58 JUMP JUMPDEST PUSH2 0x11A5 DUP10 PUSH2 0x2B1A JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0x1207 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C98 JUMP JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1216 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1226 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x125E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D48 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x126C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x12B4 JUMPI DUP9 MLOAD ISZERO PUSH2 0x12AB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4E08 JUMP JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x12C2 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x13FD JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1303 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C58 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1312 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1352 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1365 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x138A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4BE9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13AE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x196B SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x140B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x15B1 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x144C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C58 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x145B JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x149B DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP4 POP PUSH2 0x14AE DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x154F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1512 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x138A SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4BE9 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x15BF JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x161E JUMPI DUP9 MLOAD ISZERO PUSH2 0x15FE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4E08 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x162C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x16DF JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x1686 SWAP1 DUP15 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BC9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16D8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x40A3 JUMP JUMPDEST SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x16ED JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x179A JUMPI PUSH2 0x16FC DUP10 PUSH2 0x2C29 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1744 JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x1686 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B9C JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x17A8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x17E8 JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x196B JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x17F6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1939 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1837 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C58 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1846 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1886 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1899 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BDE AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x154F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1512 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C98 JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1981 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1990 PUSH2 0x3B2F JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x199F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1A7D JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19CD JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x19E9 SWAP1 DUP10 SWAP1 PUSH2 0x2AD8 JUMP JUMPDEST SWAP3 POP PUSH2 0x1A2C DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19FC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A18 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2CA2 JUMP JUMPDEST SWAP2 POP PUSH2 0x1A58 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A3F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE98 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1A64 DUP7 DUP3 PUSH2 0x2464 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x1A72 JUMPI PUSH2 0x1A7D JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x19B5 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1A91 PUSH2 0x3B2F JUMP JUMPDEST PUSH2 0x1A99 PUSH2 0x3B87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1AA7 DUP9 PUSH2 0x1FD1 JUMP JUMPDEST SWAP4 POP PUSH2 0x1AB1 PUSH2 0x24C6 JUMP JUMPDEST SWAP3 POP PUSH2 0x1AC5 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2AD8 JUMP JUMPDEST SWAP2 POP PUSH2 0x1AD1 DUP8 DUP4 PUSH2 0x2CBF JUMP JUMPDEST SWAP1 POP PUSH2 0x1AE1 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x262F JUMP JUMPDEST PUSH2 0x1AEB DUP9 DUP3 PUSH2 0x2CD5 JUMP JUMPDEST SWAP5 POP PUSH2 0x1B02 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x284C JUMP JUMPDEST PUSH2 0x110C DUP9 DUP5 DUP8 PUSH2 0x2D35 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x1B60 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D98 JUMP JUMPDEST PUSH2 0x1BA3 PUSH2 0x1B9E DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x2E4A SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x308B JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CD8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1CC0 JUMPI PUSH2 0x1C47 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1153 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1C7F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DF8 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x1D57 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D08 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1D9D JUMPI PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1DFE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DA8 JUMP JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E65 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E79 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1E9D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x41DF JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x1F22 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C78 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x1FC3 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x4C1E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH2 0x1FD9 PUSH2 0x3B87 JUMP JUMPDEST PUSH2 0x1FE2 DUP3 PUSH2 0x320B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1FFF JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0xF07 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x2011 JUMPI PUSH1 0x2 PUSH2 0x1FF5 JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x2024 JUMPI PUSH1 0x4 PUSH2 0x1FF5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x2048 JUMPI PUSH1 0x6 PUSH2 0x1FF5 JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x2095 JUMPI PUSH1 0x6 PUSH2 0x1FF5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD GT PUSH2 0x20C3 JUMPI PUSH1 0x5 PUSH2 0x1FF5 JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x20D4 PUSH2 0x3B87 JUMP JUMPDEST PUSH2 0x20DD DUP3 PUSH2 0x1FD1 JUMP JUMPDEST SWAP1 POP PUSH2 0x20E9 DUP3 DUP3 PUSH2 0x3219 JUMP JUMPDEST PUSH2 0xC88 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3330 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x21B8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x218D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x21B8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x219B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x21C8 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x21D5 PUSH2 0x3B2F JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x21E4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x110C JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2212 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x2232 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2AD8 JUMP JUMPDEST SWAP2 POP PUSH2 0x225E DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2245 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE98 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x226A DUP6 DUP3 PUSH2 0x2464 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x227B JUMPI PUSH2 0x110C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x21FA JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2294 PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x22A3 PUSH2 0x3B2F JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x22B2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1A7D JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x22E0 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x22FC SWAP1 DUP10 SWAP1 PUSH2 0x2AD8 JUMP JUMPDEST SWAP3 POP PUSH2 0x230F DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19FC JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x233B DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2322 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x813 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x2347 DUP7 DUP3 PUSH2 0x2464 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x2355 JUMPI PUSH2 0x1A7D JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x22C8 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x23CD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DA8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x242A JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x2472 SWAP2 SWAP1 PUSH2 0x33D7 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2488 SWAP2 SWAP1 PUSH2 0x33D7 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x24A1 SWAP2 SWAP1 PUSH2 0x33D7 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x24BA SWAP2 SWAP1 PUSH2 0x33D7 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2507 JUMPI PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2509 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2521 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x3421 JUMP JUMPDEST PUSH2 0x2533 DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x3421 JUMP JUMPDEST LT ISZERO PUSH2 0xC88 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DE8 JUMP JUMPDEST PUSH2 0x2573 PUSH2 0x3B58 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x2587 DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2AD8 JUMP JUMPDEST SWAP4 POP PUSH2 0x2597 DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2AD8 JUMP JUMPDEST SWAP3 POP PUSH2 0x25A7 DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x3421 JUMP JUMPDEST PUSH2 0x25B5 DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x3421 JUMP JUMPDEST GT PUSH2 0x25D7 JUMPI DUP4 SWAP2 POP PUSH2 0x25D0 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2CA2 JUMP JUMPDEST SWAP1 POP PUSH2 0x25F0 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x25ED DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2CA2 JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x25FA DUP10 DUP4 PUSH2 0x2CD5 JUMP JUMPDEST DUP6 MSTORE PUSH2 0x2606 DUP9 DUP3 PUSH2 0x2CD5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x261E SWAP2 SWAP1 PUSH2 0x2AD8 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x266D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DC8 JUMP JUMPDEST DUP3 ISZERO ISZERO PUSH2 0x26A6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D18 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2719 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2719 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DD8 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x27A4 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x27A4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C68 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x27FA JUMPI PUSH2 0x27C2 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x1153 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x27FA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CA8 JUMP JUMPDEST PUSH2 0x280D DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x347C JUMP JUMPDEST ISZERO PUSH2 0x2844 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CF8 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x285A DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x33D7 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xBCC4C97732E47D9946F229EDB95F5B6323F601300E4690DE719993F3C371129 SWAP7 PUSH2 0x28E9 SWAP7 DUP16 SWAP7 CALLER SWAP7 SWAP3 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 SWAP1 PUSH2 0x4ABF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x29A2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2977 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x29A2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2985 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x29CA DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x140 DUP5 ADD MLOAD DUP5 MLOAD DUP7 MLOAD DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x29E6 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x29FF DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2A1B DUP2 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2A37 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST DUP4 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2AA1 JUMPI PUSH2 0x2A9C DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD PUSH2 0x2A97 DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x33D7 JUMP JUMPDEST PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2AD1 JUMP JUMPDEST PUSH2 0x2AB9 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2AD1 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2B14 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CC8 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x2B58 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D38 JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2B88 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2C20 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4C88 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2C69 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DB8 JUMP JUMPDEST PUSH2 0x2C77 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x365E JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 PUSH2 0x2CB1 DUP6 DUP5 PUSH2 0x3421 JUMP JUMPDEST DUP5 PUSH2 0x36BF JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2CCE JUMPI DUP2 PUSH2 0xF74 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CDD PUSH2 0x3B2F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x2CF9 SWAP2 DUP5 SWAP2 PUSH2 0x2CA2 JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2D10 SWAP2 DUP5 SWAP2 PUSH2 0x2CA2 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xE0 DUP5 ADD MLOAD PUSH2 0x2D2A SWAP2 DUP5 SWAP2 PUSH2 0x2CA2 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2DDF JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2DB4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2DDF JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2DC2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2DFF DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2E18 DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2E30 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST PUSH2 0x2E44 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x34CD JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2F73 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2F36 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3009 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2FCC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 SWAP8 DUP3 MSTORE DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 SWAP1 SWAP8 AND SWAP7 DUP9 ADD SWAP7 SWAP1 SWAP7 MSTORE POP POP PUSH1 0x60 DUP6 ADD MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 SLOAD DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3117 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x30DA JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP DUP4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP5 SUB DUP4 ADD DUP2 MSTORE SWAP3 DUP2 ADD SWAP1 DUP2 SWAP1 MSTORE DUP3 MLOAD SWAP3 SWAP4 POP SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x31BB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x317E JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2509 PUSH2 0x1B9E DUP4 PUSH2 0x36D6 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x325A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DC8 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x32CD JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x32CD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DD8 JUMP JUMPDEST PUSH2 0x32D5 PUSH2 0x24C6 JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x332B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CB8 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xDC47B3613D9FE400085F6DBDC99453462279057E6207385042827ED6B1A62CF7 SWAP3 PUSH2 0x33CB SWAP3 CALLER SWAP3 SWAP1 PUSH2 0x4B43 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x3416 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CC8 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x3434 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x341A JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3444 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x3416 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4CC8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x348B JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x34A0 JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x839 JUMP JUMPDEST PUSH2 0x34BF PUSH2 0x34B0 DUP4 PUSH3 0xF4240 PUSH2 0x3421 JUMP JUMPDEST PUSH2 0x34BA DUP9 DUP8 PUSH2 0x3421 JUMP JUMPDEST PUSH2 0x36BF JUMP JUMPDEST PUSH2 0x3E8 LT SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x2844 JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x3514 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D78 JUMP JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x359D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4D28 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3639 JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x3621 JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x3651 JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x36A0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8CA SWAP1 PUSH2 0x4DB8 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x36CD JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x395E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3921 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x39F9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x39BC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3A94 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3A57 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x3B6D PUSH2 0x3B2F JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3B7A PUSH2 0x3B2F JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 CALLDATALOAD PUSH2 0x4ED5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3BC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3BD7 PUSH2 0x3BD2 DUP3 PUSH2 0x4E6A JUMP JUMPDEST PUSH2 0x4E43 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C15 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3BFF DUP9 DUP3 PUSH2 0x3D71 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3BE9 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3C30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C3E PUSH2 0x3BD2 DUP3 PUSH2 0x4E6A JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C15 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3C66 DUP9 DUP3 PUSH2 0x3DC0 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3C50 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3C8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C9B PUSH2 0x3BD2 DUP3 PUSH2 0x4E6A JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3CC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C15 JUMPI DUP2 PUSH2 0x3CD6 DUP9 DUP3 PUSH2 0x3D04 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3CC3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 CALLDATALOAD PUSH2 0x4EEE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 MLOAD PUSH2 0x4EEE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 CALLDATALOAD PUSH2 0x4EF3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 CALLDATALOAD PUSH2 0x4EF6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF74 DUP3 MLOAD PUSH2 0x4EF6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x3D3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x3D6A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D90 PUSH2 0x3BD2 DUP3 PUSH2 0x4E8B JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3DAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DB7 DUP4 DUP3 DUP5 PUSH2 0x4F2C JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3DD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DDE PUSH2 0x180 PUSH2 0x4E43 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3DEC DUP5 DUP5 PUSH2 0x3BA7 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3DFD DUP5 DUP5 DUP4 ADD PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3E11 DUP5 DUP3 DUP6 ADD PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3E25 DUP5 DUP3 DUP6 ADD PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3E39 DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3E4D DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3E61 DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x3E75 DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x3E8A DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3EA0 DUP5 DUP3 DUP6 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3EC2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3ECE DUP5 DUP3 DUP6 ADD PUSH2 0x3D71 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3EF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EFC DUP5 DUP3 DUP6 ADD PUSH2 0x3D71 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3F3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3F46 DUP6 DUP6 PUSH2 0x3BA7 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3F57 DUP6 DUP3 DUP7 ADD PUSH2 0x3BA7 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3F74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3F80 DUP6 DUP6 PUSH2 0x3BA7 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3F57 DUP6 DUP3 DUP7 ADD PUSH2 0x3CEC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3FA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2CB7 DUP5 DUP3 DUP6 ADD PUSH2 0x3C1F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3FDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FFE DUP7 DUP3 DUP8 ADD PUSH2 0x3C1F JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x401B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4027 DUP7 DUP3 DUP8 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4044 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4050 DUP7 DUP3 DUP8 ADD PUSH2 0x3BB3 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x406F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4086 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4092 DUP7 DUP3 DUP8 ADD PUSH2 0x3C1F JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4027 DUP7 DUP3 DUP8 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3CF8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x40F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3F46 DUP6 DUP6 PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4114 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4120 DUP8 DUP8 PUSH2 0x3D04 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x4131 DUP8 DUP3 DUP9 ADD PUSH2 0x3BA7 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x414E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x415A DUP8 DUP3 DUP9 ADD PUSH2 0x3D28 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x417B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4187 DUP7 DUP7 PUSH2 0x3D04 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4198 DUP7 DUP3 DUP8 ADD PUSH2 0x3BA7 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x41B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4050 DUP7 DUP3 DUP8 ADD PUSH2 0x3D71 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x41D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3D10 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x41F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2CB7 DUP5 DUP5 PUSH2 0x3D1C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x420F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4226 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2CB7 DUP5 DUP3 DUP6 ADD PUSH2 0x3DC0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x425F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x426B DUP8 DUP3 DUP9 ADD PUSH2 0x3DC0 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4294 DUP8 DUP3 DUP9 ADD PUSH2 0x3DC0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x42B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x42BD DUP8 DUP3 DUP9 ADD PUSH2 0x3D71 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x42DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x42E6 DUP8 DUP3 DUP9 ADD PUSH2 0x3D71 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4307 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x431E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x432A DUP7 DUP3 DUP8 ADD PUSH2 0x3DC0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4198 DUP7 DUP3 DUP8 ADD PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4354 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4360 DUP10 DUP10 PUSH2 0x3D04 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x4371 DUP10 DUP3 DUP11 ADD PUSH2 0x3BA7 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x438E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x439A DUP10 DUP3 DUP11 ADD PUSH2 0x3D28 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43C5 DUP10 DUP3 DUP11 ADD PUSH2 0x3D28 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4ED5 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4EEE JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4EF3 JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4EF6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4409 DUP3 PUSH2 0x4ED1 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x441D DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x4F38 JUMP JUMPDEST PUSH2 0x4426 DUP2 PUSH2 0x4F64 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4F21 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4E45575F4F524445525F45504F4348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x49FF DUP5 DUP3 PUSH2 0x43EC JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4A12 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x4A25 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x2E44 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4A4A DUP5 DUP3 PUSH2 0x49EE JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4A5D PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x49EE JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2E44 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x4A82 DUP5 DUP3 PUSH2 0x4AA8 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4A95 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2E44 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x43DD DUP2 PUSH2 0x4F1B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x43D4 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x4ACE DUP3 DUP12 PUSH2 0x43D4 JUMP JUMPDEST PUSH2 0x4ADB PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x43D4 JUMP JUMPDEST PUSH2 0x4AE8 PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4AF5 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4B02 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4B0F PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x43EC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x4B21 DUP2 DUP6 PUSH2 0x43FE JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x4B35 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4B51 DUP3 DUP7 PUSH2 0x43D4 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4B63 DUP2 DUP6 PUSH2 0x43FE JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4B77 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x43E3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x43EC JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4BAA DUP3 DUP7 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4BB7 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x43D4 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4B77 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4BD7 DUP3 DUP6 PUSH2 0x43EC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2CB7 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x4BF7 DUP3 DUP8 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4C04 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x4AA8 JUMP JUMPDEST PUSH2 0x4C11 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x43EC JUMP JUMPDEST PUSH2 0x4B77 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x43EC JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4C2C DUP3 DUP6 PUSH2 0x43F5 JUMP JUMPDEST PUSH2 0xF74 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x43D4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xF74 DUP2 DUP5 PUSH2 0x43FE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x4433 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x443C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x446C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x449C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x44CC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4522 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4552 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4582 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x45B2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x45E2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4612 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4642 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4672 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x46A2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x46D2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4702 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4758 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4788 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x47B8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x47E8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4818 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4848 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x4878 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x48A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x48FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x492E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x495E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x498E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2509 DUP2 PUSH2 0x49BE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x49EE JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x4A38 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2509 DUP3 DUP5 PUSH2 0x4A71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x4E62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4E81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4EA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2509 DUP3 PUSH2 0x4ED5 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4F53 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4F3B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2E44 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xeb 0x4d SWAP14 0xb5 0xdb 0x49 0xf5 0xb8 PUSH12 0xACCDB83B7B22CEF2DA7CF614 CALLDATASIZE DUP15 REVERT 0xd RETURNDATACOPY PUSH26 0x97F1A2703A6C6578706572696D656E74616CF500370000000000 ",
- "sourceMap": "931:616:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;970:221:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;970:221:17;;;;;;;;;;;;;;;;;;;;1198:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1198:42:4;;;;;;;;;13371:572:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13371:572:8;;;;;;;;;;;;;;;;;1288:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1288:42:4;;;;;;;;;;;;;;;;;1493:360:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1493:360:6;;;;;;;;;;;1791:2557:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1791:2557:5;;;;;;;;;;;;;;;;;2081:10811:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2081:10811:8;;;;;;;;;976:51:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;976:51:3;;;;;;;;;;;;;;;;;24537:185:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24537:185:8;;;;;;;;;14423:584;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14423:584:8;;;;;;;;;1942:1012:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1942:1012:4;;;;;;;;;15566:586:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15566:586:8;;;;;;;;;2092:154:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2092:154:3;;;;;;;;;;;;;;;;;968:45:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;968:45:7;;;;;;;;;1160:495:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1160:495:8;;;;;;;;;2090:391:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2090:391:6;;;;;;;;;1087:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1087:71:6;;;;;;;;;16540:1432:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16540:1432:8;;;;;;;;;967:63:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;967:63:6;;;;;;;;;258:20:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:29;;;;2853:6652:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2853:6652:6;;;;;;;;;22554:1848:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22554:1848:8;;;;;;;;;3271:1327:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3271:1327:4;;;;;;;;;1710:1456:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1710:1456:7;;;;;;;;;1236:666:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1236:666:3;;;;;;;;;5425:2253:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5425:2253:4;;;;;;;;;;;;;;;;;4829:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4829:322:4;;;;;;;;;1551:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1551:67:4;;;;;;;;;857:27:16;;8:9:-1;5:2;;;30:1;27;20:12;5:2;857:27:16;;;;;;;;;;;;18429:1442:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18429:1442:8;;;;;;;;;1298:33:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1298:33:17;;;;20259:1834:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20259:1834:8;;;;;;;;;1065:36:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1065:36:7;;;;500:167:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:29;;;;;;;;;1113:46:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1113:46:2;;;;970:221:17;1042:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1042:148:17;;;;;;;;1032:159;;1042:148;;;;;1032:159;;;;1042:148;1032:159;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1032:159:17;;;;;;;;;;;;;;;;970:221;:::o;1198:42:4:-;;;;;;;;;;;;;:::o;13371:572:8:-;13557:35;;:::i;:::-;13613:9;13666:36;;:::i;:::-;13625:1;13613:13;;13608:296;13632:6;:13;13628:1;:17;13608:296;;;13705:123;13732:6;13739:1;13732:9;;;;;;;;;;;;;;;;;;13759:21;13781:1;13759:24;;;;;;;;;;;;;;;;;;13801:10;13812:1;13801:13;;;;;;;;;;;;;;;;;;13705:9;:123::i;:::-;13666:162;;13842:51;13857:16;13875:17;13842:14;:51::i;:::-;13647:3;;;;;13608:296;;;13371:572;;;;;;;:::o;1288:42:4:-;;;;;;;;;;;;;;;:::o;1493:360:6:-;1646:110;1680:4;1702:13;1733:9;;1646:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1646:16:6;;-1:-1:-1;;;;;1646:110:6:i;:::-;1625:174;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1809:15:6;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;:37;;;;1842:4;1809:37;;;1493:360::o;1791:2557:5:-;2006:59;;:::i;:::-;2471:39;;:::i;:::-;2546:40;;:::i;:::-;2335:24;;;;;2307:25;;;;:52;;;;2397:24;;;2369:25;;;:52;2655:20;2513:23;2335:9;2513:12;:23::i;:::-;2471:65;;2589:24;2602:10;2589:12;:24::i;:::-;2546:67;;2678:26;:24;:26::i;:::-;2655:49;;2767:39;2784:9;2795:10;2767:16;:39::i;:::-;2883:195;2924:9;2947:10;2971:13;:41;;;3026:14;:42;;;2883:27;:195::i;:::-;3228:23;;:46;;;2862:216;;-1:-1:-1;3123:248:5;;3152:9;;3175:13;;3202:12;;3228:46;3348:13;3123:15;:248::i;:::-;3488:24;;;;;:47;;3381:253;;3410:10;;3434:14;;3462:12;;3488:47;3610:14;3381:15;:253::i;:::-;3678:205;3709:9;3732:12;3758:13;:23;;;3795:13;:41;;;3850:18;:23;;;3678:17;:205::i;:::-;3893:209;3924:10;3948:12;3974:14;:24;;;4012:14;:42;;;4068:18;:24;;;3893:17;:209::i;:::-;4171:134;4204:9;4227:10;4251:12;4277:18;4171:19;:134::i;:::-;1791:2557;;;;;;;;;:::o;2081:10811:8:-;2252:30;;:::i;:::-;6147:4;6141:11;;5368:23;6165:42;;;6573:4;6262:3;6241:25;;7260:59;;;7586:19;;6552:26;;;7566:40;;;7374:4;7699:23;;;7693:30;7669:22;;;7662:62;7795:23;;;7789:30;7765:22;;;7758:62;7898:23;;;7892:30;7868:22;;;7861:62;8013:4;7995:23;;7989:30;7965:22;;;7958:62;8113:4;8095:23;;8089:30;8065:22;;;8058:62;8213:4;8195:23;;8189:30;8165:22;;;8158:62;8311:4;8293:23;;8287:30;8263:22;;;8256:62;8410:5;8392:24;;8386:31;8361:23;;;8354:64;8515:5;8497:24;;8491:31;8466:23;;;8459:64;8603:5;8585:24;;8579:31;;8554:23;;;8547:64;;;8711:5;8693:24;;8687:31;8662:23;;;8655:64;8795:5;8922:74;;9084:24;9156:19;;8778:23;;;9360:34;;;5368:23;;6241:25;;;;6552:26;7352:27;;;;6552:26;;9422:22;;;;9204:23;;;;9280:4;9261:24;;9257:35;5341:24;9514:237;9537:13;9534:1;9531:20;9514:237;;;9607:19;;9587:40;;9676:4;9659:22;;;;9714:23;;;;9565:1;9558:9;9514:237;;;-1:-1:-1;;;;9861:31:8;;;9845:13;9826:33;;;9819:74;;;;9987:17;;9981:24;10053:19;;10257:34;;;9853:4;10319:22;;;;10101:23;;;;10177:4;10158:24;;10154:35;10426:1;10412:237;10435:13;10432:1;10429:20;10412:237;;;10505:19;;10485:40;;10574:4;10557:22;;;;10612:23;;;;10463:1;10456:9;10412:237;;;-1:-1:-1;;;10718:46:8;;;-1:-1:-1;10949:33:8;;;10819:4;10797:27;;;10924:59;;;11097:19;;11288:34;;;10797:27;;11350:22;;;;11145:23;;;;11097:19;11221:4;11202:24;;11198:35;-1:-1:-1;11429:237:8;11452:13;11449:1;11446:20;11429:237;;;11522:19;;11502:40;;11591:4;11574:22;;;;11629:23;;;;11480:1;11473:9;11429:237;;;11433:12;12197:3;12118:15;12064;12051:11;12047:33;11966:15;11881:7;11761:3;11731:543;12294:7;12314:205;;;;12537:1;12532:316;;;;12287:561;;12314:205;12359:1;12346:11;12339:22;12407:1;12402:2;12389:11;12385:20;12378:31;12455:1;12450:2;12437:11;12433:20;12426:31;12503:1;12498:2;12485:11;12481:20;12474:31;12314:205;;12532:316;12583:15;12577:22;12564:11;12557:43;12673:2;12656:15;12652:24;12646:31;12641:2;12628:11;12624:20;12617:61;12751:2;12734:15;12730:24;12724:31;12719:2;12706:11;12702:20;12695:61;12829:2;12812:15;12808:24;12802:31;12797:2;12784:11;12780:20;12773:61;12287:561;-1:-1:-1;;;;;;;;;;;;2081:10811:8;;;;;;:::o;976:51:3:-;;;;;;;;;;;;;;;:::o;24537:185:8:-;24630:9;24625:91;24649:6;:13;24645:1;:17;24625:91;;;24683:22;24695:6;24702:1;24695:9;;;;;;;;;;;;;;;;;;24683:11;:22::i;:::-;24664:3;;24625:91;;;24537:185;;:::o;14423:584::-;14615:35;;:::i;:::-;14671:9;14724:36;;:::i;:::-;14683:1;14671:13;;14666:302;14690:6;:13;14686:1;:17;14666:302;;;14763:129;14796:6;14803:1;14796:9;;;;;;;;;;;;;;;;;;14823:21;14845:1;14823:24;;;;;;;;;;;;;;;;;;14865:10;14876:1;14865:13;;;;;;;;;;;;;;;;;;14763:15;:129::i;:::-;14724:168;;14906:51;14921:16;14939:17;14906:14;:51::i;:::-;14705:3;;;;;14666:302;;1942:1012:4;2025:20;2332:21;2496;2552;2048:26;:24;:26::i;:::-;2025:49;-1:-1:-1;2356:26:4;;;2372:10;2356:26;:52;;2398:10;2356:52;;;2393:1;2356:52;2576:24;;;;;;;;:10;:24;;;;;;;;:39;;;;;;;;;;2332:76;;-1:-1:-1;2539:1:4;2520:20;;;-1:-1:-1;2576:39:4;-1:-1:-1;2704:29:4;;;2683:100;;;;;;;;;;;;;;2823:24;;;;;;;;:10;:24;;;;;;;;:39;;;;;;;;;;;;;;:55;;;2893:54;;;;;2865:13;;2893:54;;;;;;;;;;1942:1012;;;;;:::o;15566:586:8:-;15759:35;;:::i;:::-;15815:9;15868:36;;:::i;:::-;15827:1;15815:13;;15810:303;15834:6;:13;15830:1;:17;15810:303;;;15907:130;15941:6;15948:1;15941:9;;;;;;;;;;;;;;;;;;15968:21;15990:1;15968:24;;;;;;;;;;;;;;;;;;16010:10;16021:1;16010:13;;;;;;;;;;;;;;;;;;15907:16;:130::i;:::-;15868:169;;16051:51;16066:16;16084:17;16051:14;:51::i;:::-;15849:3;;;;;15810:303;;2092:154:3;2213:26;;;2183:7;2213:26;;;:12;:26;;;;;;;;2092:154;;;;:::o;968:45:7:-;;;;;;;;;;;;;;;:::o;1160:495:8:-;1330:30;;:::i;:::-;1390:95;1413:5;1432:20;1466:9;1390;:95::i;:::-;1516:34;;;;1376:109;;-1:-1:-1;1516:58:8;;1495:125;;;;;;;;;;;;;;1160:495;;;;;:::o;2090:391:6:-;2223:21;2247:26;:24;:26::i;:::-;2283:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;;;;;:61;;;;;;;;;;2359:115;2283:32;;-1:-1:-1;2283:50:6;;2359:115;;;;2283:61;;2359:115;;;;;;;;;;2090:391;;;:::o;1087:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16540:1432:8:-;16717:35;;:::i;:::-;16768:27;16842:9;17228:37;17419:36;;:::i;:::-;16798:6;16805:1;16798:9;;;;;;;;;;;;;;;;;;:24;;;16768:54;;16854:1;16842:13;;16837:1096;16861:6;:13;16857:1;:17;16837:1096;;;17131:14;17104:6;17111:1;17104:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;17268:70;17276:20;17298:16;:39;;;17268:7;:70::i;:::-;17228:110;;17458:128;17485:6;17492:1;17485:9;;;;;;;;;;;;;;;;;;17512:29;17559:10;17570:1;17559:13;;;;;;;;;17458:128;17419:167;;17671:51;17686:16;17704:17;17671:14;:51::i;:::-;17863:20;17820:16;:39;;;:63;17816:107;;;17903:5;;17816:107;16876:3;;;;;16837:1096;;;16540:1432;;;;;;;;;:::o;967:63:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;258:20:29:-;;;;;;:::o;2853:6652:6:-;3015:12;3192:22;3445:27;3566:7;3583:9;3602;3621:17;7350:24;3083:1;3064:9;:16;:20;3043:97;;;;;;;;;;;;;;;;3223:23;:9;:21;:23::i;:::-;3217:30;;;;-1:-1:-1;3303:29:6;3278:55;;;;3257:123;;;;;;;;;;;;;;3489:16;3475:31;;;;;;;;;;3445:61;-1:-1:-1;3988:21:6;3971:13;:38;;;;;;;;;3967:5188;;;4025:27;;;;;;;;;;;3967:5188;4334:21;4317:13;:38;;;;;;;;;4313:4842;;;4396:16;;:21;4371:97;;;;;;;;;;;;;;4492:5;;-1:-1:-1;4511:14:6;;4313:4842;4598:20;4581:13;:37;;;;;;;;;4577:4578;;;4659:16;;4679:2;4659:22;4634:99;;;;;;;;;;;;;;4757:9;4767:1;4757:12;;;;;;;;;;;;;;;;;;;;;4751:19;;-1:-1:-1;4788:24:6;:9;4810:1;4788:24;:21;:24;:::i;:::-;4784:28;-1:-1:-1;4830:25:6;:9;4852:2;4830:25;:21;:25;:::i;:::-;4826:29;;4881:24;4891:4;4897:1;4900;4903;4881:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4881:24:6;;;;;4929:26;;;;;;;;;-1:-1:-1;4881:24:6;-1:-1:-1;4969:14:6;;-1:-1:-1;4969:14:6;4577:4578;5060:21;5043:13;:38;;;;;;;;;5039:4116;;;5122:16;;5142:2;5122:22;5097:99;;;;;;;;;;;;;;5220:9;5230:1;5220:12;;;;;;;;;;;;;;;;;;;;;5214:19;;-1:-1:-1;5251:24:6;:9;5273:1;5251:24;:21;:24;:::i;:::-;5247:28;-1:-1:-1;5293:25:6;:9;5315:2;5293:25;:21;:25;:::i;:::-;5289:29;;5344:225;5475:4;5381:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5381:116:6;;;5371:127;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5371:127:6;;;;;;;;;;;;-1:-1:-1;5344:225:6;;;;;;;;;;-1:-1:-1;5371:127:6;-1:-1:-1;5516:1:6;;5535;;-1:-1:-1;5554:1:6;;5344:225;;5039:4116;6237:20;6220:13;:37;;;;;;;;;6216:2939;;;6298:16;;:21;6273:97;;;;;;;;;;;;;;6394:27;;;6411:10;6394:27;;-1:-1:-1;6435:14:6;;6216:2939;6619:20;6602:13;:37;;;;;;;;;6598:2557;;;6665:56;;;;;:39;;;;;;:56;;6705:4;;6711:9;;6665:56;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6665:56:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6665:56:6;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6665:56:6;;;;;;;;;6655:66;-1:-1:-1;6735:14:6;;6598:2557;7248:23;7231:13;:40;;;;;;;;;7227:1928;;;7377:26;:9;:24;:26::i;:::-;7488:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;7350:53;;-1:-1:-1;7488:50:6;;7487:51;7483:102;;;7565:5;7558:12;;;;7483:102;7608:139;;;;;:45;;;;;;:139;;7671:4;;7693:13;;7724:9;;7608:139;;;;7227:1928;7883:23;7866:13;:40;;;;;;;;;7862:1293;;;7932:15;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;;;;-1:-1:-1;7976:14:6;;7862:1293;8556:20;8539:13;:37;;;;;;;;;8535:620;;;8617:16;;8637:2;8617:22;8592:99;;;;;;;;;;;;;;8715:9;8725:1;8715:12;;;;;;;;;;;;;;;;;;;;;8709:19;;-1:-1:-1;8746:24:6;:9;8768:1;8746:24;:21;:24;:::i;:::-;8742:28;-1:-1:-1;8788:25:6;:9;8810:2;8788:25;:21;:25;:::i;:::-;8784:29;;8839:227;8972:4;8876:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8876:118:6;;;8866:129;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;8535:620:6;9467:31;;;;;;;;;;;2853:6652;;;;;;;;;;;;;:::o;22554:1848:8:-;22737:35;;:::i;:::-;22788:27;22858:9;23248:37;23554;23840:36;;:::i;:::-;22818:6;22825:1;22818:9;;;;;;;;;;;;;;;;;;:24;;;22788:54;;22870:1;22858:13;;22853:1510;22877:6;:13;22873:1;:17;22853:1510;;;23152:14;23125:6;23132:1;23125:9;;;;;;;;;;;;;;;;;;;:24;;:41;23318:39;;23288:70;;23296:20;;23288:7;:70::i;:::-;23248:110;;23594:165;23628:6;23635:1;23628:9;;;;;;;;;;;;;;;;;;:26;;;23672:6;23679:1;23672:9;;;;;;;;;;;;;;;;;;:26;;;23716:29;23594:16;:165::i;:::-;23554:205;;23879:135;23913:6;23920:1;23913:9;;;;;;;;;;;;;;;;;;23940:29;23987:10;23998:1;23987:13;;;;;;;;;23879:135;23840:174;;24099:51;24114:16;24132:17;24099:14;:51::i;:::-;24250:39;;:63;;24246:107;;;24333:5;;24246:107;22892:3;;;;;22853:1510;;;22554:1848;;;;;;;;;;:::o;3271:1327:4:-;3426:30;;:::i;:::-;3500:26;;:::i;:::-;3590:20;3694:33;3810:30;3529:19;3542:5;3529:12;:19::i;:::-;3500:48;;3613:26;:24;:26::i;:::-;3590:49;;3730:70;3738:5;:22;;;3762:9;:37;;;3730:7;:70::i;:::-;3694:106;;3843:55;3850:20;3872:25;3843:6;:55::i;:::-;3810:88;;3937:186;3966:5;3985:9;4008:12;4034:20;4068:22;4104:9;3937:15;:186::i;:::-;4193:51;4214:5;4221:22;4193:20;:51::i;:::-;4179:65;;4297:181;4328:5;4347:12;4373:9;:19;;;4406:9;:37;;;4457:11;4297:17;:181::i;:::-;4517:45;4529:5;4536:12;4550:11;4517;:45::i;1710:1456:7:-;1924:21;;2014:23;;1924:35;:21;:35;1903:100;;;;;;;;;;;;;;2040:113;2058:94;2093:4;2111:13;2138:4;;2058:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2058:21:7;;-1:-1:-1;;;;;2058:94:7:i;:::-;2040:17;:113::i;:::-;2240:29;;;;:12;:29;;;;;;2014:139;;-1:-1:-1;2240:29:7;;2239:30;2218:92;;;;;;;;;;;;;;2396:27;;;2413:10;2396:27;2392:410;;2498:137;2536:15;2573:13;2608:9;;2498:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2498:16:7;;-1:-1:-1;;;;;2498:137:7:i;:::-;2473:216;;;;;;;;;;;;;;;;2754:21;:37;;;;;;;;;;2392:410;2843:29;;;;:12;:29;;;;;;;:36;;;;2875:4;2843:36;;;2910:32;2918:4;;2937;;;;2910:32;2937:4;;;;2910:32;;;;;;;;;;;;;;;;;;;;;;;;2889:95;;;;;;;;;;;;;;;;3072:27;;;3089:10;3072:27;3068:92;;3115:21;:34;;;;;;3068:92;1710:1456;;;;;;;:::o;1236:666:3:-;426:5:29;;1333:30:3;;;;;;426:5:29;;412:10;:19;391:85;;;;;;;;;;;;;;1378:10:3;1333:56;;1484:18;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1484:31:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1484:31:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1484:31:3;;;;;;;;;1553:26;;;;;;;:12;:26;;;;;;1462:53;;-1:-1:-1;1553:26:3;;;-1:-1:-1;1610:31:3;;1589:104;;;;;;;;;;;;;;1753:26;;;;;;;:12;:26;;;;;;;:47;;;;;;;;;;1815:80;;;;;1753:26;;1875:10;;1815:80;;;;;;;;;;1236:666;;;;:::o;5425:2253:4:-;5512:26;;:::i;:::-;5610:19;5623:5;5610:12;:19::i;:::-;5588;;;:41;5931:22;;;;:27;5927:157;;;6004:38;5998:45;5974:69;;;;6057:16;;5927:157;6397:22;;;;:27;6393:157;;;6470:38;6464:45;;6393:157;6674:27;;;;6655:15;:46;6651:157;;6747:19;6741:26;;6651:157;6877:19;;;;;6867:30;;;;:9;:30;;;;;;;;;6863:143;;;6943:21;6937:28;;6863:143;7073:10;;;;7030:18;;7019:30;;;;;;;;:10;:30;;;;;;;;7050:19;;;;7019:51;;;;;;;;;;:64;7015:177;;;7129:21;7123:28;;7015:177;7312:19;;;;;7305:27;;;;:6;:27;;;;;;;;;7265:37;;;:67;;;7387:22;;;;-1:-1:-1;7342:179:4;;7455:24;7449:31;;7342:179;7624:20;7594:51;;;5425:2253;-1:-1:-1;5425:2253:4:o;4829:322::-;4937:26;;:::i;:::-;4966:19;4979:5;4966:12;:19::i;:::-;4937:48;;5024:35;5042:5;5049:9;5024:17;:35::i;:::-;5096:48;5117:5;5124:9;:19;;;5096:20;:48::i;1551:67::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;857:27:16:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18429:1442:8:-;18613:35;;:::i;:::-;18664:27;18734:9;19120:37;19311:36;;:::i;:::-;18694:6;18701:1;18694:9;;;;;;;;;;;;;;;;;;:24;;;18664:54;;18746:1;18734:13;;18729:1103;18753:6;:13;18749:1;:17;18729:1103;;;19023:14;18996:6;19003:1;18996:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;19160:70;19168:20;19190:16;:39;;;19160:7;:70::i;:::-;19120:110;;19350:135;19384:6;19391:1;19384:9;;;;;;;;;;;;;;;;;;19411:29;19458:10;19469:1;19458:13;;;;;;;;;19350:135;19311:174;;19570:51;19585:16;19603:17;19570:14;:51::i;:::-;19762:20;19719:16;:39;;;:63;19715:107;;;19802:5;;19715:107;18768:3;;;;;18729:1103;;1298:33:17;;;;:::o;20259:1834:8:-;20435:35;;:::i;:::-;20486:27;20556:9;20946:37;21252;21538:36;;:::i;:::-;20516:6;20523:1;20516:9;;;;;;;;;;;;;;;;;;:24;;;20486:54;;20568:1;20556:13;;20551:1503;20575:6;:13;20571:1;:17;20551:1503;;;20850:14;20823:6;20830:1;20823:9;;;;;;;;;;;;;;;;;;;:24;;:41;21016:39;;20986:70;;20994:20;;20986:7;:70::i;:::-;20946:110;;21292:165;21326:6;21333:1;21326:9;;;;;;;;;21292:165;21252:205;;21577:128;21604:6;21611:1;21604:9;;;;;;;;;;;;;;;;;;21631:29;21678:10;21689:1;21678:13;;;;;;;;;21577:128;21538:167;;21790:51;21805:16;21823:17;21790:14;:51::i;:::-;21941:39;;:63;;21937:107;;;22024:5;;21937:107;20590:3;;;;;20551:1503;;1065:36:7;;;;;;:::o;500:167:29:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;1113:46:2:-;;;;;;;;;;;;;;;;;;;:::o;1772:648:19:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:19:o;4805:241:7:-;4936:21;;4888:7;;;;4936:35;:21;:35;:72;;4987:21;;;;4936:72;;;4974:10;4936:72;4911:97;4805:241;-1:-1:-1;;4805:241:7:o;4518:1075:5:-;5472:64;5480:9;:26;;;5508:10;:27;;;5472:7;:64::i;:::-;5392;5400:9;:26;;;5428:10;:27;;;5392:7;:64::i;:::-;:144;;5371:215;;;;;;;;;;;;;6329:3311;6601:59;;:::i;:::-;7557:37;7675:38;7796:34;7840:35;7597:68;7605:9;:26;;;7633:31;7597:7;:68::i;:::-;7557:108;;7716:70;7724:10;:27;;;7753:32;7716:7;:70::i;:::-;7675:111;;7985:68;7993:30;8025:10;:27;;;7985:7;:68::i;:::-;7902:67;7910:29;7941:10;:27;;;7902:7;:67::i;:::-;:151;7885:1080;;8175:29;8146:58;;8335:164;8369:10;:27;;;8414:10;:27;;;8459:26;8335:16;:164::i;:::-;8305:194;;7885:1080;;;8630:30;8600:60;;8789:165;8823:10;:27;;;8868:10;:27;;;8913;8789:16;:165::i;:::-;8760:194;;7885:1080;9050:93;9084:9;9107:26;9050:20;:93::i;:::-;9024:119;;9231:95;9265:10;9289:27;9231:20;:95::i;:::-;9204:24;;;;:122;;;9449:23;;:46;9509:47;;;9428:138;;9449:46;9428:7;:138::i;:::-;9380:45;;;:186;6329:3311;;;;;;;;;;:::o;9989:1727:4:-;10355:21;;:52;;10386:20;10355:52;10334:115;;;;;;;;;;;;;;10525:25;;;10504:92;;;;;;;;;;;;;;10668:19;;;;:33;;;10664:170;;10742:19;;;;:33;;10765:10;10742:33;10717:106;;;;;;;;;;;;;;10904:18;;;;:32;;;10900:169;;10999:12;10977:34;;:5;:18;;;:34;;;10952:106;;;;;;;;;;;;;;;;11151:37;;;;:42;11147:301;;;11234:146;11272:9;:19;;;11313:5;:18;;;11353:9;11234:16;:146::i;:::-;11209:228;;;;;;;;;;;;;;;;11520:149;11553:22;11593:5;:22;;;11633:5;:22;;;11520:15;:149::i;:::-;11519:150;11498:211;;;;;;;;;;;;;;9989:1727;;;;;;:::o;7998:792::-;8276:72;8284:27;8313:11;:34;;;8276:7;:72::i;:::-;8256:17;;;;:6;:17;;;;;;;;;:92;;;;8435:25;;;;8403:18;;8524:34;;8572;;;;8620:24;;;;8658;;;;8719:20;;;;8753;;;;8385:398;;8256:17;;8385:398;;;;;;;;;;;;;;8474:12;;8500:10;;8524:34;;8572;;8620:24;;8753:20;8385:398;;;;;;;;;;7998:792;;;;;:::o;10086:2233:5:-;10361:14;10333:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:42;;10361:14;;10333:42;;10361:14;10333:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10419:202;10453:9;:24;;;10491:9;:22;;;10527:10;:23;;;10564:18;:24;;;:47;;;10419:20;:202::i;:::-;10665:25;;;;10704:23;;10741:22;;10777:23;;:46;;;10631:202;;10665:25;10704:23;10741:22;10631:20;:202::i;:::-;10843:189;10877:9;:24;;;10915:9;:22;;;10951:12;10977:18;:45;;;10843:20;:189::i;:::-;11065:185;11099:12;11125:9;:22;;;11161:9;:29;;;11204:18;:23;;;:36;;;11065:20;:185::i;:::-;11260:188;11294:12;11320:10;:23;;;11357:10;:30;;;11401:18;:24;;;:37;;;11260:20;:188::i;:::-;11518:10;:30;;;11485:63;;:9;:29;;;:63;;;11481:832;;;11564:301;11602:12;11632;11662:9;:29;;;11709:142;11738:18;:23;;;:36;;;11796:18;:24;;;:37;;;11709:7;:142::i;:::-;11564:20;:301::i;:::-;11481:832;;;11896:195;11934:12;11964;11994:9;:29;;;12041:18;:23;;;:36;;;11896:20;:195::i;:::-;12105:197;12143:12;12173;12203:10;:30;;;12251:18;:24;;;:37;;;12105:20;:197::i;:::-;10086:2233;;;;;:::o;501:207:30:-;587:7;631:6;;;;610:69;;;;;;;;;;;;;;-1:-1:-1;696:5:30;;;501:207::o;8304:448:27:-;8388:13;8449:1;8438;:8;:12;8417:92;;;;;;;;;;;;;;;;8559:8;;8557:1;;8559:12;;;;8557:15;;;;;;;;;;8671:8;;8667:16;;8696:17;;;-1:-1:-1;8557:15:27;;;;;;;8304:448::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:27;13620:2;13718:13;13712:20;;13281:490::o;8947:482::-;9034:14;9097:2;9085:1;:8;:14;;9064:99;;;;;;;;;;;;;;;;9215:29;9227:1;9241:2;9230:1;:8;:13;9215:11;:29::i;:::-;9347:8;;9343:17;;9373;;;-1:-1:-1;9206:38:27;8947:482::o;937:326:20:-;1091:21;1144:82;1165:26;1173:9;1184:6;1165:7;:26::i;:::-;1205:11;1144:7;:82::i;:::-;1128:98;937:326;-1:-1:-1;;;;937:326:20:o;1369:135:30:-;1454:7;1488:1;1484;:5;:13;;1496:1;1484:13;;;-1:-1:-1;1492:1:30;;1477:20;-1:-1:-1;1369:135:30:o;13000:848:4:-;13151:30;;:::i;:::-;13246:34;;;:59;;;13418:22;;;;13454;;;;13352:134;;13283:22;;13352:16;:134::i;:::-;13315:171;;13589:22;;;;13625:14;;;;13523:126;;13553:22;;13523:16;:126::i;:::-;13496:24;;;:153;13752:22;;;;13788:14;;;;13686:126;;13716:22;;13686:16;:126::i;:::-;13659:24;;;:153;13000:848;;;;:::o;14158:932::-;14365:14;14337:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:42;;14365:14;;14337:42;;14365:14;14337:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14389:170;14423:5;:20;;;14457:5;:18;;;14489:12;14515:11;:34;;;14389:20;:170::i;:::-;14569;14603:5;:20;;;14637:12;14663:5;:18;;;14695:11;:34;;;14569:20;:170::i;:::-;14749:165;14783:12;14809:5;:18;;;14841:5;:25;;;14880:11;:24;;;14749:20;:165::i;:::-;14924:159;14958:12;14984;15010:5;:25;;;15049:11;:24;;;14924:20;:159::i;:::-;14158:932;;;;:::o;3459:902:7:-;1237:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1237:146:7;;;;;;;;1227:157;;3623:14;;;;;;1237:146;;;;1227:157;;;;1237:146;1227:157;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1227:157:7;;;;;;;;;;;3740:15;;1227:157;;-1:-1:-1;3740:15:7;;-1:-1:-1;1227:157:7;;-1:-1:-1;1227:157:7;;3740:15;;;-1:-1:-1;3740:15:7;1227:157;3740:15;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3740:15:7;;;;;;;;;;;;4062:26;;;4108:15;;4101:29;;;;-1:-1:-1;4186:42:7;4167:62;;;;4150:15;;;4143:87;;;;-1:-1:-1;;4262:2:7;4250:15;;4243:33;-1:-1:-1;;4317:3:7;4299:22;;;;3459:902;-1:-1:-1;3459:902:7:o;1816:205:17:-;1910:7;1967:13;;;;;;;;;;;;;;;;;;1982:18;;2002:10;1950:63;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1950:63:17;;;;;-1:-1:-1;1950:63:17;;;;;;;-1:-1:-1;1950:63:17;;;26:21:-1;;;22:32;;6:49;;1950:63:17;;;;;;;1940:74;;1950:63;;-1:-1:-1;1950:63:17;;;1940:74;;;;1950:63;1940:74;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;1940:74:17;;;;;;;;;;;;-1:-1:-1;;;;;1816:205:17:o;4212:202:21:-;4301:17;4346:35;4364:16;4374:5;4364:9;:16::i;11913:816:4:-;12177:21;;12569:20;;12177:52;;12208:20;12177:52;12156:115;;;;;;;;;;;;;;12345:19;;;;:33;;;12341:170;;12419:19;;;;:33;;12442:10;12419:33;12394:106;;;;;;;;;;;;;;12592:26;:24;:26::i;:::-;12649:18;;12569:49;;-1:-1:-1;12649:34:4;;;;;;;12628:94;;;;;;;;;;;;;;11913:816;;;:::o;9092:422::-;9240:20;;;;:9;:20;;;;;;;:27;;;;9263:4;9240:27;;;9357:25;;;;9325:18;;9443:20;;;;9477;;;;9305:202;;9250:9;;9305:202;;;;;;;;;;;;;;9396:10;;9477:20;9305:202;;;;;;;;;;9092:422;;:::o;714:230:30:-;800:7;835:5;;;871:6;;;;850:69;;;;;;;;;;;;;;936:1;929:8;;714:230;;;;;;:::o;50:288::-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:30;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;1502:555:20;1655:12;1683:17;1840:33;1729:11;1703:38;;;;;;;1718:9;1710:6;1703:38;1683:58;-1:-1:-1;1755:14:20;;1751:79;;;1792:5;1785:12;;;;1751:79;1876:98;1897:27;1905:9;1916:7;1897;:27::i;:::-;1938:26;1946:9;1957:6;1938:7;:26::i;:::-;1876:7;:98::i;:::-;2022:4;-1:-1:-1;1994:32:20;1502:555;-1:-1:-1;;;;;;1502:555:20:o;2561:5068:3:-;3031:19;3290:18;2797:1;2788:6;:10;2784:4839;;;2887:16;;2906:1;-1:-1:-1;2862:109:3;;;;;;;;;;;;;;-1:-1:-1;;3153:2:3;3138:18;;;3111:46;3179:66;3107:156;3311:26;;;;:12;:26;;;;;;;;;;3422:24;;;3397:109;;;;;;;;;;;;;;4923:2;4917:9;5239:15;5234:2;5222:9;5216:16;5212:25;5208:47;5392:14;5387:3;5383:24;5374:7;5370:38;5676:66;5667:7;5660:83;6160:3;6156:1;6147:7;6143:15;6136:28;6216:42;6210:4;6206:53;6201:2;6192:7;6188:16;6181:79;6310:42;6306:2;6302:51;6297:2;6288:7;6284:16;6277:77;6397:6;6391:3;6382:7;6378:17;6371:33;6563:3;6554:7;6550:17;6645:206;6665:5;6655:8;6652:19;6645:206;;;6714:16;;6697:34;;6778:2;6815:18;;;;6764:17;6645:206;;;7417:3;7346:7;7292;7285:5;7281:19;7208:7;7142:1;7067:10;7004:3;6978:512;7517:7;7510:15;7507:2;;;7564:16;7555:7;7548:33;7507:2;4724:2889;;;;;2561:5068;;;;;;:::o;10259:886:27:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:27;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;344:151:30:-;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:30:o;4554:1721:21:-;778:457;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;778:457:21;;;;;;;;768:468;;4640:14;;;;;;;;778:457;;;;;768:468;;;;778:457;768:468;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;768:468:21;;;;;;;;;;;4764:20;;;;4754:31;;768:468;;-1:-1:-1;4764:20:21;-1:-1:-1;768:468:21;;-1:-1:-1;768:468:21;;4754:31;;;-1:-1:-1;4754:31:21;768:468;4754:31;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;4754:31:21;;;;;;;;;;;4834:20;;;;4824:31;;4754;;-1:-1:-1;4834:20:21;-1:-1:-1;4754:31:21;;-1:-1:-1;4754:31:21;;4824;;;-1:-1:-1;4824:31:21;4754;4824;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;4824:31:21;;;;;;;;;;5586:15;;;5580:22;;5645:3;5634:15;;5628:22;;5693:3;5682:15;;;5676:22;;5812:35;;;5860:43;;;5916;;;6008:3;5982:30;;6120;;6163;;;-1:-1:-1;;;6206:30:21;;;-1:-1:-1;5982:30:21;;4554:1721;-1:-1:-1;4554:1721:21:o;931:616:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;931:616:2;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;;599:14;228:611;;;;;;;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1640:707;;1750:4;1738:17;;1734:27;-1:-1;1724:2;;1775:1;1772;1765:12;1724:2;1812:6;1799:20;1834:80;1849:64;1906:6;1849:64;;1834:80;1825:89;;1931:5;1956:6;1949:5;1942:21;1986:4;1978:6;1974:17;1964:27;;2008:4;2003:3;1999:14;1992:21;;2061:6;2108:3;2100:4;2092:6;2088:17;2083:3;2079:27;2076:36;2073:2;;;2125:1;2122;2115:12;2073:2;2150:1;2135:206;2160:6;2157:1;2154:13;2135:206;;;2218:3;2240:37;2273:3;2261:10;2240:37;;;2228:50;;-1:-1;2301:4;2292:14;;;;2320;;;;;2182:1;2175:9;2135:206;;2355:112;;2419:43;2454:6;2441:20;2419:43;;2474:116;;2549:36;2577:6;2571:13;2549:36;;2597:118;;2664:46;2702:6;2689:20;2664:46;;2722:116;;2788:45;2825:6;2812:20;2788:45;;2845:120;;2922:38;2952:6;2946:13;2922:38;;2986:335;;;3093:4;3081:17;;3077:27;-1:-1;3067:2;;3118:1;3115;3108:12;3067:2;-1:-1;3138:20;;3178:18;3167:30;;3164:2;;;3210:1;3207;3200:12;3164:2;3244:4;3236:6;3232:17;3220:29;;3294:3;3287;3279:6;3275:16;3265:8;3261:31;3258:40;3255:2;;;3311:1;3308;3301:12;3255:2;3060:261;;;;;;3330:432;;3420:4;3408:17;;3404:27;-1:-1;3394:2;;3445:1;3442;3435:12;3394:2;3482:6;3469:20;3504:60;3519:44;3556:6;3519:44;;3504:60;3495:69;;3584:6;3577:5;3570:21;3620:4;3612:6;3608:17;3653:4;3646:5;3642:16;3688:3;3679:6;3674:3;3670:16;3667:25;3664:2;;;3705:1;3702;3695:12;3664:2;3715:41;3749:6;3744:3;3739;3715:41;;;3387:375;;;;;;;;4247:2205;;4355:5;4343:9;4338:3;4334:19;4330:31;4327:2;;;4374:1;4371;4364:12;4327:2;4392:21;4407:5;4392:21;;;4383:30;-1:-1;4471:1;4502:49;4547:3;4527:9;4502:49;;;4478:74;;-1:-1;4621:2;4654:49;4699:3;4675:22;;;4654:49;;;4647:4;4640:5;4636:16;4629:75;4573:142;4780:2;4813:49;4858:3;4849:6;4838:9;4834:22;4813:49;;;4806:4;4799:5;4795:16;4788:75;4725:149;4933:2;4966:49;5011:3;5002:6;4991:9;4987:22;4966:49;;;4959:4;4952:5;4948:16;4941:75;4884:143;5089:3;5123:49;5168:3;5159:6;5148:9;5144:22;5123:49;;;5116:4;5109:5;5105:16;5098:75;5037:147;5246:3;5280:49;5325:3;5316:6;5305:9;5301:22;5280:49;;;5273:4;5266:5;5262:16;5255:75;5194:147;5395:3;5429:49;5474:3;5465:6;5454:9;5450:22;5429:49;;;5422:4;5415:5;5411:16;5404:75;5351:139;5544:3;5578:49;5623:3;5614:6;5603:9;5599:22;5578:49;;;5571:4;5564:5;5560:16;5553:75;5500:139;5706:3;5741:49;5786:3;5777:6;5766:9;5762:22;5741:49;;;5733:5;5726;5722:17;5715:76;5649:153;5852:3;5887:49;5932:3;5923:6;5912:9;5908:22;5887:49;;;5879:5;5872;5868:17;5861:76;5812:136;6036:3;6025:9;6021:19;6008:33;6061:18;6053:6;6050:30;6047:2;;;6093:1;6090;6083:12;6047:2;6129:54;6179:3;6170:6;6159:9;6155:22;6129:54;;;6121:5;6114;6110:17;6103:81;5958:237;6283:3;6272:9;6268:19;6255:33;6308:18;6300:6;6297:30;6294:2;;;6340:1;6337;6330:12;6294:2;6376:54;6426:3;6417:6;6406:9;6402:22;6376:54;;;6368:5;6361;6357:17;6350:81;6205:237;4321:2131;;;;;8828:241;;8932:2;8920:9;8911:7;8907:23;8903:32;8900:2;;;8948:1;8945;8938:12;8900:2;8983:1;9000:53;9045:7;9025:9;9000:53;;9076:366;;;9197:2;9185:9;9176:7;9172:23;9168:32;9165:2;;;9213:1;9210;9203:12;9165:2;9248:1;9265:53;9310:7;9290:9;9265:53;;;9255:63;;9227:97;9355:2;9373:53;9418:7;9409:6;9398:9;9394:22;9373:53;;;9363:63;;9334:98;9159:283;;;;;;9449:360;;;9567:2;9555:9;9546:7;9542:23;9538:32;9535:2;;;9583:1;9580;9573:12;9535:2;9618:1;9635:53;9680:7;9660:9;9635:53;;;9625:63;;9597:97;9725:2;9743:50;9785:7;9776:6;9765:9;9761:22;9743:50;;9816:415;;9964:2;9952:9;9943:7;9939:23;9935:32;9932:2;;;9980:1;9977;9970:12;9932:2;10015:31;;10066:18;10055:30;;10052:2;;;10098:1;10095;10088:12;10052:2;10118:97;10207:7;10198:6;10187:9;10183:22;10118:97;;10238:947;;;;10475:2;10463:9;10454:7;10450:23;10446:32;10443:2;;;10491:1;10488;10481:12;10443:2;10526:31;;10577:18;10566:30;;10563:2;;;10609:1;10606;10599:12;10563:2;10629:97;10718:7;10709:6;10698:9;10694:22;10629:97;;;10619:107;;10505:227;10791:2;10780:9;10776:18;10763:32;10815:18;10807:6;10804:30;10801:2;;;10847:1;10844;10837:12;10801:2;10867:78;10937:7;10928:6;10917:9;10913:22;10867:78;;;10857:88;;10742:209;11010:2;10999:9;10995:18;10982:32;11034:18;11026:6;11023:30;11020:2;;;11066:1;11063;11056:12;11020:2;11086:83;11161:7;11152:6;11141:9;11137:22;11086:83;;;11076:93;;10961:214;10437:748;;;;;;11192:811;;;;11404:2;11392:9;11383:7;11379:23;11375:32;11372:2;;;11420:1;11417;11410:12;11372:2;11455:31;;11506:18;11495:30;;11492:2;;;11538:1;11535;11528:12;11492:2;11558:97;11647:7;11638:6;11627:9;11623:22;11558:97;;;11548:107;;11434:227;11692:2;11710:53;11755:7;11746:6;11735:9;11731:22;11710:53;;12010:257;;12122:2;12110:9;12101:7;12097:23;12093:32;12090:2;;;12138:1;12135;12128:12;12090:2;12173:1;12190:61;12243:7;12223:9;12190:61;;12274:241;;12378:2;12366:9;12357:7;12353:23;12349:32;12346:2;;;12394:1;12391;12384:12;12346:2;12429:1;12446:53;12491:7;12471:9;12446:53;;12522:366;;;12643:2;12631:9;12622:7;12618:23;12614:32;12611:2;;;12659:1;12656;12649:12;12611:2;12694:1;12711:53;12756:7;12736:9;12711:53;;12895:615;;;;;13052:2;13040:9;13031:7;13027:23;13023:32;13020:2;;;13068:1;13065;13058:12;13020:2;13103:1;13120:53;13165:7;13145:9;13120:53;;;13110:63;;13082:97;13210:2;13228:53;13273:7;13264:6;13253:9;13249:22;13228:53;;;13218:63;;13189:98;13346:2;13335:9;13331:18;13318:32;13370:18;13362:6;13359:30;13356:2;;;13402:1;13399;13392:12;13356:2;13430:64;13486:7;13477:6;13466:9;13462:22;13430:64;;;13014:496;;;;-1:-1;13412:82;-1:-1;;;;13014:496;13517:595;;;;13664:2;13652:9;13643:7;13639:23;13635:32;13632:2;;;13680:1;13677;13670:12;13632:2;13715:1;13732:53;13777:7;13757:9;13732:53;;;13722:63;;13694:97;13822:2;13840:53;13885:7;13876:6;13865:9;13861:22;13840:53;;;13830:63;;13801:98;13958:2;13947:9;13943:18;13930:32;13982:18;13974:6;13971:30;13968:2;;;14014:1;14011;14004:12;13968:2;14034:62;14088:7;14079:6;14068:9;14064:22;14034:62;;14119:239;;14222:2;14210:9;14201:7;14197:23;14193:32;14190:2;;;14238:1;14235;14228:12;14190:2;14273:1;14290:52;14334:7;14314:9;14290:52;;14365:261;;14479:2;14467:9;14458:7;14454:23;14450:32;14447:2;;;14495:1;14492;14485:12;14447:2;14530:1;14547:63;14602:7;14582:9;14547:63;;14633:373;;14760:2;14748:9;14739:7;14735:23;14731:32;14728:2;;;14776:1;14773;14766:12;14728:2;14811:31;;14862:18;14851:30;;14848:2;;;14894:1;14891;14884:12;14848:2;14914:76;14982:7;14973:6;14962:9;14958:22;14914:76;;15013:1089;;;;;15232:3;15220:9;15211:7;15207:23;15203:33;15200:2;;;15249:1;15246;15239:12;15200:2;15284:31;;15335:18;15324:30;;15321:2;;;15367:1;15364;15357:12;15321:2;15387:76;15455:7;15446:6;15435:9;15431:22;15387:76;;;15377:86;;15263:206;15528:2;15517:9;15513:18;15500:32;15552:18;15544:6;15541:30;15538:2;;;15584:1;15581;15574:12;15538:2;15604:76;15672:7;15663:6;15652:9;15648:22;15604:76;;;15594:86;;15479:207;15745:2;15734:9;15730:18;15717:32;15769:18;15761:6;15758:30;15755:2;;;15801:1;15798;15791:12;15755:2;15821:62;15875:7;15866:6;15855:9;15851:22;15821:62;;;15811:72;;15696:193;15948:2;15937:9;15933:18;15920:32;15972:18;15964:6;15961:30;15958:2;;;16004:1;16001;15994:12;15958:2;16024:62;16078:7;16069:6;16058:9;16054:22;16024:62;;;16014:72;;15899:193;15194:908;;;;;;;;16109:727;;;;16279:2;16267:9;16258:7;16254:23;16250:32;16247:2;;;16295:1;16292;16285:12;16247:2;16330:31;;16381:18;16370:30;;16367:2;;;16413:1;16410;16403:12;16367:2;16433:76;16501:7;16492:6;16481:9;16477:22;16433:76;;;16423:86;;16309:206;16546:2;16564:53;16609:7;16600:6;16589:9;16585:22;16564:53;;17091:865;;;;;;;17284:3;17272:9;17263:7;17259:23;17255:33;17252:2;;;17301:1;17298;17291:12;17252:2;17336:1;17353:53;17398:7;17378:9;17353:53;;;17343:63;;17315:97;17443:2;17461:53;17506:7;17497:6;17486:9;17482:22;17461:53;;;17451:63;;17422:98;17579:2;17568:9;17564:18;17551:32;17603:18;17595:6;17592:30;17589:2;;;17635:1;17632;17625:12;17589:2;17663:64;17719:7;17710:6;17699:9;17695:22;17663:64;;;17645:82;;;;17530:203;17792:2;17781:9;17777:18;17764:32;17816:18;17808:6;17805:30;17802:2;;;17848:1;17845;17838:12;17802:2;17876:64;17932:7;17923:6;17912:9;17908:22;17876:64;;;17858:82;;;;17743:203;17246:710;;;;;;;;;17963:110;18036:31;18061:5;18036:31;;;18031:3;18024:44;18018:55;;;18080:101;18147:28;18169:5;18147:28;;18188:110;18261:31;18286:5;18261:31;;18305:107;18376:30;18400:5;18376:30;;18419:297;;18519:38;18551:5;18519:38;;;18574:6;18569:3;18562:19;18586:63;18642:6;18635:4;18630:3;18626:14;18619:4;18612:5;18608:16;18586:63;;;18681:29;18703:6;18681:29;;;18661:50;;;18674:4;18661:50;;18499:217;-1:-1;;;18499:217;19019:156;19112:57;19163:5;19112:57;;19482:296;19637:2;19625:15;;19674:66;19669:2;19660:12;;19653:88;19769:2;19760:12;;19618:160;19787:296;19942:2;19930:15;;19979:66;19974:2;19965:12;;19958:88;20074:2;20065:12;;19923:160;20092:296;20247:2;20235:15;;20284:66;20279:2;20270:12;;20263:88;20379:2;20370:12;;20228:160;20397:397;20552:2;20540:15;;20589:66;20584:2;20575:12;;20568:88;20690:66;20685:2;20676:12;;20669:88;20785:2;20776:12;;20533:261;20803:296;20958:2;20946:15;;20995:66;20990:2;20981:12;;20974:88;21090:2;21081:12;;20939:160;21108:296;21263:2;21251:15;;21300:66;21295:2;21286:12;;21279:88;21395:2;21386:12;;21244:160;21413:296;21568:2;21556:15;;21605:66;21600:2;21591:12;;21584:88;21700:2;21691:12;;21549:160;21718:296;21873:2;21861:15;;21910:66;21905:2;21896:12;;21889:88;22005:2;21996:12;;21854:160;22023:296;22178:2;22166:15;;22215:66;22210:2;22201:12;;22194:88;22310:2;22301:12;;22159:160;22328:296;22483:2;22471:15;;22520:66;22515:2;22506:12;;22499:88;22615:2;22606:12;;22464:160;22633:296;22788:2;22776:15;;22825:66;22820:2;22811:12;;22804:88;22920:2;22911:12;;22769:160;22938:296;23093:2;23081:15;;23130:66;23125:2;23116:12;;23109:88;23225:2;23216:12;;23074:160;23243:296;23398:2;23386:15;;23435:66;23430:2;23421:12;;23414:88;23530:2;23521:12;;23379:160;23548:296;23703:2;23691:15;;23740:66;23735:2;23726:12;;23719:88;23835:2;23826:12;;23684:160;23853:397;24008:2;23996:15;;24045:66;24040:2;24031:12;;24024:88;24146:66;24141:2;24132:12;;24125:88;24241:2;24232:12;;23989:261;24259:296;24414:2;24402:15;;24451:66;24446:2;24437:12;;24430:88;24546:2;24537:12;;24395:160;24564:296;24719:2;24707:15;;24756:66;24751:2;24742:12;;24735:88;24851:2;24842:12;;24700:160;24869:296;25024:2;25012:15;;25061:66;25056:2;25047:12;;25040:88;25156:2;25147:12;;25005:160;25174:296;25329:2;25317:15;;25366:66;25361:2;25352:12;;25345:88;25461:2;25452:12;;25310:160;25479:296;25634:2;25622:15;;25671:66;25666:2;25657:12;;25650:88;25766:2;25757:12;;25615:160;25784:296;25939:2;25927:15;;25976:66;25971:2;25962:12;;25955:88;26071:2;26062:12;;25920:160;26089:296;26244:2;26232:15;;26281:66;26276:2;26267:12;;26260:88;26376:2;26367:12;;26225:160;26394:397;26549:2;26537:15;;26586:66;26581:2;26572:12;;26565:88;26687:66;26682:2;26673:12;;26666:88;26782:2;26773:12;;26530:261;26800:296;26955:2;26943:15;;26992:66;26987:2;26978:12;;26971:88;27087:2;27078:12;;26936:160;27105:296;27260:2;27248:15;;27297:66;27292:2;27283:12;;27276:88;27392:2;27383:12;;27241:160;27410:296;27565:2;27553:15;;27602:66;27597:2;27588:12;;27581:88;27697:2;27688:12;;27546:160;27715:296;27870:2;27858:15;;27907:66;27902:2;27893:12;;27886:88;28002:2;27993:12;;27851:160;28020:296;28175:2;28163:15;;28212:66;28207:2;28198:12;;28191:88;28307:2;28298:12;;28156:160;28401:888;28629:22;;28542:4;28533:14;;;28663:61;28537:3;28629:22;28663:61;;;28562:174;28830:4;28823:5;28819:16;28813:23;28848:62;28904:4;28899:3;28895:14;28882:11;28848:62;;;28746:176;29006:4;28999:5;28995:16;28989:23;29024:62;29080:4;29075:3;29071:14;29058:11;29024:62;;;28932:166;29182:4;29175:5;29171:16;29165:23;29200:62;29256:4;29251:3;29247:14;29234:11;29200:62;;30355:815;30580:22;;30510:5;30501:15;;;30614:115;30505:3;30580:22;30614:115;;;30531:210;30818:4;30811:5;30807:16;30801:23;30836:116;30946:4;30941:3;30937:14;30924:11;30836:116;;;30751:213;31062:4;31055:5;31051:16;31045:23;31080:63;31136:5;31131:3;31127:15;31114:11;31080:63;;31238:695;31451:22;;31375:4;31366:14;;;31485:57;31370:3;31451:22;31485:57;;;31395:159;31635:4;31628:5;31624:16;31618:23;31653:62;31709:4;31704:3;31700:14;31687:11;31653:62;;;31564:163;31826:4;31819:5;31815:16;31809:23;31844:62;31900:4;31895:3;31891:14;31878:11;31844:62;;32057:104;32126:29;32149:5;32126:29;;32168:193;32276:2;32261:18;;32290:61;32265:9;32324:6;32290:61;;32368:1057;32700:3;32685:19;;32715:61;32689:9;32749:6;32715:61;;;32787:62;32845:2;32834:9;32830:18;32821:6;32787:62;;;32860;32918:2;32907:9;32903:18;32894:6;32860:62;;;32933;32991:2;32980:9;32976:18;32967:6;32933:62;;;33006:63;33064:3;33053:9;33049:19;33040:6;33006:63;;;33080;33138:3;33127:9;33123:19;33114:6;33080:63;;;33192:9;33186:4;33182:20;33176:3;33165:9;33161:19;33154:49;33217:62;33274:4;33265:6;33217:62;;;33209:70;;33328:9;33322:4;33318:20;33312:3;33301:9;33297:19;33290:49;33353:62;33410:4;33401:6;33353:62;;;33345:70;32671:754;-1:-1;;;;;;;;;;32671:754;33432:547;33624:2;33609:18;;33638:61;33613:9;33672:6;33638:61;;;33747:9;33741:4;33737:20;33732:2;33721:9;33717:18;33710:48;33772:62;33829:4;33820:6;33772:62;;;33764:70;;33882:9;33876:4;33872:20;33867:2;33856:9;33852:18;33845:48;33907:62;33964:4;33955:6;33907:62;;;33899:70;33595:384;-1:-1;;;;;33595:384;33986:181;34088:2;34073:18;;34102:55;34077:9;34130:6;34102:55;;34174:193;34282:2;34267:18;;34296:61;34271:9;34330:6;34296:61;;34374:479;34556:2;34541:18;;34570:61;34545:9;34604:6;34570:61;;;34642:62;34700:2;34689:9;34685:18;34676:6;34642:62;;;34752:9;34746:4;34742:20;34737:2;34726:9;34722:18;34715:48;34777:66;34838:4;34829:6;34777:66;;34860:378;35014:2;34999:18;;35028:61;35003:9;35062:6;35028:61;;;35137:9;35131:4;35127:20;35122:2;35111:9;35107:18;35100:48;35162:66;35223:4;35214:6;35162:66;;35245:489;35433:3;35418:19;;35448:61;35422:9;35482:6;35448:61;;;35520:58;35574:2;35563:9;35559:18;35550:6;35520:58;;;35589:62;35647:2;35636:9;35632:18;35623:6;35589:62;;;35662;35720:2;35709:9;35705:18;35696:6;35662:62;;35741:290;35875:2;35860:18;;35889:59;35864:9;35921:6;35889:59;;;35959:62;36017:2;36006:9;36002:18;35993:6;35959:62;;36038:269;36160:2;36174:47;;;36145:18;;36235:62;36145:18;36283:6;36235:62;;36314:233;36442:2;36427:18;;36456:81;36431:9;36510:6;36456:81;;36834:387;37015:2;37029:47;;;37000:18;;37090:121;37000:18;37090:121;;37228:387;37409:2;37423:47;;;37394:18;;37484:121;37394:18;37484:121;;37622:387;37803:2;37817:47;;;37788:18;;37878:121;37788:18;37878:121;;38016:387;38197:2;38211:47;;;38182:18;;38272:121;38182:18;38272:121;;38410:387;38591:2;38605:47;;;38576:18;;38666:121;38576:18;38666:121;;38804:387;38985:2;38999:47;;;38970:18;;39060:121;38970:18;39060:121;;39198:387;39379:2;39393:47;;;39364:18;;39454:121;39364:18;39454:121;;39592:387;39773:2;39787:47;;;39758:18;;39848:121;39758:18;39848:121;;39986:387;40167:2;40181:47;;;40152:18;;40242:121;40152:18;40242:121;;40380:387;40561:2;40575:47;;;40546:18;;40636:121;40546:18;40636:121;;40774:387;40955:2;40969:47;;;40940:18;;41030:121;40940:18;41030:121;;41168:387;41349:2;41363:47;;;41334:18;;41424:121;41334:18;41424:121;;41562:387;41743:2;41757:47;;;41728:18;;41818:121;41728:18;41818:121;;41956:387;42137:2;42151:47;;;42122:18;;42212:121;42122:18;42212:121;;42350:387;42531:2;42545:47;;;42516:18;;42606:121;42516:18;42606:121;;42744:387;42925:2;42939:47;;;42910:18;;43000:121;42910:18;43000:121;;43138:387;43319:2;43333:47;;;43304:18;;43394:121;43304:18;43394:121;;43532:387;43713:2;43727:47;;;43698:18;;43788:121;43698:18;43788:121;;43926:387;44107:2;44121:47;;;44092:18;;44182:121;44092:18;44182:121;;44320:387;44501:2;44515:47;;;44486:18;;44576:121;44486:18;44576:121;;44714:387;44895:2;44909:47;;;44880:18;;44970:121;44880:18;44970:121;;45108:387;45289:2;45303:47;;;45274:18;;45364:121;45274:18;45364:121;;45502:387;45683:2;45697:47;;;45668:18;;45758:121;45668:18;45758:121;;45896:387;46077:2;46091:47;;;46062:18;;46152:121;46062:18;46152:121;;46290:387;46471:2;46485:47;;;46456:18;;46546:121;46456:18;46546:121;;46684:387;46865:2;46879:47;;;46850:18;;46940:121;46850:18;46940:121;;47078:387;47259:2;47273:47;;;47244:18;;47334:121;47244:18;47334:121;;47472:387;47653:2;47667:47;;;47638:18;;47728:121;47638:18;47728:121;;47866:310;48032:3;48017:19;;48047:119;48021:9;48139:6;48047:119;;48183:338;48363:3;48348:19;;48378:133;48352:9;48484:6;48378:133;;48528:301;48690:2;48675:18;;48704:115;48679:9;48792:6;48704:115;;49036:256;49098:2;49092:9;49124:17;;;49199:18;49184:34;;49220:22;;;49181:62;49178:2;;;49256:1;49253;49246:12;49178:2;49272;49265:22;49076:216;;-1:-1;49076:216;49299:263;;49463:18;49455:6;49452:30;49449:2;;;49495:1;49492;49485:12;49449:2;-1:-1;49524:4;49512:17;;;49542:15;;49386:176;50118:254;;50257:18;50249:6;50246:30;50243:2;;;50289:1;50286;50279:12;50243:2;-1:-1;50362:4;50333;50310:17;;;;50329:9;50306:33;50352:15;;50180:192;50644:87;50714:12;;50698:33;50931:128;51011:42;51000:54;;50983:76;51066:92;51139:13;51132:21;;51115:43;51165:79;51234:5;51217:27;51251:151;51330:66;51319:78;;51302:100;51495:88;51573:4;51562:16;;51545:38;52154:135;;52253:31;52278:5;52253:31;;52297:145;52378:6;52373:3;52368;52355:30;-1:-1;52434:1;52416:16;;52409:27;52348:94;52451:268;52516:1;52523:101;52537:6;52534:1;52531:13;52523:101;;;52604:11;;;52598:18;52585:11;;;52578:39;52559:2;52552:10;52523:101;;;52639:6;52636:1;52633:13;52630:2;;;-1:-1;;52704:1;52686:16;;52679:27;52500:219;52727:97;52815:2;52795:14;52811:7;52791:28;;52775:49"
+ "object": "0x6080604052600436106101c15763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632624b2d981146101c6578063288cdc91146101f1578063297bb70b146102115780632ac126221461023e5780633683ef8e1461026b5780633c28d8611461028d5780633e228bae146102ba5780633fd3c997146102da5780634ac14782146103075780634d0ae546146103275780634f9559b11461034757806350dde190146103675780636070410814610387578063642f2eaf146103b457806364a3bc15146103d457806377fcce68146103f45780637b8e3514146104145780637e1d9808146104345780637e9d74dc1461045457806382c174d0146104815780638da5cb5b146104a157806393634702146104b6578063a3e20380146104d6578063b4be83d5146104f6578063bfc8bfce14610516578063c585bb9314610536578063c75e0a8114610556578063d46b02c314610583578063d9bfa73e146105a3578063db123b1a146105c3578063dd1c7d18146105e5578063e306f77914610605578063e5fa431b1461061a578063eea086ba1461063a578063f2fde38b1461064f578063ffa1ad741461066f575b600080fd5b3480156101d257600080fd5b506101db610684565b6040516101e89190614ccb565b60405180910390f35b3480156101fd57600080fd5b506101db61020c366004614196565b6107d8565b34801561021d57600080fd5b5061023161022c36600461409b565b6107ea565b6040516101e89190614f55565b34801561024a57600080fd5b5061025e610259366004614196565b61087a565b6040516101e89190614cbd565b34801561027757600080fd5b5061028b6102863660046141d3565b61088f565b005b34801561029957600080fd5b506102ad6102a8366004614307565b610968565b6040516101e89190614f63565b3480156102c657600080fd5b506102316102d53660046143c7565b610a54565b3480156102e657600080fd5b506102fa6102f5366004614296565b610c64565b6040516101e89190614d87565b34801561031357600080fd5b5061028b610322366004614066565b610c8c565b34801561033357600080fd5b5061023161034236600461409b565b610cc4565b34801561035357600080fd5b5061028b610362366004614196565b610d4b565b34801561037357600080fd5b5061023161038236600461409b565b610e6f565b34801561039357600080fd5b506103a76103a2366004614296565b610ef6565b6040516101e89190614bdd565b3480156103c057600080fd5b5061025e6103cf366004614196565b610f44565b3480156103e057600080fd5b506102316103ef3660046143c7565b610f59565b34801561040057600080fd5b5061028b61040f366004614036565b610fb3565b34801561042057600080fd5b5061025e61042f366004613ffc565b61105e565b34801561044057600080fd5b5061023161044f36600461412f565b61107e565b34801561046057600080fd5b5061047461046f366004614066565b61114f565b6040516101e89190614cac565b34801561048d57600080fd5b5061025e61049c3660046141b4565b6111ed565b3480156104ad57600080fd5b506103a761120d565b3480156104c257600080fd5b5061025e6104d136600461423b565b611229565b3480156104e257600080fd5b506102316104f136600461412f565b611a4f565b34801561050257600080fd5b506102316105113660046143c7565b611b5f565b34801561052257600080fd5b5061028b610531366004614410565b611be3565b34801561054257600080fd5b5061028b610551366004613fde565b611e7c565b34801561056257600080fd5b506105766105713660046142d2565b6120a7565b6040516101e89190614f72565b34801561058f57600080fd5b5061028b61059e3660046142d2565b6121a1565b3480156105af57600080fd5b506101db6105be366004613ffc565b6121cc565b3480156105cf57600080fd5b506105d86121e9565b6040516101e89190614d76565b3480156105f157600080fd5b5061023161060036600461412f565b612295565b34801561061157600080fd5b506101db61235b565b34801561062657600080fd5b5061023161063536600461412f565b612361565b34801561064657600080fd5b506103a7612435565b34801561065b57600080fd5b5061028b61066a366004613fde565b612451565b34801561067b57600080fd5b506105d8612502565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b602083106107a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161076b565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902081565b60036020526000908152604090205481565b6107f2613c04565b60006107fc613c04565b600091505b85518210156108715761085a868381518110151561081b57fe5b90602001906020020151868481518110151561083357fe5b90602001906020020151868581518110151561084b57fe5b90602001906020020151611b5f565b90506108668382612539565b600190910190610801565b50509392505050565b60046020526000908152604090205460ff1681565b6108ca848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750611229945050505050565b151561090b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e25565b60405180910390fd5b5050600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff9093168452919052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610970613c2d565b610978613c5c565b610980613c5c565b61016080880151610140808901919091528801519087015260006109a3886120a7565b92506109ae876120a7565b91506109b861259b565b90506109c488886125e4565b6109d8888885604001518560400151612640565b8051602001519094506109f290899085908490808b612704565b6020808501510151610a0b90889084908490808a612704565b610a248882856020015186604001518860000151612921565b610a3d8782846020015185604001518860200151612921565b610a49888883876129cd565b505050949350505050565b610a5c613c04565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000008082526060600483018181528851606485019081526020808b01516084870152958a015160a48601529189015160c4850152608089015160e485015260a089015161010485015260c089015161012485015260e0890151610144850152610100890151610164850152610120890151610184850152610140890180516101a486019081526101608b01516101c487015261018090525180516101e48601819052939591938493926024870192849261020489019291820191601f82010460005b81811015610b5f578351855260209485019490930192600101610b41565b50505050818103610160808401919091528c0151805180835260209283019291820191601f82010460005b81811015610ba8578351855260209485019490930192600101610b8a565b5050508b84525084810360209384019081528a518083529093918201918b81019190601f82010460005b81811015610bf0578351855260209485019490930192600101610bd2565b5060808a8b86038c305af4808015610c0f5760018114610c2d57610c50565b60008e52600060208f0152600060408f0152600060608f0152610c50565b8b518e5260208c015160208f015260408c015160408f015260608c015160608f01525b505050505050505050505050509392505050565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60005b8151811015610cc057610cb88282815181101515610ca957fe5b906020019060200201516121a1565b600101610c8f565b5050565b610ccc613c04565b6000610cd6613c04565b600091505b855182101561087157610d348683815181101515610cf557fe5b906020019060200201518684815181101515610d0d57fe5b906020019060200201518685815181101515610d2557fe5b90602001906020020151610f59565b9050610d408382612539565b600190910190610cdb565b600080600080610d5961259b565b935073ffffffffffffffffffffffffffffffffffffffff84163314610d7e5733610d81565b60005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600560209081526040808320938516835292905220549093506001860192509050808211610df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ea5565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526005602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610e60908690614ccb565b60405180910390a35050505050565b610e77613c04565b6000610e81613c04565b600091505b855182101561087157610edf8683815181101515610ea057fe5b906020019060200201518684815181101515610eb857fe5b906020019060200201518685815181101515610ed057fe5b90602001906020020151610a54565b9050610eeb8382612539565b600190910190610e86565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60086020526000908152604090205460ff1681565b610f61613c04565b610f6c848484611b5f565b60208101519091508314610fac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ec5565b9392505050565b6000610fbd61259b565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600760209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190611051908690614cbd565b60405180910390a3505050565b600760209081526000928352604080842090915290825290205460ff1681565b611086613c04565b6060600080611093613c04565b8760008151811015156110a257fe5b9060200190602002015161016001519350600092505b8751831015611144578388848151811015156110d057fe5b9060200190602002015161016001819052506110f0878660200151612bad565b915061111c888481518110151561110357fe5b9060200190602002015183888681518110151561084b57fe5b90506111288582612539565b868560200151141561113957611144565b6001909201916110b8565b505050509392505050565b6060600060606000845192508260405190808252806020026020018201604052801561119557816020015b611182613c5c565b81526020019060019003908161117a5790505b509150600090505b828110156111e5576111c585828151811015156111b657fe5b906020019060200201516120a7565b82828151811015156111d357fe5b6020908102909101015260010161119d565b509392505050565b600660209081526000928352604080842090915290825290205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008951111515611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e95565b61127b89612bef565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff8816106112dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614dd5565b8660ff1660098111156112ec57fe5b955060008660098111156112fc57fe5b1415611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e85565b600186600981111561134257fe5b141561138a57885115611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f45565b60009750611a41565b600286600981111561139857fe5b14156114d35788516041146113d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614d95565b8860008151811015156113e857fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061142889600163ffffffff612cb316565b935061143b89602163ffffffff612cb316565b925060018b868686604051600081526020016040526040516114609493929190614d26565b60206040516020810390808403906000865af1158015611484573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c81169082161499509250611a419050565b60038660098111156114e157fe5b1415611687578851604114611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614d95565b88600081518110151561153157fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061157189600163ffffffff612cb316565b935061158489602163ffffffff612cb316565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061162557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115e8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018290038220600083529101928390526114609450925089918991508890614d26565b600486600981111561169557fe5b14156116f4578851156116d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f45565b73ffffffffffffffffffffffffffffffffffffffff8a1633149750611a41565b600586600981111561170257fe5b14156117b5576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e9061175c908e908d90600401614d06565b602060405180830381600087803b15801561177657600080fd5b505af115801561178a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117ae9190810190614178565b9750611a41565b60068660098111156117c357fe5b1415611870576117d289612cfe565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526007602090815260408083209385168352929052205490915060ff16151561181a5760009750611a41565b6040517f9363470200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063936347029061175c908e908e908e90600401614cd9565b600786600981111561187e57fe5b14156118be5760008b815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff169750611a41565b60088660098111156118cc57fe5b1415611a0f57885160411461190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614d95565b88600081518110151561191c57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061195c89600163ffffffff612cb316565b935061196f89602163ffffffff612cb316565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083836020831061162557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115e8565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614dd5565b505050505050509392505050565b611a57613c04565b60606000806000611a66613c04565b886000815181101515611a7557fe5b9060200190602002015161014001519450600093505b8851841015611b5357848985815181101515611aa357fe5b6020908102909101015161014001528551611abf908990612bad565b9250611b028985815181101515611ad257fe5b9060200190602002015160a001518a86815181101515611aee57fe5b906020019060200201516080015185612d77565b9150611b2e8985815181101515611b1557fe5b90602001906020020151838987815181101515610ed057fe5b9050611b3a8682612539565b8551881415611b4857611b53565b600190930192611a8b565b50505050509392505050565b611b67613c04565b611b6f613c5c565b6000806000611b7d886120a7565b9350611b8761259b565b9250611b9b8860a001518560400151612bad565b9150611ba78783612d94565b9050611bb78885858a858b612704565b611bc18882612daa565b9450611bd888848660200151876040015189612921565b611144888487612e0a565b60095460009073ffffffffffffffffffffffffffffffffffffffff1615611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ed5565b611c79611c74888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843750612f1f945050505050565b613160565b60008181526008602052604090205490915060ff1615611cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e15565b73ffffffffffffffffffffffffffffffffffffffff86163314611d9657611d1d818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611229945050505050565b1515611d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f35565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600860205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af49150501515611e2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e45565b73ffffffffffffffffffffffffffffffffffffffff86163314611e7357600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b6002546000908190819073ffffffffffffffffffffffffffffffffffffffff163314611ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ee5565b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611f3b57600080fd5b505af1158015611f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f7391908101906142b4565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1690508015611ff8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614db5565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600a60205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c03194906120999084908790614d5b565b60405180910390a150505050565b6120af613c5c565b6120b8826132e0565b60208083018290526000918252600390526040908190205490820152608082015115156120ec5760015b60ff168152610f3f565b60a082015115156120fe5760026120e2565b60a08201516040820151106121145760056120e2565b61010082015142106121275760046120e2565b60208082015160009081526004909152604090205460ff161561214b5760066120e2565b610120820151825173ffffffffffffffffffffffffffffffffffffffff908116600090815260056020908152604080832060608801519094168352929052205411156121985760066120e2565b60038152919050565b6121a9613c5c565b6121b2826120a7565b90506121be82826132ee565b610cc0828260200151613405565b600560209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561228d5780601f106122625761010080835404028352916020019161228d565b820191906000526020600020905b81548152906001019060200180831161227057829003601f168201915b505050505081565b61229d613c04565b60606000806122aa613c04565b8760008151811015156122b957fe5b9060200190602002015161016001519350600092505b8751831015611144578388848151811015156122e757fe5b906020019060200201516101600181905250612307878660200151612bad565b9150612333888481518110151561231a57fe5b90602001906020020151838886815181101515610ed057fe5b905061233f8582612539565b868560200151141561235057611144565b6001909201916122cf565b60015481565b612369613c04565b60606000806000612378613c04565b88600081518110151561238757fe5b9060200190602002015161014001519450600093505b8851841015611b53578489858151811015156123b557fe5b60209081029091010151610140015285516123d1908990612bad565b92506123e48985815181101515611ad257fe5b915061241089858151811015156123f757fe5b9060200190602002015183898781518110151561084b57fe5b905061241c8682612539565b855188141561242a57611b53565b60019093019261239d565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146124a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ee5565b73ffffffffffffffffffffffffffffffffffffffff8116156124ff57600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b8151815161254791906134ac565b82526020808301519082015161255d91906134ac565b60208301526040808301519082015161257691906134ac565b60408301526060808301519082015161258f91906134ac565b60609092019190915250565b600954600090819073ffffffffffffffffffffffffffffffffffffffff16156125dc5760095473ffffffffffffffffffffffffffffffffffffffff166125de565b335b92915050565b6125f68260a001518260a001516134f6565b612608836080015183608001516134f6565b1015610cc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f25565b612648613c2d565b60008060008061265c8960a0015188612bad565b935061266c8860a0015187612bad565b925061267c8389608001516134f6565b61268a858a60a001516134f6565b116126ac578391506126a58860a00151896080015184612d77565b90506126c5565b8290506126c288608001518960a0015183612d77565b91505b6126cf8983612daa565b85526126db8882612daa565b60208087018290528651519101516126f39190612bad565b604086015250505050949350505050565b845160ff16600314612742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f05565b82151561277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e55565b606086015173ffffffffffffffffffffffffffffffffffffffff16156127ee57606086015173ffffffffffffffffffffffffffffffffffffffff1633146127ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f15565b602086015173ffffffffffffffffffffffffffffffffffffffff1615612879578373ffffffffffffffffffffffffffffffffffffffff16866020015173ffffffffffffffffffffffffffffffffffffffff16141515612879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614da5565b604085015115156128cf576128978560200151876000015183611229565b15156128cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614de5565b6128e2828760a001518860800151613551565b15612919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e35565b505050505050565b61292f8282602001516134ac565b600084815260036020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b9873ffffffffffffffffffffffffffffffffffffffff9788169897909616967f0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c371129966129be968f96339692959194909390614beb565b60405180910390a45050505050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612a775780601f10612a4c57610100808354040283529160200191612a77565b820191906000526020600020905b815481529060010190602001808311612a5a57829003601f168201915b50505050509050612a9f856101400151866000015186600001518560200151602001516135a2565b61014084015184518651845160200151612abb939291906135a2565b612ad485610140015186600001518585604001516135a2565b612af081866000015187604001518560000151604001516135a2565b612b0c81856000015186604001518560200151604001516135a2565b836040015173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff161415612b7657612b7181848760400151612b6c8660000151606001518760200151606001516134ac565b6135a2565b612ba6565b612b8e818487604001518560000151606001516135a2565b612ba6818486604001518560200151606001516135a2565b5050505050565b600082821115612be9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e05565b50900390565b6000808251111515612c2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e75565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612c5d57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515612cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614dc5565b50016020015190565b60006014825110151515612d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ef5565b612d4c826014845103613733565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000612d8c612d8685846134f6565b84613794565b949350505050565b6000818310612da35781610fac565b5090919050565b612db2613c04565b6020810182905260a08301516080840151612dce918491612d77565b815260a083015160c0840151612de5918491612d77565b604082015260a083015160e0840151612dff918491612d77565b606082015292915050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612eb45780601f10612e8957610100808354040283529160200191612eb4565b820191906000526020600020905b815481529060010190602001808311612e9757829003601f168201915b50505050509050612ed484610140015185600001518585600001516135a2565b612eed84610160015184866000015185602001516135a2565b612f05818560000151866040015185604001516135a2565b612f198184866040015185606001516135a2565b50505050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b6020831061304857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161300b565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b602083106130de57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016130a1565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822097825281019a909a525073ffffffffffffffffffffffffffffffffffffffff97909716968801969096525050606085015250506080909120919050565b60006040805190810160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250600154836040516020018084805190602001908083835b602083106131ec57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016131af565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250838101929092525060408051808403830181529281019081905282519293509182918401908083835b6020831061329057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613253565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912095945050505050565b60006125de611c74836137ab565b805160009060ff1660031461332f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f05565b606083015173ffffffffffffffffffffffffffffffffffffffff16156133a257606083015173ffffffffffffffffffffffffffffffffffffffff1633146133a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614f15565b6133aa61259b565b835190915073ffffffffffffffffffffffffffffffffffffffff808316911614613400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614df5565b505050565b6000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927fdc47b3613d9fe400085f6dbdc99453462279057e6207385042827ed6b1a62cf7926134a092339290614c6f565b60405180910390a45050565b6000828201838110156134eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e05565b8091505b5092915050565b60008083151561350957600091506134ef565b5082820282848281151561351957fe5b04146134eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e05565b60008060008480151561356057fe5b86850991508115156135755760009250610871565b61359461358583620f42406134f6565b61358f88876134f6565b613794565b6103e8109695505050505050565b60008060008311156129195785516003106135e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614eb5565b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600a90925260409091205473ffffffffffffffffffffffffffffffffffffffff16801515613672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e65565b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b8181101561370e57895181526020998a0199016136f6565b61020084858403866000895af1801515613726573d85fd5b5050505050505050505050565b600081601401835110151515613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614ef5565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60008082848115156137a257fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b60208310613a3357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016139f6565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b60208310613ace57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613a91565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310613b6957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613b2c565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b61012060405190810160405280613c42613c04565b8152602001613c4f613c04565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610fac8235615018565b6000601f82018313613c9957600080fd5b8135613cac613ca782614fa7565b614f80565b81815260209384019390925082018360005b83811015613cea5781358601613cd48882613e46565b8452506020928301929190910190600101613cbe565b5050505092915050565b6000601f82018313613d0557600080fd5b8135613d13613ca782614fa7565b81815260209384019390925082018360005b83811015613cea5781358601613d3b8882613e95565b8452506020928301929190910190600101613d25565b6000601f82018313613d6257600080fd5b8135613d70613ca782614fa7565b91508181835260208401935060208101905083856020840282011115613d9557600080fd5b60005b83811015613cea5781613dab8882613dd9565b8452506020928301929190910190600101613d98565b6000610fac8235615031565b6000610fac8251615031565b6000610fac8235615036565b6000610fac8235615039565b6000610fac8251615039565b600080601f83018413613e0f57600080fd5b50813567ffffffffffffffff811115613e2757600080fd5b602083019150836001820283011115613e3f57600080fd5b9250929050565b6000601f82018313613e5757600080fd5b8135613e65613ca782614fc8565b91508082526020830160208301858383011115613e8157600080fd5b613e8c83828461506f565b50505092915050565b60006101808284031215613ea857600080fd5b613eb3610180614f80565b90506000613ec18484613c7c565b8252506020613ed284848301613c7c565b6020830152506040613ee684828501613c7c565b6040830152506060613efa84828501613c7c565b6060830152506080613f0e84828501613dd9565b60808301525060a0613f2284828501613dd9565b60a08301525060c0613f3684828501613dd9565b60c08301525060e0613f4a84828501613dd9565b60e083015250610100613f5f84828501613dd9565b61010083015250610120613f7584828501613dd9565b6101208301525061014082013567ffffffffffffffff811115613f9757600080fd5b613fa384828501613e46565b6101408301525061016082013567ffffffffffffffff811115613fc557600080fd5b613fd184828501613e46565b6101608301525092915050565b600060208284031215613ff057600080fd5b6000612d8c8484613c7c565b6000806040838503121561400f57600080fd5b600061401b8585613c7c565b925050602061402c85828601613c7c565b9150509250929050565b6000806040838503121561404957600080fd5b60006140558585613c7c565b925050602061402c85828601613dc1565b60006020828403121561407857600080fd5b813567ffffffffffffffff81111561408f57600080fd5b612d8c84828501613cf4565b6000806000606084860312156140b057600080fd5b833567ffffffffffffffff8111156140c757600080fd5b6140d386828701613cf4565b935050602084013567ffffffffffffffff8111156140f057600080fd5b6140fc86828701613d51565b925050604084013567ffffffffffffffff81111561411957600080fd5b61412586828701613c88565b9150509250925092565b60008060006060848603121561414457600080fd5b833567ffffffffffffffff81111561415b57600080fd5b61416786828701613cf4565b93505060206140fc86828701613dd9565b60006020828403121561418a57600080fd5b6000612d8c8484613dcd565b6000602082840312156141a857600080fd5b6000612d8c8484613dd9565b600080604083850312156141c757600080fd5b600061401b8585613dd9565b600080600080606085870312156141e957600080fd5b60006141f58787613dd9565b945050602061420687828801613c7c565b935050604085013567ffffffffffffffff81111561422357600080fd5b61422f87828801613dfd565b95989497509550505050565b60008060006060848603121561425057600080fd5b600061425c8686613dd9565b935050602061426d86828701613c7c565b925050604084013567ffffffffffffffff81111561428a57600080fd5b61412586828701613e46565b6000602082840312156142a857600080fd5b6000612d8c8484613de5565b6000602082840312156142c657600080fd5b6000612d8c8484613df1565b6000602082840312156142e457600080fd5b813567ffffffffffffffff8111156142fb57600080fd5b612d8c84828501613e95565b6000806000806080858703121561431d57600080fd5b843567ffffffffffffffff81111561433457600080fd5b61434087828801613e95565b945050602085013567ffffffffffffffff81111561435d57600080fd5b61436987828801613e95565b935050604085013567ffffffffffffffff81111561438657600080fd5b61439287828801613e46565b925050606085013567ffffffffffffffff8111156143af57600080fd5b6143bb87828801613e46565b91505092959194509250565b6000806000606084860312156143dc57600080fd5b833567ffffffffffffffff8111156143f357600080fd5b6143ff86828701613e95565b935050602061426d86828701613dd9565b6000806000806000806080878903121561442957600080fd5b60006144358989613dd9565b965050602061444689828a01613c7c565b955050604087013567ffffffffffffffff81111561446357600080fd5b61446f89828a01613dfd565b9450945050606087013567ffffffffffffffff81111561448e57600080fd5b61449a89828a01613dfd565b92509250509295509295509295565b6144b281615018565b82525050565b60006144c382615014565b8084526020840193506144d58361500e565b60005b82811015614505576144eb868351614b9d565b6144f48261500e565b6060969096019591506001016144d8565b5093949350505050565b6144b281615031565b6144b281615036565b6144b281615039565b600061453582615014565b80845261454981602086016020860161507b565b614552816150a7565b9093016020019392505050565b6144b281615064565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b600d81527f494e56414c49445f54414b455200000000000000000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f414c52454144595f455849535453000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015260400190565b600d81527f494e56414c49445f4d414b455200000000000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f494e56414c49445f54585f484153480000000000000000000000000000000000602082015260400190565b601181527f494e56414c49445f5349474e4154555245000000000000000000000000000000602082015260400190565b600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015260400190565b601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015260400190565b601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b601781527f494e56414c49445f4e45575f4f524445525f45504f4348000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601281527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015260400190565b601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015260400190565b601181527f4c454e4754485f305f5245515549524544000000000000000000000000000000602082015260400190565b80516080830190614b2b8482614518565b506020820151614b3e6020850182614518565b506040820151614b516040850182614518565b506060820151612f196060850182614518565b8051610120830190614b768482614b1a565b506020820151614b896080850182614b1a565b506040820151612f19610100850182614518565b80516060830190614bae8482614bd4565b506020820151614bc16020850182614518565b506040820151612f196040850182614518565b6144b28161505e565b602081016125de82846144a9565b6101008101614bfa828b6144a9565b614c07602083018a6144a9565b614c146040830189614518565b614c216060830188614518565b614c2e6080830187614518565b614c3b60a0830186614518565b81810360c0830152614c4d818561452a565b905081810360e0830152614c61818461452a565b9a9950505050505050505050565b60608101614c7d82866144a9565b8181036020830152614c8f818561452a565b90508181036040830152614ca3818461452a565b95945050505050565b60208082528101610fac81846144b8565b602081016125de828461450f565b602081016125de8284614518565b60608101614ce78286614518565b614cf460208301856144a9565b8181036040830152614ca3818461452a565b60408101614d148285614518565b8181036020830152612d8c818461452a565b60808101614d348287614518565b614d416020830186614bd4565b614d4e6040830185614518565b614ca36060830184614518565b60408101614d698285614521565b610fac60208301846144a9565b60208082528101610fac818461452a565b602081016125de828461455f565b602080825281016125de81614568565b602080825281016125de81614598565b602080825281016125de816145c8565b602080825281016125de816145f8565b602080825281016125de8161464e565b602080825281016125de8161467e565b602080825281016125de816146ae565b602080825281016125de816146de565b602080825281016125de8161470e565b602080825281016125de8161473e565b602080825281016125de8161476e565b602080825281016125de8161479e565b602080825281016125de816147ce565b602080825281016125de816147fe565b602080825281016125de8161482e565b602080825281016125de81614884565b602080825281016125de816148b4565b602080825281016125de816148e4565b602080825281016125de81614914565b602080825281016125de81614944565b602080825281016125de81614974565b602080825281016125de816149a4565b602080825281016125de816149d4565b602080825281016125de81614a2a565b602080825281016125de81614a5a565b602080825281016125de81614a8a565b602080825281016125de81614aba565b602080825281016125de81614aea565b608081016125de8284614b1a565b61012081016125de8284614b64565b606081016125de8284614b9d565b60405181810167ffffffffffffffff81118282101715614f9f57600080fd5b604052919050565b600067ffffffffffffffff821115614fbe57600080fd5b5060209081020190565b600067ffffffffffffffff821115614fdf57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b60006125de82615018565b82818337506000910152565b60005b8381101561509657818101518382015260200161507e565b83811115612f195750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058207c5f5af88134aeeede952e9cdda7741efb0001f235c761ec650b76b231ab60266c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1C1 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x2624B2D9 DUP2 EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x211 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x26B JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x28D JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x3FD3C997 EQ PUSH2 0x2DA JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x307 JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x347 JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x367 JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0x387 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x3D4 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3F4 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x434 JUMPI DUP1 PUSH4 0x7E9D74DC EQ PUSH2 0x454 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x481 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x4A1 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x4B6 JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x4D6 JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x516 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x536 JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x556 JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x583 JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x5A3 JUMPI DUP1 PUSH4 0xDB123B1A EQ PUSH2 0x5C3 JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x5E5 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x605 JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x61A JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x63A JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x64F JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x66F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x684 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4CCB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x20C CALLDATASIZE PUSH1 0x4 PUSH2 0x4196 JUMP JUMPDEST PUSH2 0x7D8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x22C CALLDATASIZE PUSH1 0x4 PUSH2 0x409B JUMP JUMPDEST PUSH2 0x7EA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4F55 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x259 CALLDATASIZE PUSH1 0x4 PUSH2 0x4196 JUMP JUMPDEST PUSH2 0x87A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4CBD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0x41D3 JUMP JUMPDEST PUSH2 0x88F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x299 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AD PUSH2 0x2A8 CALLDATASIZE PUSH1 0x4 PUSH2 0x4307 JUMP JUMPDEST PUSH2 0x968 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4F63 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x2D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x43C7 JUMP JUMPDEST PUSH2 0xA54 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FA PUSH2 0x2F5 CALLDATASIZE PUSH1 0x4 PUSH2 0x4296 JUMP JUMPDEST PUSH2 0xC64 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D87 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x4066 JUMP JUMPDEST PUSH2 0xC8C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x342 CALLDATASIZE PUSH1 0x4 PUSH2 0x409B JUMP JUMPDEST PUSH2 0xCC4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x353 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x362 CALLDATASIZE PUSH1 0x4 PUSH2 0x4196 JUMP JUMPDEST PUSH2 0xD4B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x382 CALLDATASIZE PUSH1 0x4 PUSH2 0x409B JUMP JUMPDEST PUSH2 0xE6F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x393 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A7 PUSH2 0x3A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x4296 JUMP JUMPDEST PUSH2 0xEF6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4BDD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x3CF CALLDATASIZE PUSH1 0x4 PUSH2 0x4196 JUMP JUMPDEST PUSH2 0xF44 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x3EF CALLDATASIZE PUSH1 0x4 PUSH2 0x43C7 JUMP JUMPDEST PUSH2 0xF59 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x40F CALLDATASIZE PUSH1 0x4 PUSH2 0x4036 JUMP JUMPDEST PUSH2 0xFB3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x42F CALLDATASIZE PUSH1 0x4 PUSH2 0x3FFC JUMP JUMPDEST PUSH2 0x105E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x44F CALLDATASIZE PUSH1 0x4 PUSH2 0x412F JUMP JUMPDEST PUSH2 0x107E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x460 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x474 PUSH2 0x46F CALLDATASIZE PUSH1 0x4 PUSH2 0x4066 JUMP JUMPDEST PUSH2 0x114F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4CAC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x49C CALLDATASIZE PUSH1 0x4 PUSH2 0x41B4 JUMP JUMPDEST PUSH2 0x11ED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A7 PUSH2 0x120D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25E PUSH2 0x4D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x423B JUMP JUMPDEST PUSH2 0x1229 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x4F1 CALLDATASIZE PUSH1 0x4 PUSH2 0x412F JUMP JUMPDEST PUSH2 0x1A4F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x502 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x511 CALLDATASIZE PUSH1 0x4 PUSH2 0x43C7 JUMP JUMPDEST PUSH2 0x1B5F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x522 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x531 CALLDATASIZE PUSH1 0x4 PUSH2 0x4410 JUMP JUMPDEST PUSH2 0x1BE3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x542 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x551 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FDE JUMP JUMPDEST PUSH2 0x1E7C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x562 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x576 PUSH2 0x571 CALLDATASIZE PUSH1 0x4 PUSH2 0x42D2 JUMP JUMPDEST PUSH2 0x20A7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4F72 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x59E CALLDATASIZE PUSH1 0x4 PUSH2 0x42D2 JUMP JUMPDEST PUSH2 0x21A1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x5BE CALLDATASIZE PUSH1 0x4 PUSH2 0x3FFC JUMP JUMPDEST PUSH2 0x21CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5D8 PUSH2 0x21E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D76 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x600 CALLDATASIZE PUSH1 0x4 PUSH2 0x412F JUMP JUMPDEST PUSH2 0x2295 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x611 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x235B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x635 CALLDATASIZE PUSH1 0x4 PUSH2 0x412F JUMP JUMPDEST PUSH2 0x2361 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x646 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A7 PUSH2 0x2435 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x65B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x66A CALLDATASIZE PUSH1 0x4 PUSH2 0x3FDE JUMP JUMPDEST PUSH2 0x2451 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5D8 PUSH2 0x2502 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x7A8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x76B JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x7F2 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7FC PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x871 JUMPI PUSH2 0x85A DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x81B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x833 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x84B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1B5F JUMP JUMPDEST SWAP1 POP PUSH2 0x866 DUP4 DUP3 PUSH2 0x2539 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x801 JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x8CA DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1229 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x90B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E25 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x970 PUSH2 0x3C2D JUMP JUMPDEST PUSH2 0x978 PUSH2 0x3C5C JUMP JUMPDEST PUSH2 0x980 PUSH2 0x3C5C JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x9A3 DUP9 PUSH2 0x20A7 JUMP JUMPDEST SWAP3 POP PUSH2 0x9AE DUP8 PUSH2 0x20A7 JUMP JUMPDEST SWAP2 POP PUSH2 0x9B8 PUSH2 0x259B JUMP JUMPDEST SWAP1 POP PUSH2 0x9C4 DUP9 DUP9 PUSH2 0x25E4 JUMP JUMPDEST PUSH2 0x9D8 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2640 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x9F2 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x2704 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0xA0B SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x2704 JUMP JUMPDEST PUSH2 0xA24 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x2921 JUMP JUMPDEST PUSH2 0xA3D DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x2921 JUMP JUMPDEST PUSH2 0xA49 DUP9 DUP9 DUP4 DUP8 PUSH2 0x29CD JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA5C PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE PUSH1 0x60 PUSH1 0x4 DUP4 ADD DUP2 DUP2 MSTORE DUP9 MLOAD PUSH1 0x64 DUP6 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 DUP1 DUP12 ADD MLOAD PUSH1 0x84 DUP8 ADD MSTORE SWAP6 DUP11 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP2 DUP10 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE PUSH1 0x80 DUP10 ADD MLOAD PUSH1 0xE4 DUP6 ADD MSTORE PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x104 DUP6 ADD MSTORE PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x124 DUP6 ADD MSTORE PUSH1 0xE0 DUP10 ADD MLOAD PUSH2 0x144 DUP6 ADD MSTORE PUSH2 0x100 DUP10 ADD MLOAD PUSH2 0x164 DUP6 ADD MSTORE PUSH2 0x120 DUP10 ADD MLOAD PUSH2 0x184 DUP6 ADD MSTORE PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x1A4 DUP7 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP12 ADD MLOAD PUSH2 0x1C4 DUP8 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x1E4 DUP7 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP6 SWAP2 SWAP4 DUP5 SWAP4 SWAP3 PUSH1 0x24 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x204 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB5F JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB41 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP13 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xBA8 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xB8A JUMP JUMPDEST POP POP POP DUP12 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP11 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP12 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xBF0 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0xBD2 JUMP JUMPDEST POP PUSH1 0x80 DUP11 DUP12 DUP7 SUB DUP13 ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0xC0F JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xC2D JUMPI PUSH2 0xC50 JUMP JUMPDEST PUSH1 0x0 DUP15 MSTORE PUSH1 0x0 PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP16 ADD MSTORE PUSH2 0xC50 JUMP JUMPDEST DUP12 MLOAD DUP15 MSTORE PUSH1 0x20 DUP13 ADD MLOAD PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x40 DUP13 ADD MLOAD PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x60 DUP13 ADD MLOAD PUSH1 0x60 DUP16 ADD MSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xCC0 JUMPI PUSH2 0xCB8 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCA9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x21A1 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC8F JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xCCC PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCD6 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x871 JUMPI PUSH2 0xD34 DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCF5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD0D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD25 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xF59 JUMP JUMPDEST SWAP1 POP PUSH2 0xD40 DUP4 DUP3 PUSH2 0x2539 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xCDB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xD59 PUSH2 0x259B JUMP JUMPDEST SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ PUSH2 0xD7E JUMPI CALLER PUSH2 0xD81 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH1 0x1 DUP7 ADD SWAP3 POP SWAP1 POP DUP1 DUP3 GT PUSH2 0xDF8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EA5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xE60 SWAP1 DUP7 SWAP1 PUSH2 0x4CCB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE77 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE81 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP6 MLOAD DUP3 LT ISZERO PUSH2 0x871 JUMPI PUSH2 0xEDF DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEA0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEB8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xED0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA54 JUMP JUMPDEST SWAP1 POP PUSH2 0xEEB DUP4 DUP3 PUSH2 0x2539 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xE86 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF61 PUSH2 0x3C04 JUMP JUMPDEST PUSH2 0xF6C DUP5 DUP5 DUP5 PUSH2 0x1B5F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD SWAP1 SWAP2 POP DUP4 EQ PUSH2 0xFAC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EC5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFBD PUSH2 0x259B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0x1051 SWAP1 DUP7 SWAP1 PUSH2 0x4CBD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x1086 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x1093 PUSH2 0x3C04 JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10A2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1144 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10D0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x10F0 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2BAD JUMP JUMPDEST SWAP2 POP PUSH2 0x111C DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1103 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x84B JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1128 DUP6 DUP3 PUSH2 0x2539 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1139 JUMPI PUSH2 0x1144 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x10B8 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP5 MLOAD SWAP3 POP DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1195 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1182 PUSH2 0x3C5C JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x117A JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x11E5 JUMPI PUSH2 0x11C5 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11B6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x20A7 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11D3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x119D JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0x1272 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E95 JUMP JUMPDEST PUSH2 0x127B DUP10 PUSH2 0x2BEF JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0x12DD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DD5 JUMP JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x12EC JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x12FC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1334 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E85 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1342 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x138A JUMPI DUP9 MLOAD ISZERO PUSH2 0x1381 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F45 JUMP JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1398 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x14D3 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x13D9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4D95 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13E8 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1428 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x143B DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1460 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4D26 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1484 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x1A41 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x14E1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1687 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1522 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4D95 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1531 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1571 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1584 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1625 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15E8 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x1460 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4D26 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1695 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x16F4 JUMPI DUP9 MLOAD ISZERO PUSH2 0x16D4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F45 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1702 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x17B5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x175C SWAP1 DUP15 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4D06 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1776 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x178A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x17AE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4178 JUMP JUMPDEST SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1870 JUMPI PUSH2 0x17D2 DUP10 PUSH2 0x2CFE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x181A JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x175C SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x4CD9 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x187E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x18BE JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x1A41 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x18CC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1A0F JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x190D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4D95 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x191C JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x195C DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x196F DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2CB3 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x1625 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DD5 JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1A57 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1A66 PUSH2 0x3C04 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A75 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1B53 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AA3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x1ABF SWAP1 DUP10 SWAP1 PUSH2 0x2BAD JUMP JUMPDEST SWAP3 POP PUSH2 0x1B02 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AD2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AEE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2D77 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B2E DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B15 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xED0 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1B3A DUP7 DUP3 PUSH2 0x2539 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x1B48 JUMPI PUSH2 0x1B53 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1A8B JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1B67 PUSH2 0x3C04 JUMP JUMPDEST PUSH2 0x1B6F PUSH2 0x3C5C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1B7D DUP9 PUSH2 0x20A7 JUMP JUMPDEST SWAP4 POP PUSH2 0x1B87 PUSH2 0x259B JUMP JUMPDEST SWAP3 POP PUSH2 0x1B9B DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2BAD JUMP JUMPDEST SWAP2 POP PUSH2 0x1BA7 DUP8 DUP4 PUSH2 0x2D94 JUMP JUMPDEST SWAP1 POP PUSH2 0x1BB7 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x2704 JUMP JUMPDEST PUSH2 0x1BC1 DUP9 DUP3 PUSH2 0x2DAA JUMP JUMPDEST SWAP5 POP PUSH2 0x1BD8 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x2921 JUMP JUMPDEST PUSH2 0x1144 DUP9 DUP5 DUP8 PUSH2 0x2E0A JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x1C36 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4ED5 JUMP JUMPDEST PUSH2 0x1C79 PUSH2 0x1C74 DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x2F1F SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3160 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x1CC5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1D96 JUMPI PUSH2 0x1D1D DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1229 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1D55 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F35 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x1E2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E45 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1E73 JUMPI PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1ED4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EE5 JUMP JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F3B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F4F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1F73 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x42B4 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x1FF8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DB5 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x2099 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x4D5B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH2 0x20AF PUSH2 0x3C5C JUMP JUMPDEST PUSH2 0x20B8 DUP3 PUSH2 0x32E0 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x20EC JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0xF3F JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x20FE JUMPI PUSH1 0x2 PUSH2 0x20E2 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MLOAD LT PUSH2 0x2114 JUMPI PUSH1 0x5 PUSH2 0x20E2 JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x2127 JUMPI PUSH1 0x4 PUSH2 0x20E2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x214B JUMPI PUSH1 0x6 PUSH2 0x20E2 JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x2198 JUMPI PUSH1 0x6 PUSH2 0x20E2 JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x21A9 PUSH2 0x3C5C JUMP JUMPDEST PUSH2 0x21B2 DUP3 PUSH2 0x20A7 JUMP JUMPDEST SWAP1 POP PUSH2 0x21BE DUP3 DUP3 PUSH2 0x32EE JUMP JUMPDEST PUSH2 0xCC0 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3405 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x228D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2262 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x228D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2270 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x229D PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x22AA PUSH2 0x3C04 JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x22B9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1144 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x22E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x2307 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2BAD JUMP JUMPDEST SWAP2 POP PUSH2 0x2333 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x231A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xED0 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x233F DUP6 DUP3 PUSH2 0x2539 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x2350 JUMPI PUSH2 0x1144 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x22CF JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2369 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2378 PUSH2 0x3C04 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2387 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1B53 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x23B5 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x23D1 SWAP1 DUP10 SWAP1 PUSH2 0x2BAD JUMP JUMPDEST SWAP3 POP PUSH2 0x23E4 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AD2 JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x2410 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x23F7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x84B JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x241C DUP7 DUP3 PUSH2 0x2539 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x242A JUMPI PUSH2 0x1B53 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x239D JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x24A2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EE5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x24FF JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x2547 SWAP2 SWAP1 PUSH2 0x34AC JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x255D SWAP2 SWAP1 PUSH2 0x34AC JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2576 SWAP2 SWAP1 PUSH2 0x34AC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x258F SWAP2 SWAP1 PUSH2 0x34AC JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x25DC JUMPI PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x25DE JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x25F6 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x2608 DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x34F6 JUMP JUMPDEST LT ISZERO PUSH2 0xCC0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F25 JUMP JUMPDEST PUSH2 0x2648 PUSH2 0x3C2D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x265C DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2BAD JUMP JUMPDEST SWAP4 POP PUSH2 0x266C DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2BAD JUMP JUMPDEST SWAP3 POP PUSH2 0x267C DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x268A DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x34F6 JUMP JUMPDEST GT PUSH2 0x26AC JUMPI DUP4 SWAP2 POP PUSH2 0x26A5 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2D77 JUMP JUMPDEST SWAP1 POP PUSH2 0x26C5 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x26C2 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2D77 JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x26CF DUP10 DUP4 PUSH2 0x2DAA JUMP JUMPDEST DUP6 MSTORE PUSH2 0x26DB DUP9 DUP3 PUSH2 0x2DAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x26F3 SWAP2 SWAP1 PUSH2 0x2BAD JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x2742 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F05 JUMP JUMPDEST DUP3 ISZERO ISZERO PUSH2 0x277B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E55 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x27EE JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x27EE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2879 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2879 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DA5 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x28CF JUMPI PUSH2 0x2897 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x1229 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x28CF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DE5 JUMP JUMPDEST PUSH2 0x28E2 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x3551 JUMP JUMPDEST ISZERO PUSH2 0x2919 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E35 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x292F DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x34AC JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xBCC4C97732E47D9946F229EDB95F5B6323F601300E4690DE719993F3C371129 SWAP7 PUSH2 0x29BE SWAP7 DUP16 SWAP7 CALLER SWAP7 SWAP3 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 SWAP1 PUSH2 0x4BEB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2A77 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A4C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2A77 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A5A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2A9F DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x140 DUP5 ADD MLOAD DUP5 MLOAD DUP7 MLOAD DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x2ABB SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2AD4 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2AF0 DUP2 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2B0C DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST DUP4 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2B76 JUMPI PUSH2 0x2B71 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD PUSH2 0x2B6C DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34AC JUMP JUMPDEST PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2BA6 JUMP JUMPDEST PUSH2 0x2B8E DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2BA6 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2BE9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E05 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x2C2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E75 JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2C5D JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2CF5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DC5 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2D3E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EF5 JUMP JUMPDEST PUSH2 0x2D4C DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x3733 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D8C PUSH2 0x2D86 DUP6 DUP5 PUSH2 0x34F6 JUMP JUMPDEST DUP5 PUSH2 0x3794 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2DA3 JUMPI DUP2 PUSH2 0xFAC JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2DB2 PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x2DCE SWAP2 DUP5 SWAP2 PUSH2 0x2D77 JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2DE5 SWAP2 DUP5 SWAP2 PUSH2 0x2D77 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xE0 DUP5 ADD MLOAD PUSH2 0x2DFF SWAP2 DUP5 SWAP2 PUSH2 0x2D77 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2EB4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2E89 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2EB4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2E97 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2ED4 DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2EED DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2F05 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST PUSH2 0x2F19 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x35A2 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3048 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x300B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x30DE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x30A1 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 SWAP8 DUP3 MSTORE DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 SWAP1 SWAP8 AND SWAP7 DUP9 ADD SWAP7 SWAP1 SWAP7 MSTORE POP POP PUSH1 0x60 DUP6 ADD MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 SLOAD DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x31EC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x31AF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP DUP4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP5 SUB DUP4 ADD DUP2 MSTORE SWAP3 DUP2 ADD SWAP1 DUP2 SWAP1 MSTORE DUP3 MLOAD SWAP3 SWAP4 POP SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3290 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3253 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x25DE PUSH2 0x1C74 DUP4 PUSH2 0x37AB JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x332F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F05 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x33A2 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x33A2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4F15 JUMP JUMPDEST PUSH2 0x33AA PUSH2 0x259B JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x3400 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4DF5 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xDC47B3613D9FE400085F6DBDC99453462279057E6207385042827ED6B1A62CF7 SWAP3 PUSH2 0x34A0 SWAP3 CALLER SWAP3 SWAP1 PUSH2 0x4C6F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x34EB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E05 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x3509 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x34EF JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3519 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x34EB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E05 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x3560 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x3575 JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x871 JUMP JUMPDEST PUSH2 0x3594 PUSH2 0x3585 DUP4 PUSH3 0xF4240 PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x358F DUP9 DUP8 PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x3794 JUMP JUMPDEST PUSH2 0x3E8 LT SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x2919 JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x35E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EB5 JUMP JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x3672 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4E65 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x370E JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x36F6 JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x3726 JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x3775 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x902 SWAP1 PUSH2 0x4EF5 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x37A2 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3A33 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x39F6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3ACE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3A91 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3B69 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B2C JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x3C42 PUSH2 0x3C04 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3C4F PUSH2 0x3C04 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 CALLDATALOAD PUSH2 0x5018 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3C99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3CAC PUSH2 0x3CA7 DUP3 PUSH2 0x4FA7 JUMP JUMPDEST PUSH2 0x4F80 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3CEA JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3CD4 DUP9 DUP3 PUSH2 0x3E46 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3CBE JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D05 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D13 PUSH2 0x3CA7 DUP3 PUSH2 0x4FA7 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3CEA JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3D3B DUP9 DUP3 PUSH2 0x3E95 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D25 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D70 PUSH2 0x3CA7 DUP3 PUSH2 0x4FA7 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3D95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3CEA JUMPI DUP2 PUSH2 0x3DAB DUP9 DUP3 PUSH2 0x3DD9 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D98 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 CALLDATALOAD PUSH2 0x5031 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 MLOAD PUSH2 0x5031 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 CALLDATALOAD PUSH2 0x5036 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 CALLDATALOAD PUSH2 0x5039 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFAC DUP3 MLOAD PUSH2 0x5039 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x3E0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x3E3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3E57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3E65 PUSH2 0x3CA7 DUP3 PUSH2 0x4FC8 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3E81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E8C DUP4 DUP3 DUP5 PUSH2 0x506F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3EA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EB3 PUSH2 0x180 PUSH2 0x4F80 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3EC1 DUP5 DUP5 PUSH2 0x3C7C JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3ED2 DUP5 DUP5 DUP4 ADD PUSH2 0x3C7C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3EE6 DUP5 DUP3 DUP6 ADD PUSH2 0x3C7C JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3EFA DUP5 DUP3 DUP6 ADD PUSH2 0x3C7C JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3F0E DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3F22 DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3F36 DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x3F4A DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x3F5F DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3F75 DUP5 DUP3 DUP6 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3F97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FA3 DUP5 DUP3 DUP6 ADD PUSH2 0x3E46 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FD1 DUP5 DUP3 DUP6 ADD PUSH2 0x3E46 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3FF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3C7C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x400F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x401B DUP6 DUP6 PUSH2 0x3C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x402C DUP6 DUP3 DUP7 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4049 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4055 DUP6 DUP6 PUSH2 0x3C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x402C DUP6 DUP3 DUP7 ADD PUSH2 0x3DC1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4078 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x408F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2D8C DUP5 DUP3 DUP6 ADD PUSH2 0x3CF4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x40B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x40C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40D3 DUP7 DUP3 DUP8 ADD PUSH2 0x3CF4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x40F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40FC DUP7 DUP3 DUP8 ADD PUSH2 0x3D51 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4119 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4125 DUP7 DUP3 DUP8 ADD PUSH2 0x3C88 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x415B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4167 DUP7 DUP3 DUP8 ADD PUSH2 0x3CF4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x40FC DUP7 DUP3 DUP8 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x418A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3DCD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x41A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x41C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x401B DUP6 DUP6 PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x41E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x41F5 DUP8 DUP8 PUSH2 0x3DD9 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x4206 DUP8 DUP3 DUP9 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4223 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x422F DUP8 DUP3 DUP9 ADD PUSH2 0x3DFD JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4250 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x425C DUP7 DUP7 PUSH2 0x3DD9 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x426D DUP7 DUP3 DUP8 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x428A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4125 DUP7 DUP3 DUP8 ADD PUSH2 0x3E46 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x42A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3DE5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x42C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP5 DUP5 PUSH2 0x3DF1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x42E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x42FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2D8C DUP5 DUP3 DUP6 ADD PUSH2 0x3E95 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x431D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4340 DUP8 DUP3 DUP9 ADD PUSH2 0x3E95 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x435D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4369 DUP8 DUP3 DUP9 ADD PUSH2 0x3E95 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4386 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4392 DUP8 DUP3 DUP9 ADD PUSH2 0x3E46 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43BB DUP8 DUP3 DUP9 ADD PUSH2 0x3E46 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x43DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43FF DUP7 DUP3 DUP8 ADD PUSH2 0x3E95 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x426D DUP7 DUP3 DUP8 ADD PUSH2 0x3DD9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4429 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4435 DUP10 DUP10 PUSH2 0x3DD9 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x4446 DUP10 DUP3 DUP11 ADD PUSH2 0x3C7C JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x446F DUP10 DUP3 DUP11 ADD PUSH2 0x3DFD JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x448E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x449A DUP10 DUP3 DUP11 ADD PUSH2 0x3DFD JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5018 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x44C3 DUP3 PUSH2 0x5014 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x44D5 DUP4 PUSH2 0x500E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4505 JUMPI PUSH2 0x44EB DUP7 DUP4 MLOAD PUSH2 0x4B9D JUMP JUMPDEST PUSH2 0x44F4 DUP3 PUSH2 0x500E JUMP JUMPDEST PUSH1 0x60 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x44D8 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5031 JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5036 JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5039 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4535 DUP3 PUSH2 0x5014 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x4549 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x507B JUMP JUMPDEST PUSH2 0x4552 DUP2 PUSH2 0x50A7 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x5064 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4E45575F4F524445525F45504F4348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x4B2B DUP5 DUP3 PUSH2 0x4518 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4B3E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x4B51 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x2F19 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4B76 DUP5 DUP3 PUSH2 0x4B1A JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4B89 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x4B1A JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2F19 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x4BAE DUP5 DUP3 PUSH2 0x4BD4 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4BC1 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2F19 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x44B2 DUP2 PUSH2 0x505E JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x44A9 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x4BFA DUP3 DUP12 PUSH2 0x44A9 JUMP JUMPDEST PUSH2 0x4C07 PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x44A9 JUMP JUMPDEST PUSH2 0x4C14 PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4C21 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4C2E PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4C3B PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x4518 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x4C4D DUP2 DUP6 PUSH2 0x452A JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x4C61 DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4C7D DUP3 DUP7 PUSH2 0x44A9 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4C8F DUP2 DUP6 PUSH2 0x452A JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4CA3 DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xFAC DUP2 DUP5 PUSH2 0x44B8 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x450F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x4518 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4CE7 DUP3 DUP7 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4CF4 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x44A9 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4CA3 DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4D14 DUP3 DUP6 PUSH2 0x4518 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2D8C DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x4D34 DUP3 DUP8 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4D41 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x4BD4 JUMP JUMPDEST PUSH2 0x4D4E PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x4518 JUMP JUMPDEST PUSH2 0x4CA3 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x4518 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4D69 DUP3 DUP6 PUSH2 0x4521 JUMP JUMPDEST PUSH2 0xFAC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x44A9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xFAC DUP2 DUP5 PUSH2 0x452A JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x455F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4568 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4598 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x45C8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x45F8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x464E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x467E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x46AE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x470E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x473E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x476E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x479E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x47CE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x47FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x482E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4884 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x48B4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x48E4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4914 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4944 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4974 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x49A4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x49D4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4A2A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4A5A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4A8A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4ABA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x25DE DUP2 PUSH2 0x4AEA JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x4B1A JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x4B64 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x25DE DUP3 DUP5 PUSH2 0x4B9D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x4F9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4FBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4FDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x25DE DUP3 PUSH2 0x5018 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5096 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x507E JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2F19 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH29 0x5F5AF88134AEEEDE952E9CDDA7741EFB0001F235C761EC650B76B231AB PUSH1 0x26 PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
+ "sourceMap": "931:616:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;970:221:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;970:221:17;;;;;;;;;;;;;;;;;;;;1198:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1198:42:4;;;;;;;;;13371:572:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13371:572:8;;;;;;;;;;;;;;;;;1288:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1288:42:4;;;;;;;;;;;;;;;;;1493:360:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1493:360:6;;;;;;;;;;;1791:2557:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1791:2557:5;;;;;;;;;;;;;;;;;2081:10811:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2081:10811:8;;;;;;;;;976:51:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;976:51:3;;;;;;;;;;;;;;;;;24537:185:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24537:185:8;;;;;;;;;14423:584;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14423:584:8;;;;;;;;;1942:1012:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1942:1012:4;;;;;;;;;15566:586:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15566:586:8;;;;;;;;;2092:154:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2092:154:3;;;;;;;;;;;;;;;;;968:45:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;968:45:7;;;;;;;;;1160:495:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1160:495:8;;;;;;;;;2090:391:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2090:391:6;;;;;;;;;1087:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1087:71:6;;;;;;;;;16540:1432:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16540:1432:8;;;;;;;;;24916:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24916:400:8;;;;;;;;;;;;;;;;;967:63:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;967:63:6;;;;;;;;;258:20:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:29;;;;2853:6652:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2853:6652:6;;;;;;;;;22554:1848:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22554:1848:8;;;;;;;;;3271:1327:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3271:1327:4;;;;;;;;;1710:1456:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1710:1456:7;;;;;;;;;1236:666:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1236:666:3;;;;;;;;;5425:2261:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5425:2261:4;;;;;;;;;;;;;;;;;4829:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4829:322:4;;;;;;;;;1551:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1551:67:4;;;;;;;;;857:27:16;;8:9:-1;5:2;;;30:1;27;20:12;5:2;857:27:16;;;;;;;;;;;;18429:1442:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18429:1442:8;;;;;;;;;1298:33:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1298:33:17;;;;20259:1834:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20259:1834:8;;;;;;;;;1065:36:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1065:36:7;;;;500:167:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:29;;;;;;;;;1113:46:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1113:46:2;;;;970:221:17;1042:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1042:148:17;;;;;;;;1032:159;;1042:148;;;;;1032:159;;;;1042:148;1032:159;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1032:159:17;;;;;;;;;;;;;;;;970:221;:::o;1198:42:4:-;;;;;;;;;;;;;:::o;13371:572:8:-;13557:35;;:::i;:::-;13613:9;13666:36;;:::i;:::-;13625:1;13613:13;;13608:296;13632:6;:13;13628:1;:17;13608:296;;;13705:123;13732:6;13739:1;13732:9;;;;;;;;;;;;;;;;;;13759:21;13781:1;13759:24;;;;;;;;;;;;;;;;;;13801:10;13812:1;13801:13;;;;;;;;;;;;;;;;;;13705:9;:123::i;:::-;13666:162;;13842:51;13857:16;13875:17;13842:14;:51::i;:::-;13647:3;;;;;13608:296;;;13371:572;;;;;;;:::o;1288:42:4:-;;;;;;;;;;;;;;;:::o;1493:360:6:-;1646:110;1680:4;1702:13;1733:9;;1646:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1646:16:6;;-1:-1:-1;;;;;1646:110:6:i;:::-;1625:174;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1809:15:6;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;:37;;;;1842:4;1809:37;;;1493:360::o;1791:2557:5:-;2006:59;;:::i;:::-;2471:39;;:::i;:::-;2546:40;;:::i;:::-;2335:24;;;;;2307:25;;;;:52;;;;2397:24;;;2369:25;;;:52;2655:20;2513:23;2335:9;2513:12;:23::i;:::-;2471:65;;2589:24;2602:10;2589:12;:24::i;:::-;2546:67;;2678:26;:24;:26::i;:::-;2655:49;;2767:39;2784:9;2795:10;2767:16;:39::i;:::-;2883:195;2924:9;2947:10;2971:13;:41;;;3026:14;:42;;;2883:27;:195::i;:::-;3228:23;;:46;;;2862:216;;-1:-1:-1;3123:248:5;;3152:9;;3175:13;;3202:12;;3228:46;3348:13;3123:15;:248::i;:::-;3488:24;;;;;:47;;3381:253;;3410:10;;3434:14;;3462:12;;3488:47;3610:14;3381:15;:253::i;:::-;3678:205;3709:9;3732:12;3758:13;:23;;;3795:13;:41;;;3850:18;:23;;;3678:17;:205::i;:::-;3893:209;3924:10;3948:12;3974:14;:24;;;4012:14;:42;;;4068:18;:24;;;3893:17;:209::i;:::-;4171:134;4204:9;4227:10;4251:12;4277:18;4171:19;:134::i;:::-;1791:2557;;;;;;;;;:::o;2081:10811:8:-;2252:30;;:::i;:::-;6147:4;6141:11;;5368:23;6165:42;;;6573:4;6262:3;6241:25;;7260:59;;;7586:19;;6552:26;;;7566:40;;;7374:4;7699:23;;;7693:30;7669:22;;;7662:62;7795:23;;;7789:30;7765:22;;;7758:62;7898:23;;;7892:30;7868:22;;;7861:62;8013:4;7995:23;;7989:30;7965:22;;;7958:62;8113:4;8095:23;;8089:30;8065:22;;;8058:62;8213:4;8195:23;;8189:30;8165:22;;;8158:62;8311:4;8293:23;;8287:30;8263:22;;;8256:62;8410:5;8392:24;;8386:31;8361:23;;;8354:64;8515:5;8497:24;;8491:31;8466:23;;;8459:64;8603:5;8585:24;;8579:31;;8554:23;;;8547:64;;;8711:5;8693:24;;8687:31;8662:23;;;8655:64;8795:5;8922:74;;9084:24;9156:19;;8778:23;;;9360:34;;;5368:23;;6241:25;;;;6552:26;7352:27;;;;6552:26;;9422:22;;;;9204:23;;;;9280:4;9261:24;;9257:35;5341:24;9514:237;9537:13;9534:1;9531:20;9514:237;;;9607:19;;9587:40;;9676:4;9659:22;;;;9714:23;;;;9565:1;9558:9;9514:237;;;-1:-1:-1;;;;9861:31:8;;;9845:13;9826:33;;;9819:74;;;;9987:17;;9981:24;10053:19;;10257:34;;;9853:4;10319:22;;;;10101:23;;;;10177:4;10158:24;;10154:35;10426:1;10412:237;10435:13;10432:1;10429:20;10412:237;;;10505:19;;10485:40;;10574:4;10557:22;;;;10612:23;;;;10463:1;10456:9;10412:237;;;-1:-1:-1;;;10718:46:8;;;-1:-1:-1;10949:33:8;;;10819:4;10797:27;;;10924:59;;;11097:19;;11288:34;;;10797:27;;11350:22;;;;11145:23;;;;11097:19;11221:4;11202:24;;11198:35;-1:-1:-1;11429:237:8;11452:13;11449:1;11446:20;11429:237;;;11522:19;;11502:40;;11591:4;11574:22;;;;11629:23;;;;11480:1;11473:9;11429:237;;;11433:12;12197:3;12118:15;12064;12051:11;12047:33;11966:15;11881:7;11761:3;11731:543;12294:7;12314:205;;;;12537:1;12532:316;;;;12287:561;;12314:205;12359:1;12346:11;12339:22;12407:1;12402:2;12389:11;12385:20;12378:31;12455:1;12450:2;12437:11;12433:20;12426:31;12503:1;12498:2;12485:11;12481:20;12474:31;12314:205;;12532:316;12583:15;12577:22;12564:11;12557:43;12673:2;12656:15;12652:24;12646:31;12641:2;12628:11;12624:20;12617:61;12751:2;12734:15;12730:24;12724:31;12719:2;12706:11;12702:20;12695:61;12829:2;12812:15;12808:24;12802:31;12797:2;12784:11;12780:20;12773:61;12287:561;-1:-1:-1;;;;;;;;;;;;2081:10811:8;;;;;;:::o;976:51:3:-;;;;;;;;;;;;;;;:::o;24537:185:8:-;24630:9;24625:91;24649:6;:13;24645:1;:17;24625:91;;;24683:22;24695:6;24702:1;24695:9;;;;;;;;;;;;;;;;;;24683:11;:22::i;:::-;24664:3;;24625:91;;;24537:185;;:::o;14423:584::-;14615:35;;:::i;:::-;14671:9;14724:36;;:::i;:::-;14683:1;14671:13;;14666:302;14690:6;:13;14686:1;:17;14666:302;;;14763:129;14796:6;14803:1;14796:9;;;;;;;;;;;;;;;;;;14823:21;14845:1;14823:24;;;;;;;;;;;;;;;;;;14865:10;14876:1;14865:13;;;;;;;;;;;;;;;;;;14763:15;:129::i;:::-;14724:168;;14906:51;14921:16;14939:17;14906:14;:51::i;:::-;14705:3;;;;;14666:302;;1942:1012:4;2025:20;2332:21;2496;2552;2048:26;:24;:26::i;:::-;2025:49;-1:-1:-1;2356:26:4;;;2372:10;2356:26;:52;;2398:10;2356:52;;;2393:1;2356:52;2576:24;;;;;;;;:10;:24;;;;;;;;:39;;;;;;;;;;2332:76;;-1:-1:-1;2539:1:4;2520:20;;;-1:-1:-1;2576:39:4;-1:-1:-1;2704:29:4;;;2683:100;;;;;;;;;;;;;;2823:24;;;;;;;;:10;:24;;;;;;;;:39;;;;;;;;;;;;;;:55;;;2893:54;;;;;2865:13;;2893:54;;;;;;;;;;1942:1012;;;;;:::o;15566:586:8:-;15759:35;;:::i;:::-;15815:9;15868:36;;:::i;:::-;15827:1;15815:13;;15810:303;15834:6;:13;15830:1;:17;15810:303;;;15907:130;15941:6;15948:1;15941:9;;;;;;;;;;;;;;;;;;15968:21;15990:1;15968:24;;;;;;;;;;;;;;;;;;16010:10;16021:1;16010:13;;;;;;;;;;;;;;;;;;15907:16;:130::i;:::-;15868:169;;16051:51;16066:16;16084:17;16051:14;:51::i;:::-;15849:3;;;;;15810:303;;2092:154:3;2213:26;;;2183:7;2213:26;;;:12;:26;;;;;;;;2092:154;;;;:::o;968:45:7:-;;;;;;;;;;;;;;;:::o;1160:495:8:-;1330:30;;:::i;:::-;1390:95;1413:5;1432:20;1466:9;1390;:95::i;:::-;1516:34;;;;1376:109;;-1:-1:-1;1516:58:8;;1495:125;;;;;;;;;;;;;;1160:495;;;;;:::o;2090:391:6:-;2223:21;2247:26;:24;:26::i;:::-;2283:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;;;;;:61;;;;;;;;;;2359:115;2283:32;;-1:-1:-1;2283:50:6;;2359:115;;;;2283:61;;2359:115;;;;;;;;;;2090:391;;;:::o;1087:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16540:1432:8:-;16717:35;;:::i;:::-;16768:27;16842:9;17228:37;17419:36;;:::i;:::-;16798:6;16805:1;16798:9;;;;;;;;;;;;;;;;;;:24;;;16768:54;;16854:1;16842:13;;16837:1096;16861:6;:13;16857:1;:17;16837:1096;;;17131:14;17104:6;17111:1;17104:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;17268:70;17276:20;17298:16;:39;;;17268:7;:70::i;:::-;17228:110;;17458:128;17485:6;17492:1;17485:9;;;;;;;;;;;;;;;;;;17512:29;17559:10;17570:1;17559:13;;;;;;;;;17458:128;17419:167;;17671:51;17686:16;17704:17;17671:14;:51::i;:::-;17863:20;17820:16;:39;;;:63;17816:107;;;17903:5;;17816:107;16876:3;;;;;16837:1096;;;16540:1432;;;;;;;;;:::o;24916:400::-;25016:20;25059:14;25099:38;25187:9;25076:6;:13;25059:30;;25165:6;25140:32;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;25099:73;;25199:1;25187:13;;25182:101;25206:6;25202:1;:10;25182:101;;;25249:23;25262:6;25269:1;25262:9;;;;;;;;;;;;;;;;;;25249:12;:23::i;:::-;25233:10;25244:1;25233:13;;;;;;;;;;;;;;;;;;:39;25214:3;;25182:101;;;-1:-1:-1;25299:10:8;24916:400;-1:-1:-1;;;24916:400:8:o;967:63:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;258:20:29:-;;;;;;:::o;2853:6652:6:-;3015:12;3192:22;3445:27;3566:7;3583:9;3602;3621:17;7350:24;3083:1;3064:9;:16;:20;3043:97;;;;;;;;;;;;;;;;3223:23;:9;:21;:23::i;:::-;3217:30;;;;-1:-1:-1;3303:29:6;3278:55;;;;3257:123;;;;;;;;;;;;;;3489:16;3475:31;;;;;;;;;;3445:61;-1:-1:-1;3988:21:6;3971:13;:38;;;;;;;;;3967:5188;;;4025:27;;;;;;;;;;;3967:5188;4334:21;4317:13;:38;;;;;;;;;4313:4842;;;4396:16;;:21;4371:97;;;;;;;;;;;;;;4492:5;;-1:-1:-1;4511:14:6;;4313:4842;4598:20;4581:13;:37;;;;;;;;;4577:4578;;;4659:16;;4679:2;4659:22;4634:99;;;;;;;;;;;;;;4757:9;4767:1;4757:12;;;;;;;;;;;;;;;;;;;;;4751:19;;-1:-1:-1;4788:24:6;:9;4810:1;4788:24;:21;:24;:::i;:::-;4784:28;-1:-1:-1;4830:25:6;:9;4852:2;4830:25;:21;:25;:::i;:::-;4826:29;;4881:24;4891:4;4897:1;4900;4903;4881:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4881:24:6;;;;;4929:26;;;;;;;;;-1:-1:-1;4881:24:6;-1:-1:-1;4969:14:6;;-1:-1:-1;4969:14:6;4577:4578;5060:21;5043:13;:38;;;;;;;;;5039:4116;;;5122:16;;5142:2;5122:22;5097:99;;;;;;;;;;;;;;5220:9;5230:1;5220:12;;;;;;;;;;;;;;;;;;;;;5214:19;;-1:-1:-1;5251:24:6;:9;5273:1;5251:24;:21;:24;:::i;:::-;5247:28;-1:-1:-1;5293:25:6;:9;5315:2;5293:25;:21;:25;:::i;:::-;5289:29;;5344:225;5475:4;5381:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5381:116:6;;;5371:127;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5371:127:6;;;;;;;;;;;;-1:-1:-1;5344:225:6;;;;;;;;;;-1:-1:-1;5371:127:6;-1:-1:-1;5516:1:6;;5535;;-1:-1:-1;5554:1:6;;5344:225;;5039:4116;6237:20;6220:13;:37;;;;;;;;;6216:2939;;;6298:16;;:21;6273:97;;;;;;;;;;;;;;6394:27;;;6411:10;6394:27;;-1:-1:-1;6435:14:6;;6216:2939;6619:20;6602:13;:37;;;;;;;;;6598:2557;;;6665:56;;;;;:39;;;;;;:56;;6705:4;;6711:9;;6665:56;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6665:56:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6665:56:6;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6665:56:6;;;;;;;;;6655:66;-1:-1:-1;6735:14:6;;6598:2557;7248:23;7231:13;:40;;;;;;;;;7227:1928;;;7377:26;:9;:24;:26::i;:::-;7488:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;7350:53;;-1:-1:-1;7488:50:6;;7487:51;7483:102;;;7565:5;7558:12;;;;7483:102;7608:139;;;;;:45;;;;;;:139;;7671:4;;7693:13;;7724:9;;7608:139;;;;7227:1928;7883:23;7866:13;:40;;;;;;;;;7862:1293;;;7932:15;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;;;;-1:-1:-1;7976:14:6;;7862:1293;8556:20;8539:13;:37;;;;;;;;;8535:620;;;8617:16;;8637:2;8617:22;8592:99;;;;;;;;;;;;;;8715:9;8725:1;8715:12;;;;;;;;;;;;;;;;;;;;;8709:19;;-1:-1:-1;8746:24:6;:9;8768:1;8746:24;:21;:24;:::i;:::-;8742:28;-1:-1:-1;8788:25:6;:9;8810:2;8788:25;:21;:25;:::i;:::-;8784:29;;8839:227;8972:4;8876:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8876:118:6;;;8866:129;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;8535:620:6;9467:31;;;;;;;;;;;2853:6652;;;;;;;;;;;;;:::o;22554:1848:8:-;22737:35;;:::i;:::-;22788:27;22858:9;23248:37;23554;23840:36;;:::i;:::-;22818:6;22825:1;22818:9;;;;;;;;;;;;;;;;;;:24;;;22788:54;;22870:1;22858:13;;22853:1510;22877:6;:13;22873:1;:17;22853:1510;;;23152:14;23125:6;23132:1;23125:9;;;;;;;;;;;;;;;;;;;:24;;:41;23318:39;;23288:70;;23296:20;;23288:7;:70::i;:::-;23248:110;;23594:165;23628:6;23635:1;23628:9;;;;;;;;;;;;;;;;;;:26;;;23672:6;23679:1;23672:9;;;;;;;;;;;;;;;;;;:26;;;23716:29;23594:16;:165::i;:::-;23554:205;;23879:135;23913:6;23920:1;23913:9;;;;;;;;;;;;;;;;;;23940:29;23987:10;23998:1;23987:13;;;;;;;;;23879:135;23840:174;;24099:51;24114:16;24132:17;24099:14;:51::i;:::-;24250:39;;:63;;24246:107;;;24333:5;;24246:107;22892:3;;;;;22853:1510;;;22554:1848;;;;;;;;;;:::o;3271:1327:4:-;3426:30;;:::i;:::-;3500:26;;:::i;:::-;3590:20;3694:33;3810:30;3529:19;3542:5;3529:12;:19::i;:::-;3500:48;;3613:26;:24;:26::i;:::-;3590:49;;3730:70;3738:5;:22;;;3762:9;:37;;;3730:7;:70::i;:::-;3694:106;;3843:55;3850:20;3872:25;3843:6;:55::i;:::-;3810:88;;3937:186;3966:5;3985:9;4008:12;4034:20;4068:22;4104:9;3937:15;:186::i;:::-;4193:51;4214:5;4221:22;4193:20;:51::i;:::-;4179:65;;4297:181;4328:5;4347:12;4373:9;:19;;;4406:9;:37;;;4457:11;4297:17;:181::i;:::-;4517:45;4529:5;4536:12;4550:11;4517;:45::i;1710:1456:7:-;1924:21;;2014:23;;1924:35;:21;:35;1903:100;;;;;;;;;;;;;;2040:113;2058:94;2093:4;2111:13;2138:4;;2058:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2058:21:7;;-1:-1:-1;;;;;2058:94:7:i;:::-;2040:17;:113::i;:::-;2240:29;;;;:12;:29;;;;;;2014:139;;-1:-1:-1;2240:29:7;;2239:30;2218:92;;;;;;;;;;;;;;2396:27;;;2413:10;2396:27;2392:410;;2498:137;2536:15;2573:13;2608:9;;2498:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2498:16:7;;-1:-1:-1;;;;;2498:137:7:i;:::-;2473:216;;;;;;;;;;;;;;;;2754:21;:37;;;;;;;;;;2392:410;2843:29;;;;:12;:29;;;;;;;:36;;;;2875:4;2843:36;;;2910:32;2918:4;;2937;;;;2910:32;2937:4;;;;2910:32;;;;;;;;;;;;;;;;;;;;;;;;2889:95;;;;;;;;;;;;;;;;3072:27;;;3089:10;3072:27;3068:92;;3115:21;:34;;;;;;3068:92;1710:1456;;;;;;;:::o;1236:666:3:-;426:5:29;;1333:30:3;;;;;;426:5:29;;412:10;:19;391:85;;;;;;;;;;;;;;1378:10:3;1333:56;;1484:18;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1484:31:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1484:31:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1484:31:3;;;;;;;;;1553:26;;;;;;;:12;:26;;;;;;1462:53;;-1:-1:-1;1553:26:3;;;-1:-1:-1;1610:31:3;;1589:104;;;;;;;;;;;;;;1753:26;;;;;;;:12;:26;;;;;;;:47;;;;;;;;;;1815:80;;;;;1753:26;;1875:10;;1815:80;;;;;;;;;;1236:666;;;;:::o;5425:2261:4:-;5512:26;;:::i;:::-;5610:19;5623:5;5610:12;:19::i;:::-;5588;;;;:41;;;;5711:27;;;:6;:27;;;;;;;;5671:37;;;:67;6040:22;;;;:27;6036:157;;;6113:38;6107:45;6083:69;;;;6166:16;;6036:157;6506:22;;;;:27;6502:157;;;6579:38;6573:45;;6502:157;6753:22;;;;6712:37;;;;:63;6708:179;;6821:24;6815:31;;6708:179;7011:27;;;;6992:15;:46;6988:157;;7084:19;7078:26;;6988:157;7214:19;;;;;7204:30;;;;:9;:30;;;;;;;;;7200:143;;;7280:21;7274:28;;7200:143;7410:10;;;;7367:18;;7356:30;;;;;;;;:10;:30;;;;;;;;7387:19;;;;7356:51;;;;;;;;;;:64;7352:177;;;7466:21;7460:28;;7352:177;7632:20;7602:51;;;5425:2261;-1:-1:-1;5425:2261:4:o;4829:322::-;4937:26;;:::i;:::-;4966:19;4979:5;4966:12;:19::i;:::-;4937:48;;5024:35;5042:5;5049:9;5024:17;:35::i;:::-;5096:48;5117:5;5124:9;:19;;;5096:20;:48::i;1551:67::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;857:27:16:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18429:1442:8:-;18613:35;;:::i;:::-;18664:27;18734:9;19120:37;19311:36;;:::i;:::-;18694:6;18701:1;18694:9;;;;;;;;;;;;;;;;;;:24;;;18664:54;;18746:1;18734:13;;18729:1103;18753:6;:13;18749:1;:17;18729:1103;;;19023:14;18996:6;19003:1;18996:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;19160:70;19168:20;19190:16;:39;;;19160:7;:70::i;:::-;19120:110;;19350:135;19384:6;19391:1;19384:9;;;;;;;;;;;;;;;;;;19411:29;19458:10;19469:1;19458:13;;;;;;;;;19350:135;19311:174;;19570:51;19585:16;19603:17;19570:14;:51::i;:::-;19762:20;19719:16;:39;;;:63;19715:107;;;19802:5;;19715:107;18768:3;;;;;18729:1103;;1298:33:17;;;;:::o;20259:1834:8:-;20435:35;;:::i;:::-;20486:27;20556:9;20946:37;21252;21538:36;;:::i;:::-;20516:6;20523:1;20516:9;;;;;;;;;;;;;;;;;;:24;;;20486:54;;20568:1;20556:13;;20551:1503;20575:6;:13;20571:1;:17;20551:1503;;;20850:14;20823:6;20830:1;20823:9;;;;;;;;;;;;;;;;;;;:24;;:41;21016:39;;20986:70;;20994:20;;20986:7;:70::i;:::-;20946:110;;21292:165;21326:6;21333:1;21326:9;;;;;;;;;21292:165;21252:205;;21577:128;21604:6;21611:1;21604:9;;;;;;;;;;;;;;;;;;21631:29;21678:10;21689:1;21678:13;;;;;;;;;21577:128;21538:167;;21790:51;21805:16;21823:17;21790:14;:51::i;:::-;21941:39;;:63;;21937:107;;;22024:5;;21937:107;20590:3;;;;;20551:1503;;1065:36:7;;;;;;:::o;500:167:29:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;1113:46:2:-;;;;;;;;;;;;;;;;;;;:::o;1772:648:19:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:19:o;4805:241:7:-;4936:21;;4888:7;;;;4936:35;:21;:35;:72;;4987:21;;;;4936:72;;;4974:10;4936:72;4911:97;4805:241;-1:-1:-1;;4805:241:7:o;4518:1075:5:-;5472:64;5480:9;:26;;;5508:10;:27;;;5472:7;:64::i;:::-;5392;5400:9;:26;;;5428:10;:27;;;5392:7;:64::i;:::-;:144;;5371:215;;;;;;;;;;;;;6329:3311;6601:59;;:::i;:::-;7557:37;7675:38;7796:34;7840:35;7597:68;7605:9;:26;;;7633:31;7597:7;:68::i;:::-;7557:108;;7716:70;7724:10;:27;;;7753:32;7716:7;:70::i;:::-;7675:111;;7985:68;7993:30;8025:10;:27;;;7985:7;:68::i;:::-;7902:67;7910:29;7941:10;:27;;;7902:7;:67::i;:::-;:151;7885:1080;;8175:29;8146:58;;8335:164;8369:10;:27;;;8414:10;:27;;;8459:26;8335:16;:164::i;:::-;8305:194;;7885:1080;;;8630:30;8600:60;;8789:165;8823:10;:27;;;8868:10;:27;;;8913;8789:16;:165::i;:::-;8760:194;;7885:1080;9050:93;9084:9;9107:26;9050:20;:93::i;:::-;9024:119;;9231:95;9265:10;9289:27;9231:20;:95::i;:::-;9204:24;;;;:122;;;9449:23;;:46;9509:47;;;9428:138;;9449:46;9428:7;:138::i;:::-;9380:45;;;:186;6329:3311;;;;;;;;;;:::o;9997:1727:4:-;10363:21;;:52;;10394:20;10363:52;10342:115;;;;;;;;;;;;;;10533:25;;;10512:92;;;;;;;;;;;;;;10676:19;;;;:33;;;10672:170;;10750:19;;;;:33;;10773:10;10750:33;10725:106;;;;;;;;;;;;;;10912:18;;;;:32;;;10908:169;;11007:12;10985:34;;:5;:18;;;:34;;;10960:106;;;;;;;;;;;;;;;;11159:37;;;;:42;11155:301;;;11242:146;11280:9;:19;;;11321:5;:18;;;11361:9;11242:16;:146::i;:::-;11217:228;;;;;;;;;;;;;;;;11528:149;11561:22;11601:5;:22;;;11641:5;:22;;;11528:15;:149::i;:::-;11527:150;11506:211;;;;;;;;;;;;;;9997:1727;;;;;;:::o;8006:792::-;8284:72;8292:27;8321:11;:34;;;8284:7;:72::i;:::-;8264:17;;;;:6;:17;;;;;;;;;:92;;;;8443:25;;;;8411:18;;8532:34;;8580;;;;8628:24;;;;8666;;;;8727:20;;;;8761;;;;8393:398;;8264:17;;8393:398;;;;;;;;;;;;;;8482:12;;8508:10;;8532:34;;8580;;8628:24;;8761:20;8393:398;;;;;;;;;;8006:792;;;;;:::o;10086:2233:5:-;10361:14;10333:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:42;;10361:14;;10333:42;;10361:14;10333:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10419:202;10453:9;:24;;;10491:9;:22;;;10527:10;:23;;;10564:18;:24;;;:47;;;10419:20;:202::i;:::-;10665:25;;;;10704:23;;10741:22;;10777:23;;:46;;;10631:202;;10665:25;10704:23;10741:22;10631:20;:202::i;:::-;10843:189;10877:9;:24;;;10915:9;:22;;;10951:12;10977:18;:45;;;10843:20;:189::i;:::-;11065:185;11099:12;11125:9;:22;;;11161:9;:29;;;11204:18;:23;;;:36;;;11065:20;:185::i;:::-;11260:188;11294:12;11320:10;:23;;;11357:10;:30;;;11401:18;:24;;;:37;;;11260:20;:188::i;:::-;11518:10;:30;;;11485:63;;:9;:29;;;:63;;;11481:832;;;11564:301;11602:12;11632;11662:9;:29;;;11709:142;11738:18;:23;;;:36;;;11796:18;:24;;;:37;;;11709:7;:142::i;:::-;11564:20;:301::i;:::-;11481:832;;;11896:195;11934:12;11964;11994:9;:29;;;12041:18;:23;;;:36;;;11896:20;:195::i;:::-;12105:197;12143:12;12173;12203:10;:30;;;12251:18;:24;;;:37;;;12105:20;:197::i;:::-;10086:2233;;;;;:::o;501:207:30:-;587:7;631:6;;;;610:69;;;;;;;;;;;;;;-1:-1:-1;696:5:30;;;501:207::o;8304:448:27:-;8388:13;8449:1;8438;:8;:12;8417:92;;;;;;;;;;;;;;;;8559:8;;8557:1;;8559:12;;;;8557:15;;;;;;;;;;8671:8;;8667:16;;8696:17;;;-1:-1:-1;8557:15:27;;;;;;;8304:448::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:27;13620:2;13718:13;13712:20;;13281:490::o;8947:482::-;9034:14;9097:2;9085:1;:8;:14;;9064:99;;;;;;;;;;;;;;;;9215:29;9227:1;9241:2;9230:1;:8;:13;9215:11;:29::i;:::-;9347:8;;9343:17;;9373;;;-1:-1:-1;9206:38:27;8947:482::o;937:326:20:-;1091:21;1144:82;1165:26;1173:9;1184:6;1165:7;:26::i;:::-;1205:11;1144:7;:82::i;:::-;1128:98;937:326;-1:-1:-1;;;;937:326:20:o;1369:135:30:-;1454:7;1488:1;1484;:5;:13;;1496:1;1484:13;;;-1:-1:-1;1492:1:30;;1477:20;-1:-1:-1;1369:135:30:o;13008:848:4:-;13159:30;;:::i;:::-;13254:34;;;:59;;;13426:22;;;;13462;;;;13360:134;;13291:22;;13360:16;:134::i;:::-;13323:171;;13597:22;;;;13633:14;;;;13531:126;;13561:22;;13531:16;:126::i;:::-;13504:24;;;:153;13760:22;;;;13796:14;;;;13694:126;;13724:22;;13694:16;:126::i;:::-;13667:24;;;:153;13008:848;;;;:::o;14166:932::-;14373:14;14345:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:42;;14373:14;;14345:42;;14373:14;14345:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14397:170;14431:5;:20;;;14465:5;:18;;;14497:12;14523:11;:34;;;14397:20;:170::i;:::-;14577;14611:5;:20;;;14645:12;14671:5;:18;;;14703:11;:34;;;14577:20;:170::i;:::-;14757:165;14791:12;14817:5;:18;;;14849:5;:25;;;14888:11;:24;;;14757:20;:165::i;:::-;14932:159;14966:12;14992;15018:5;:25;;;15057:11;:24;;;14932:20;:159::i;:::-;14166:932;;;;:::o;3459:902:7:-;1237:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1237:146:7;;;;;;;;1227:157;;3623:14;;;;;;1237:146;;;;1227:157;;;;1237:146;1227:157;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1227:157:7;;;;;;;;;;;3740:15;;1227:157;;-1:-1:-1;3740:15:7;;-1:-1:-1;1227:157:7;;-1:-1:-1;1227:157:7;;3740:15;;;-1:-1:-1;3740:15:7;1227:157;3740:15;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3740:15:7;;;;;;;;;;;;4062:26;;;4108:15;;4101:29;;;;-1:-1:-1;4186:42:7;4167:62;;;;4150:15;;;4143:87;;;;-1:-1:-1;;4262:2:7;4250:15;;4243:33;-1:-1:-1;;4317:3:7;4299:22;;;;3459:902;-1:-1:-1;3459:902:7:o;1816:205:17:-;1910:7;1967:13;;;;;;;;;;;;;;;;;;1982:18;;2002:10;1950:63;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1950:63:17;;;;;-1:-1:-1;1950:63:17;;;;;;;-1:-1:-1;1950:63:17;;;26:21:-1;;;22:32;;6:49;;1950:63:17;;;;;;;1940:74;;1950:63;;-1:-1:-1;1950:63:17;;;1940:74;;;;1950:63;1940:74;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;1940:74:17;;;;;;;;;;;;-1:-1:-1;;;;;1816:205:17:o;4212:202:21:-;4301:17;4346:35;4364:16;4374:5;4364:9;:16::i;11921:816:4:-;12185:21;;12577:20;;12185:52;;12216:20;12185:52;12164:115;;;;;;;;;;;;;;12353:19;;;;:33;;;12349:170;;12427:19;;;;:33;;12450:10;12427:33;12402:106;;;;;;;;;;;;;;12600:26;:24;:26::i;:::-;12657:18;;12577:49;;-1:-1:-1;12657:34:4;;;;;;;12636:94;;;;;;;;;;;;;;11921:816;;;:::o;9100:422::-;9248:20;;;;:9;:20;;;;;;;:27;;;;9271:4;9248:27;;;9365:25;;;;9333:18;;9451:20;;;;9485;;;;9313:202;;9258:9;;9313:202;;;;;;;;;;;;;;9404:10;;9485:20;9313:202;;;;;;;;;;9100:422;;:::o;714:230:30:-;800:7;835:5;;;871:6;;;;850:69;;;;;;;;;;;;;;936:1;929:8;;714:230;;;;;;:::o;50:288::-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:30;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;1502:555:20;1655:12;1683:17;1840:33;1729:11;1703:38;;;;;;;1718:9;1710:6;1703:38;1683:58;-1:-1:-1;1755:14:20;;1751:79;;;1792:5;1785:12;;;;1751:79;1876:98;1897:27;1905:9;1916:7;1897;:27::i;:::-;1938:26;1946:9;1957:6;1938:7;:26::i;:::-;1876:7;:98::i;:::-;2022:4;-1:-1:-1;1994:32:20;1502:555;-1:-1:-1;;;;;;1502:555:20:o;2561:5068:3:-;3031:19;3290:18;2797:1;2788:6;:10;2784:4839;;;2887:16;;2906:1;-1:-1:-1;2862:109:3;;;;;;;;;;;;;;-1:-1:-1;;3153:2:3;3138:18;;;3111:46;3179:66;3107:156;3311:26;;;;:12;:26;;;;;;;;;;3422:24;;;3397:109;;;;;;;;;;;;;;4923:2;4917:9;5239:15;5234:2;5222:9;5216:16;5212:25;5208:47;5392:14;5387:3;5383:24;5374:7;5370:38;5676:66;5667:7;5660:83;6160:3;6156:1;6147:7;6143:15;6136:28;6216:42;6210:4;6206:53;6201:2;6192:7;6188:16;6181:79;6310:42;6306:2;6302:51;6297:2;6288:7;6284:16;6277:77;6397:6;6391:3;6382:7;6378:17;6371:33;6563:3;6554:7;6550:17;6645:206;6665:5;6655:8;6652:19;6645:206;;;6714:16;;6697:34;;6778:2;6815:18;;;;6764:17;6645:206;;;7417:3;7346:7;7292;7285:5;7281:19;7208:7;7142:1;7067:10;7004:3;6978:512;7517:7;7510:15;7507:2;;;7564:16;7555:7;7548:33;7507:2;4724:2889;;;;;2561:5068;;;;;;:::o;10259:886:27:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:27;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;344:151:30:-;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:30:o;4554:1721:21:-;778:457;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;778:457:21;;;;;;;;768:468;;4640:14;;;;;;;;778:457;;;;;768:468;;;;778:457;768:468;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;768:468:21;;;;;;;;;;;4764:20;;;;4754:31;;768:468;;-1:-1:-1;4764:20:21;-1:-1:-1;768:468:21;;-1:-1:-1;768:468:21;;4754:31;;;-1:-1:-1;4754:31:21;768:468;4754:31;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;4754:31:21;;;;;;;;;;;4834:20;;;;4824:31;;4754;;-1:-1:-1;4834:20:21;-1:-1:-1;4754:31:21;;-1:-1:-1;4754:31:21;;4824;;;-1:-1:-1;4824:31:21;4754;4824;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;4824:31:21;;;;;;;;;;5586:15;;;5580:22;;5645:3;5634:15;;5628:22;;5693:3;5682:15;;;5676:22;;5812:35;;;5860:43;;;5916;;;6008:3;5982:30;;6120;;6163;;;-1:-1:-1;;;6206:30:21;;;-1:-1:-1;5982:30:21;;4554:1721;-1:-1:-1;4554:1721:21:o;931:616:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;931:616:2;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;;599:14;228:611;;;;;;;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1640:707;;1750:4;1738:17;;1734:27;-1:-1;1724:2;;1775:1;1772;1765:12;1724:2;1812:6;1799:20;1834:80;1849:64;1906:6;1849:64;;1834:80;1825:89;;1931:5;1956:6;1949:5;1942:21;1986:4;1978:6;1974:17;1964:27;;2008:4;2003:3;1999:14;1992:21;;2061:6;2108:3;2100:4;2092:6;2088:17;2083:3;2079:27;2076:36;2073:2;;;2125:1;2122;2115:12;2073:2;2150:1;2135:206;2160:6;2157:1;2154:13;2135:206;;;2218:3;2240:37;2273:3;2261:10;2240:37;;;2228:50;;-1:-1;2301:4;2292:14;;;;2320;;;;;2182:1;2175:9;2135:206;;2355:112;;2419:43;2454:6;2441:20;2419:43;;2474:116;;2549:36;2577:6;2571:13;2549:36;;2597:118;;2664:46;2702:6;2689:20;2664:46;;2722:116;;2788:45;2825:6;2812:20;2788:45;;2845:120;;2922:38;2952:6;2946:13;2922:38;;2986:335;;;3093:4;3081:17;;3077:27;-1:-1;3067:2;;3118:1;3115;3108:12;3067:2;-1:-1;3138:20;;3178:18;3167:30;;3164:2;;;3210:1;3207;3200:12;3164:2;3244:4;3236:6;3232:17;3220:29;;3294:3;3287;3279:6;3275:16;3265:8;3261:31;3258:40;3255:2;;;3311:1;3308;3301:12;3255:2;3060:261;;;;;;3330:432;;3420:4;3408:17;;3404:27;-1:-1;3394:2;;3445:1;3442;3435:12;3394:2;3482:6;3469:20;3504:60;3519:44;3556:6;3519:44;;3504:60;3495:69;;3584:6;3577:5;3570:21;3620:4;3612:6;3608:17;3653:4;3646:5;3642:16;3688:3;3679:6;3674:3;3670:16;3667:25;3664:2;;;3705:1;3702;3695:12;3664:2;3715:41;3749:6;3744:3;3739;3715:41;;;3387:375;;;;;;;;4247:2205;;4355:5;4343:9;4338:3;4334:19;4330:31;4327:2;;;4374:1;4371;4364:12;4327:2;4392:21;4407:5;4392:21;;;4383:30;-1:-1;4471:1;4502:49;4547:3;4527:9;4502:49;;;4478:74;;-1:-1;4621:2;4654:49;4699:3;4675:22;;;4654:49;;;4647:4;4640:5;4636:16;4629:75;4573:142;4780:2;4813:49;4858:3;4849:6;4838:9;4834:22;4813:49;;;4806:4;4799:5;4795:16;4788:75;4725:149;4933:2;4966:49;5011:3;5002:6;4991:9;4987:22;4966:49;;;4959:4;4952:5;4948:16;4941:75;4884:143;5089:3;5123:49;5168:3;5159:6;5148:9;5144:22;5123:49;;;5116:4;5109:5;5105:16;5098:75;5037:147;5246:3;5280:49;5325:3;5316:6;5305:9;5301:22;5280:49;;;5273:4;5266:5;5262:16;5255:75;5194:147;5395:3;5429:49;5474:3;5465:6;5454:9;5450:22;5429:49;;;5422:4;5415:5;5411:16;5404:75;5351:139;5544:3;5578:49;5623:3;5614:6;5603:9;5599:22;5578:49;;;5571:4;5564:5;5560:16;5553:75;5500:139;5706:3;5741:49;5786:3;5777:6;5766:9;5762:22;5741:49;;;5733:5;5726;5722:17;5715:76;5649:153;5852:3;5887:49;5932:3;5923:6;5912:9;5908:22;5887:49;;;5879:5;5872;5868:17;5861:76;5812:136;6036:3;6025:9;6021:19;6008:33;6061:18;6053:6;6050:30;6047:2;;;6093:1;6090;6083:12;6047:2;6129:54;6179:3;6170:6;6159:9;6155:22;6129:54;;;6121:5;6114;6110:17;6103:81;5958:237;6283:3;6272:9;6268:19;6255:33;6308:18;6300:6;6297:30;6294:2;;;6340:1;6337;6330:12;6294:2;6376:54;6426:3;6417:6;6406:9;6402:22;6376:54;;;6368:5;6361;6357:17;6350:81;6205:237;4321:2131;;;;;8828:241;;8932:2;8920:9;8911:7;8907:23;8903:32;8900:2;;;8948:1;8945;8938:12;8900:2;8983:1;9000:53;9045:7;9025:9;9000:53;;9076:366;;;9197:2;9185:9;9176:7;9172:23;9168:32;9165:2;;;9213:1;9210;9203:12;9165:2;9248:1;9265:53;9310:7;9290:9;9265:53;;;9255:63;;9227:97;9355:2;9373:53;9418:7;9409:6;9398:9;9394:22;9373:53;;;9363:63;;9334:98;9159:283;;;;;;9449:360;;;9567:2;9555:9;9546:7;9542:23;9538:32;9535:2;;;9583:1;9580;9573:12;9535:2;9618:1;9635:53;9680:7;9660:9;9635:53;;;9625:63;;9597:97;9725:2;9743:50;9785:7;9776:6;9765:9;9761:22;9743:50;;9816:415;;9964:2;9952:9;9943:7;9939:23;9935:32;9932:2;;;9980:1;9977;9970:12;9932:2;10015:31;;10066:18;10055:30;;10052:2;;;10098:1;10095;10088:12;10052:2;10118:97;10207:7;10198:6;10187:9;10183:22;10118:97;;10238:947;;;;10475:2;10463:9;10454:7;10450:23;10446:32;10443:2;;;10491:1;10488;10481:12;10443:2;10526:31;;10577:18;10566:30;;10563:2;;;10609:1;10606;10599:12;10563:2;10629:97;10718:7;10709:6;10698:9;10694:22;10629:97;;;10619:107;;10505:227;10791:2;10780:9;10776:18;10763:32;10815:18;10807:6;10804:30;10801:2;;;10847:1;10844;10837:12;10801:2;10867:78;10937:7;10928:6;10917:9;10913:22;10867:78;;;10857:88;;10742:209;11010:2;10999:9;10995:18;10982:32;11034:18;11026:6;11023:30;11020:2;;;11066:1;11063;11056:12;11020:2;11086:83;11161:7;11152:6;11141:9;11137:22;11086:83;;;11076:93;;10961:214;10437:748;;;;;;11192:811;;;;11404:2;11392:9;11383:7;11379:23;11375:32;11372:2;;;11420:1;11417;11410:12;11372:2;11455:31;;11506:18;11495:30;;11492:2;;;11538:1;11535;11528:12;11492:2;11558:97;11647:7;11638:6;11627:9;11623:22;11558:97;;;11548:107;;11434:227;11692:2;11710:53;11755:7;11746:6;11735:9;11731:22;11710:53;;12010:257;;12122:2;12110:9;12101:7;12097:23;12093:32;12090:2;;;12138:1;12135;12128:12;12090:2;12173:1;12190:61;12243:7;12223:9;12190:61;;12274:241;;12378:2;12366:9;12357:7;12353:23;12349:32;12346:2;;;12394:1;12391;12384:12;12346:2;12429:1;12446:53;12491:7;12471:9;12446:53;;12522:366;;;12643:2;12631:9;12622:7;12618:23;12614:32;12611:2;;;12659:1;12656;12649:12;12611:2;12694:1;12711:53;12756:7;12736:9;12711:53;;12895:615;;;;;13052:2;13040:9;13031:7;13027:23;13023:32;13020:2;;;13068:1;13065;13058:12;13020:2;13103:1;13120:53;13165:7;13145:9;13120:53;;;13110:63;;13082:97;13210:2;13228:53;13273:7;13264:6;13253:9;13249:22;13228:53;;;13218:63;;13189:98;13346:2;13335:9;13331:18;13318:32;13370:18;13362:6;13359:30;13356:2;;;13402:1;13399;13392:12;13356:2;13430:64;13486:7;13477:6;13466:9;13462:22;13430:64;;;13014:496;;;;-1:-1;13412:82;-1:-1;;;;13014:496;13517:595;;;;13664:2;13652:9;13643:7;13639:23;13635:32;13632:2;;;13680:1;13677;13670:12;13632:2;13715:1;13732:53;13777:7;13757:9;13732:53;;;13722:63;;13694:97;13822:2;13840:53;13885:7;13876:6;13865:9;13861:22;13840:53;;;13830:63;;13801:98;13958:2;13947:9;13943:18;13930:32;13982:18;13974:6;13971:30;13968:2;;;14014:1;14011;14004:12;13968:2;14034:62;14088:7;14079:6;14068:9;14064:22;14034:62;;14119:239;;14222:2;14210:9;14201:7;14197:23;14193:32;14190:2;;;14238:1;14235;14228:12;14190:2;14273:1;14290:52;14334:7;14314:9;14290:52;;14365:261;;14479:2;14467:9;14458:7;14454:23;14450:32;14447:2;;;14495:1;14492;14485:12;14447:2;14530:1;14547:63;14602:7;14582:9;14547:63;;14633:373;;14760:2;14748:9;14739:7;14735:23;14731:32;14728:2;;;14776:1;14773;14766:12;14728:2;14811:31;;14862:18;14851:30;;14848:2;;;14894:1;14891;14884:12;14848:2;14914:76;14982:7;14973:6;14962:9;14958:22;14914:76;;15013:1089;;;;;15232:3;15220:9;15211:7;15207:23;15203:33;15200:2;;;15249:1;15246;15239:12;15200:2;15284:31;;15335:18;15324:30;;15321:2;;;15367:1;15364;15357:12;15321:2;15387:76;15455:7;15446:6;15435:9;15431:22;15387:76;;;15377:86;;15263:206;15528:2;15517:9;15513:18;15500:32;15552:18;15544:6;15541:30;15538:2;;;15584:1;15581;15574:12;15538:2;15604:76;15672:7;15663:6;15652:9;15648:22;15604:76;;;15594:86;;15479:207;15745:2;15734:9;15730:18;15717:32;15769:18;15761:6;15758:30;15755:2;;;15801:1;15798;15791:12;15755:2;15821:62;15875:7;15866:6;15855:9;15851:22;15821:62;;;15811:72;;15696:193;15948:2;15937:9;15933:18;15920:32;15972:18;15964:6;15961:30;15958:2;;;16004:1;16001;15994:12;15958:2;16024:62;16078:7;16069:6;16058:9;16054:22;16024:62;;;16014:72;;15899:193;15194:908;;;;;;;;16109:727;;;;16279:2;16267:9;16258:7;16254:23;16250:32;16247:2;;;16295:1;16292;16285:12;16247:2;16330:31;;16381:18;16370:30;;16367:2;;;16413:1;16410;16403:12;16367:2;16433:76;16501:7;16492:6;16481:9;16477:22;16433:76;;;16423:86;;16309:206;16546:2;16564:53;16609:7;16600:6;16589:9;16585:22;16564:53;;17091:865;;;;;;;17284:3;17272:9;17263:7;17259:23;17255:33;17252:2;;;17301:1;17298;17291:12;17252:2;17336:1;17353:53;17398:7;17378:9;17353:53;;;17343:63;;17315:97;17443:2;17461:53;17506:7;17497:6;17486:9;17482:22;17461:53;;;17451:63;;17422:98;17579:2;17568:9;17564:18;17551:32;17603:18;17595:6;17592:30;17589:2;;;17635:1;17632;17625:12;17589:2;17663:64;17719:7;17710:6;17699:9;17695:22;17663:64;;;17645:82;;;;17530:203;17792:2;17781:9;17777:18;17764:32;17816:18;17808:6;17805:30;17802:2;;;17848:1;17845;17838:12;17802:2;17876:64;17932:7;17923:6;17912:9;17908:22;17876:64;;;17858:82;;;;17743:203;17246:710;;;;;;;;;17963:110;18036:31;18061:5;18036:31;;;18031:3;18024:44;18018:55;;;18147:755;;18328:77;18399:5;18328:77;;;18423:6;18418:3;18411:19;18447:4;18442:3;18438:14;18431:21;;18492:79;18565:5;18492:79;;;18592:1;18577:303;18602:6;18599:1;18596:13;18577:303;;;18642:103;18741:3;18732:6;18726:13;18642:103;;;18762:83;18838:6;18762:83;;;18868:4;18859:14;;;;;18752:93;-1:-1;18624:1;18617:9;18577:303;;;-1:-1;18893:3;;18307:595;-1:-1;;;;18307:595;18910:101;18977:28;18999:5;18977:28;;19018:110;19091:31;19116:5;19091:31;;19135:107;19206:30;19230:5;19206:30;;19249:297;;19349:38;19381:5;19349:38;;;19404:6;19399:3;19392:19;19416:63;19472:6;19465:4;19460:3;19456:14;19449:4;19442:5;19438:16;19416:63;;;19511:29;19533:6;19511:29;;;19491:50;;;19504:4;19491:50;;19329:217;-1:-1;;;19329:217;19849:156;19942:57;19993:5;19942:57;;20312:296;20467:2;20455:15;;20504:66;20499:2;20490:12;;20483:88;20599:2;20590:12;;20448:160;20617:296;20772:2;20760:15;;20809:66;20804:2;20795:12;;20788:88;20904:2;20895:12;;20753:160;20922:296;21077:2;21065:15;;21114:66;21109:2;21100:12;;21093:88;21209:2;21200:12;;21058:160;21227:397;21382:2;21370:15;;21419:66;21414:2;21405:12;;21398:88;21520:66;21515:2;21506:12;;21499:88;21615:2;21606:12;;21363:261;21633:296;21788:2;21776:15;;21825:66;21820:2;21811:12;;21804:88;21920:2;21911:12;;21769:160;21938:296;22093:2;22081:15;;22130:66;22125:2;22116:12;;22109:88;22225:2;22216:12;;22074:160;22243:296;22398:2;22386:15;;22435:66;22430:2;22421:12;;22414:88;22530:2;22521:12;;22379:160;22548:296;22703:2;22691:15;;22740:66;22735:2;22726:12;;22719:88;22835:2;22826:12;;22684:160;22853:296;23008:2;22996:15;;23045:66;23040:2;23031:12;;23024:88;23140:2;23131:12;;22989:160;23158:296;23313:2;23301:15;;23350:66;23345:2;23336:12;;23329:88;23445:2;23436:12;;23294:160;23463:296;23618:2;23606:15;;23655:66;23650:2;23641:12;;23634:88;23750:2;23741:12;;23599:160;23768:296;23923:2;23911:15;;23960:66;23955:2;23946:12;;23939:88;24055:2;24046:12;;23904:160;24073:296;24228:2;24216:15;;24265:66;24260:2;24251:12;;24244:88;24360:2;24351:12;;24209:160;24378:296;24533:2;24521:15;;24570:66;24565:2;24556:12;;24549:88;24665:2;24656:12;;24514:160;24683:397;24838:2;24826:15;;24875:66;24870:2;24861:12;;24854:88;24976:66;24971:2;24962:12;;24955:88;25071:2;25062:12;;24819:261;25089:296;25244:2;25232:15;;25281:66;25276:2;25267:12;;25260:88;25376:2;25367:12;;25225:160;25394:296;25549:2;25537:15;;25586:66;25581:2;25572:12;;25565:88;25681:2;25672:12;;25530:160;25699:296;25854:2;25842:15;;25891:66;25886:2;25877:12;;25870:88;25986:2;25977:12;;25835:160;26004:296;26159:2;26147:15;;26196:66;26191:2;26182:12;;26175:88;26291:2;26282:12;;26140:160;26309:296;26464:2;26452:15;;26501:66;26496:2;26487:12;;26480:88;26596:2;26587:12;;26445:160;26614:296;26769:2;26757:15;;26806:66;26801:2;26792:12;;26785:88;26901:2;26892:12;;26750:160;26919:296;27074:2;27062:15;;27111:66;27106:2;27097:12;;27090:88;27206:2;27197:12;;27055:160;27224:397;27379:2;27367:15;;27416:66;27411:2;27402:12;;27395:88;27517:66;27512:2;27503:12;;27496:88;27612:2;27603:12;;27360:261;27630:296;27785:2;27773:15;;27822:66;27817:2;27808:12;;27801:88;27917:2;27908:12;;27766:160;27935:296;28090:2;28078:15;;28127:66;28122:2;28113:12;;28106:88;28222:2;28213:12;;28071:160;28240:296;28395:2;28383:15;;28432:66;28427:2;28418:12;;28411:88;28527:2;28518:12;;28376:160;28545:296;28700:2;28688:15;;28737:66;28732:2;28723:12;;28716:88;28832:2;28823:12;;28681:160;28850:296;29005:2;28993:15;;29042:66;29037:2;29028:12;;29021:88;29137:2;29128:12;;28986:160;29231:888;29459:22;;29372:4;29363:14;;;29493:61;29367:3;29459:22;29493:61;;;29392:174;29660:4;29653:5;29649:16;29643:23;29678:62;29734:4;29729:3;29725:14;29712:11;29678:62;;;29576:176;29836:4;29829:5;29825:16;29819:23;29854:62;29910:4;29905:3;29901:14;29888:11;29854:62;;;29762:166;30012:4;30005:5;30001:16;29995:23;30030:62;30086:4;30081:3;30077:14;30064:11;30030:62;;31185:815;31410:22;;31340:5;31331:15;;;31444:115;31335:3;31410:22;31444:115;;;31361:210;31648:4;31641:5;31637:16;31631:23;31666:116;31776:4;31771:3;31767:14;31754:11;31666:116;;;31581:213;31892:4;31885:5;31881:16;31875:23;31910:63;31966:5;31961:3;31957:15;31944:11;31910:63;;32068:695;32281:22;;32205:4;32196:14;;;32315:57;32200:3;32281:22;32315:57;;;32225:159;32465:4;32458:5;32454:16;32448:23;32483:62;32539:4;32534:3;32530:14;32517:11;32483:62;;;32394:163;32656:4;32649:5;32645:16;32639:23;32674:62;32730:4;32725:3;32721:14;32708:11;32674:62;;33646:104;33715:29;33738:5;33715:29;;33757:193;33865:2;33850:18;;33879:61;33854:9;33913:6;33879:61;;33957:1057;34289:3;34274:19;;34304:61;34278:9;34338:6;34304:61;;;34376:62;34434:2;34423:9;34419:18;34410:6;34376:62;;;34449;34507:2;34496:9;34492:18;34483:6;34449:62;;;34522;34580:2;34569:9;34565:18;34556:6;34522:62;;;34595:63;34653:3;34642:9;34638:19;34629:6;34595:63;;;34669;34727:3;34716:9;34712:19;34703:6;34669:63;;;34781:9;34775:4;34771:20;34765:3;34754:9;34750:19;34743:49;34806:62;34863:4;34854:6;34806:62;;;34798:70;;34917:9;34911:4;34907:20;34901:3;34890:9;34886:19;34879:49;34942:62;34999:4;34990:6;34942:62;;;34934:70;34260:754;-1:-1;;;;;;;;;;34260:754;35021:547;35213:2;35198:18;;35227:61;35202:9;35261:6;35227:61;;;35336:9;35330:4;35326:20;35321:2;35310:9;35306:18;35299:48;35361:62;35418:4;35409:6;35361:62;;;35353:70;;35471:9;35465:4;35461:20;35456:2;35445:9;35441:18;35434:48;35496:62;35553:4;35544:6;35496:62;;;35488:70;35184:384;-1:-1;;;;;35184:384;35575:433;35779:2;35793:47;;;35764:18;;35854:144;35764:18;35984:6;35854:144;;36015:181;36117:2;36102:18;;36131:55;36106:9;36159:6;36131:55;;36203:193;36311:2;36296:18;;36325:61;36300:9;36359:6;36325:61;;36403:479;36585:2;36570:18;;36599:61;36574:9;36633:6;36599:61;;;36671:62;36729:2;36718:9;36714:18;36705:6;36671:62;;;36781:9;36775:4;36771:20;36766:2;36755:9;36751:18;36744:48;36806:66;36867:4;36858:6;36806:66;;36889:378;37043:2;37028:18;;37057:61;37032:9;37091:6;37057:61;;;37166:9;37160:4;37156:20;37151:2;37140:9;37136:18;37129:48;37191:66;37252:4;37243:6;37191:66;;37274:489;37462:3;37447:19;;37477:61;37451:9;37511:6;37477:61;;;37549:58;37603:2;37592:9;37588:18;37579:6;37549:58;;;37618:62;37676:2;37665:9;37661:18;37652:6;37618:62;;;37691;37749:2;37738:9;37734:18;37725:6;37691:62;;37770:290;37904:2;37889:18;;37918:59;37893:9;37950:6;37918:59;;;37988:62;38046:2;38035:9;38031:18;38022:6;37988:62;;38067:269;38189:2;38203:47;;;38174:18;;38264:62;38174:18;38312:6;38264:62;;38343:233;38471:2;38456:18;;38485:81;38460:9;38539:6;38485:81;;38863:387;39044:2;39058:47;;;39029:18;;39119:121;39029:18;39119:121;;39257:387;39438:2;39452:47;;;39423:18;;39513:121;39423:18;39513:121;;39651:387;39832:2;39846:47;;;39817:18;;39907:121;39817:18;39907:121;;40045:387;40226:2;40240:47;;;40211:18;;40301:121;40211:18;40301:121;;40439:387;40620:2;40634:47;;;40605:18;;40695:121;40605:18;40695:121;;40833:387;41014:2;41028:47;;;40999:18;;41089:121;40999:18;41089:121;;41227:387;41408:2;41422:47;;;41393:18;;41483:121;41393:18;41483:121;;41621:387;41802:2;41816:47;;;41787:18;;41877:121;41787:18;41877:121;;42015:387;42196:2;42210:47;;;42181:18;;42271:121;42181:18;42271:121;;42409:387;42590:2;42604:47;;;42575:18;;42665:121;42575:18;42665:121;;42803:387;42984:2;42998:47;;;42969:18;;43059:121;42969:18;43059:121;;43197:387;43378:2;43392:47;;;43363:18;;43453:121;43363:18;43453:121;;43591:387;43772:2;43786:47;;;43757:18;;43847:121;43757:18;43847:121;;43985:387;44166:2;44180:47;;;44151:18;;44241:121;44151:18;44241:121;;44379:387;44560:2;44574:47;;;44545:18;;44635:121;44545:18;44635:121;;44773:387;44954:2;44968:47;;;44939:18;;45029:121;44939:18;45029:121;;45167:387;45348:2;45362:47;;;45333:18;;45423:121;45333:18;45423:121;;45561:387;45742:2;45756:47;;;45727:18;;45817:121;45727:18;45817:121;;45955:387;46136:2;46150:47;;;46121:18;;46211:121;46121:18;46211:121;;46349:387;46530:2;46544:47;;;46515:18;;46605:121;46515:18;46605:121;;46743:387;46924:2;46938:47;;;46909:18;;46999:121;46909:18;46999:121;;47137:387;47318:2;47332:47;;;47303:18;;47393:121;47303:18;47393:121;;47531:387;47712:2;47726:47;;;47697:18;;47787:121;47697:18;47787:121;;47925:387;48106:2;48120:47;;;48091:18;;48181:121;48091:18;48181:121;;48319:387;48500:2;48514:47;;;48485:18;;48575:121;48485:18;48575:121;;48713:387;48894:2;48908:47;;;48879:18;;48969:121;48879:18;48969:121;;49107:387;49288:2;49302:47;;;49273:18;;49363:121;49273:18;49363:121;;49501:387;49682:2;49696:47;;;49667:18;;49757:121;49667:18;49757:121;;49895:310;50061:3;50046:19;;50076:119;50050:9;50168:6;50076:119;;50212:338;50392:3;50377:19;;50407:133;50381:9;50513:6;50407:133;;50557:301;50719:2;50704:18;;50733:115;50708:9;50821:6;50733:115;;51065:256;51127:2;51121:9;51153:17;;;51228:18;51213:34;;51249:22;;;51210:62;51207:2;;;51285:1;51282;51275:12;51207:2;51301;51294:22;51105:216;;-1:-1;51105:216;51328:263;;51492:18;51484:6;51481:30;51478:2;;;51524:1;51521;51514:12;51478:2;-1:-1;51553:4;51541:17;;;51571:15;;51415:176;52147:254;;52286:18;52278:6;52275:30;52272:2;;;52318:1;52315;52308:12;52272:2;-1:-1;52391:4;52362;52339:17;;;;52358:9;52335:33;52381:15;;52209:192;52675:144;52807:4;52795:17;;52776:43;52828:130;52941:12;;52925:33;53406:128;53486:42;53475:54;;53458:76;53541:92;53614:13;53607:21;;53590:43;53640:79;53709:5;53692:27;53726:151;53805:66;53794:78;;53777:100;53970:88;54048:4;54037:16;;54020:38;54629:135;;54728:31;54753:5;54728:31;;54772:145;54853:6;54848:3;54843;54830:30;-1:-1;54909:1;54891:16;;54884:27;54823:94;54926:268;54991:1;54998:101;55012:6;55009:1;55006:13;54998:101;;;55079:11;;;55073:18;55060:11;;;55053:39;55034:2;55027:10;54998:101;;;55114:6;55111:1;55108:13;55105:2;;;-1:-1;;55179:1;55161:16;;55154:27;54975:219;55202:97;55290:2;55270:14;55286:7;55266:28;;55250:49"
}
}
},
@@ -2015,11 +2098,11 @@
"2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
"2.0.0/protocol/Exchange/Exchange.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./MixinExchangeCore.sol\";\nimport \"./MixinSignatureValidator.sol\";\nimport \"./MixinWrapperFunctions.sol\";\nimport \"./MixinAssetProxyDispatcher.sol\";\nimport \"./MixinTransactions.sol\";\nimport \"./MixinMatchOrders.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Exchange is\n MixinExchangeCore,\n MixinMatchOrders,\n MixinSignatureValidator,\n MixinTransactions,\n MixinAssetProxyDispatcher,\n MixinWrapperFunctions\n{\n\n string constant public VERSION = \"2.0.1-alpha\";\n\n // Mixins are instantiated in the order they are inherited\n constructor (bytes memory _zrxAssetData)\n public\n LibConstants(_zrxAssetData) // @TODO: Remove when we deploy.\n MixinExchangeCore()\n MixinMatchOrders()\n MixinSignatureValidator()\n MixinTransactions()\n MixinAssetProxyDispatcher()\n MixinWrapperFunctions()\n {}\n}\n",
"2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\nimport \"../AssetProxy/interfaces/IAssetProxy.sol\";\n\n\ncontract MixinAssetProxyDispatcher is\n Ownable,\n MAssetProxyDispatcher\n{\n using LibBytes for bytes;\n \n // Mapping from Asset Proxy Id's to their respective Asset Proxy\n mapping (bytes4 => IAssetProxy) public assetProxies;\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external\n onlyOwner\n {\n IAssetProxy assetProxyContract = IAssetProxy(assetProxy);\n\n // Ensure that no asset proxy exists with current id.\n bytes4 assetProxyId = assetProxyContract.getProxyId();\n address currentAssetProxy = assetProxies[assetProxyId];\n require(\n currentAssetProxy == address(0),\n \"ASSET_PROXY_ALREADY_EXISTS\"\n );\n\n // Add asset proxy and log registration.\n assetProxies[assetProxyId] = assetProxyContract;\n emit AssetProxyRegistered(\n assetProxyId,\n assetProxy\n );\n }\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address)\n {\n return assetProxies[assetProxyId];\n }\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Do nothing if no amount should be transferred.\n if (amount > 0) {\n // Ensure assetData length is valid\n require(\n assetData.length > 3,\n \"LENGTH_GREATER_THAN_3_REQUIRED\"\n );\n \n // Lookup assetProxy\n bytes4 assetProxyId;\n assembly {\n assetProxyId := and(mload(\n add(assetData, 32)),\n 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000\n )\n }\n address assetProxy = assetProxies[assetProxyId];\n\n // Ensure that assetProxy exists\n require(\n assetProxy != address(0),\n \"ASSET_PROXY_DOES_NOT_EXIST\"\n );\n \n // We construct calldata for the `assetProxy.transferFrom` ABI.\n // The layout of this calldata is in the table below.\n // \n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0 | 4 | function selector |\n // | Params | | 4 * 32 | function parameters: |\n // | | 4 | | 1. offset to assetData (*) |\n // | | 36 | | 2. from |\n // | | 68 | | 3. to |\n // | | 100 | | 4. amount |\n // | Data | | | assetData: |\n // | | 132 | 32 | assetData Length |\n // | | 164 | ** | assetData Contents |\n\n assembly {\n /////// Setup State ///////\n // `cdStart` is the start of the calldata for `assetProxy.transferFrom` (equal to free memory ptr).\n let cdStart := mload(64)\n // `dataAreaLength` is the total number of words needed to store `assetData`\n // As-per the ABI spec, this value is padded up to the nearest multiple of 32,\n // and includes 32-bytes for length.\n let dataAreaLength := and(add(mload(assetData), 63), 0xFFFFFFFFFFFE0)\n // `cdEnd` is the end of the calldata for `assetProxy.transferFrom`.\n let cdEnd := add(cdStart, add(132, dataAreaLength))\n\n \n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFromSelector`.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n mstore(cdStart, 0xa85e59e400000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // Each parameter is padded to 32-bytes. The entire Params Area is 128 bytes.\n // Notes:\n // 1. The offset to `assetData` is the length of the Params Area (128 bytes).\n // 2. A 20-byte mask is applied to addresses to zero-out the unused bytes.\n mstore(add(cdStart, 4), 128)\n mstore(add(cdStart, 36), and(from, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 68), and(to, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 100), amount)\n \n /////// Setup Data Area ///////\n // This area holds `assetData`.\n let dataArea := add(cdStart, 132)\n // solhint-disable-next-line no-empty-blocks\n for {} lt(dataArea, cdEnd) {} {\n mstore(dataArea, mload(assetData))\n dataArea := add(dataArea, 32)\n assetData := add(assetData, 32)\n }\n\n /////// Call `assetProxy.transferFrom` using the constructed calldata ///////\n let success := call(\n gas, // forward all gas\n assetProxy, // call address of asset proxy\n 0, // don't send any ETH\n cdStart, // pointer to start of input\n sub(cdEnd, cdStart), // length of input \n cdStart, // write output over input\n 512 // reserve 512 bytes for output\n )\n if iszero(success) {\n revert(cdStart, returndatasize())\n }\n }\n }\n }\n}\n",
- "2.0.0/protocol/Exchange/MixinExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\n\ncontract MixinExchangeCore is\n LibConstants,\n LibMath,\n LibOrder,\n LibFillResults,\n MAssetProxyDispatcher,\n MExchangeCore,\n MSignatureValidator,\n MTransactions\n{\n // Mapping of orderHash => amount of takerAsset already bought by maker\n mapping (bytes32 => uint256) public filled;\n\n // Mapping of orderHash => cancelled\n mapping (bytes32 => bool) public cancelled;\n\n // Mapping of makerAddress => senderAddress => lowest salt an order can have in order to be fillable\n // Orders with specified senderAddress and with a salt less than their epoch to are considered cancelled\n mapping (address => mapping (address => uint256)) public orderEpoch;\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external\n {\n address makerAddress = getCurrentContextAddress();\n // If this function is called via `executeTransaction`, we only update the orderEpoch for the makerAddress/msg.sender combination.\n // This allows external filter contracts to add rules to how orders are cancelled via this function.\n address senderAddress = makerAddress == msg.sender ? address(0) : msg.sender;\n\n // orderEpoch is initialized to 0, so to cancelUpTo we need salt + 1\n uint256 newOrderEpoch = targetOrderEpoch + 1; \n uint256 oldOrderEpoch = orderEpoch[makerAddress][senderAddress];\n\n // Ensure orderEpoch is monotonically increasing\n require(\n newOrderEpoch > oldOrderEpoch, \n \"INVALID_NEW_ORDER_EPOCH\"\n );\n\n // Update orderEpoch\n orderEpoch[makerAddress][senderAddress] = newOrderEpoch;\n emit CancelUpTo(makerAddress, senderAddress, newOrderEpoch);\n }\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // Fetch order info\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Get amount of takerAsset to fill\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n // Validate context\n assertValidFill(\n order,\n orderInfo,\n takerAddress,\n takerAssetFillAmount,\n takerAssetFilledAmount,\n signature\n );\n\n // Compute proportional fill amounts\n fillResults = calculateFillResults(order, takerAssetFilledAmount);\n\n // Update exchange internal state\n updateFilledState(\n order,\n takerAddress,\n orderInfo.orderHash,\n orderInfo.orderTakerAssetFilledAmount,\n fillResults\n );\n \n // Settle order\n settleOrder(order, takerAddress, fillResults);\n\n return fillResults;\n }\n\n /// @dev After calling, the order can not be filled anymore.\n /// Throws if order is invalid or sender does not have permission to cancel.\n /// @param order Order to cancel. Order must be OrderStatus.FILLABLE.\n function cancelOrder(Order memory order)\n public\n {\n // Fetch current order status\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Validate context\n assertValidCancel(order, orderInfo);\n\n // Perform cancel\n updateCancelledState(order, orderInfo.orderHash);\n }\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(Order memory order)\n public\n view\n returns (OrderInfo memory orderInfo)\n {\n // Compute the order hash\n orderInfo.orderHash = getOrderHash(order);\n\n // If order.makerAssetAmount is zero, we also reject the order.\n // While the Exchange contract handles them correctly, they create\n // edge cases in the supporting infrastructure because they have\n // an 'infinite' price when computed by a simple division.\n if (order.makerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_MAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // If order.takerAssetAmount is zero, then the order will always\n // be considered filled because 0 == takerAssetAmount == orderTakerAssetFilledAmount\n // Instead of distinguishing between unfilled and filled zero taker\n // amount orders, we choose not to support them.\n if (order.takerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_TAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // Validate order expiration\n // solhint-disable-next-line not-rely-on-time\n if (block.timestamp >= order.expirationTimeSeconds) {\n orderInfo.orderStatus = uint8(OrderStatus.EXPIRED);\n return orderInfo;\n }\n\n // Check if order has been cancelled\n if (cancelled[orderInfo.orderHash]) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n if (orderEpoch[order.makerAddress][order.senderAddress] > order.salt) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n\n // Fetch filled amount and validate order availability\n orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];\n if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {\n orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);\n return orderInfo;\n }\n\n // All other statuses are ruled out: order is Fillable\n orderInfo.orderStatus = uint8(OrderStatus.FILLABLE);\n return orderInfo;\n }\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n FillResults memory fillResults\n )\n internal\n {\n // Update state\n filled[orderHash] = safeAdd(orderTakerAssetFilledAmount, fillResults.takerAssetFilledAmount);\n\n // Log order\n emit Fill(\n order.makerAddress,\n order.feeRecipientAddress,\n takerAddress,\n msg.sender,\n fillResults.makerAssetFilledAmount,\n fillResults.takerAssetFilledAmount,\n fillResults.makerFeePaid,\n fillResults.takerFeePaid,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n Order memory order,\n bytes32 orderHash\n )\n internal\n {\n // Perform cancel\n cancelled[orderHash] = true;\n\n // Log cancel\n emit Cancel(\n order.makerAddress,\n order.feeRecipientAddress,\n msg.sender,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n Order memory order,\n OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view\n {\n // An order can only be filled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Revert if fill amount is invalid\n require(\n takerAssetFillAmount != 0,\n \"INVALID_TAKER_AMOUNT\"\n );\n\n // Validate sender is allowed to fill this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate taker is allowed to fill this order\n if (order.takerAddress != address(0)) {\n require(\n order.takerAddress == takerAddress,\n \"INVALID_TAKER\"\n );\n }\n\n // Validate Maker signature (check only if first time seen)\n if (orderInfo.orderTakerAssetFilledAmount == 0) {\n require(\n isValidSignature(\n orderInfo.orderHash,\n order.makerAddress,\n signature\n ),\n \"INVALID_ORDER_SIGNATURE\"\n );\n }\n\n // Validate fill order rounding\n require(\n !isRoundingError(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n ),\n \"ROUNDING_ERROR\"\n );\n }\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n Order memory order,\n OrderInfo memory orderInfo\n )\n internal\n view\n {\n // Ensure order is valid\n // An order can only be cancelled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Validate sender is allowed to cancel this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate transaction signed by maker\n address makerAddress = getCurrentContextAddress();\n require(\n order.makerAddress == makerAddress,\n \"INVALID_MAKER\"\n );\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n return fillResults;\n }\n\n /// @dev Settles an order by transferring assets between counterparties.\n /// @param order Order struct containing order specifications.\n /// @param takerAddress Address selling takerAsset and buying makerAsset.\n /// @param fillResults Amounts to be filled and fees paid by maker and taker.\n function settleOrder(\n LibOrder.Order memory order,\n address takerAddress,\n LibFillResults.FillResults memory fillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n dispatchTransferFrom(\n order.makerAssetData,\n order.makerAddress,\n takerAddress,\n fillResults.makerAssetFilledAmount\n );\n dispatchTransferFrom(\n order.takerAssetData,\n takerAddress,\n order.makerAddress,\n fillResults.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n zrxAssetData,\n order.makerAddress,\n order.feeRecipientAddress,\n fillResults.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n order.feeRecipientAddress,\n fillResults.takerFeePaid\n );\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\n\ncontract MixinExchangeCore is\n LibConstants,\n LibMath,\n LibOrder,\n LibFillResults,\n MAssetProxyDispatcher,\n MExchangeCore,\n MSignatureValidator,\n MTransactions\n{\n // Mapping of orderHash => amount of takerAsset already bought by maker\n mapping (bytes32 => uint256) public filled;\n\n // Mapping of orderHash => cancelled\n mapping (bytes32 => bool) public cancelled;\n\n // Mapping of makerAddress => senderAddress => lowest salt an order can have in order to be fillable\n // Orders with specified senderAddress and with a salt less than their epoch to are considered cancelled\n mapping (address => mapping (address => uint256)) public orderEpoch;\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external\n {\n address makerAddress = getCurrentContextAddress();\n // If this function is called via `executeTransaction`, we only update the orderEpoch for the makerAddress/msg.sender combination.\n // This allows external filter contracts to add rules to how orders are cancelled via this function.\n address senderAddress = makerAddress == msg.sender ? address(0) : msg.sender;\n\n // orderEpoch is initialized to 0, so to cancelUpTo we need salt + 1\n uint256 newOrderEpoch = targetOrderEpoch + 1; \n uint256 oldOrderEpoch = orderEpoch[makerAddress][senderAddress];\n\n // Ensure orderEpoch is monotonically increasing\n require(\n newOrderEpoch > oldOrderEpoch, \n \"INVALID_NEW_ORDER_EPOCH\"\n );\n\n // Update orderEpoch\n orderEpoch[makerAddress][senderAddress] = newOrderEpoch;\n emit CancelUpTo(makerAddress, senderAddress, newOrderEpoch);\n }\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // Fetch order info\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Get amount of takerAsset to fill\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n // Validate context\n assertValidFill(\n order,\n orderInfo,\n takerAddress,\n takerAssetFillAmount,\n takerAssetFilledAmount,\n signature\n );\n\n // Compute proportional fill amounts\n fillResults = calculateFillResults(order, takerAssetFilledAmount);\n\n // Update exchange internal state\n updateFilledState(\n order,\n takerAddress,\n orderInfo.orderHash,\n orderInfo.orderTakerAssetFilledAmount,\n fillResults\n );\n \n // Settle order\n settleOrder(order, takerAddress, fillResults);\n\n return fillResults;\n }\n\n /// @dev After calling, the order can not be filled anymore.\n /// Throws if order is invalid or sender does not have permission to cancel.\n /// @param order Order to cancel. Order must be OrderStatus.FILLABLE.\n function cancelOrder(Order memory order)\n public\n {\n // Fetch current order status\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Validate context\n assertValidCancel(order, orderInfo);\n\n // Perform cancel\n updateCancelledState(order, orderInfo.orderHash);\n }\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(Order memory order)\n public\n view\n returns (OrderInfo memory orderInfo)\n {\n // Compute the order hash\n orderInfo.orderHash = getOrderHash(order);\n\n // Fetch filled amount\n orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];\n\n // If order.makerAssetAmount is zero, we also reject the order.\n // While the Exchange contract handles them correctly, they create\n // edge cases in the supporting infrastructure because they have\n // an 'infinite' price when computed by a simple division.\n if (order.makerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_MAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // If order.takerAssetAmount is zero, then the order will always\n // be considered filled because 0 == takerAssetAmount == orderTakerAssetFilledAmount\n // Instead of distinguishing between unfilled and filled zero taker\n // amount orders, we choose not to support them.\n if (order.takerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_TAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // Validate order availability\n if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {\n orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);\n return orderInfo;\n }\n\n // Validate order expiration\n // solhint-disable-next-line not-rely-on-time\n if (block.timestamp >= order.expirationTimeSeconds) {\n orderInfo.orderStatus = uint8(OrderStatus.EXPIRED);\n return orderInfo;\n }\n\n // Check if order has been cancelled\n if (cancelled[orderInfo.orderHash]) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n if (orderEpoch[order.makerAddress][order.senderAddress] > order.salt) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n\n // All other statuses are ruled out: order is Fillable\n orderInfo.orderStatus = uint8(OrderStatus.FILLABLE);\n return orderInfo;\n }\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n FillResults memory fillResults\n )\n internal\n {\n // Update state\n filled[orderHash] = safeAdd(orderTakerAssetFilledAmount, fillResults.takerAssetFilledAmount);\n\n // Log order\n emit Fill(\n order.makerAddress,\n order.feeRecipientAddress,\n takerAddress,\n msg.sender,\n fillResults.makerAssetFilledAmount,\n fillResults.takerAssetFilledAmount,\n fillResults.makerFeePaid,\n fillResults.takerFeePaid,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n Order memory order,\n bytes32 orderHash\n )\n internal\n {\n // Perform cancel\n cancelled[orderHash] = true;\n\n // Log cancel\n emit Cancel(\n order.makerAddress,\n order.feeRecipientAddress,\n msg.sender,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n Order memory order,\n OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view\n {\n // An order can only be filled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Revert if fill amount is invalid\n require(\n takerAssetFillAmount != 0,\n \"INVALID_TAKER_AMOUNT\"\n );\n\n // Validate sender is allowed to fill this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate taker is allowed to fill this order\n if (order.takerAddress != address(0)) {\n require(\n order.takerAddress == takerAddress,\n \"INVALID_TAKER\"\n );\n }\n\n // Validate Maker signature (check only if first time seen)\n if (orderInfo.orderTakerAssetFilledAmount == 0) {\n require(\n isValidSignature(\n orderInfo.orderHash,\n order.makerAddress,\n signature\n ),\n \"INVALID_ORDER_SIGNATURE\"\n );\n }\n\n // Validate fill order rounding\n require(\n !isRoundingError(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n ),\n \"ROUNDING_ERROR\"\n );\n }\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n Order memory order,\n OrderInfo memory orderInfo\n )\n internal\n view\n {\n // Ensure order is valid\n // An order can only be cancelled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Validate sender is allowed to cancel this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate transaction signed by maker\n address makerAddress = getCurrentContextAddress();\n require(\n order.makerAddress == makerAddress,\n \"INVALID_MAKER\"\n );\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n return fillResults;\n }\n\n /// @dev Settles an order by transferring assets between counterparties.\n /// @param order Order struct containing order specifications.\n /// @param takerAddress Address selling takerAsset and buying makerAsset.\n /// @param fillResults Amounts to be filled and fees paid by maker and taker.\n function settleOrder(\n LibOrder.Order memory order,\n address takerAddress,\n LibFillResults.FillResults memory fillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n dispatchTransferFrom(\n order.makerAssetData,\n order.makerAddress,\n takerAddress,\n fillResults.makerAssetFilledAmount\n );\n dispatchTransferFrom(\n order.takerAssetData,\n takerAddress,\n order.makerAddress,\n fillResults.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n zrxAssetData,\n order.makerAddress,\n order.feeRecipientAddress,\n fillResults.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n order.feeRecipientAddress,\n fillResults.takerFeePaid\n );\n }\n}\n",
"2.0.0/protocol/Exchange/MixinMatchOrders.sol": "/*\n Copyright 2018 ZeroEx Intl.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MMatchOrders.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\n\ncontract MixinMatchOrders is\n LibConstants,\n LibMath,\n MAssetProxyDispatcher,\n MExchangeCore,\n MMatchOrders,\n MTransactions\n{\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We assume that rightOrder.takerAssetData == leftOrder.makerAssetData and rightOrder.makerAssetData == leftOrder.takerAssetData.\n // If this assumption isn't true, the match will fail at signature validation.\n rightOrder.makerAssetData = leftOrder.takerAssetData;\n rightOrder.takerAssetData = leftOrder.makerAssetData;\n\n // Get left & right order info\n LibOrder.OrderInfo memory leftOrderInfo = getOrderInfo(leftOrder);\n LibOrder.OrderInfo memory rightOrderInfo = getOrderInfo(rightOrder);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Either our context is valid or we revert\n assertValidMatch(leftOrder, rightOrder);\n\n // Compute proportional fill amounts\n matchedFillResults = calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderTakerAssetFilledAmount,\n rightOrderInfo.orderTakerAssetFilledAmount\n );\n\n // Validate fill contexts\n assertValidFill(\n leftOrder,\n leftOrderInfo,\n takerAddress,\n matchedFillResults.left.takerAssetFilledAmount,\n matchedFillResults.left.takerAssetFilledAmount,\n leftSignature\n );\n assertValidFill(\n rightOrder,\n rightOrderInfo,\n takerAddress,\n matchedFillResults.right.takerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount,\n rightSignature\n );\n\n // Update exchange state\n updateFilledState(\n leftOrder,\n takerAddress,\n leftOrderInfo.orderHash,\n leftOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.left\n );\n updateFilledState(\n rightOrder,\n takerAddress,\n rightOrderInfo.orderHash,\n rightOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.right\n );\n \n // Settle matched orders. Succeeds or throws.\n settleMatchedOrders(\n leftOrder,\n rightOrder,\n takerAddress,\n matchedFillResults\n );\n\n return matchedFillResults;\n }\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure\n {\n // Make sure there is a profitable spread.\n // There is a profitable spread iff the cost per unit bought (OrderA.MakerAmount/OrderA.TakerAmount) for each order is greater\n // than the profit per unit sold of the matched order (OrderB.TakerAmount/OrderB.MakerAmount).\n // This is satisfied by the equations below:\n // <leftOrder.makerAssetAmount> / <leftOrder.takerAssetAmount> >= <rightOrder.takerAssetAmount> / <rightOrder.makerAssetAmount>\n // AND\n // <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount> >= <leftOrder.takerAssetAmount> / <leftOrder.makerAssetAmount>\n // These equations can be combined to get the following:\n require(\n safeMul(leftOrder.makerAssetAmount, rightOrder.makerAssetAmount) >=\n safeMul(leftOrder.takerAssetAmount, rightOrder.takerAssetAmount),\n \"NEGATIVE_SPREAD_REQUIRED\"\n );\n }\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We settle orders at the exchange rate of the right order.\n // The amount saved by the left maker goes to the taker.\n // Either the left or right order will be fully filled; possibly both.\n // The left order is fully filled iff the right order can sell more than left can buy.\n // That is: the amount required to fill the left order is less than or equal to\n // the amount we can spend from the right order:\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightMakerToTakerRatio>\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount>\n // <leftTakerAssetAmountRemaining> * <rightOrder.takerAssetAmount> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount>\n uint256 leftTakerAssetAmountRemaining = safeSub(leftOrder.takerAssetAmount, leftOrderTakerAssetFilledAmount);\n uint256 rightTakerAssetAmountRemaining = safeSub(rightOrder.takerAssetAmount, rightOrderTakerAssetFilledAmount);\n uint256 leftTakerAssetFilledAmount;\n uint256 rightTakerAssetFilledAmount;\n if (\n safeMul(leftTakerAssetAmountRemaining, rightOrder.takerAssetAmount) <=\n safeMul(rightTakerAssetAmountRemaining, rightOrder.makerAssetAmount)\n ) {\n // Left order will be fully filled: maximally fill left\n leftTakerAssetFilledAmount = leftTakerAssetAmountRemaining;\n\n // The right order receives an amount proportional to how much was spent.\n rightTakerAssetFilledAmount = getPartialAmount(\n rightOrder.takerAssetAmount,\n rightOrder.makerAssetAmount,\n leftTakerAssetFilledAmount\n );\n } else {\n // Right order will be fully filled: maximally fill right\n rightTakerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n // The left order receives an amount proportional to how much was spent.\n leftTakerAssetFilledAmount = getPartialAmount(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n rightTakerAssetFilledAmount\n );\n }\n\n // Calculate fill results for left order\n matchedFillResults.left = calculateFillResults(\n leftOrder,\n leftTakerAssetFilledAmount\n );\n\n // Calculate fill results for right order\n matchedFillResults.right = calculateFillResults(\n rightOrder,\n rightTakerAssetFilledAmount\n );\n\n // Calculate amount given to taker\n matchedFillResults.leftMakerAssetSpreadAmount = safeSub(\n matchedFillResults.left.makerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n // Return fill results\n return matchedFillResults;\n }\n\n /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.\n /// @param leftOrder First matched order.\n /// @param rightOrder Second matched order.\n /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.\n /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.\n function settleMatchedOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n address takerAddress,\n LibFillResults.MatchedFillResults memory matchedFillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n // Order makers and taker\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftOrder.makerAddress,\n rightOrder.makerAddress,\n matchedFillResults.right.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n rightOrder.makerAssetData,\n rightOrder.makerAddress,\n leftOrder.makerAddress,\n matchedFillResults.left.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftOrder.makerAddress,\n takerAddress,\n matchedFillResults.leftMakerAssetSpreadAmount\n );\n\n // Maker fees\n dispatchTransferFrom(\n zrxAssetData,\n leftOrder.makerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n rightOrder.makerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.makerFeePaid\n );\n\n // Taker fees\n if (leftOrder.feeRecipientAddress == rightOrder.feeRecipientAddress) {\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n leftOrder.feeRecipientAddress,\n safeAdd(\n matchedFillResults.left.takerFeePaid,\n matchedFillResults.right.takerFeePaid\n )\n );\n } else {\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.takerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.takerFeePaid\n );\n }\n }\n}\n",
"2.0.0/protocol/Exchange/MixinSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\n\ncontract MixinSignatureValidator is\n MSignatureValidator,\n MTransactions\n{\n using LibBytes for bytes;\n \n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(\n hash,\n signerAddress,\n signature\n ),\n \"INVALID_SIGNATURE\"\n );\n preSigned[hash][signerAddress] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external\n {\n address signerAddress = getCurrentContextAddress();\n allowedValidators[signerAddress][validatorAddress] = approval;\n emit SignatureValidatorApproval(\n signerAddress,\n validatorAddress,\n approval\n );\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n require(\n signature.length > 0,\n \"LENGTH_GREATER_THAN_0_REQUIRED\"\n );\n\n // Ensure signature is supported\n uint8 signatureTypeRaw = uint8(signature.popLastByte());\n require(\n signatureTypeRaw < uint8(SignatureType.NSignatureTypes),\n \"SIGNATURE_UNSUPPORTED\"\n );\n\n // Pop last byte off of signature byte array.\n SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(\"SIGNATURE_ILLEGAL\");\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(hash, v, r, s);\n isValid = signerAddress == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n32\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = signerAddress == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signerAddress).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n\n address validatorAddress = signature.popLast20Bytes();\n \n // Ensure signer has approved validator.\n if (!allowedValidators[signerAddress][validatorAddress]) {\n return false;\n }\n isValid = IValidator(validatorAddress).isValidSignature(\n hash,\n signerAddress,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signerAddress];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n\\x20\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(\"SIGNATURE_UNSUPPORTED\");\n }\n}\n",
"2.0.0/protocol/Exchange/MixinTransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\n\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./libs/LibEIP712.sol\";\n\n\ncontract MixinTransactions is\n LibEIP712,\n MSignatureValidator,\n MTransactions\n{\n\n // Mapping of transaction hash => executed\n // This prevents transactions from being executed more than once.\n mapping (bytes32 => bool) public transactions;\n\n // Address of current transaction signer\n address public currentContextAddress;\n\n // Hash for the EIP712 ZeroEx Transaction Schema\n bytes32 constant internal EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"ZeroExTransaction(\",\n \"uint256 salt,\",\n \"address signerAddress,\",\n \"bytes data\",\n \")\"\n ));\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external\n {\n // Prevent reentrancy\n require(\n currentContextAddress == address(0),\n \"REENTRANCY_ILLEGAL\"\n );\n\n bytes32 transactionHash = hashEIP712Message(hashZeroExTransaction(\n salt,\n signerAddress,\n data\n ));\n\n // Validate transaction has not been executed\n require(\n !transactions[transactionHash],\n \"INVALID_TX_HASH\"\n );\n\n // Transaction always valid if signer is sender of transaction\n if (signerAddress != msg.sender) {\n // Validate signature\n require(\n isValidSignature(\n transactionHash,\n signerAddress,\n signature\n ),\n \"INVALID_TX_SIGNATURE\"\n );\n\n // Set the current transaction signer\n currentContextAddress = signerAddress;\n }\n\n // Execute transaction\n transactions[transactionHash] = true;\n require(\n address(this).delegatecall(data),\n \"FAILED_EXECUTION\"\n );\n\n // Reset current transaction signer if it was previously updated\n if (signerAddress != msg.sender) {\n currentContextAddress = address(0);\n }\n }\n\n /// @dev Calculates EIP712 hash of the Transaction.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @return EIP712 hash of the Transaction.\n function hashZeroExTransaction(\n uint256 salt,\n address signerAddress,\n bytes memory data\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes32 dataHash = keccak256(data);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,\n // salt,\n // signerAddress,\n // keccak256(data)\n // ));\n\n assembly {\n let memPtr := mload(64)\n mstore(memPtr, schemaHash)\n mstore(add(memPtr, 32), salt)\n mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(memPtr, 96), dataHash)\n result := keccak256(memPtr, 128)\n }\n\n return result;\n }\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address)\n {\n address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;\n return contextAddress;\n }\n}\n",
- "2.0.0/protocol/Exchange/MixinWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./mixins/MExchangeCore.sol\";\n\n\ncontract MixinWrapperFunctions is\n LibMath,\n LibFillResults,\n MExchangeCore\n{\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n fillResults = fillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n require(\n fillResults.takerAssetFilledAmount == takerAssetFillAmount,\n \"COMPLETE_FILL_FAILED\"\n );\n return fillResults;\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n bytes4 fillOrderSelector = this.fillOrder.selector;\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n let headerAreaStart := mload(0x40)\n mstore(headerAreaStart, fillOrderSelector)\n let headerAreaEnd := add(headerAreaStart, 0x4)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Execute delegatecall\n let success := delegatecall(\n gas, // forward all gas, TODO: look into gas consumption of assert/throw\n address, // call address of this contract\n headerAreaStart, // pointer to start of input\n sub(dataAreaEnd, headerAreaStart), // length of input\n headerAreaStart, // write output over input\n 128 // output size is 128 bytes\n )\n switch success\n case 0 {\n mstore(fillResults, 0)\n mstore(add(fillResults, 32), 0)\n mstore(add(fillResults, 64), 0)\n mstore(add(fillResults, 96), 0)\n }\n case 1 {\n mstore(fillResults, mload(headerAreaStart))\n mstore(add(fillResults, 32), mload(add(headerAreaStart, 32)))\n mstore(add(fillResults, 64), mload(add(headerAreaStart, 64)))\n mstore(add(fillResults, 96), mload(add(headerAreaStart, 96)))\n }\n }\n return fillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrKillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n \n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public\n {\n for (uint256 i = 0; i < orders.length; i++) {\n cancelOrder(orders[i]);\n }\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./mixins/MExchangeCore.sol\";\n\n\ncontract MixinWrapperFunctions is\n LibMath,\n LibFillResults,\n MExchangeCore\n{\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n fillResults = fillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n require(\n fillResults.takerAssetFilledAmount == takerAssetFillAmount,\n \"COMPLETE_FILL_FAILED\"\n );\n return fillResults;\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n bytes4 fillOrderSelector = this.fillOrder.selector;\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n let headerAreaStart := mload(0x40)\n mstore(headerAreaStart, fillOrderSelector)\n let headerAreaEnd := add(headerAreaStart, 0x4)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Execute delegatecall\n let success := delegatecall(\n gas, // forward all gas, TODO: look into gas consumption of assert/throw\n address, // call address of this contract\n headerAreaStart, // pointer to start of input\n sub(dataAreaEnd, headerAreaStart), // length of input\n headerAreaStart, // write output over input\n 128 // output size is 128 bytes\n )\n switch success\n case 0 {\n mstore(fillResults, 0)\n mstore(add(fillResults, 32), 0)\n mstore(add(fillResults, 64), 0)\n mstore(add(fillResults, 96), 0)\n }\n case 1 {\n mstore(fillResults, mload(headerAreaStart))\n mstore(add(fillResults, 32), mload(add(headerAreaStart, 32)))\n mstore(add(fillResults, 64), mload(add(headerAreaStart, 64)))\n mstore(add(fillResults, 96), mload(add(headerAreaStart, 96)))\n }\n }\n return fillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrKillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n \n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public\n {\n for (uint256 i = 0; i < orders.length; i++) {\n cancelOrder(orders[i]);\n }\n }\n\n /// @dev Fetches information for all passed in orders.\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory)\n {\n uint256 length = orders.length;\n LibOrder.OrderInfo[] memory ordersInfo = new LibOrder.OrderInfo[](length);\n for (uint256 i = 0; i < length; i++) {\n ordersInfo[i] = getOrderInfo(orders[i]);\n }\n return ordersInfo;\n }\n}\n",
"2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
"2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
"2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
@@ -2043,7 +2126,7 @@
"2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
"2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_OVERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
},
- "sourceTreeHashHex": "0x667ddf5a32b87ae7eee520250a4a827ca6e1acb44e0946be4919b58a8d8a9856",
+ "sourceTreeHashHex": "0xbfc241cbae71226b40165a93c66351122af93c9b20c621b3c5d3ab7bd7145fdc",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
diff --git a/packages/migrations/artifacts/2.0.0/ExchangeWrapper.json b/packages/migrations/artifacts/2.0.0/ExchangeWrapper.json
index 2191fff88..e6d619340 100644
--- a/packages/migrations/artifacts/2.0.0/ExchangeWrapper.json
+++ b/packages/migrations/artifacts/2.0.0/ExchangeWrapper.json
@@ -120,14 +120,14 @@
"evm": {
"bytecode": {
"linkReferences": {},
- "object": "0x608060405234801561001057600080fd5b50604051602080610a86833981018060405261002f9190810190610067565b60008054600160a060020a031916600160a060020a0392909216919091179055610099565b6000610060825161008d565b9392505050565b60006020828403121561007957600080fd5b60006100858484610054565b949350505050565b600160a060020a031690565b6109de806100a86000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663a2dbfe658114610050578063f7de1c8b14610072575b600080fd5b34801561005c57600080fd5b5061007061006b366004610538565b610092565b005b34801561007e57600080fd5b5061007061008d3660046105f4565b6101e4565b60405133906060907fb4be83d500000000000000000000000000000000000000000000000000000000906100ce908990899088906024016107d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906101a9908890869086908990600401610868565b600060405180830381600087803b1580156101c357600080fd5b505af11580156101d7573d6000803e3d6000fd5b5050505050505050505050565b60405133906060907f4f9559b1000000000000000000000000000000000000000000000000000000009061021c908890602401610807565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906102f9908890869086908a908a9060040161081b565b600060405180830381600087803b15801561031357600080fd5b505af1158015610327573d6000803e3d6000fd5b50505050505050505050565b600061033f8235610924565b9392505050565b600080601f8301841361035857600080fd5b50813567ffffffffffffffff81111561037057600080fd5b60208301915083600182028301111561038857600080fd5b9250929050565b6000601f820183136103a057600080fd5b81356103b36103ae826108da565b6108b3565b915080825260208301602083018583830111156103cf57600080fd5b6103da838284610940565b50505092915050565b600061018082840312156103f657600080fd5b6104016101806108b3565b9050600061040f8484610333565b825250602061042084848301610333565b602083015250604061043484828501610333565b604083015250606061044884828501610333565b606083015250608061045c8482850161052c565b60808301525060a06104708482850161052c565b60a08301525060c06104848482850161052c565b60c08301525060e06104988482850161052c565b60e0830152506101006104ad8482850161052c565b610100830152506101206104c38482850161052c565b6101208301525061014082013567ffffffffffffffff8111156104e557600080fd5b6104f18482850161038f565b6101408301525061016082013567ffffffffffffffff81111561051357600080fd5b61051f8482850161038f565b6101608301525092915050565b600061033f823561093d565b600080600080600060a0868803121561055057600080fd5b853567ffffffffffffffff81111561056757600080fd5b610573888289016103e3565b95505060206105848882890161052c565b94505060406105958882890161052c565b935050606086013567ffffffffffffffff8111156105b257600080fd5b6105be8882890161038f565b925050608086013567ffffffffffffffff8111156105db57600080fd5b6105e78882890161038f565b9150509295509295909350565b6000806000806060858703121561060a57600080fd5b6000610616878761052c565b94505060206106278782880161052c565b935050604085013567ffffffffffffffff81111561064457600080fd5b61065087828801610346565b95989497509550505050565b61066581610924565b82525050565b6000828452602084019350610681838584610940565b61068a8361097c565b9093019392505050565b600061069f82610920565b8084526106b381602086016020860161094c565b6106bc8161097c565b9093016020019392505050565b80516000906101808401906106de858261065c565b5060208301516106f1602086018261065c565b506040830151610704604086018261065c565b506060830151610717606086018261065c565b50608083015161072a60808601826107cc565b5060a083015161073d60a08601826107cc565b5060c083015161075060c08601826107cc565b5060e083015161076360e08601826107cc565b506101008301516107786101008601826107cc565b5061012083015161078d6101208601826107cc565b506101408301518482036101408601526107a78282610694565b9150506101608301518482036101608601526107c38282610694565b95945050505050565b6106658161093d565b606080825281016107e681866106c9565b90506107f560208301856107cc565b81810360408301526107c38184610694565b6020810161081582846107cc565b92915050565b6080810161082982886107cc565b610836602083018761065c565b81810360408301526108488186610694565b9050818103606083015261085d81848661066b565b979650505050505050565b6080810161087682876107cc565b610883602083018661065c565b81810360408301526108958185610694565b905081810360608301526108a98184610694565b9695505050505050565b60405181810167ffffffffffffffff811182821017156108d257600080fd5b604052919050565b600067ffffffffffffffff8211156108f157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b82818337506000910152565b60005b8381101561096757818101518382015260200161094f565b83811115610976576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a7230582052a9c2bd0705118df191041c9644a342fe157e4ea403fc34a1aa872264614cc86c6578706572696d656e74616cf50037",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0xA86 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH2 0x2F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x67 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x60 DUP3 MLOAD PUSH2 0x8D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x85 DUP5 DUP5 PUSH2 0x54 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x9DE DUP1 PUSH2 0xA8 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xA2DBFE65 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xF7DE1C8B EQ PUSH2 0x72 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x6B CALLDATASIZE PUSH1 0x4 PUSH2 0x538 JUMP JUMPDEST PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x5F4 JUMP JUMPDEST PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xCE SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x1A9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x868 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0x4F9559B100000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x21C SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x807 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x2F9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x81B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x327 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x924 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x358 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x388 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B3 PUSH2 0x3AE DUP3 PUSH2 0x8DA JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DA DUP4 DUP3 DUP5 PUSH2 0x940 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x401 PUSH2 0x180 PUSH2 0x8B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x40F DUP5 DUP5 PUSH2 0x333 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x420 DUP5 DUP5 DUP4 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x434 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x448 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x45C DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x470 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x484 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x498 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x4AD DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x4C3 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4F1 DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x51F DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x93D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x550 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x567 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x573 DUP9 DUP3 DUP10 ADD PUSH2 0x3E3 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x584 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x595 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BE DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5E7 DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x616 DUP8 DUP8 PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x627 DUP8 DUP3 DUP9 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x644 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x650 DUP8 DUP3 DUP9 ADD PUSH2 0x346 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x924 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x681 DUP4 DUP6 DUP5 PUSH2 0x940 JUMP JUMPDEST PUSH2 0x68A DUP4 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x69F DUP3 PUSH2 0x920 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x6B3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x94C JUMP JUMPDEST PUSH2 0x6BC DUP2 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x6DE DUP6 DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x6F1 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x704 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x717 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x72A PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x73D PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x750 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x763 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x778 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x78D PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x7A7 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x7C3 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x93D JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7E6 DUP2 DUP7 PUSH2 0x6C9 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x7CC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x7C3 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x815 DUP3 DUP5 PUSH2 0x7CC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x829 DUP3 DUP9 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x836 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x848 DUP2 DUP7 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x85D DUP2 DUP5 DUP7 PUSH2 0x66B JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x876 DUP3 DUP8 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x883 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x895 DUP2 DUP6 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x8A9 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x8D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x8F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x967 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x94F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x976 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 MSTORE 0xa9 0xc2 0xbd SMOD SDIV GT DUP14 CALL SWAP2 DIV SHR SWAP7 DIFFICULTY LOG3 TIMESTAMP INVALID ISZERO PUSH31 0x4EA403FC34A1AA872264614CC86C6578706572696D656E74616CF500370000 ",
+ "object": "0x608060405234801561001057600080fd5b50604051602080610a86833981018060405261002f9190810190610067565b60008054600160a060020a031916600160a060020a0392909216919091179055610099565b6000610060825161008d565b9392505050565b60006020828403121561007957600080fd5b60006100858484610054565b949350505050565b600160a060020a031690565b6109de806100a86000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663a2dbfe658114610050578063f7de1c8b14610072575b600080fd5b34801561005c57600080fd5b5061007061006b366004610538565b610092565b005b34801561007e57600080fd5b5061007061008d3660046105f4565b6101e4565b60405133906060907fb4be83d500000000000000000000000000000000000000000000000000000000906100ce908990899088906024016107d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906101a9908890869086908990600401610868565b600060405180830381600087803b1580156101c357600080fd5b505af11580156101d7573d6000803e3d6000fd5b5050505050505050505050565b60405133906060907f4f9559b1000000000000000000000000000000000000000000000000000000009061021c908890602401610807565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906102f9908890869086908a908a9060040161081b565b600060405180830381600087803b15801561031357600080fd5b505af1158015610327573d6000803e3d6000fd5b50505050505050505050565b600061033f8235610924565b9392505050565b600080601f8301841361035857600080fd5b50813567ffffffffffffffff81111561037057600080fd5b60208301915083600182028301111561038857600080fd5b9250929050565b6000601f820183136103a057600080fd5b81356103b36103ae826108da565b6108b3565b915080825260208301602083018583830111156103cf57600080fd5b6103da838284610940565b50505092915050565b600061018082840312156103f657600080fd5b6104016101806108b3565b9050600061040f8484610333565b825250602061042084848301610333565b602083015250604061043484828501610333565b604083015250606061044884828501610333565b606083015250608061045c8482850161052c565b60808301525060a06104708482850161052c565b60a08301525060c06104848482850161052c565b60c08301525060e06104988482850161052c565b60e0830152506101006104ad8482850161052c565b610100830152506101206104c38482850161052c565b6101208301525061014082013567ffffffffffffffff8111156104e557600080fd5b6104f18482850161038f565b6101408301525061016082013567ffffffffffffffff81111561051357600080fd5b61051f8482850161038f565b6101608301525092915050565b600061033f823561093d565b600080600080600060a0868803121561055057600080fd5b853567ffffffffffffffff81111561056757600080fd5b610573888289016103e3565b95505060206105848882890161052c565b94505060406105958882890161052c565b935050606086013567ffffffffffffffff8111156105b257600080fd5b6105be8882890161038f565b925050608086013567ffffffffffffffff8111156105db57600080fd5b6105e78882890161038f565b9150509295509295909350565b6000806000806060858703121561060a57600080fd5b6000610616878761052c565b94505060206106278782880161052c565b935050604085013567ffffffffffffffff81111561064457600080fd5b61065087828801610346565b95989497509550505050565b61066581610924565b82525050565b6000828452602084019350610681838584610940565b61068a8361097c565b9093019392505050565b600061069f82610920565b8084526106b381602086016020860161094c565b6106bc8161097c565b9093016020019392505050565b80516000906101808401906106de858261065c565b5060208301516106f1602086018261065c565b506040830151610704604086018261065c565b506060830151610717606086018261065c565b50608083015161072a60808601826107cc565b5060a083015161073d60a08601826107cc565b5060c083015161075060c08601826107cc565b5060e083015161076360e08601826107cc565b506101008301516107786101008601826107cc565b5061012083015161078d6101208601826107cc565b506101408301518482036101408601526107a78282610694565b9150506101608301518482036101608601526107c38282610694565b95945050505050565b6106658161093d565b606080825281016107e681866106c9565b90506107f560208301856107cc565b81810360408301526107c38184610694565b6020810161081582846107cc565b92915050565b6080810161082982886107cc565b610836602083018761065c565b81810360408301526108488186610694565b9050818103606083015261085d81848661066b565b979650505050505050565b6080810161087682876107cc565b610883602083018661065c565b81810360408301526108958185610694565b905081810360608301526108a98184610694565b9695505050505050565b60405181810167ffffffffffffffff811182821017156108d257600080fd5b604052919050565b600067ffffffffffffffff8211156108f157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b82818337506000910152565b60005b8381101561096757818101518382015260200161094f565b83811115610976576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058207cf6c43855ec3c90051a1652faa76da89c76ad7dcadee12edb0d13b52a6fd4f86c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0xA86 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH2 0x2F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x67 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x60 DUP3 MLOAD PUSH2 0x8D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x85 DUP5 DUP5 PUSH2 0x54 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x9DE DUP1 PUSH2 0xA8 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xA2DBFE65 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xF7DE1C8B EQ PUSH2 0x72 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x6B CALLDATASIZE PUSH1 0x4 PUSH2 0x538 JUMP JUMPDEST PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x5F4 JUMP JUMPDEST PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xCE SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x1A9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x868 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0x4F9559B100000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x21C SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x807 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x2F9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x81B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x327 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x924 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x358 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x388 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B3 PUSH2 0x3AE DUP3 PUSH2 0x8DA JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DA DUP4 DUP3 DUP5 PUSH2 0x940 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x401 PUSH2 0x180 PUSH2 0x8B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x40F DUP5 DUP5 PUSH2 0x333 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x420 DUP5 DUP5 DUP4 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x434 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x448 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x45C DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x470 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x484 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x498 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x4AD DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x4C3 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4F1 DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x51F DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x93D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x550 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x567 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x573 DUP9 DUP3 DUP10 ADD PUSH2 0x3E3 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x584 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x595 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BE DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5E7 DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x616 DUP8 DUP8 PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x627 DUP8 DUP3 DUP9 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x644 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x650 DUP8 DUP3 DUP9 ADD PUSH2 0x346 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x924 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x681 DUP4 DUP6 DUP5 PUSH2 0x940 JUMP JUMPDEST PUSH2 0x68A DUP4 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x69F DUP3 PUSH2 0x920 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x6B3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x94C JUMP JUMPDEST PUSH2 0x6BC DUP2 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x6DE DUP6 DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x6F1 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x704 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x717 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x72A PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x73D PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x750 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x763 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x778 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x78D PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x7A7 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x7C3 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x93D JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7E6 DUP2 DUP7 PUSH2 0x6C9 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x7CC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x7C3 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x815 DUP3 DUP5 PUSH2 0x7CC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x829 DUP3 DUP9 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x836 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x848 DUP2 DUP7 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x85D DUP2 DUP5 DUP7 PUSH2 0x66B JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x876 DUP3 DUP8 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x883 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x895 DUP2 DUP6 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x8A9 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x8D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x8F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x967 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x94F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x976 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH29 0xF6C43855EC3C90051A1652FAA76DA89C76AD7DCADEE12EDB0D13B52A6F 0xd4 0xf8 PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
"sourceMap": "752:2418:10:-;;;896:99;8:9:-1;5:2;;;30:1;27;20:12;5:2;896:99:10;;;;;;;;;;;;;;;;;;;;;;957:8;:31;;-1:-1:-1;;;;;;957:31:10;-1:-1:-1;;;;;957:31:10;;;;;;;;;;752:2418;;5:122:-1;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:263;;249:2;237:9;228:7;224:23;220:32;217:2;;;265:1;262;255:12;217:2;300:1;317:64;373:7;353:9;317:64;;;307:74;211:186;-1:-1;;;;211:186;404:128;-1:-1;;;;;473:54;;456:76;;752:2418:10;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
- "object": "0x60806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663a2dbfe658114610050578063f7de1c8b14610072575b600080fd5b34801561005c57600080fd5b5061007061006b366004610538565b610092565b005b34801561007e57600080fd5b5061007061008d3660046105f4565b6101e4565b60405133906060907fb4be83d500000000000000000000000000000000000000000000000000000000906100ce908990899088906024016107d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906101a9908890869086908990600401610868565b600060405180830381600087803b1580156101c357600080fd5b505af11580156101d7573d6000803e3d6000fd5b5050505050505050505050565b60405133906060907f4f9559b1000000000000000000000000000000000000000000000000000000009061021c908890602401610807565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906102f9908890869086908a908a9060040161081b565b600060405180830381600087803b15801561031357600080fd5b505af1158015610327573d6000803e3d6000fd5b50505050505050505050565b600061033f8235610924565b9392505050565b600080601f8301841361035857600080fd5b50813567ffffffffffffffff81111561037057600080fd5b60208301915083600182028301111561038857600080fd5b9250929050565b6000601f820183136103a057600080fd5b81356103b36103ae826108da565b6108b3565b915080825260208301602083018583830111156103cf57600080fd5b6103da838284610940565b50505092915050565b600061018082840312156103f657600080fd5b6104016101806108b3565b9050600061040f8484610333565b825250602061042084848301610333565b602083015250604061043484828501610333565b604083015250606061044884828501610333565b606083015250608061045c8482850161052c565b60808301525060a06104708482850161052c565b60a08301525060c06104848482850161052c565b60c08301525060e06104988482850161052c565b60e0830152506101006104ad8482850161052c565b610100830152506101206104c38482850161052c565b6101208301525061014082013567ffffffffffffffff8111156104e557600080fd5b6104f18482850161038f565b6101408301525061016082013567ffffffffffffffff81111561051357600080fd5b61051f8482850161038f565b6101608301525092915050565b600061033f823561093d565b600080600080600060a0868803121561055057600080fd5b853567ffffffffffffffff81111561056757600080fd5b610573888289016103e3565b95505060206105848882890161052c565b94505060406105958882890161052c565b935050606086013567ffffffffffffffff8111156105b257600080fd5b6105be8882890161038f565b925050608086013567ffffffffffffffff8111156105db57600080fd5b6105e78882890161038f565b9150509295509295909350565b6000806000806060858703121561060a57600080fd5b6000610616878761052c565b94505060206106278782880161052c565b935050604085013567ffffffffffffffff81111561064457600080fd5b61065087828801610346565b95989497509550505050565b61066581610924565b82525050565b6000828452602084019350610681838584610940565b61068a8361097c565b9093019392505050565b600061069f82610920565b8084526106b381602086016020860161094c565b6106bc8161097c565b9093016020019392505050565b80516000906101808401906106de858261065c565b5060208301516106f1602086018261065c565b506040830151610704604086018261065c565b506060830151610717606086018261065c565b50608083015161072a60808601826107cc565b5060a083015161073d60a08601826107cc565b5060c083015161075060c08601826107cc565b5060e083015161076360e08601826107cc565b506101008301516107786101008601826107cc565b5061012083015161078d6101208601826107cc565b506101408301518482036101408601526107a78282610694565b9150506101608301518482036101608601526107c38282610694565b95945050505050565b6106658161093d565b606080825281016107e681866106c9565b90506107f560208301856107cc565b81810360408301526107c38184610694565b6020810161081582846107cc565b92915050565b6080810161082982886107cc565b610836602083018761065c565b81810360408301526108488186610694565b9050818103606083015261085d81848661066b565b979650505050505050565b6080810161087682876107cc565b610883602083018661065c565b81810360408301526108958185610694565b905081810360608301526108a98184610694565b9695505050505050565b60405181810167ffffffffffffffff811182821017156108d257600080fd5b604052919050565b600067ffffffffffffffff8211156108f157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b82818337506000910152565b60005b8381101561096757818101518382015260200161094f565b83811115610976576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a7230582052a9c2bd0705118df191041c9644a342fe157e4ea403fc34a1aa872264614cc86c6578706572696d656e74616cf50037",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xA2DBFE65 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xF7DE1C8B EQ PUSH2 0x72 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x6B CALLDATASIZE PUSH1 0x4 PUSH2 0x538 JUMP JUMPDEST PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x5F4 JUMP JUMPDEST PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xCE SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x1A9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x868 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0x4F9559B100000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x21C SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x807 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x2F9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x81B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x327 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x924 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x358 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x388 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B3 PUSH2 0x3AE DUP3 PUSH2 0x8DA JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DA DUP4 DUP3 DUP5 PUSH2 0x940 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x401 PUSH2 0x180 PUSH2 0x8B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x40F DUP5 DUP5 PUSH2 0x333 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x420 DUP5 DUP5 DUP4 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x434 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x448 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x45C DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x470 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x484 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x498 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x4AD DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x4C3 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4F1 DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x51F DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x93D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x550 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x567 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x573 DUP9 DUP3 DUP10 ADD PUSH2 0x3E3 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x584 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x595 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BE DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5E7 DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x616 DUP8 DUP8 PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x627 DUP8 DUP3 DUP9 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x644 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x650 DUP8 DUP3 DUP9 ADD PUSH2 0x346 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x924 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x681 DUP4 DUP6 DUP5 PUSH2 0x940 JUMP JUMPDEST PUSH2 0x68A DUP4 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x69F DUP3 PUSH2 0x920 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x6B3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x94C JUMP JUMPDEST PUSH2 0x6BC DUP2 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x6DE DUP6 DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x6F1 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x704 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x717 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x72A PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x73D PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x750 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x763 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x778 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x78D PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x7A7 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x7C3 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x93D JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7E6 DUP2 DUP7 PUSH2 0x6C9 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x7CC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x7C3 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x815 DUP3 DUP5 PUSH2 0x7CC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x829 DUP3 DUP9 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x836 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x848 DUP2 DUP7 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x85D DUP2 DUP5 DUP7 PUSH2 0x66B JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x876 DUP3 DUP8 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x883 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x895 DUP2 DUP6 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x8A9 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x8D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x8F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x967 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x94F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x976 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 MSTORE 0xa9 0xc2 0xbd SMOD SDIV GT DUP14 CALL SWAP2 DIV SHR SWAP7 DIFFICULTY LOG3 TIMESTAMP INVALID ISZERO PUSH31 0x4EA403FC34A1AA872264614CC86C6578706572696D656E74616CF500370000 ",
+ "object": "0x60806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663a2dbfe658114610050578063f7de1c8b14610072575b600080fd5b34801561005c57600080fd5b5061007061006b366004610538565b610092565b005b34801561007e57600080fd5b5061007061008d3660046105f4565b6101e4565b60405133906060907fb4be83d500000000000000000000000000000000000000000000000000000000906100ce908990899088906024016107d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906101a9908890869086908990600401610868565b600060405180830381600087803b1580156101c357600080fd5b505af11580156101d7573d6000803e3d6000fd5b5050505050505050505050565b60405133906060907f4f9559b1000000000000000000000000000000000000000000000000000000009061021c908890602401610807565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906102f9908890869086908a908a9060040161081b565b600060405180830381600087803b15801561031357600080fd5b505af1158015610327573d6000803e3d6000fd5b50505050505050505050565b600061033f8235610924565b9392505050565b600080601f8301841361035857600080fd5b50813567ffffffffffffffff81111561037057600080fd5b60208301915083600182028301111561038857600080fd5b9250929050565b6000601f820183136103a057600080fd5b81356103b36103ae826108da565b6108b3565b915080825260208301602083018583830111156103cf57600080fd5b6103da838284610940565b50505092915050565b600061018082840312156103f657600080fd5b6104016101806108b3565b9050600061040f8484610333565b825250602061042084848301610333565b602083015250604061043484828501610333565b604083015250606061044884828501610333565b606083015250608061045c8482850161052c565b60808301525060a06104708482850161052c565b60a08301525060c06104848482850161052c565b60c08301525060e06104988482850161052c565b60e0830152506101006104ad8482850161052c565b610100830152506101206104c38482850161052c565b6101208301525061014082013567ffffffffffffffff8111156104e557600080fd5b6104f18482850161038f565b6101408301525061016082013567ffffffffffffffff81111561051357600080fd5b61051f8482850161038f565b6101608301525092915050565b600061033f823561093d565b600080600080600060a0868803121561055057600080fd5b853567ffffffffffffffff81111561056757600080fd5b610573888289016103e3565b95505060206105848882890161052c565b94505060406105958882890161052c565b935050606086013567ffffffffffffffff8111156105b257600080fd5b6105be8882890161038f565b925050608086013567ffffffffffffffff8111156105db57600080fd5b6105e78882890161038f565b9150509295509295909350565b6000806000806060858703121561060a57600080fd5b6000610616878761052c565b94505060206106278782880161052c565b935050604085013567ffffffffffffffff81111561064457600080fd5b61065087828801610346565b95989497509550505050565b61066581610924565b82525050565b6000828452602084019350610681838584610940565b61068a8361097c565b9093019392505050565b600061069f82610920565b8084526106b381602086016020860161094c565b6106bc8161097c565b9093016020019392505050565b80516000906101808401906106de858261065c565b5060208301516106f1602086018261065c565b506040830151610704604086018261065c565b506060830151610717606086018261065c565b50608083015161072a60808601826107cc565b5060a083015161073d60a08601826107cc565b5060c083015161075060c08601826107cc565b5060e083015161076360e08601826107cc565b506101008301516107786101008601826107cc565b5061012083015161078d6101208601826107cc565b506101408301518482036101408601526107a78282610694565b9150506101608301518482036101608601526107c38282610694565b95945050505050565b6106658161093d565b606080825281016107e681866106c9565b90506107f560208301856107cc565b81810360408301526107c38184610694565b6020810161081582846107cc565b92915050565b6080810161082982886107cc565b610836602083018761065c565b81810360408301526108488186610694565b9050818103606083015261085d81848661066b565b979650505050505050565b6080810161087682876107cc565b610883602083018661065c565b81810360408301526108958185610694565b905081810360608301526108a98184610694565b9695505050505050565b60405181810167ffffffffffffffff811182821017156108d257600080fd5b604052919050565b600067ffffffffffffffff8211156108f157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b82818337506000910152565b60005b8381101561096757818101518382015260200161094f565b83811115610976576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058207cf6c43855ec3c90051a1652faa76da89c76ad7dcadee12edb0d13b52a6fd4f86c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xA2DBFE65 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xF7DE1C8B EQ PUSH2 0x72 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x6B CALLDATASIZE PUSH1 0x4 PUSH2 0x538 JUMP JUMPDEST PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x5F4 JUMP JUMPDEST PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xCE SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x1A9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x868 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0x4F9559B100000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x21C SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x807 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x2F9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x81B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x327 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x924 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x358 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x388 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B3 PUSH2 0x3AE DUP3 PUSH2 0x8DA JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DA DUP4 DUP3 DUP5 PUSH2 0x940 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x401 PUSH2 0x180 PUSH2 0x8B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x40F DUP5 DUP5 PUSH2 0x333 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x420 DUP5 DUP5 DUP4 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x434 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x448 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x45C DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x470 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x484 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x498 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x4AD DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x4C3 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4F1 DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x51F DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x93D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x550 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x567 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x573 DUP9 DUP3 DUP10 ADD PUSH2 0x3E3 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x584 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x595 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BE DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5E7 DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x616 DUP8 DUP8 PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x627 DUP8 DUP3 DUP9 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x644 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x650 DUP8 DUP3 DUP9 ADD PUSH2 0x346 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x924 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x681 DUP4 DUP6 DUP5 PUSH2 0x940 JUMP JUMPDEST PUSH2 0x68A DUP4 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x69F DUP3 PUSH2 0x920 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x6B3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x94C JUMP JUMPDEST PUSH2 0x6BC DUP2 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x6DE DUP6 DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x6F1 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x704 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x717 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x72A PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x73D PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x750 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x763 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x778 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x78D PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x7A7 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x7C3 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x93D JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7E6 DUP2 DUP7 PUSH2 0x6C9 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x7CC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x7C3 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x815 DUP3 DUP5 PUSH2 0x7CC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x829 DUP3 DUP9 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x836 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x848 DUP2 DUP7 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x85D DUP2 DUP5 DUP7 PUSH2 0x66B JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x876 DUP3 DUP8 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x883 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x895 DUP2 DUP6 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x8A9 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x8D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x8F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x967 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x94F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x976 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH29 0xF6C43855EC3C90051A1652FAA76DA89C76AD7DCADEE12EDB0D13B52A6F 0xd4 0xf8 PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
"sourceMap": "752:2418:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;2481:687;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2481:687:10;;;;;;;;;;;1446:574;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1446:574:10;;;;;;;;;2481:687;2815:154;;2729:10;;2795:17;;2851:27;;2815:154;;2892:5;;2911:20;;2945:14;;2815:154;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2815:154:10;;;49:4:-1;25:18;;61:17;;2815:154:10;182:15:-1;2815:154:10;;;;179:29:-1;;;;160:49;;;-1:-1;3034:8:10;:127;;;;;2815:154;;-1:-1:-1;3034:8:10;;;;;:27;;:127;;3075:4;;3093:12;;2815:154;;3137:14;;3034:127;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3034:127:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3034:127:10;;;;2481:687;;;;;;;:::o;1446:574::-;1704:110;;1618:10;;1684:17;;1740:34;;1704:110;;1788:16;;1704:110;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1704:110:10;;;49:4:-1;25:18;;61:17;;1704:110:10;182:15:-1;1704:110:10;;;;179:29:-1;;;;160:49;;;-1:-1;1886:8:10;:127;;;;;1704:110;;-1:-1:-1;1886:8:10;;;;;:27;;:127;;1927:4;;1945:12;;1704:110;;1989:14;;;;1886:127;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1886:127:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1886:127:10;;;;1446:574;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;144:335;;;251:4;239:17;;235:27;-1:-1;225:2;;276:1;273;266:12;225:2;-1:-1;296:20;;336:18;325:30;;322:2;;;368:1;365;358:12;322:2;402:4;394:6;390:17;378:29;;452:3;445;437:6;433:16;423:8;419:31;416:40;413:2;;;469:1;466;459:12;413:2;218:261;;;;;;488:432;;578:4;566:17;;562:27;-1:-1;552:2;;603:1;600;593:12;552:2;640:6;627:20;662:60;677:44;714:6;677:44;;;662:60;;;653:69;;742:6;735:5;728:21;778:4;770:6;766:17;811:4;804:5;800:16;846:3;837:6;832:3;828:16;825:25;822:2;;;863:1;860;853:12;822:2;873:41;907:6;902:3;897;873:41;;;545:375;;;;;;;;1405:2208;;1516:5;1504:9;1499:3;1495:19;1491:31;1488:2;;;1535:1;1532;1525:12;1488:2;1553:21;1568:5;1553:21;;;1544:30;-1:-1;1632:1;1663:49;1708:3;1688:9;1663:49;;;1639:74;;-1:-1;1782:2;1815:49;1860:3;1836:22;;;1815:49;;;1808:4;1801:5;1797:16;1790:75;1734:142;1941:2;1974:49;2019:3;2010:6;1999:9;1995:22;1974:49;;;1967:4;1960:5;1956:16;1949:75;1886:149;2094:2;2127:49;2172:3;2163:6;2152:9;2148:22;2127:49;;;2120:4;2113:5;2109:16;2102:75;2045:143;2250:3;2284:49;2329:3;2320:6;2309:9;2305:22;2284:49;;;2277:4;2270:5;2266:16;2259:75;2198:147;2407:3;2441:49;2486:3;2477:6;2466:9;2462:22;2441:49;;;2434:4;2427:5;2423:16;2416:75;2355:147;2556:3;2590:49;2635:3;2626:6;2615:9;2611:22;2590:49;;;2583:4;2576:5;2572:16;2565:75;2512:139;2705:3;2739:49;2784:3;2775:6;2764:9;2760:22;2739:49;;;2732:4;2725:5;2721:16;2714:75;2661:139;2867:3;2902:49;2947:3;2938:6;2927:9;2923:22;2902:49;;;2894:5;2887;2883:17;2876:76;2810:153;3013:3;3048:49;3093:3;3084:6;3073:9;3069:22;3048:49;;;3040:5;3033;3029:17;3022:76;2973:136;3197:3;3186:9;3182:19;3169:33;3222:18;3214:6;3211:30;3208:2;;;3254:1;3251;3244:12;3208:2;3290:54;3340:3;3331:6;3320:9;3316:22;3290:54;;;3282:5;3275;3271:17;3264:81;3119:237;3444:3;3433:9;3429:19;3416:33;3469:18;3461:6;3458:30;3455:2;;;3501:1;3498;3491:12;3455:2;3537:54;3587:3;3578:6;3567:9;3563:22;3537:54;;;3529:5;3522;3518:17;3511:81;3366:237;1482:2131;;;;;3620:118;;3687:46;3725:6;3712:20;3687:46;;3745:1081;;;;;;3957:3;3945:9;3936:7;3932:23;3928:33;3925:2;;;3974:1;3971;3964:12;3925:2;4009:31;;4060:18;4049:30;;4046:2;;;4092:1;4089;4082:12;4046:2;4112:75;4179:7;4170:6;4159:9;4155:22;4112:75;;;4102:85;;3988:205;4224:2;4242:53;4287:7;4278:6;4267:9;4263:22;4242:53;;;4232:63;;4203:98;4332:2;4350:53;4395:7;4386:6;4375:9;4371:22;4350:53;;;4340:63;;4311:98;4468:2;4457:9;4453:18;4440:32;4492:18;4484:6;4481:30;4478:2;;;4524:1;4521;4514:12;4478:2;4544:62;4598:7;4589:6;4578:9;4574:22;4544:62;;;4534:72;;4419:193;4671:3;4660:9;4656:19;4643:33;4696:18;4688:6;4685:30;4682:2;;;4728:1;4725;4718:12;4682:2;4748:62;4802:7;4793:6;4782:9;4778:22;4748:62;;;4738:72;;4622:194;3919:907;;;;;;;;;4833:615;;;;;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5041:1;5058:53;5103:7;5083:9;5058:53;;;5048:63;;5020:97;5148:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;;;5156:63;;5127:98;5284:2;5273:9;5269:18;5256:32;5308:18;5300:6;5297:30;5294:2;;;5340:1;5337;5330:12;5294:2;5368:64;5424:7;5415:6;5404:9;5400:22;5368:64;;;4952:496;;;;-1:-1;5350:82;-1:-1;;;;4952:496;5455:110;5528:31;5553:5;5528:31;;;5523:3;5516:44;5510:55;;;5593:261;;5701:6;5696:3;5689:19;5725:4;5720:3;5716:14;5709:21;;5755:43;5791:6;5786:3;5779:5;5755:43;;;5819:29;5841:6;5819:29;;;5810:39;;;;5683:171;-1:-1;;;5683:171;5861:297;;5961:38;5993:5;5961:38;;;6016:6;6011:3;6004:19;6028:63;6084:6;6077:4;6072:3;6068:14;6061:4;6054:5;6050:16;6028:63;;;6123:29;6145:6;6123:29;;;6103:50;;;6116:4;6103:50;;5941:217;-1:-1;;;5941:217;6514:2417;6727:22;;6514:2417;;6649:5;6640:15;;;6761:61;6644:3;6727:22;6761:61;;;6670:164;6918:4;6911:5;6907:16;6901:23;6936:62;6992:4;6987:3;6983:14;6970:11;6936:62;;;6844:166;7101:4;7094:5;7090:16;7084:23;7119:62;7175:4;7170:3;7166:14;7153:11;7119:62;;;7020:173;7278:4;7271:5;7267:16;7261:23;7296:62;7352:4;7347:3;7343:14;7330:11;7296:62;;;7203:167;7458:4;7451:5;7447:16;7441:23;7476:62;7532:4;7527:3;7523:14;7510:11;7476:62;;;7380:170;7638:4;7631:5;7627:16;7621:23;7656:62;7712:4;7707:3;7703:14;7690:11;7656:62;;;7560:170;7810:4;7803:5;7799:16;7793:23;7828:62;7884:4;7879:3;7875:14;7862:11;7828:62;;;7740:162;7982:4;7975:5;7971:16;7965:23;8000:62;8056:4;8051:3;8047:14;8034:11;8000:62;;;7912:162;8167:5;8160;8156:17;8150:24;8186:63;8242:5;8237:3;8233:15;8220:11;8186:63;;;8084:177;8337:5;8330;8326:17;8320:24;8356:63;8412:5;8407:3;8403:15;8390:11;8356:63;;;8271:160;8517:5;8510;8506:17;8500:24;8570:3;8564:4;8560:14;8552:5;8547:3;8543:15;8536:39;8590:66;8651:4;8638:11;8590:66;;;8582:74;;8441:227;8754:5;8747;8743:17;8737:24;8807:3;8801:4;8797:14;8789:5;8784:3;8780:15;8773:39;8827:66;8888:4;8875:11;8827:66;;;8819:74;6622:2309;-1:-1;;;;;6622:2309;8938:110;9011:31;9036:5;9011:31;;9055:615;9281:2;9295:47;;;9266:18;;9356:92;9266:18;9434:6;9356:92;;;9348:100;;9459:62;9517:2;9506:9;9502:18;9493:6;9459:62;;;9569:9;9563:4;9559:20;9554:2;9543:9;9539:18;9532:48;9594:66;9655:4;9646:6;9594:66;;9677:193;9785:2;9770:18;;9799:61;9774:9;9833:6;9799:61;;;9756:114;;;;;9877:685;10115:3;10100:19;;10130:61;10104:9;10164:6;10130:61;;;10202:62;10260:2;10249:9;10245:18;10236:6;10202:62;;;10312:9;10306:4;10302:20;10297:2;10286:9;10282:18;10275:48;10337:66;10398:4;10389:6;10337:66;;;10329:74;;10451:9;10445:4;10441:20;10436:2;10425:9;10421:18;10414:48;10476:76;10547:4;10538:6;10530;10476:76;;;10468:84;10086:476;-1:-1;;;;;;;10086:476;10569:665;10797:3;10782:19;;10812:61;10786:9;10846:6;10812:61;;;10884:62;10942:2;10931:9;10927:18;10918:6;10884:62;;;10994:9;10988:4;10984:20;10979:2;10968:9;10964:18;10957:48;11019:66;11080:4;11071:6;11019:66;;;11011:74;;11133:9;11127:4;11123:20;11118:2;11107:9;11103:18;11096:48;11158:66;11219:4;11210:6;11158:66;;;11150:74;10768:466;-1:-1;;;;;;10768:466;11241:256;11303:2;11297:9;11329:17;;;11404:18;11389:34;;11425:22;;;11386:62;11383:2;;;11461:1;11458;11451:12;11383:2;11477;11470:22;11281:216;;-1:-1;11281:216;11504:254;;11643:18;11635:6;11632:30;11629:2;;;11675:1;11672;11665:12;11629:2;-1:-1;11748:4;11719;11696:17;;;;11715:9;11692:33;11738:15;;11566:192;12030:87;12100:12;;12084:33;12222:128;12302:42;12291:54;;12274:76;12357:79;12426:5;12409:27;12665:145;12746:6;12741:3;12736;12723:30;-1:-1;12802:1;12784:16;;12777:27;12716:94;12819:268;12884:1;12891:101;12905:6;12902:1;12899:13;12891:101;;;12972:11;;;12966:18;12953:11;;;12946:39;12927:2;12920:10;12891:101;;;13007:6;13004:1;13001:13;12998:2;;;13072:1;13063:6;13058:3;13054:16;13047:27;12998:2;12868:219;;;;;13095:97;13183:2;13163:14;13179:7;13159:28;;13143:49"
}
}
@@ -177,14 +177,14 @@
"2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
"2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
"2.0.0/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
- "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n\n /// @dev Fetches information for all passed in orders\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory);\n}\n",
"2.0.0/protocol/Exchange/libs/LibEIP712.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 public constant EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encode(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n address(this)\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, hashStruct));\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibFillResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibOrder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // order.makerAddress,\n // order.takerAddress,\n // order.feeRecipientAddress,\n // order.senderAddress,\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Backup\n // solhint-disable-next-line space-after-comma\n let temp1 := mload(sub(order, 32))\n let temp2 := mload(add(order, 320))\n let temp3 := mload(add(order, 352))\n \n // Hash in place\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), schemaHash)\n mstore(add(order, 320), makerAssetDataHash)\n mstore(add(order, 352), takerAssetDataHash)\n result := keccak256(sub(order, 32), 416)\n \n // Restore\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), temp1)\n mstore(add(order, 320), temp2)\n mstore(add(order, 352), temp3)\n }\n return result;\n }\n}\n",
"2.0.0/test/ExchangeWrapper/ExchangeWrapper.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/interfaces/IExchange.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\n\n\ncontract ExchangeWrapper {\n\n // Exchange contract.\n // solhint-disable-next-line var-name-mixedcase\n IExchange internal EXCHANGE;\n\n constructor (address _exchange)\n public\n {\n EXCHANGE = IExchange(_exchange);\n }\n\n /// @dev Cancels all orders created by sender with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to this contract.\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n /// @param salt Arbitrary value to gaurantee uniqueness of 0x transaction hash.\n /// @param makerSignature Proof that maker wishes to call this function with given params.\n function cancelOrdersUpTo(\n uint256 targetOrderEpoch,\n uint256 salt,\n bytes makerSignature\n )\n external\n {\n address makerAddress = msg.sender;\n\n // Encode arguments into byte array.\n bytes memory data = abi.encodeWithSelector(\n EXCHANGE.cancelOrdersUpTo.selector,\n targetOrderEpoch\n );\n\n // Call `cancelOrdersUpTo` via `executeTransaction`.\n EXCHANGE.executeTransaction(\n salt,\n makerAddress,\n data,\n makerSignature\n );\n }\n\n /// @dev Fills an order using `msg.sender` as the taker.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param salt Arbitrary value to gaurantee uniqueness of 0x transaction hash.\n /// @param orderSignature Proof that order has been created by maker.\n /// @param takerSignature Proof that taker wishes to call this function with given params.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n uint256 salt,\n bytes memory orderSignature,\n bytes memory takerSignature\n )\n public\n {\n address takerAddress = msg.sender;\n\n // Encode arguments into byte array.\n bytes memory data = abi.encodeWithSelector(\n EXCHANGE.fillOrder.selector,\n order,\n takerAssetFillAmount,\n orderSignature\n );\n\n // Call `fillOrder` via `executeTransaction`.\n EXCHANGE.executeTransaction(\n salt,\n takerAddress,\n data,\n takerSignature\n );\n }\n}\n",
"2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_OVERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
},
- "sourceTreeHashHex": "0x1abe323449ce7163c9ef208252854c3840c24493a56827c2c5439a25ee3d9bf1",
+ "sourceTreeHashHex": "0x8f987fe89e675259bfeec3e04977656c5a4393696670dd031023b76f85f8bfb7",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
diff --git a/packages/migrations/artifacts/2.0.0/Forwarder.json b/packages/migrations/artifacts/2.0.0/Forwarder.json
index 0bef9adbc..479f9d2eb 100644
--- a/packages/migrations/artifacts/2.0.0/Forwarder.json
+++ b/packages/migrations/artifacts/2.0.0/Forwarder.json
@@ -730,15 +730,15 @@
"evm": {
"bytecode": {
"linkReferences": {},
- "object": "0x60806040523480156200001157600080fd5b506040516200376938038062003769833981018060405262000037919081019062000442565b60008054600160a060020a03808916600160a060020a031992831617835560018054828a1690841617905560028054918816919092161790558251879087908790869086906200008f906003906020850190620002e7565b508051620000a5906004906020840190620002e7565b5050600054604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130181207f60704108000000000000000000000000000000000000000000000000000000008252600160a060020a039092169550636070410894506200012593509091506004016200056d565b602060405180830381600087803b1580156200014057600080fd5b505af115801562000155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200017b919081019062000419565b9050600160a060020a03811615620002da576001546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b390620001dc908490600019906004016200054e565b602060405180830381600087803b158015620001f757600080fd5b505af11580156200020c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000232919081019062000506565b506002546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b39062000282908490600019906004016200054e565b602060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002d8919081019062000506565b505b505050505050506200063b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200032a57805160ff19168380011785556200035a565b828001600101855582156200035a579182015b828111156200035a5782518255916020019190600101906200033d565b50620003689291506200036c565b5090565b6200038991905b8082111562000368576000815560010162000373565b90565b60006200039a8251620005d2565b9392505050565b60006200039a825162000603565b60006200039a8251620005de565b6000601f82018313620003cf57600080fd5b8151620003e6620003e082620005aa565b62000583565b915080825260208301602083018583830111156200040357600080fd5b6200041083828462000608565b50505092915050565b6000602082840312156200042c57600080fd5b60006200043a84846200038c565b949350505050565b60008060008060008060c087890312156200045c57600080fd5b60006200046a89896200038c565b96505060206200047d89828a016200038c565b95505060406200049089828a016200038c565b9450506060620004a389828a01620003af565b93505060808701516001604060020a03811115620004c057600080fd5b620004ce89828a01620003bd565b92505060a08701516001604060020a03811115620004eb57600080fd5b620004f989828a01620003bd565b9150509295509295509295565b6000602082840312156200051957600080fd5b60006200043a8484620003a1565b6200053281620005d2565b82525050565b6200053281620005de565b620005328162000389565b604081016200055e828562000527565b6200039a602083018462000543565b602081016200057d828462000538565b92915050565b6040518181016001604060020a0381118282101715620005a257600080fd5b604052919050565b60006001604060020a03821115620005c157600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b151590565b60005b83811015620006255781810151838201526020016200060b565b8381111562000635576000848401525b50505050565b61311e806200064b6000396000f3006080604052600436106100a35763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a0281146100ff578063169645f2146101355780631c5b1ec41461015557806320472cf714610175578063725cef0614610197578063b3cd4254146101aa578063bc063e1a146101bf578063c5e6e6ac146101d4578063e58e9c16146101f4578063f0b9e5ba14610214575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e71565b60405180910390fd5b005b34801561010b57600080fd5b5061011f61011a36600461248a565b610234565b60405161012c9190612e63565b60405180910390f35b610148610143366004612568565b610294565b60405161012c9190612f31565b34801561016157600080fd5b50610148610170366004612749565b610560565b34801561018157600080fd5b5061018a610626565b60405161012c9190612f82565b6101486101a536600461264e565b61062c565b3480156101b657600080fd5b5061018a6109fa565b3480156101cb57600080fd5b5061018a610a00565b3480156101e057600080fd5b506101486101ef366004612749565b610a06565b34801561020057600080fd5b5061014861020f366004612749565b610a79565b34801561022057600080fd5b5061011f61022f366004612503565b610b76565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b61029c6120ed565b34600080808084116102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6102e5848888610bd6565b92506102f18484610ca4565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b50505050506103ba8b60008151811015156103a457fe5b9060200190602002015161014001516010610ceb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508b600081518110151561047457fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff828116911614156104b8576104b18b8b84610d4c565b94506104c8565b6104c58b8b8b8b86610e66565b94505b6020850151841015610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b60208501518214610543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b61055281338760000151610fee565b505050509695505050505050565b6105686120ed565b60008060006105756120ed565b600093505b865184101561061c57610591868660000151610ca4565b92506105d487858151811015156105a457fe5b9060200190602002015160a0015188868151811015156105c057fe5b9060200190602002015160800151856111c8565b91506105f787858151811015156105e757fe5b90602001906020020151836111e5565b9050610603858261132e565b84518614156106115761061c565b60019093019261057a565b5050505092915050565b61251c81565b6106346120ed565b346000808211610670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b600086116106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6106d28a60008151811015156106bc57fe5b9060200190602002015161014001516000611390565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806107b45750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f11565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506108ff915050576108f88a8a8a8a8a6113fd565b9250610992565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156109925761098f8a8a8a8a611754565b92505b60208301518210156109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b6109ed6109e1838560200151610ca4565b84602001518787611a56565b5050979650505050505050565b61271081565b6103e881565b610a0e6120ed565b600080610a196120ed565b600092505b8551831015610a7057610a35858560200151610ca4565b9150610a4886848151811015156105e757fe5b9050610a54848261132e565b8484602001511415610a6557610a70565b600190920191610a1e565b50505092915050565b610a816120ed565b6000806000610a8e6120ed565b600093505b865184101561061c57610aaa868660000151610ca4565b9250610b118785815181101515610abd57fe5b9060200190602002015160a00151610b0b8987815181101515610adc57fe5b90602001906020020151608001518a88815181101515610af857fe5b9060200190602002015160e00151610ca4565b856111c8565b9150610b3e8785815181101515610b2457fe5b90602001906020020151610b39846001611b43565b6111e5565b9050610b5281600001518260600151610ca4565b8152610b5e858261132e565b84518611610b6b5761061c565b600190930192610a93565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000808361ffff16118015610c00575073ffffffffffffffffffffffffffffffffffffffff821615155b15610bcf576103e861ffff84161115610c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ed1565b610c5661ffff8416612710866111c8565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610c9c573d6000803e3d6000fd5b509392505050565b600082821115610ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b508082035b92915050565b600081601401835110151515610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f01565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b610d546120ed565b600080546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610daf90889087908990600401612e31565b608060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e01919081019061279a565b9150610e1582600001518360600151610ca4565b9050610e25826000015182611b8d565b1515610e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b81529392505050565b610e6e6120ed565b6000610e786120ed565b610e806120ed565b610e886120ed565b859350610e958a87610a06565b9250600083606001511115610f2957610eb388888560600151611baa565b9150610ecc86610ec7888560200151610ca4565b611b8d565b1515610f04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610f12848360200151610ca4565b606080840151908701526020808401519087015293505b6000546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610f83908d9088908e90600401612e31565b608060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd5919081019061279a565b9050610fe1858261132e565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff8616919061104c9086908690602401612ddd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156110f05781810151838201526020016110d8565b50505050905090810190601f16801561111d5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af19250505080151561116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b3d15611189575060003d602014156111895760206000803e506000515b8015156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b50505050565b60006111dd6111d78584611ee3565b84611f3e565b949350505050565b6111ed6120ed565b6111f5612116565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a819061124c908990600401612f3f565b606060405180830381600087803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061129e91908101906127b8565b805190935060ff166003146112b257610a70565b6112c48660a001518460400151610ca4565b91506112d08583611f55565b9050808460200181815250506112ef818760a0015188608001516111c8565b845260a086015160c08701516113069183916111c8565b604085015260a086015160e08701516113209183916111c8565b606085015250505092915050565b8151815161133c9190611b43565b8252602080830151908201516113529190611b43565b60208301526040808301519082015161136b9190611b43565b6040830152606080830151908201516113849190611b43565b60609092019190915250565b6000816004018351101515156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f21565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6114056120ed565b600061140f6120ed565b6114176120ed565b61141f6120ed565b6114318a60008151811015156103a457fe5b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b50505050508a60008151811015156114eb57fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff858116911614156115c9576115288a8a88611baa565b8051909350861115611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611570858461132e565b61158c61158586600001518760600151611b43565b8651611b8d565b15156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611745565b6115d38a87610560565b9150600082606001511115611608576115f188888460600151611baa565b602080820151908701526060808201519087015290505b6000546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611662908d908a908e90600401612e31565b608060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b4919081019061279a565b805190935086146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b6116fb858461132e565b61170d85602001518460200151611b8d565b1515611745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610fe184338560000151610fee565b61175c6120ed565b6000806060600061176b6120ed565b6117736120ed565b8a519450846040519080825280602002602001820160405280156117a1578160200160208202803883390190505b509350600092505b848310156118dd576117d6868c858151811015156117c357fe5b9060200190602002015160e00151611b43565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815293995083018282801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b50505050508b8481518110151561188f57fe5b6020908102909101015161016001528a518b90849081106118ac57fe5b9060200190602002015160a0015184848151811015156118c857fe5b602090810290910101526001909201916117a9565b6000861115611908576118f1898988611baa565b606080820151908901526020808201519089015291505b6000546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611962908e9088908f90600401612df8565b608060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b4919081019061279a565b90506119c0878261132e565b6119d287602001518260200151611b8d565b1515611a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b600092505b84831015611a4857611a3d8b84815181101515611a2857fe5b90602001906020020151610140015133611f6b565b600190920191611a0f565b505050505050949350505050565b6000806000861115611b3b576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611ab8908990600401612f90565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b50505050611af5858585610bd6565b9150611b018683610ca4565b90506000811115611b3b57604051339082156108fc029083906000818181858888f19350505050158015611b39573d6000803e3d6000fd5b505b505050505050565b600082820183811015611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b8091505b5092915050565b600080611b9f61251c612710866111c8565b909210159392505050565b611bb26120ed565b6000806000611bbf6120ed565b600093505b8751841015611ed8576003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c715780601f10611c4657610100808354040283529160200191611c71565b820191906000526020600020905b815481529060010190602001808311611c5457829003601f168201915b50505050508885815181101515611c8457fe5b602090810290910181015161014001919091526004805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015611d395780601f10611d0e57610100808354040283529160200191611d39565b820191906000526020600020905b815481529060010190602001808311611d1c57829003601f168201915b50505050508885815181101515611d4c57fe5b6020908102909101015161016001528451611d68908790610ca4565b9250611db68885815181101515611d7b57fe5b9060200190602002015160a00151610b0b8a87815181101515611d9a57fe5b90602001906020020151608001518b88815181101515610af857fe5b600054895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a9087908110611de757fe5b90602001906020020151611dfc856001611b43565b8a88815181101515611e0a57fe5b906020019060200201516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e4e93929190612f50565b608060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea0919081019061279a565b9050611eb481600001518260600151610ca4565b8152611ec0858261132e565b84518611611ecd57611ed8565b600190930192611bc4565b505050509392505050565b600080831515611ef65760009150611b86565b50828202828482811515611f0657fe5b0414611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b6000808284811515611f4c57fe5b04949350505050565b6000818310611f645781610bcf565b5090919050565b6000806060611f8185601063ffffffff610ceb16565b9250611f9485602463ffffffff61203b16565b9150611fa785606463ffffffff61204716565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde90612002903090889087908790600401612d99565b600060405180830381600087803b15801561201c57600080fd5b505af1158015612030573d6000803e3d6000fd5b505050505050505050565b6000610bcf83836120a2565b60606000612055848461203b565b905060208301925080830184511015151561209c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e91565b50500190565b6000816020018351101515156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612eb1565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610bcf8235613036565b6000601f8201831361215357600080fd5b813561216661216182612fc5565b612f9e565b81815260209384019390925082018360005b8381101561061c578135860161218e888261220d565b8452506020928301929190910190600101612178565b6000601f820183136121b557600080fd5b81356121c361216182612fc5565b81815260209384019390925082018360005b8381101561061c57813586016121eb888261231d565b84525060209283019291909101906001016121d5565b6000610bcf825161307b565b6000601f8201831361221e57600080fd5b813561222c61216182612fe6565b9150808252602083016020830185838301111561224857600080fd5b610a70838284613084565b60006080828403121561226557600080fd5b61226f6080612f9e565b9050600061227d8484612201565b825250602061228e84848301612201565b60208301525060406122a284828501612201565b60408301525060606122b684828501612201565b60608301525092915050565b6000606082840312156122d457600080fd5b6122de6060612f9e565b905060006122ec848461247e565b82525060206122fd84848301612201565b602083015250604061231184828501612201565b60408301525092915050565b6000610180828403121561233057600080fd5b61233b610180612f9e565b905060006123498484612136565b825250602061235a84848301612136565b602083015250604061236e84828501612136565b604083015250606061238284828501612136565b606083015250608061239684828501612472565b60808301525060a06123aa84828501612472565b60a08301525060c06123be84828501612472565b60c08301525060e06123d284828501612472565b60e0830152506101006123e784828501612472565b610100830152506101206123fd84828501612472565b6101208301525061014082013567ffffffffffffffff81111561241f57600080fd5b61242b8482850161220d565b6101408301525061016082013567ffffffffffffffff81111561244d57600080fd5b6124598482850161220d565b6101608301525092915050565b6000610bcf8235613074565b6000610bcf823561307b565b6000610bcf825161307e565b600080600080608085870312156124a057600080fd5b60006124ac8787612136565b94505060206124bd87828801612136565b93505060406124ce87828801612472565b925050606085013567ffffffffffffffff8111156124eb57600080fd5b6124f78782880161220d565b91505092959194509250565b60008060006060848603121561251857600080fd5b60006125248686612136565b935050602061253586828701612472565b925050604084013567ffffffffffffffff81111561255257600080fd5b61255e8682870161220d565b9150509250925092565b60008060008060008060c0878903121561258157600080fd5b863567ffffffffffffffff81111561259857600080fd5b6125a489828a016121a4565b965050602087013567ffffffffffffffff8111156125c157600080fd5b6125cd89828a01612142565b955050604087013567ffffffffffffffff8111156125ea57600080fd5b6125f689828a016121a4565b945050606087013567ffffffffffffffff81111561261357600080fd5b61261f89828a01612142565b935050608061263089828a01612466565b92505060a061264189828a01612136565b9150509295509295509295565b600080600080600080600060e0888a03121561266957600080fd5b873567ffffffffffffffff81111561268057600080fd5b61268c8a828b016121a4565b975050602088013567ffffffffffffffff8111156126a957600080fd5b6126b58a828b01612142565b965050604088013567ffffffffffffffff8111156126d257600080fd5b6126de8a828b016121a4565b955050606088013567ffffffffffffffff8111156126fb57600080fd5b6127078a828b01612142565b94505060806127188a828b01612472565b93505060a06127298a828b01612466565b92505060c061273a8a828b01612136565b91505092959891949750929550565b6000806040838503121561275c57600080fd5b823567ffffffffffffffff81111561277357600080fd5b61277f858286016121a4565b925050602061279085828601612472565b9150509250929050565b6000608082840312156127ac57600080fd5b60006111dd8484612253565b6000606082840312156127ca57600080fd5b60006111dd84846122c2565b6127df81613036565b82525050565b60006127f082613032565b808452602084019350836020820285016128098561302c565b60005b84811015612840578383038852612824838351612907565b925061282f8261302c565b60209890980197915060010161280c565b50909695505050505050565b600061285782613032565b808452602084019350836020820285016128708561302c565b60005b8481101561284057838303885261288b838351612c84565b92506128968261302c565b602098909801979150600101612873565b60006128b282613032565b8084526020840193506128c48361302c565b60005b828110156128f4576128da868351612d90565b6128e38261302c565b6020969096019591506001016128c7565b5093949350505050565b6127df8161304f565b600061291282613032565b808452612926816020860160208601613090565b61292f816130bc565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b80516080830190612c4b8482612d90565b506020820151612c5e6020850182612d90565b506040820151612c716040850182612d90565b5060608201516111c26060850182612d90565b8051600090610180840190612c9985826127d6565b506020830151612cac60208601826127d6565b506040830151612cbf60408601826127d6565b506060830151612cd260608601826127d6565b506080830151612ce56080860182612d90565b5060a0830151612cf860a0860182612d90565b5060c0830151612d0b60c0860182612d90565b5060e0830151612d1e60e0860182612d90565b50610100830151612d33610100860182612d90565b50610120830151612d48610120860182612d90565b50610140830151848203610140860152612d628282612907565b915050610160830151848203610160860152612d7e8282612907565b95945050505050565b6127df81613074565b6127df8161307b565b60808101612da782876127d6565b612db460208301866127d6565b612dc16040830185612d90565b8181036060830152612dd38184612907565b9695505050505050565b60408101612deb82856127d6565b610bcf6020830184612d90565b60608082528101612e09818661284c565b90508181036020830152612e1d81856128a7565b90508181036040830152612d7e81846127e5565b60608082528101612e42818661284c565b9050612e516020830185612d90565b8181036040830152612d7e81846127e5565b60208101610ce582846128fe565b60208082528101610ce58161293c565b60208082528101610ce581612992565b60208082528101610ce5816129c2565b60208082528101610ce581612a18565b60208082528101610ce581612a48565b60208082528101610ce581612a9e565b60208082528101610ce581612ace565b60208082528101610ce581612afe565b60208082528101610ce581612b2e565b60208082528101610ce581612b5e565b60208082528101610ce581612bb4565b60208082528101610ce581612be4565b60808101610ce58284612c3a565b60208082528101610bcf8184612c84565b60608082528101612f618186612c84565b9050612f706020830185612d90565b8181036040830152612d7e8184612907565b60208101610ce58284612d87565b60208101610ce58284612d90565b60405181810167ffffffffffffffff81118282101715612fbd57600080fd5b604052919050565b600067ffffffffffffffff821115612fdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612ffd57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b60ff1690565b82818337506000910152565b60005b838110156130ab578181015183820152602001613093565b838111156111c25750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820676a15b49b9dd297feeb6f91748dd348b8f7ed3dd357aec4140cc6cbcdcd68f86c6578706572696d656e74616cf50037",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x3769 CODESIZE SUB DUP1 PUSH3 0x3769 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x442 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP3 DUP4 AND OR DUP4 SSTORE PUSH1 0x1 DUP1 SLOAD DUP3 DUP11 AND SWAP1 DUP5 AND OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP2 DUP9 AND SWAP2 SWAP1 SWAP3 AND OR SWAP1 SSTORE DUP3 MLOAD DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH3 0x8F SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x2E7 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0xA5 SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x2E7 JUMP JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP6 POP PUSH4 0x60704108 SWAP5 POP PUSH3 0x125 SWAP4 POP SWAP1 SWAP2 POP PUSH1 0x4 ADD PUSH3 0x56D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x140 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x155 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x17B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x419 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH3 0x2DA JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x1DC SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x54E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x20C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x232 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x506 JUMP JUMPDEST POP PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x282 SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x54E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2B2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x2D8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x506 JUMP JUMPDEST POP JUMPDEST POP POP POP POP POP POP POP PUSH3 0x63B JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x32A JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x35A JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x35A JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x35A JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x33D JUMP JUMPDEST POP PUSH3 0x368 SWAP3 SWAP2 POP PUSH3 0x36C JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x389 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x368 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x373 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x39A DUP3 MLOAD PUSH3 0x5D2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x39A DUP3 MLOAD PUSH3 0x603 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x39A DUP3 MLOAD PUSH3 0x5DE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x3E6 PUSH3 0x3E0 DUP3 PUSH3 0x5AA JUMP JUMPDEST PUSH3 0x583 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x403 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x410 DUP4 DUP3 DUP5 PUSH3 0x608 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x42C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x43A DUP5 DUP5 PUSH3 0x38C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH3 0x45C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x46A DUP10 DUP10 PUSH3 0x38C JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH3 0x47D DUP10 DUP3 DUP11 ADD PUSH3 0x38C JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 PUSH3 0x490 DUP10 DUP3 DUP11 ADD PUSH3 0x38C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 PUSH3 0x4A3 DUP10 DUP3 DUP11 ADD PUSH3 0x3AF JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4CE DUP10 DUP3 DUP11 ADD PUSH3 0x3BD JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4F9 DUP10 DUP3 DUP11 ADD PUSH3 0x3BD JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x519 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x43A DUP5 DUP5 PUSH3 0x3A1 JUMP JUMPDEST PUSH3 0x532 DUP2 PUSH3 0x5D2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x532 DUP2 PUSH3 0x5DE JUMP JUMPDEST PUSH3 0x532 DUP2 PUSH3 0x389 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0x55E DUP3 DUP6 PUSH3 0x527 JUMP JUMPDEST PUSH3 0x39A PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0x543 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x57D DUP3 DUP5 PUSH3 0x538 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x5A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x625 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x60B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x635 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x311E DUP1 PUSH3 0x64B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0xFF JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0xC5E6E6AC EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x1F4 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x214 JUMPI JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x248A JUMP JUMPDEST PUSH2 0x234 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2E63 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x148 PUSH2 0x143 CALLDATASIZE PUSH1 0x4 PUSH2 0x2568 JUMP JUMPDEST PUSH2 0x294 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0x560 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x626 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F82 JUMP JUMPDEST PUSH2 0x148 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x264E JUMP JUMPDEST PUSH2 0x62C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x9FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0xA00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x1EF CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x20F CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x2503 JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x29C PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x2DA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x2E5 DUP5 DUP9 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2F1 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x379 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x38D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x3BA DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0xCEB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x460 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x435 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x460 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x443 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x474 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4B8 JUMPI PUSH2 0x4B1 DUP12 DUP12 DUP5 PUSH2 0xD4C JUMP JUMPDEST SWAP5 POP PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0x4C5 DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0xE66 JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x506 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x543 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x552 DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x568 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x575 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0x591 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x5D4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5C0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0x5F7 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0x603 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x611 JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x57A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH2 0x634 PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x670 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x6AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x6D2 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6BC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x1390 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x7B4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x872 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x886 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x8FF SWAP2 POP POP JUMPI PUSH2 0x8F8 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x13FD JUMP JUMPDEST SWAP3 POP PUSH2 0x992 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x992 JUMPI PUSH2 0x98F DUP11 DUP11 DUP11 DUP11 PUSH2 0x1754 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH2 0x9ED PUSH2 0x9E1 DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1A56 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xA0E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA19 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0xA70 JUMPI PUSH2 0xA35 DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0xA48 DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xA54 DUP5 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0xA65 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xA1E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA81 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA8E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0xAAA DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0xB11 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0xB3E DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xB39 DUP5 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0xB52 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0xB5E DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xB6B JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xA93 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xC00 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBCF JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0xC56 PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC9C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xCE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xD2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xD54 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xDAF SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDDD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xE01 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP2 POP PUSH2 0xE15 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH2 0xE25 DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE6E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE78 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE80 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE88 PUSH2 0x20ED JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0xE95 DUP11 DUP8 PUSH2 0xA06 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0xF29 JUMPI PUSH2 0xEB3 DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST SWAP2 POP PUSH2 0xECC DUP7 PUSH2 0xEC7 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xF12 DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xF83 SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFD5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0xFE1 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x104C SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x2DDD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x10D8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x111D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x116C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1189 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1189 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x11C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DD PUSH2 0x11D7 DUP6 DUP5 PUSH2 0x1EE3 JUMP JUMPDEST DUP5 PUSH2 0x1F3E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x11ED PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x11F5 PUSH2 0x2116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x124C SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x127A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x129E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x27B8 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x12B2 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH2 0x12C4 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0x12D0 DUP6 DUP4 PUSH2 0x1F55 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x12EF DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x11C8 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x1306 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1320 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x133C SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1352 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x136B SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1384 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x1405 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1417 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x141F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1431 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14D7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x1528 DUP11 DUP11 DUP9 PUSH2 0x1BAA JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1570 DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x158C PUSH2 0x1585 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x15D3 DUP11 DUP8 PUSH2 0x560 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x1608 JUMPI PUSH2 0x15F1 DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1662 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x167C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1690 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x16F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x16FB DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x170D DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1745 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xFE1 DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST PUSH2 0x175C PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x176B PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x20ED JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x18DD JUMPI PUSH2 0x17D6 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x187C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1851 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x187C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x185F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x188F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x18AC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17A9 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1908 JUMPI PUSH2 0x18F1 DUP10 DUP10 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1962 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DF8 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1990 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x19B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x19C0 DUP8 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x19D2 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1A48 JUMPI PUSH2 0x1A3D DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A28 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x1F6B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1A0F JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1AB8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AE6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1AF5 DUP6 DUP6 DUP6 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B01 DUP7 DUP4 PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1B39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B9F PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1BB2 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1BBF PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x1ED8 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C71 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C71 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C54 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C84 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1D39 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D0E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D39 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D1C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D4C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x1D68 SWAP1 DUP8 SWAP1 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x1DB6 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x1DE7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DFC DUP6 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E0A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E4E SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F50 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E7C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1EA0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x1EB4 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1EC0 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x1ECD JUMPI PUSH2 0x1ED8 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1BC4 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1EF6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1B86 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1F06 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1F4C JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1F64 JUMPI DUP2 PUSH2 0xBCF JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x1F81 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xCEB AND JUMP JUMPDEST SWAP3 POP PUSH2 0x1F94 DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x203B AND JUMP JUMPDEST SWAP2 POP PUSH2 0x1FA7 DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x2047 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x2002 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D99 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2030 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP4 DUP4 PUSH2 0x20A2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x2055 DUP5 DUP5 PUSH2 0x203B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x209C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E91 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x20E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EB1 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3036 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2166 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST PUSH2 0x2F9E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x218E DUP9 DUP3 PUSH2 0x220D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2178 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x21B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21C3 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x21EB DUP9 DUP3 PUSH2 0x231D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x221E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x222C PUSH2 0x2161 DUP3 PUSH2 0x2FE6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA70 DUP4 DUP3 DUP5 PUSH2 0x3084 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x226F PUSH1 0x80 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x227D DUP5 DUP5 PUSH2 0x2201 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x228E DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x22A2 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x22B6 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22DE PUSH1 0x60 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22EC DUP5 DUP5 PUSH2 0x247E JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x22FD DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2311 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x233B PUSH2 0x180 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2349 DUP5 DUP5 PUSH2 0x2136 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x235A DUP5 DUP5 DUP4 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x236E DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2382 DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2396 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x23AA DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x23BE DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x23D2 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x23E7 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x23FD DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x241F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x242B DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2459 DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3074 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x24A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x24AC DUP8 DUP8 PUSH2 0x2136 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x24BD DUP8 DUP3 DUP9 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x24CE DUP8 DUP3 DUP9 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x24EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F7 DUP8 DUP3 DUP9 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2524 DUP7 DUP7 PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2535 DUP7 DUP3 DUP8 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x255E DUP7 DUP3 DUP8 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25A4 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25CD DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F6 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2613 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x261F DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2630 DUP10 DUP3 DUP11 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2641 DUP10 DUP3 DUP11 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2669 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268C DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26DE DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2707 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2718 DUP11 DUP3 DUP12 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2729 DUP11 DUP3 DUP12 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x273A DUP11 DUP3 DUP12 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x275C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x277F DUP6 DUP3 DUP7 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2790 DUP6 DUP3 DUP7 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x2253 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x22C2 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3036 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F0 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2809 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2824 DUP4 DUP4 MLOAD PUSH2 0x2907 JUMP JUMPDEST SWAP3 POP PUSH2 0x282F DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x280C JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2857 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2870 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x288B DUP4 DUP4 MLOAD PUSH2 0x2C84 JUMP JUMPDEST SWAP3 POP PUSH2 0x2896 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2873 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B2 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x28C4 DUP4 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x28F4 JUMPI PUSH2 0x28DA DUP7 DUP4 MLOAD PUSH2 0x2D90 JUMP JUMPDEST PUSH2 0x28E3 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x28C7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x304F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2912 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2926 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3090 JUMP JUMPDEST PUSH2 0x292F DUP2 PUSH2 0x30BC JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x2C4B DUP5 DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2C5E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2C71 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x11C2 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x2C99 DUP6 DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x2CAC PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2CBF PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2CD2 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x2CE5 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x2CF8 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x2D0B PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x2D1E PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x2D33 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x2D48 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x2D62 DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x2D7E DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3074 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x307B JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2DA7 DUP3 DUP8 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DB4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DC1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2DD3 DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2DEB DUP3 DUP6 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E09 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E1D DUP2 DUP6 PUSH2 0x28A7 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E42 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP PUSH2 0x2E51 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x28FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x293C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2992 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x29C2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A18 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A48 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B2E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B5E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BB4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BE4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2C3A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCF DUP2 DUP5 PUSH2 0x2C84 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2F61 DUP2 DUP7 PUSH2 0x2C84 JUMP JUMPDEST SWAP1 POP PUSH2 0x2F70 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x30AB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3093 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11C2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH8 0x6A15B49B9DD297FE 0xeb PUSH16 0x91748DD348B8F7ED3DD357AEC4140CC6 0xcb 0xcd 0xcd PUSH9 0xF86C6578706572696D PUSH6 0x6E74616CF500 CALLDATACOPY ",
- "sourceMap": "834:576:0:-;;;989:419;8:9:-1;5:2;;;30:1;27;20:12;5:2;989:419:0;;;;;;;;;;;;;;;;;;;;;;;;1444:20:4;894:31:1;;-1:-1:-1;;;;;894:31:1;;;-1:-1:-1;;;;;;894:31:1;;;;;;;935:38;;;;;;;;;;;983:9;:34;;;;;;;;;;;;1027:30;;1250:9:0;;1273:11;;1298:9;;1321:13;;1348:14;;1027:30:1;;:14;;:30;;;;;:::i;:::-;-1:-1:-1;1067:32:1;;;;:15;;:32;;;;;:::i;:::-;-1:-1:-1;;1467:8:4;;1204:32;;;;;;;;;;;;;;;;1467:37;;;-1:-1:-1;;;;;1467:8:4;;;;-1:-1:-1;1467:22:4;;-1:-1:-1;1467:37:4;;-1:-1:-1;1204:32:4;;-1:-1:-1;1467:37:4;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1467:37:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1467:37:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1467:37:4;;;;;;;;;1444:60;-1:-1:-1;;;;;;1518:26:4;;;1514:155;;1560:11;;:43;;;;;-1:-1:-1;;;;;1560:11:4;;;;:19;;:43;;1580:12;;-1:-1:-1;;1383:10:4;1560:43;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1560:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1560:43:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1560:43:4;;;;;;;;;-1:-1:-1;1617:9:4;;:41;;;;;-1:-1:-1;;;;;1617:9:4;;;;:17;;:41;;1635:12;;-1:-1:-1;;1383:10:4;1617:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1617:41:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1617:41:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1617:41:4;;;;;;;;;;1514:155;1400:275;989:419:0;;;;;;834:576;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;834:576:0;;;-1:-1:-1;834:576:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:116;;209:36;237:6;231:13;209:36;;257:120;;334:38;364:6;358:13;334:38;;385:442;;490:4;478:17;;474:27;-1:-1;464:2;;515:1;512;505:12;464:2;545:6;539:13;567:64;582:48;623:6;582:48;;;567:64;;;558:73;;651:6;644:5;637:21;687:4;679:6;675:17;720:4;713:5;709:16;755:3;746:6;741:3;737:16;734:25;731:2;;;772:1;769;762:12;731:2;782:39;814:6;809:3;804;782:39;;;457:370;;;;;;;;835:263;;950:2;938:9;929:7;925:23;921:32;918:2;;;966:1;963;956:12;918:2;1001:1;1018:64;1074:7;1054:9;1018:64;;;1008:74;912:186;-1:-1;;;;912:186;1105:1138;;;;;;;1322:3;1310:9;1301:7;1297:23;1293:33;1290:2;;;1339:1;1336;1329:12;1290:2;1374:1;1391:64;1447:7;1427:9;1391:64;;;1381:74;;1353:108;1492:2;1510:64;1566:7;1557:6;1546:9;1542:22;1510:64;;;1500:74;;1471:109;1611:2;1629:64;1685:7;1676:6;1665:9;1661:22;1629:64;;;1619:74;;1590:109;1730:2;1748:63;1803:7;1794:6;1783:9;1779:22;1748:63;;;1738:73;;1709:108;1869:3;1858:9;1854:19;1848:26;-1:-1;;;;;1886:6;1883:30;1880:2;;;1926:1;1923;1916:12;1880:2;1946:73;2011:7;2002:6;1991:9;1987:22;1946:73;;;1936:83;;1827:198;2077:3;2066:9;2062:19;2056:26;-1:-1;;;;;2094:6;2091:30;2088:2;;;2134:1;2131;2124:12;2088:2;2154:73;2219:7;2210:6;2199:9;2195:22;2154:73;;;2144:83;;2035:198;1284:959;;;;;;;;;2250:257;;2362:2;2350:9;2341:7;2337:23;2333:32;2330:2;;;2378:1;2375;2368:12;2330:2;2413:1;2430:61;2483:7;2463:9;2430:61;;2514:110;2587:31;2612:5;2587:31;;;2582:3;2575:44;2569:55;;;2631:107;2702:30;2726:5;2702:30;;2745:110;2818:31;2843:5;2818:31;;2862:294;2998:2;2983:18;;3012:61;2987:9;3046:6;3012:61;;;3084:62;3142:2;3131:9;3127:18;3118:6;3084:62;;3163:189;3269:2;3254:18;;3283:59;3258:9;3315:6;3283:59;;;3240:112;;;;;3359:256;3421:2;3415:9;3447:17;;;-1:-1;;;;;3507:34;;3543:22;;;3504:62;3501:2;;;3579:1;3576;3569:12;3501:2;3595;3588:22;3399:216;;-1:-1;3399:216;3622:258;;-1:-1;;;;;3757:6;3754:30;3751:2;;;3797:1;3794;3787:12;3751:2;-1:-1;3870:4;3841;3818:17;;;;-1:-1;;3814:33;3860:15;;3688:192;3887:128;-1:-1;;;;;3956:54;;3939:76;4022:151;4101:66;4090:78;;4073:100;4401:92;4474:13;4467:21;;4450:43;4659:268;4724:1;4731:101;4745:6;4742:1;4739:13;4731:101;;;4812:11;;;4806:18;4793:11;;;4786:39;4767:2;4760:10;4731:101;;;4847:6;4844:1;4841:13;4838:2;;;4912:1;4903:6;4898:3;4894:16;4887:27;4838:2;4708:219;;;;;;834:576:0;;;;;;"
+ "object": "0x60806040523480156200001157600080fd5b506040516200374638038062003746833981018060405262000037919081019062000433565b60008054600160a060020a03808816600160a060020a03199283161783556001805482891690841617905560028054918716919092161790558251869086908690869086906200008f906003906020850190620002e6565b508051620000a5906004906020840190620002e6565b5050600054604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130181207f60704108000000000000000000000000000000000000000000000000000000008252600160a060020a039092169550636070410894506200012593509091506004016200054a565b602060405180830381600087803b1580156200014057600080fd5b505af115801562000155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200017b91908101906200040a565b9050600160a060020a03811615620002da576001546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b390620001dc908490600019906004016200052b565b602060405180830381600087803b158015620001f757600080fd5b505af11580156200020c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002329190810190620004e3565b506002546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b39062000282908490600019906004016200052b565b602060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002d89190810190620004e3565b505b50505050505062000618565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200032957805160ff191683800117855562000359565b8280016001018555821562000359579182015b82811115620003595782518255916020019190600101906200033c565b50620003679291506200036b565b5090565b6200038891905b8082111562000367576000815560010162000372565b90565b6000620003998251620005af565b9392505050565b6000620003998251620005e0565b6000601f82018313620003c057600080fd5b8151620003d7620003d18262000587565b62000560565b91508082526020830160208301858383011115620003f457600080fd5b62000401838284620005e5565b50505092915050565b6000602082840312156200041d57600080fd5b60006200042b84846200038b565b949350505050565b600080600080600060a086880312156200044c57600080fd5b60006200045a88886200038b565b95505060206200046d888289016200038b565b945050604062000480888289016200038b565b93505060608601516001604060020a038111156200049d57600080fd5b620004ab88828901620003ae565b92505060808601516001604060020a03811115620004c857600080fd5b620004d688828901620003ae565b9150509295509295909350565b600060208284031215620004f657600080fd5b60006200042b8484620003a0565b6200050f81620005af565b82525050565b6200050f81620005bb565b6200050f8162000388565b604081016200053b828562000504565b62000399602083018462000520565b602081016200055a828462000515565b92915050565b6040518181016001604060020a03811182821017156200057f57600080fd5b604052919050565b60006001604060020a038211156200059e57600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b151590565b60005b8381101562000602578181015183820152602001620005e8565b8381111562000612576000848401525b50505050565b61311e80620006286000396000f3006080604052600436106100a35763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a0281146100ff578063169645f2146101355780631c5b1ec41461015557806320472cf714610175578063725cef0614610197578063b3cd4254146101aa578063bc063e1a146101bf578063c5e6e6ac146101d4578063e58e9c16146101f4578063f0b9e5ba14610214575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e71565b60405180910390fd5b005b34801561010b57600080fd5b5061011f61011a36600461248a565b610234565b60405161012c9190612e63565b60405180910390f35b610148610143366004612568565b610294565b60405161012c9190612f31565b34801561016157600080fd5b50610148610170366004612749565b610560565b34801561018157600080fd5b5061018a610626565b60405161012c9190612f82565b6101486101a536600461264e565b61062c565b3480156101b657600080fd5b5061018a6109fa565b3480156101cb57600080fd5b5061018a610a00565b3480156101e057600080fd5b506101486101ef366004612749565b610a06565b34801561020057600080fd5b5061014861020f366004612749565b610a79565b34801561022057600080fd5b5061011f61022f366004612503565b610b76565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b61029c6120ed565b34600080808084116102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6102e5848888610bd6565b92506102f18484610ca4565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b50505050506103ba8b60008151811015156103a457fe5b9060200190602002015161014001516010610ceb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508b600081518110151561047457fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff828116911614156104b8576104b18b8b84610d4c565b94506104c8565b6104c58b8b8b8b86610e66565b94505b6020850151841015610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b60208501518214610543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b61055281338760000151610fee565b505050509695505050505050565b6105686120ed565b60008060006105756120ed565b600093505b865184101561061c57610591868660000151610ca4565b92506105d487858151811015156105a457fe5b9060200190602002015160a0015188868151811015156105c057fe5b9060200190602002015160800151856111c8565b91506105f787858151811015156105e757fe5b90602001906020020151836111e5565b9050610603858261132e565b84518614156106115761061c565b60019093019261057a565b5050505092915050565b61251c81565b6106346120ed565b346000808211610670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b600086116106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6106d28a60008151811015156106bc57fe5b9060200190602002015161014001516000611390565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806107b45750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f11565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506108ff915050576108f88a8a8a8a8a6113fd565b9250610992565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156109925761098f8a8a8a8a611754565b92505b60208301518210156109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b6109ed6109e1838560200151610ca4565b84602001518787611a56565b5050979650505050505050565b61271081565b6103e881565b610a0e6120ed565b600080610a196120ed565b600092505b8551831015610a7057610a35858560200151610ca4565b9150610a4886848151811015156105e757fe5b9050610a54848261132e565b8484602001511415610a6557610a70565b600190920191610a1e565b50505092915050565b610a816120ed565b6000806000610a8e6120ed565b600093505b865184101561061c57610aaa868660000151610ca4565b9250610b118785815181101515610abd57fe5b9060200190602002015160a00151610b0b8987815181101515610adc57fe5b90602001906020020151608001518a88815181101515610af857fe5b9060200190602002015160e00151610ca4565b856111c8565b9150610b3e8785815181101515610b2457fe5b90602001906020020151610b39846001611b43565b6111e5565b9050610b5281600001518260600151610ca4565b8152610b5e858261132e565b84518611610b6b5761061c565b600190930192610a93565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000808361ffff16118015610c00575073ffffffffffffffffffffffffffffffffffffffff821615155b15610bcf576103e861ffff84161115610c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ed1565b610c5661ffff8416612710866111c8565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610c9c573d6000803e3d6000fd5b509392505050565b600082821115610ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b508082035b92915050565b600081601401835110151515610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f01565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b610d546120ed565b600080546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610daf90889087908990600401612e31565b608060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e01919081019061279a565b9150610e1582600001518360600151610ca4565b9050610e25826000015182611b8d565b1515610e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b81529392505050565b610e6e6120ed565b6000610e786120ed565b610e806120ed565b610e886120ed565b859350610e958a87610a06565b9250600083606001511115610f2957610eb388888560600151611baa565b9150610ecc86610ec7888560200151610ca4565b611b8d565b1515610f04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610f12848360200151610ca4565b606080840151908701526020808401519087015293505b6000546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610f83908d9088908e90600401612e31565b608060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd5919081019061279a565b9050610fe1858261132e565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff8616919061104c9086908690602401612ddd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156110f05781810151838201526020016110d8565b50505050905090810190601f16801561111d5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af19250505080151561116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b3d15611189575060003d602014156111895760206000803e506000515b8015156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b50505050565b60006111dd6111d78584611ee3565b84611f3e565b949350505050565b6111ed6120ed565b6111f5612116565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a819061124c908990600401612f3f565b606060405180830381600087803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061129e91908101906127b8565b805190935060ff166003146112b257610a70565b6112c48660a001518460400151610ca4565b91506112d08583611f55565b9050808460200181815250506112ef818760a0015188608001516111c8565b845260a086015160c08701516113069183916111c8565b604085015260a086015160e08701516113209183916111c8565b606085015250505092915050565b8151815161133c9190611b43565b8252602080830151908201516113529190611b43565b60208301526040808301519082015161136b9190611b43565b6040830152606080830151908201516113849190611b43565b60609092019190915250565b6000816004018351101515156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f21565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6114056120ed565b600061140f6120ed565b6114176120ed565b61141f6120ed565b6114318a60008151811015156103a457fe5b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b50505050508a60008151811015156114eb57fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff858116911614156115c9576115288a8a88611baa565b8051909350861115611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611570858461132e565b61158c61158586600001518760600151611b43565b8651611b8d565b15156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611745565b6115d38a87610560565b9150600082606001511115611608576115f188888460600151611baa565b602080820151908701526060808201519087015290505b6000546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611662908d908a908e90600401612e31565b608060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b4919081019061279a565b805190935086146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b6116fb858461132e565b61170d85602001518460200151611b8d565b1515611745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610fe184338560000151610fee565b61175c6120ed565b6000806060600061176b6120ed565b6117736120ed565b8a519450846040519080825280602002602001820160405280156117a1578160200160208202803883390190505b509350600092505b848310156118dd576117d6868c858151811015156117c357fe5b9060200190602002015160e00151611b43565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815293995083018282801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b50505050508b8481518110151561188f57fe5b6020908102909101015161016001528a518b90849081106118ac57fe5b9060200190602002015160a0015184848151811015156118c857fe5b602090810290910101526001909201916117a9565b6000861115611908576118f1898988611baa565b606080820151908901526020808201519089015291505b6000546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611962908e9088908f90600401612df8565b608060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b4919081019061279a565b90506119c0878261132e565b6119d287602001518260200151611b8d565b1515611a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b600092505b84831015611a4857611a3d8b84815181101515611a2857fe5b90602001906020020151610140015133611f6b565b600190920191611a0f565b505050505050949350505050565b6000806000861115611b3b576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611ab8908990600401612f90565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b50505050611af5858585610bd6565b9150611b018683610ca4565b90506000811115611b3b57604051339082156108fc029083906000818181858888f19350505050158015611b39573d6000803e3d6000fd5b505b505050505050565b600082820183811015611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b8091505b5092915050565b600080611b9f61251c612710866111c8565b909210159392505050565b611bb26120ed565b6000806000611bbf6120ed565b600093505b8751841015611ed8576003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c715780601f10611c4657610100808354040283529160200191611c71565b820191906000526020600020905b815481529060010190602001808311611c5457829003601f168201915b50505050508885815181101515611c8457fe5b602090810290910181015161014001919091526004805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015611d395780601f10611d0e57610100808354040283529160200191611d39565b820191906000526020600020905b815481529060010190602001808311611d1c57829003601f168201915b50505050508885815181101515611d4c57fe5b6020908102909101015161016001528451611d68908790610ca4565b9250611db68885815181101515611d7b57fe5b9060200190602002015160a00151610b0b8a87815181101515611d9a57fe5b90602001906020020151608001518b88815181101515610af857fe5b600054895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a9087908110611de757fe5b90602001906020020151611dfc856001611b43565b8a88815181101515611e0a57fe5b906020019060200201516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e4e93929190612f50565b608060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea0919081019061279a565b9050611eb481600001518260600151610ca4565b8152611ec0858261132e565b84518611611ecd57611ed8565b600190930192611bc4565b505050509392505050565b600080831515611ef65760009150611b86565b50828202828482811515611f0657fe5b0414611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b6000808284811515611f4c57fe5b04949350505050565b6000818310611f645781610bcf565b5090919050565b6000806060611f8185601063ffffffff610ceb16565b9250611f9485602463ffffffff61203b16565b9150611fa785606463ffffffff61204716565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde90612002903090889087908790600401612d99565b600060405180830381600087803b15801561201c57600080fd5b505af1158015612030573d6000803e3d6000fd5b505050505050505050565b6000610bcf83836120a2565b60606000612055848461203b565b905060208301925080830184511015151561209c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e91565b50500190565b6000816020018351101515156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612eb1565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610bcf8235613036565b6000601f8201831361215357600080fd5b813561216661216182612fc5565b612f9e565b81815260209384019390925082018360005b8381101561061c578135860161218e888261220d565b8452506020928301929190910190600101612178565b6000601f820183136121b557600080fd5b81356121c361216182612fc5565b81815260209384019390925082018360005b8381101561061c57813586016121eb888261231d565b84525060209283019291909101906001016121d5565b6000610bcf825161307b565b6000601f8201831361221e57600080fd5b813561222c61216182612fe6565b9150808252602083016020830185838301111561224857600080fd5b610a70838284613084565b60006080828403121561226557600080fd5b61226f6080612f9e565b9050600061227d8484612201565b825250602061228e84848301612201565b60208301525060406122a284828501612201565b60408301525060606122b684828501612201565b60608301525092915050565b6000606082840312156122d457600080fd5b6122de6060612f9e565b905060006122ec848461247e565b82525060206122fd84848301612201565b602083015250604061231184828501612201565b60408301525092915050565b6000610180828403121561233057600080fd5b61233b610180612f9e565b905060006123498484612136565b825250602061235a84848301612136565b602083015250604061236e84828501612136565b604083015250606061238284828501612136565b606083015250608061239684828501612472565b60808301525060a06123aa84828501612472565b60a08301525060c06123be84828501612472565b60c08301525060e06123d284828501612472565b60e0830152506101006123e784828501612472565b610100830152506101206123fd84828501612472565b6101208301525061014082013567ffffffffffffffff81111561241f57600080fd5b61242b8482850161220d565b6101408301525061016082013567ffffffffffffffff81111561244d57600080fd5b6124598482850161220d565b6101608301525092915050565b6000610bcf8235613074565b6000610bcf823561307b565b6000610bcf825161307e565b600080600080608085870312156124a057600080fd5b60006124ac8787612136565b94505060206124bd87828801612136565b93505060406124ce87828801612472565b925050606085013567ffffffffffffffff8111156124eb57600080fd5b6124f78782880161220d565b91505092959194509250565b60008060006060848603121561251857600080fd5b60006125248686612136565b935050602061253586828701612472565b925050604084013567ffffffffffffffff81111561255257600080fd5b61255e8682870161220d565b9150509250925092565b60008060008060008060c0878903121561258157600080fd5b863567ffffffffffffffff81111561259857600080fd5b6125a489828a016121a4565b965050602087013567ffffffffffffffff8111156125c157600080fd5b6125cd89828a01612142565b955050604087013567ffffffffffffffff8111156125ea57600080fd5b6125f689828a016121a4565b945050606087013567ffffffffffffffff81111561261357600080fd5b61261f89828a01612142565b935050608061263089828a01612466565b92505060a061264189828a01612136565b9150509295509295509295565b600080600080600080600060e0888a03121561266957600080fd5b873567ffffffffffffffff81111561268057600080fd5b61268c8a828b016121a4565b975050602088013567ffffffffffffffff8111156126a957600080fd5b6126b58a828b01612142565b965050604088013567ffffffffffffffff8111156126d257600080fd5b6126de8a828b016121a4565b955050606088013567ffffffffffffffff8111156126fb57600080fd5b6127078a828b01612142565b94505060806127188a828b01612472565b93505060a06127298a828b01612466565b92505060c061273a8a828b01612136565b91505092959891949750929550565b6000806040838503121561275c57600080fd5b823567ffffffffffffffff81111561277357600080fd5b61277f858286016121a4565b925050602061279085828601612472565b9150509250929050565b6000608082840312156127ac57600080fd5b60006111dd8484612253565b6000606082840312156127ca57600080fd5b60006111dd84846122c2565b6127df81613036565b82525050565b60006127f082613032565b808452602084019350836020820285016128098561302c565b60005b84811015612840578383038852612824838351612907565b925061282f8261302c565b60209890980197915060010161280c565b50909695505050505050565b600061285782613032565b808452602084019350836020820285016128708561302c565b60005b8481101561284057838303885261288b838351612c84565b92506128968261302c565b602098909801979150600101612873565b60006128b282613032565b8084526020840193506128c48361302c565b60005b828110156128f4576128da868351612d90565b6128e38261302c565b6020969096019591506001016128c7565b5093949350505050565b6127df8161304f565b600061291282613032565b808452612926816020860160208601613090565b61292f816130bc565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b80516080830190612c4b8482612d90565b506020820151612c5e6020850182612d90565b506040820151612c716040850182612d90565b5060608201516111c26060850182612d90565b8051600090610180840190612c9985826127d6565b506020830151612cac60208601826127d6565b506040830151612cbf60408601826127d6565b506060830151612cd260608601826127d6565b506080830151612ce56080860182612d90565b5060a0830151612cf860a0860182612d90565b5060c0830151612d0b60c0860182612d90565b5060e0830151612d1e60e0860182612d90565b50610100830151612d33610100860182612d90565b50610120830151612d48610120860182612d90565b50610140830151848203610140860152612d628282612907565b915050610160830151848203610160860152612d7e8282612907565b95945050505050565b6127df81613074565b6127df8161307b565b60808101612da782876127d6565b612db460208301866127d6565b612dc16040830185612d90565b8181036060830152612dd38184612907565b9695505050505050565b60408101612deb82856127d6565b610bcf6020830184612d90565b60608082528101612e09818661284c565b90508181036020830152612e1d81856128a7565b90508181036040830152612d7e81846127e5565b60608082528101612e42818661284c565b9050612e516020830185612d90565b8181036040830152612d7e81846127e5565b60208101610ce582846128fe565b60208082528101610ce58161293c565b60208082528101610ce581612992565b60208082528101610ce5816129c2565b60208082528101610ce581612a18565b60208082528101610ce581612a48565b60208082528101610ce581612a9e565b60208082528101610ce581612ace565b60208082528101610ce581612afe565b60208082528101610ce581612b2e565b60208082528101610ce581612b5e565b60208082528101610ce581612bb4565b60208082528101610ce581612be4565b60808101610ce58284612c3a565b60208082528101610bcf8184612c84565b60608082528101612f618186612c84565b9050612f706020830185612d90565b8181036040830152612d7e8184612907565b60208101610ce58284612d87565b60208101610ce58284612d90565b60405181810167ffffffffffffffff81118282101715612fbd57600080fd5b604052919050565b600067ffffffffffffffff821115612fdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612ffd57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b60ff1690565b82818337506000910152565b60005b838110156130ab578181015183820152602001613093565b838111156111c25750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820ff5c1e325698909ffd3590166bdff6a2f31ff4394822a4e1b9ea119a6a813e6c6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x3746 CODESIZE SUB DUP1 PUSH3 0x3746 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x433 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP9 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP3 DUP4 AND OR DUP4 SSTORE PUSH1 0x1 DUP1 SLOAD DUP3 DUP10 AND SWAP1 DUP5 AND OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP2 DUP8 AND SWAP2 SWAP1 SWAP3 AND OR SWAP1 SSTORE DUP3 MLOAD DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH3 0x8F SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x2E6 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0xA5 SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x2E6 JUMP JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP6 POP PUSH4 0x60704108 SWAP5 POP PUSH3 0x125 SWAP4 POP SWAP1 SWAP2 POP PUSH1 0x4 ADD PUSH3 0x54A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x140 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x155 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x17B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x40A JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH3 0x2DA JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x1DC SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x52B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x20C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x232 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4E3 JUMP JUMPDEST POP PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x282 SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x52B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2B2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x2D8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4E3 JUMP JUMPDEST POP JUMPDEST POP POP POP POP POP POP PUSH3 0x618 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x329 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x359 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x359 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x359 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x33C JUMP JUMPDEST POP PUSH3 0x367 SWAP3 SWAP2 POP PUSH3 0x36B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x388 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x367 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x372 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x399 DUP3 MLOAD PUSH3 0x5AF JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x399 DUP3 MLOAD PUSH3 0x5E0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x3D7 PUSH3 0x3D1 DUP3 PUSH3 0x587 JUMP JUMPDEST PUSH3 0x560 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x401 DUP4 DUP3 DUP5 PUSH3 0x5E5 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x41D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x42B DUP5 DUP5 PUSH3 0x38B JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x44C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x45A DUP9 DUP9 PUSH3 0x38B JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0x46D DUP9 DUP3 DUP10 ADD PUSH3 0x38B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x480 DUP9 DUP3 DUP10 ADD PUSH3 0x38B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4AB DUP9 DUP3 DUP10 ADD PUSH3 0x3AE JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4D6 DUP9 DUP3 DUP10 ADD PUSH3 0x3AE JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x42B DUP5 DUP5 PUSH3 0x3A0 JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x5AF JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x5BB JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x388 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0x53B DUP3 DUP6 PUSH3 0x504 JUMP JUMPDEST PUSH3 0x399 PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0x520 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x55A DUP3 DUP5 PUSH3 0x515 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x57F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x59E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x602 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x5E8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x612 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x311E DUP1 PUSH3 0x628 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0xFF JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0xC5E6E6AC EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x1F4 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x214 JUMPI JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x248A JUMP JUMPDEST PUSH2 0x234 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2E63 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x148 PUSH2 0x143 CALLDATASIZE PUSH1 0x4 PUSH2 0x2568 JUMP JUMPDEST PUSH2 0x294 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0x560 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x626 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F82 JUMP JUMPDEST PUSH2 0x148 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x264E JUMP JUMPDEST PUSH2 0x62C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x9FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0xA00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x1EF CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x20F CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x2503 JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x29C PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x2DA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x2E5 DUP5 DUP9 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2F1 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x379 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x38D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x3BA DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0xCEB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x460 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x435 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x460 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x443 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x474 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4B8 JUMPI PUSH2 0x4B1 DUP12 DUP12 DUP5 PUSH2 0xD4C JUMP JUMPDEST SWAP5 POP PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0x4C5 DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0xE66 JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x506 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x543 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x552 DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x568 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x575 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0x591 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x5D4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5C0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0x5F7 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0x603 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x611 JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x57A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH2 0x634 PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x670 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x6AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x6D2 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6BC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x1390 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x7B4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x872 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x886 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x8FF SWAP2 POP POP JUMPI PUSH2 0x8F8 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x13FD JUMP JUMPDEST SWAP3 POP PUSH2 0x992 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x992 JUMPI PUSH2 0x98F DUP11 DUP11 DUP11 DUP11 PUSH2 0x1754 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH2 0x9ED PUSH2 0x9E1 DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1A56 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xA0E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA19 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0xA70 JUMPI PUSH2 0xA35 DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0xA48 DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xA54 DUP5 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0xA65 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xA1E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA81 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA8E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0xAAA DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0xB11 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0xB3E DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xB39 DUP5 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0xB52 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0xB5E DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xB6B JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xA93 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xC00 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBCF JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0xC56 PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC9C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xCE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xD2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xD54 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xDAF SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDDD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xE01 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP2 POP PUSH2 0xE15 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH2 0xE25 DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE6E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE78 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE80 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE88 PUSH2 0x20ED JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0xE95 DUP11 DUP8 PUSH2 0xA06 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0xF29 JUMPI PUSH2 0xEB3 DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST SWAP2 POP PUSH2 0xECC DUP7 PUSH2 0xEC7 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xF12 DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xF83 SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFD5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0xFE1 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x104C SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x2DDD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x10D8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x111D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x116C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1189 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1189 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x11C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DD PUSH2 0x11D7 DUP6 DUP5 PUSH2 0x1EE3 JUMP JUMPDEST DUP5 PUSH2 0x1F3E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x11ED PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x11F5 PUSH2 0x2116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x124C SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x127A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x129E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x27B8 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x12B2 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH2 0x12C4 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0x12D0 DUP6 DUP4 PUSH2 0x1F55 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x12EF DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x11C8 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x1306 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1320 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x133C SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1352 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x136B SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1384 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x1405 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1417 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x141F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1431 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14D7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x1528 DUP11 DUP11 DUP9 PUSH2 0x1BAA JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1570 DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x158C PUSH2 0x1585 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x15D3 DUP11 DUP8 PUSH2 0x560 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x1608 JUMPI PUSH2 0x15F1 DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1662 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x167C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1690 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x16F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x16FB DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x170D DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1745 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xFE1 DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST PUSH2 0x175C PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x176B PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x20ED JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x18DD JUMPI PUSH2 0x17D6 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x187C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1851 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x187C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x185F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x188F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x18AC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17A9 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1908 JUMPI PUSH2 0x18F1 DUP10 DUP10 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1962 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DF8 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1990 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x19B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x19C0 DUP8 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x19D2 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1A48 JUMPI PUSH2 0x1A3D DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A28 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x1F6B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1A0F JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1AB8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AE6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1AF5 DUP6 DUP6 DUP6 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B01 DUP7 DUP4 PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1B39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B9F PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1BB2 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1BBF PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x1ED8 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C71 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C71 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C54 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C84 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1D39 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D0E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D39 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D1C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D4C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x1D68 SWAP1 DUP8 SWAP1 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x1DB6 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x1DE7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DFC DUP6 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E0A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E4E SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F50 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E7C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1EA0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x1EB4 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1EC0 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x1ECD JUMPI PUSH2 0x1ED8 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1BC4 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1EF6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1B86 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1F06 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1F4C JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1F64 JUMPI DUP2 PUSH2 0xBCF JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x1F81 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xCEB AND JUMP JUMPDEST SWAP3 POP PUSH2 0x1F94 DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x203B AND JUMP JUMPDEST SWAP2 POP PUSH2 0x1FA7 DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x2047 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x2002 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D99 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2030 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP4 DUP4 PUSH2 0x20A2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x2055 DUP5 DUP5 PUSH2 0x203B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x209C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E91 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x20E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EB1 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3036 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2166 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST PUSH2 0x2F9E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x218E DUP9 DUP3 PUSH2 0x220D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2178 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x21B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21C3 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x21EB DUP9 DUP3 PUSH2 0x231D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x221E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x222C PUSH2 0x2161 DUP3 PUSH2 0x2FE6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA70 DUP4 DUP3 DUP5 PUSH2 0x3084 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x226F PUSH1 0x80 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x227D DUP5 DUP5 PUSH2 0x2201 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x228E DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x22A2 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x22B6 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22DE PUSH1 0x60 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22EC DUP5 DUP5 PUSH2 0x247E JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x22FD DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2311 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x233B PUSH2 0x180 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2349 DUP5 DUP5 PUSH2 0x2136 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x235A DUP5 DUP5 DUP4 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x236E DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2382 DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2396 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x23AA DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x23BE DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x23D2 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x23E7 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x23FD DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x241F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x242B DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2459 DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3074 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x24A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x24AC DUP8 DUP8 PUSH2 0x2136 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x24BD DUP8 DUP3 DUP9 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x24CE DUP8 DUP3 DUP9 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x24EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F7 DUP8 DUP3 DUP9 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2524 DUP7 DUP7 PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2535 DUP7 DUP3 DUP8 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x255E DUP7 DUP3 DUP8 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25A4 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25CD DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F6 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2613 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x261F DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2630 DUP10 DUP3 DUP11 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2641 DUP10 DUP3 DUP11 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2669 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268C DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26DE DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2707 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2718 DUP11 DUP3 DUP12 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2729 DUP11 DUP3 DUP12 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x273A DUP11 DUP3 DUP12 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x275C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x277F DUP6 DUP3 DUP7 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2790 DUP6 DUP3 DUP7 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x2253 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x22C2 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3036 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F0 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2809 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2824 DUP4 DUP4 MLOAD PUSH2 0x2907 JUMP JUMPDEST SWAP3 POP PUSH2 0x282F DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x280C JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2857 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2870 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x288B DUP4 DUP4 MLOAD PUSH2 0x2C84 JUMP JUMPDEST SWAP3 POP PUSH2 0x2896 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2873 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B2 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x28C4 DUP4 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x28F4 JUMPI PUSH2 0x28DA DUP7 DUP4 MLOAD PUSH2 0x2D90 JUMP JUMPDEST PUSH2 0x28E3 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x28C7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x304F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2912 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2926 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3090 JUMP JUMPDEST PUSH2 0x292F DUP2 PUSH2 0x30BC JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x2C4B DUP5 DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2C5E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2C71 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x11C2 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x2C99 DUP6 DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x2CAC PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2CBF PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2CD2 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x2CE5 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x2CF8 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x2D0B PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x2D1E PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x2D33 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x2D48 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x2D62 DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x2D7E DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3074 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x307B JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2DA7 DUP3 DUP8 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DB4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DC1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2DD3 DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2DEB DUP3 DUP6 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E09 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E1D DUP2 DUP6 PUSH2 0x28A7 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E42 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP PUSH2 0x2E51 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x28FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x293C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2992 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x29C2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A18 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A48 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B2E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B5E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BB4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BE4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2C3A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCF DUP2 DUP5 PUSH2 0x2C84 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2F61 DUP2 DUP7 PUSH2 0x2C84 JUMP JUMPDEST SWAP1 POP PUSH2 0x2F70 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x30AB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3093 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11C2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SELFDESTRUCT 0x5c 0x1e ORIGIN JUMP SWAP9 SWAP1 SWAP16 REVERT CALLDATALOAD SWAP1 AND PUSH12 0xDFF6A2F31FF4394822A4E1B9 0xea GT SWAP11 PUSH11 0x813E6C6C6578706572696D PUSH6 0x6E74616CF500 CALLDATACOPY ",
+ "sourceMap": "834:541:0:-;;;989:384;8:9:-1;5:2;;;30:1;27;20:12;5:2;989:384:0;;;;;;;;;;;;;;;;;;;;;;;;1444:20:4;894:31:1;;-1:-1:-1;;;;;894:31:1;;;-1:-1:-1;;;;;;894:31:1;;;;;;;935:38;;;;;;;;;;;983:9;:34;;;;;;;;;;;;1027:30;;1215:9:0;;1238:11;;1263:9;;1286:13;;1313:14;;1027:30:1;;:14;;:30;;;;;:::i;:::-;-1:-1:-1;1067:32:1;;;;:15;;:32;;;;;:::i;:::-;-1:-1:-1;;1467:8:4;;1204:32;;;;;;;;;;;;;;;;1467:37;;;-1:-1:-1;;;;;1467:8:4;;;;-1:-1:-1;1467:22:4;;-1:-1:-1;1467:37:4;;-1:-1:-1;1204:32:4;;-1:-1:-1;1467:37:4;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1467:37:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1467:37:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1467:37:4;;;;;;;;;1444:60;-1:-1:-1;;;;;;1518:26:4;;;1514:155;;1560:11;;:43;;;;;-1:-1:-1;;;;;1560:11:4;;;;:19;;:43;;1580:12;;-1:-1:-1;;1383:10:4;1560:43;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1560:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1560:43:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1560:43:4;;;;;;;;;-1:-1:-1;1617:9:4;;:41;;;;;-1:-1:-1;;;;;1617:9:4;;;;:17;;:41;;1635:12;;-1:-1:-1;;1383:10:4;1617:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1617:41:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1617:41:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1617:41:4;;;;;;;;;;1514:155;1400:275;989:384:0;;;;;834:541;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;834:541:0;;;-1:-1:-1;834:541:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:116;;209:36;237:6;231:13;209:36;;258:442;;363:4;351:17;;347:27;-1:-1;337:2;;388:1;385;378:12;337:2;418:6;412:13;440:64;455:48;496:6;455:48;;;440:64;;;431:73;;524:6;517:5;510:21;560:4;552:6;548:17;593:4;586:5;582:16;628:3;619:6;614:3;610:16;607:25;604:2;;;645:1;642;635:12;604:2;655:39;687:6;682:3;677;655:39;;;330:370;;;;;;;;708:263;;823:2;811:9;802:7;798:23;794:32;791:2;;;839:1;836;829:12;791:2;874:1;891:64;947:7;927:9;891:64;;;881:74;785:186;-1:-1;;;;785:186;978:1003;;;;;;1179:3;1167:9;1158:7;1154:23;1150:33;1147:2;;;1196:1;1193;1186:12;1147:2;1231:1;1248:64;1304:7;1284:9;1248:64;;;1238:74;;1210:108;1349:2;1367:64;1423:7;1414:6;1403:9;1399:22;1367:64;;;1357:74;;1328:109;1468:2;1486:64;1542:7;1533:6;1522:9;1518:22;1486:64;;;1476:74;;1447:109;1608:2;1597:9;1593:18;1587:25;-1:-1;;;;;1624:6;1621:30;1618:2;;;1664:1;1661;1654:12;1618:2;1684:73;1749:7;1740:6;1729:9;1725:22;1684:73;;;1674:83;;1566:197;1815:3;1804:9;1800:19;1794:26;-1:-1;;;;;1832:6;1829:30;1826:2;;;1872:1;1869;1862:12;1826:2;1892:73;1957:7;1948:6;1937:9;1933:22;1892:73;;;1882:83;;1773:198;1141:840;;;;;;;;;1988:257;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2151:1;2168:61;2221:7;2201:9;2168:61;;2252:110;2325:31;2350:5;2325:31;;;2320:3;2313:44;2307:55;;;2369:107;2440:30;2464:5;2440:30;;2483:110;2556:31;2581:5;2556:31;;2600:294;2736:2;2721:18;;2750:61;2725:9;2784:6;2750:61;;;2822:62;2880:2;2869:9;2865:18;2856:6;2822:62;;2901:189;3007:2;2992:18;;3021:59;2996:9;3053:6;3021:59;;;2978:112;;;;;3097:256;3159:2;3153:9;3185:17;;;-1:-1;;;;;3245:34;;3281:22;;;3242:62;3239:2;;;3317:1;3314;3307:12;3239:2;3333;3326:22;3137:216;;-1:-1;3137:216;3360:258;;-1:-1;;;;;3495:6;3492:30;3489:2;;;3535:1;3532;3525:12;3489:2;-1:-1;3608:4;3579;3556:17;;;;-1:-1;;3552:33;3598:15;;3426:192;3625:128;-1:-1;;;;;3694:54;;3677:76;3760:151;3839:66;3828:78;;3811:100;4139:92;4212:13;4205:21;;4188:43;4239:268;4304:1;4311:101;4325:6;4322:1;4319:13;4311:101;;;4392:11;;;4386:18;4373:11;;;4366:39;4347:2;4340:10;4311:101;;;4427:6;4424:1;4421:13;4418:2;;;4492:1;4483:6;4478:3;4474:16;4467:27;4418:2;4288:219;;;;;;834:541:0;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
- "object": "0x6080604052600436106100a35763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a0281146100ff578063169645f2146101355780631c5b1ec41461015557806320472cf714610175578063725cef0614610197578063b3cd4254146101aa578063bc063e1a146101bf578063c5e6e6ac146101d4578063e58e9c16146101f4578063f0b9e5ba14610214575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e71565b60405180910390fd5b005b34801561010b57600080fd5b5061011f61011a36600461248a565b610234565b60405161012c9190612e63565b60405180910390f35b610148610143366004612568565b610294565b60405161012c9190612f31565b34801561016157600080fd5b50610148610170366004612749565b610560565b34801561018157600080fd5b5061018a610626565b60405161012c9190612f82565b6101486101a536600461264e565b61062c565b3480156101b657600080fd5b5061018a6109fa565b3480156101cb57600080fd5b5061018a610a00565b3480156101e057600080fd5b506101486101ef366004612749565b610a06565b34801561020057600080fd5b5061014861020f366004612749565b610a79565b34801561022057600080fd5b5061011f61022f366004612503565b610b76565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b61029c6120ed565b34600080808084116102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6102e5848888610bd6565b92506102f18484610ca4565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b50505050506103ba8b60008151811015156103a457fe5b9060200190602002015161014001516010610ceb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508b600081518110151561047457fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff828116911614156104b8576104b18b8b84610d4c565b94506104c8565b6104c58b8b8b8b86610e66565b94505b6020850151841015610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b60208501518214610543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b61055281338760000151610fee565b505050509695505050505050565b6105686120ed565b60008060006105756120ed565b600093505b865184101561061c57610591868660000151610ca4565b92506105d487858151811015156105a457fe5b9060200190602002015160a0015188868151811015156105c057fe5b9060200190602002015160800151856111c8565b91506105f787858151811015156105e757fe5b90602001906020020151836111e5565b9050610603858261132e565b84518614156106115761061c565b60019093019261057a565b5050505092915050565b61251c81565b6106346120ed565b346000808211610670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b600086116106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6106d28a60008151811015156106bc57fe5b9060200190602002015161014001516000611390565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806107b45750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f11565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506108ff915050576108f88a8a8a8a8a6113fd565b9250610992565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156109925761098f8a8a8a8a611754565b92505b60208301518210156109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b6109ed6109e1838560200151610ca4565b84602001518787611a56565b5050979650505050505050565b61271081565b6103e881565b610a0e6120ed565b600080610a196120ed565b600092505b8551831015610a7057610a35858560200151610ca4565b9150610a4886848151811015156105e757fe5b9050610a54848261132e565b8484602001511415610a6557610a70565b600190920191610a1e565b50505092915050565b610a816120ed565b6000806000610a8e6120ed565b600093505b865184101561061c57610aaa868660000151610ca4565b9250610b118785815181101515610abd57fe5b9060200190602002015160a00151610b0b8987815181101515610adc57fe5b90602001906020020151608001518a88815181101515610af857fe5b9060200190602002015160e00151610ca4565b856111c8565b9150610b3e8785815181101515610b2457fe5b90602001906020020151610b39846001611b43565b6111e5565b9050610b5281600001518260600151610ca4565b8152610b5e858261132e565b84518611610b6b5761061c565b600190930192610a93565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000808361ffff16118015610c00575073ffffffffffffffffffffffffffffffffffffffff821615155b15610bcf576103e861ffff84161115610c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ed1565b610c5661ffff8416612710866111c8565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610c9c573d6000803e3d6000fd5b509392505050565b600082821115610ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b508082035b92915050565b600081601401835110151515610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f01565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b610d546120ed565b600080546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610daf90889087908990600401612e31565b608060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e01919081019061279a565b9150610e1582600001518360600151610ca4565b9050610e25826000015182611b8d565b1515610e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b81529392505050565b610e6e6120ed565b6000610e786120ed565b610e806120ed565b610e886120ed565b859350610e958a87610a06565b9250600083606001511115610f2957610eb388888560600151611baa565b9150610ecc86610ec7888560200151610ca4565b611b8d565b1515610f04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610f12848360200151610ca4565b606080840151908701526020808401519087015293505b6000546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610f83908d9088908e90600401612e31565b608060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd5919081019061279a565b9050610fe1858261132e565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff8616919061104c9086908690602401612ddd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156110f05781810151838201526020016110d8565b50505050905090810190601f16801561111d5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af19250505080151561116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b3d15611189575060003d602014156111895760206000803e506000515b8015156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b50505050565b60006111dd6111d78584611ee3565b84611f3e565b949350505050565b6111ed6120ed565b6111f5612116565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a819061124c908990600401612f3f565b606060405180830381600087803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061129e91908101906127b8565b805190935060ff166003146112b257610a70565b6112c48660a001518460400151610ca4565b91506112d08583611f55565b9050808460200181815250506112ef818760a0015188608001516111c8565b845260a086015160c08701516113069183916111c8565b604085015260a086015160e08701516113209183916111c8565b606085015250505092915050565b8151815161133c9190611b43565b8252602080830151908201516113529190611b43565b60208301526040808301519082015161136b9190611b43565b6040830152606080830151908201516113849190611b43565b60609092019190915250565b6000816004018351101515156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f21565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6114056120ed565b600061140f6120ed565b6114176120ed565b61141f6120ed565b6114318a60008151811015156103a457fe5b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b50505050508a60008151811015156114eb57fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff858116911614156115c9576115288a8a88611baa565b8051909350861115611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611570858461132e565b61158c61158586600001518760600151611b43565b8651611b8d565b15156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611745565b6115d38a87610560565b9150600082606001511115611608576115f188888460600151611baa565b602080820151908701526060808201519087015290505b6000546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611662908d908a908e90600401612e31565b608060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b4919081019061279a565b805190935086146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b6116fb858461132e565b61170d85602001518460200151611b8d565b1515611745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610fe184338560000151610fee565b61175c6120ed565b6000806060600061176b6120ed565b6117736120ed565b8a519450846040519080825280602002602001820160405280156117a1578160200160208202803883390190505b509350600092505b848310156118dd576117d6868c858151811015156117c357fe5b9060200190602002015160e00151611b43565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815293995083018282801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b50505050508b8481518110151561188f57fe5b6020908102909101015161016001528a518b90849081106118ac57fe5b9060200190602002015160a0015184848151811015156118c857fe5b602090810290910101526001909201916117a9565b6000861115611908576118f1898988611baa565b606080820151908901526020808201519089015291505b6000546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611962908e9088908f90600401612df8565b608060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b4919081019061279a565b90506119c0878261132e565b6119d287602001518260200151611b8d565b1515611a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b600092505b84831015611a4857611a3d8b84815181101515611a2857fe5b90602001906020020151610140015133611f6b565b600190920191611a0f565b505050505050949350505050565b6000806000861115611b3b576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611ab8908990600401612f90565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b50505050611af5858585610bd6565b9150611b018683610ca4565b90506000811115611b3b57604051339082156108fc029083906000818181858888f19350505050158015611b39573d6000803e3d6000fd5b505b505050505050565b600082820183811015611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b8091505b5092915050565b600080611b9f61251c612710866111c8565b909210159392505050565b611bb26120ed565b6000806000611bbf6120ed565b600093505b8751841015611ed8576003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c715780601f10611c4657610100808354040283529160200191611c71565b820191906000526020600020905b815481529060010190602001808311611c5457829003601f168201915b50505050508885815181101515611c8457fe5b602090810290910181015161014001919091526004805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015611d395780601f10611d0e57610100808354040283529160200191611d39565b820191906000526020600020905b815481529060010190602001808311611d1c57829003601f168201915b50505050508885815181101515611d4c57fe5b6020908102909101015161016001528451611d68908790610ca4565b9250611db68885815181101515611d7b57fe5b9060200190602002015160a00151610b0b8a87815181101515611d9a57fe5b90602001906020020151608001518b88815181101515610af857fe5b600054895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a9087908110611de757fe5b90602001906020020151611dfc856001611b43565b8a88815181101515611e0a57fe5b906020019060200201516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e4e93929190612f50565b608060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea0919081019061279a565b9050611eb481600001518260600151610ca4565b8152611ec0858261132e565b84518611611ecd57611ed8565b600190930192611bc4565b505050509392505050565b600080831515611ef65760009150611b86565b50828202828482811515611f0657fe5b0414611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b6000808284811515611f4c57fe5b04949350505050565b6000818310611f645781610bcf565b5090919050565b6000806060611f8185601063ffffffff610ceb16565b9250611f9485602463ffffffff61203b16565b9150611fa785606463ffffffff61204716565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde90612002903090889087908790600401612d99565b600060405180830381600087803b15801561201c57600080fd5b505af1158015612030573d6000803e3d6000fd5b505050505050505050565b6000610bcf83836120a2565b60606000612055848461203b565b905060208301925080830184511015151561209c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e91565b50500190565b6000816020018351101515156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612eb1565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610bcf8235613036565b6000601f8201831361215357600080fd5b813561216661216182612fc5565b612f9e565b81815260209384019390925082018360005b8381101561061c578135860161218e888261220d565b8452506020928301929190910190600101612178565b6000601f820183136121b557600080fd5b81356121c361216182612fc5565b81815260209384019390925082018360005b8381101561061c57813586016121eb888261231d565b84525060209283019291909101906001016121d5565b6000610bcf825161307b565b6000601f8201831361221e57600080fd5b813561222c61216182612fe6565b9150808252602083016020830185838301111561224857600080fd5b610a70838284613084565b60006080828403121561226557600080fd5b61226f6080612f9e565b9050600061227d8484612201565b825250602061228e84848301612201565b60208301525060406122a284828501612201565b60408301525060606122b684828501612201565b60608301525092915050565b6000606082840312156122d457600080fd5b6122de6060612f9e565b905060006122ec848461247e565b82525060206122fd84848301612201565b602083015250604061231184828501612201565b60408301525092915050565b6000610180828403121561233057600080fd5b61233b610180612f9e565b905060006123498484612136565b825250602061235a84848301612136565b602083015250604061236e84828501612136565b604083015250606061238284828501612136565b606083015250608061239684828501612472565b60808301525060a06123aa84828501612472565b60a08301525060c06123be84828501612472565b60c08301525060e06123d284828501612472565b60e0830152506101006123e784828501612472565b610100830152506101206123fd84828501612472565b6101208301525061014082013567ffffffffffffffff81111561241f57600080fd5b61242b8482850161220d565b6101408301525061016082013567ffffffffffffffff81111561244d57600080fd5b6124598482850161220d565b6101608301525092915050565b6000610bcf8235613074565b6000610bcf823561307b565b6000610bcf825161307e565b600080600080608085870312156124a057600080fd5b60006124ac8787612136565b94505060206124bd87828801612136565b93505060406124ce87828801612472565b925050606085013567ffffffffffffffff8111156124eb57600080fd5b6124f78782880161220d565b91505092959194509250565b60008060006060848603121561251857600080fd5b60006125248686612136565b935050602061253586828701612472565b925050604084013567ffffffffffffffff81111561255257600080fd5b61255e8682870161220d565b9150509250925092565b60008060008060008060c0878903121561258157600080fd5b863567ffffffffffffffff81111561259857600080fd5b6125a489828a016121a4565b965050602087013567ffffffffffffffff8111156125c157600080fd5b6125cd89828a01612142565b955050604087013567ffffffffffffffff8111156125ea57600080fd5b6125f689828a016121a4565b945050606087013567ffffffffffffffff81111561261357600080fd5b61261f89828a01612142565b935050608061263089828a01612466565b92505060a061264189828a01612136565b9150509295509295509295565b600080600080600080600060e0888a03121561266957600080fd5b873567ffffffffffffffff81111561268057600080fd5b61268c8a828b016121a4565b975050602088013567ffffffffffffffff8111156126a957600080fd5b6126b58a828b01612142565b965050604088013567ffffffffffffffff8111156126d257600080fd5b6126de8a828b016121a4565b955050606088013567ffffffffffffffff8111156126fb57600080fd5b6127078a828b01612142565b94505060806127188a828b01612472565b93505060a06127298a828b01612466565b92505060c061273a8a828b01612136565b91505092959891949750929550565b6000806040838503121561275c57600080fd5b823567ffffffffffffffff81111561277357600080fd5b61277f858286016121a4565b925050602061279085828601612472565b9150509250929050565b6000608082840312156127ac57600080fd5b60006111dd8484612253565b6000606082840312156127ca57600080fd5b60006111dd84846122c2565b6127df81613036565b82525050565b60006127f082613032565b808452602084019350836020820285016128098561302c565b60005b84811015612840578383038852612824838351612907565b925061282f8261302c565b60209890980197915060010161280c565b50909695505050505050565b600061285782613032565b808452602084019350836020820285016128708561302c565b60005b8481101561284057838303885261288b838351612c84565b92506128968261302c565b602098909801979150600101612873565b60006128b282613032565b8084526020840193506128c48361302c565b60005b828110156128f4576128da868351612d90565b6128e38261302c565b6020969096019591506001016128c7565b5093949350505050565b6127df8161304f565b600061291282613032565b808452612926816020860160208601613090565b61292f816130bc565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b80516080830190612c4b8482612d90565b506020820151612c5e6020850182612d90565b506040820151612c716040850182612d90565b5060608201516111c26060850182612d90565b8051600090610180840190612c9985826127d6565b506020830151612cac60208601826127d6565b506040830151612cbf60408601826127d6565b506060830151612cd260608601826127d6565b506080830151612ce56080860182612d90565b5060a0830151612cf860a0860182612d90565b5060c0830151612d0b60c0860182612d90565b5060e0830151612d1e60e0860182612d90565b50610100830151612d33610100860182612d90565b50610120830151612d48610120860182612d90565b50610140830151848203610140860152612d628282612907565b915050610160830151848203610160860152612d7e8282612907565b95945050505050565b6127df81613074565b6127df8161307b565b60808101612da782876127d6565b612db460208301866127d6565b612dc16040830185612d90565b8181036060830152612dd38184612907565b9695505050505050565b60408101612deb82856127d6565b610bcf6020830184612d90565b60608082528101612e09818661284c565b90508181036020830152612e1d81856128a7565b90508181036040830152612d7e81846127e5565b60608082528101612e42818661284c565b9050612e516020830185612d90565b8181036040830152612d7e81846127e5565b60208101610ce582846128fe565b60208082528101610ce58161293c565b60208082528101610ce581612992565b60208082528101610ce5816129c2565b60208082528101610ce581612a18565b60208082528101610ce581612a48565b60208082528101610ce581612a9e565b60208082528101610ce581612ace565b60208082528101610ce581612afe565b60208082528101610ce581612b2e565b60208082528101610ce581612b5e565b60208082528101610ce581612bb4565b60208082528101610ce581612be4565b60808101610ce58284612c3a565b60208082528101610bcf8184612c84565b60608082528101612f618186612c84565b9050612f706020830185612d90565b8181036040830152612d7e8184612907565b60208101610ce58284612d87565b60208101610ce58284612d90565b60405181810167ffffffffffffffff81118282101715612fbd57600080fd5b604052919050565b600067ffffffffffffffff821115612fdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612ffd57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b60ff1690565b82818337506000910152565b60005b838110156130ab578181015183820152602001613093565b838111156111c25750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820676a15b49b9dd297feeb6f91748dd348b8f7ed3dd357aec4140cc6cbcdcd68f86c6578706572696d656e74616cf50037",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0xFF JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0xC5E6E6AC EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x1F4 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x214 JUMPI JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x248A JUMP JUMPDEST PUSH2 0x234 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2E63 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x148 PUSH2 0x143 CALLDATASIZE PUSH1 0x4 PUSH2 0x2568 JUMP JUMPDEST PUSH2 0x294 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0x560 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x626 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F82 JUMP JUMPDEST PUSH2 0x148 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x264E JUMP JUMPDEST PUSH2 0x62C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x9FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0xA00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x1EF CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x20F CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x2503 JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x29C PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x2DA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x2E5 DUP5 DUP9 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2F1 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x379 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x38D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x3BA DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0xCEB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x460 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x435 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x460 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x443 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x474 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4B8 JUMPI PUSH2 0x4B1 DUP12 DUP12 DUP5 PUSH2 0xD4C JUMP JUMPDEST SWAP5 POP PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0x4C5 DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0xE66 JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x506 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x543 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x552 DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x568 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x575 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0x591 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x5D4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5C0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0x5F7 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0x603 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x611 JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x57A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH2 0x634 PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x670 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x6AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x6D2 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6BC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x1390 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x7B4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x872 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x886 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x8FF SWAP2 POP POP JUMPI PUSH2 0x8F8 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x13FD JUMP JUMPDEST SWAP3 POP PUSH2 0x992 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x992 JUMPI PUSH2 0x98F DUP11 DUP11 DUP11 DUP11 PUSH2 0x1754 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH2 0x9ED PUSH2 0x9E1 DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1A56 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xA0E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA19 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0xA70 JUMPI PUSH2 0xA35 DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0xA48 DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xA54 DUP5 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0xA65 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xA1E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA81 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA8E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0xAAA DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0xB11 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0xB3E DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xB39 DUP5 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0xB52 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0xB5E DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xB6B JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xA93 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xC00 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBCF JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0xC56 PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC9C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xCE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xD2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xD54 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xDAF SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDDD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xE01 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP2 POP PUSH2 0xE15 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH2 0xE25 DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE6E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE78 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE80 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE88 PUSH2 0x20ED JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0xE95 DUP11 DUP8 PUSH2 0xA06 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0xF29 JUMPI PUSH2 0xEB3 DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST SWAP2 POP PUSH2 0xECC DUP7 PUSH2 0xEC7 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xF12 DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xF83 SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFD5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0xFE1 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x104C SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x2DDD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x10D8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x111D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x116C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1189 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1189 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x11C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DD PUSH2 0x11D7 DUP6 DUP5 PUSH2 0x1EE3 JUMP JUMPDEST DUP5 PUSH2 0x1F3E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x11ED PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x11F5 PUSH2 0x2116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x124C SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x127A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x129E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x27B8 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x12B2 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH2 0x12C4 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0x12D0 DUP6 DUP4 PUSH2 0x1F55 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x12EF DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x11C8 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x1306 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1320 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x133C SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1352 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x136B SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1384 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x1405 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1417 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x141F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1431 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14D7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x1528 DUP11 DUP11 DUP9 PUSH2 0x1BAA JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1570 DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x158C PUSH2 0x1585 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x15D3 DUP11 DUP8 PUSH2 0x560 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x1608 JUMPI PUSH2 0x15F1 DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1662 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x167C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1690 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x16F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x16FB DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x170D DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1745 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xFE1 DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST PUSH2 0x175C PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x176B PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x20ED JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x18DD JUMPI PUSH2 0x17D6 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x187C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1851 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x187C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x185F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x188F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x18AC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17A9 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1908 JUMPI PUSH2 0x18F1 DUP10 DUP10 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1962 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DF8 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1990 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x19B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x19C0 DUP8 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x19D2 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1A48 JUMPI PUSH2 0x1A3D DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A28 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x1F6B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1A0F JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1AB8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AE6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1AF5 DUP6 DUP6 DUP6 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B01 DUP7 DUP4 PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1B39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B9F PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1BB2 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1BBF PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x1ED8 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C71 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C71 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C54 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C84 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1D39 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D0E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D39 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D1C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D4C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x1D68 SWAP1 DUP8 SWAP1 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x1DB6 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x1DE7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DFC DUP6 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E0A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E4E SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F50 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E7C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1EA0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x1EB4 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1EC0 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x1ECD JUMPI PUSH2 0x1ED8 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1BC4 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1EF6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1B86 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1F06 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1F4C JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1F64 JUMPI DUP2 PUSH2 0xBCF JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x1F81 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xCEB AND JUMP JUMPDEST SWAP3 POP PUSH2 0x1F94 DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x203B AND JUMP JUMPDEST SWAP2 POP PUSH2 0x1FA7 DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x2047 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x2002 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D99 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2030 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP4 DUP4 PUSH2 0x20A2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x2055 DUP5 DUP5 PUSH2 0x203B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x209C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E91 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x20E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EB1 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3036 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2166 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST PUSH2 0x2F9E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x218E DUP9 DUP3 PUSH2 0x220D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2178 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x21B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21C3 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x21EB DUP9 DUP3 PUSH2 0x231D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x221E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x222C PUSH2 0x2161 DUP3 PUSH2 0x2FE6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA70 DUP4 DUP3 DUP5 PUSH2 0x3084 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x226F PUSH1 0x80 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x227D DUP5 DUP5 PUSH2 0x2201 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x228E DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x22A2 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x22B6 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22DE PUSH1 0x60 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22EC DUP5 DUP5 PUSH2 0x247E JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x22FD DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2311 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x233B PUSH2 0x180 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2349 DUP5 DUP5 PUSH2 0x2136 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x235A DUP5 DUP5 DUP4 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x236E DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2382 DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2396 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x23AA DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x23BE DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x23D2 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x23E7 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x23FD DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x241F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x242B DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2459 DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3074 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x24A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x24AC DUP8 DUP8 PUSH2 0x2136 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x24BD DUP8 DUP3 DUP9 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x24CE DUP8 DUP3 DUP9 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x24EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F7 DUP8 DUP3 DUP9 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2524 DUP7 DUP7 PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2535 DUP7 DUP3 DUP8 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x255E DUP7 DUP3 DUP8 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25A4 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25CD DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F6 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2613 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x261F DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2630 DUP10 DUP3 DUP11 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2641 DUP10 DUP3 DUP11 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2669 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268C DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26DE DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2707 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2718 DUP11 DUP3 DUP12 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2729 DUP11 DUP3 DUP12 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x273A DUP11 DUP3 DUP12 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x275C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x277F DUP6 DUP3 DUP7 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2790 DUP6 DUP3 DUP7 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x2253 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x22C2 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3036 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F0 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2809 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2824 DUP4 DUP4 MLOAD PUSH2 0x2907 JUMP JUMPDEST SWAP3 POP PUSH2 0x282F DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x280C JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2857 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2870 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x288B DUP4 DUP4 MLOAD PUSH2 0x2C84 JUMP JUMPDEST SWAP3 POP PUSH2 0x2896 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2873 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B2 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x28C4 DUP4 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x28F4 JUMPI PUSH2 0x28DA DUP7 DUP4 MLOAD PUSH2 0x2D90 JUMP JUMPDEST PUSH2 0x28E3 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x28C7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x304F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2912 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2926 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3090 JUMP JUMPDEST PUSH2 0x292F DUP2 PUSH2 0x30BC JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x2C4B DUP5 DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2C5E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2C71 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x11C2 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x2C99 DUP6 DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x2CAC PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2CBF PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2CD2 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x2CE5 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x2CF8 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x2D0B PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x2D1E PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x2D33 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x2D48 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x2D62 DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x2D7E DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3074 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x307B JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2DA7 DUP3 DUP8 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DB4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DC1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2DD3 DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2DEB DUP3 DUP6 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E09 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E1D DUP2 DUP6 PUSH2 0x28A7 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E42 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP PUSH2 0x2E51 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x28FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x293C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2992 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x29C2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A18 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A48 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B2E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B5E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BB4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BE4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2C3A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCF DUP2 DUP5 PUSH2 0x2C84 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2F61 DUP2 DUP7 PUSH2 0x2C84 JUMP JUMPDEST SWAP1 POP PUSH2 0x2F70 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x30AB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3093 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11C2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH8 0x6A15B49B9DD297FE 0xeb PUSH16 0x91748DD348B8F7ED3DD357AEC4140CC6 0xcb 0xcd 0xcd PUSH9 0xF86C6578706572696D PUSH6 0x6E74616CF500 CALLDATACOPY ",
- "sourceMap": "834:576:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1170:11:3;;;;1148:10;:34;1127:116;;;;;;;;;;;;;;;;;;;;;;834:576:0;1336:209:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1336:209:6;;;;;;;;;;;;;;;;;;;;;;;;;2954:2408:4;;;;;;;;;;;;;;;;;;1419:950:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1419:950:2;;;;;;;;;925:59:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;925:59:3;;;;;;;;;;;;6720:1894:4;;;;;;;;;;786:53:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;786:53:3;;;;875:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;875:37:3;;;;2778:732:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2778:732:2;;;;;;;;;3919:1414;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3919:1414:2;;;;;;;;;1147:183:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1147:183:6;;;;;;;;;1336:209;1079:60;;;;;;;;;;;;;;;;;;;;;1336:209;;;;;;:::o;2954:2408:4:-;3256:35;;:::i;:::-;3332:9;3307:22;;;3372:18;;;3351:88;;;;;;;;;;;;;;3535:100;3558:14;3586:13;3613:12;3535:9;:100::i;:::-;3512:123;;3670:37;3678:14;3694:12;3670:7;:37::i;:::-;3645:62;;3774:11;;;;;;;;;;;:19;;;3800:14;3774:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3774:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3774:43:4;;;;;4011:50;4032:6;4039:1;4032:9;;;;;;;;;;;;;;;;;;:24;;;4058:2;4011:20;:50::i;:::-;4098:15;4071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3983:78;;-1:-1:-1;4071:42:4;;4098:15;4071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;4078:1;4071:9;;;;;;;;;;;;;;;;;;;:24;;:42;4156:9;;;4127:39;;;4156:9;;4127:39;4123:614;;;4366:125;4411:6;4435:10;4463:14;4366:27;:125::i;:::-;4347:144;;4123:614;;;4541:185;4588:6;4612:10;4640:9;4667:13;4698:14;4541:29;:185::i;:::-;4522:204;;4123:614;4862:39;;;;4844:57;;;4823:121;;;;;;;;;;;;;;5044:39;;;;5026:57;;5005:126;;;;;;;;;;;;;;5186:136;5218:17;5249:10;5273:16;:39;;;5186:18;:136::i;:::-;2954:2408;;;;;;;;;;;;:::o;1419:950:2:-;1583:35;;:::i;:::-;1639:9;1692:37;1816;2035:35;;:::i;:::-;1651:1;1639:13;;1634:696;1658:6;:13;1654:1;:17;1634:696;;;1732:70;1740:20;1762:16;:39;;;1732:7;:70::i;:::-;1692:110;;1856:165;1890:6;1897:1;1890:9;;;;;;;;;;;;;;;;;;:26;;;1934:6;1941:1;1934:9;;;;;;;;;;;;;;;;;;:26;;;1978:29;1856:16;:165::i;:::-;1816:205;;2073:62;2094:6;2101:1;2094:9;;;;;;;;;;;;;;;;;;2105:29;2073:20;:62::i;:::-;2035:100;;2149:50;2164:16;2182;2149:14;:50::i;:::-;2217:39;;:63;;2213:107;;;2300:5;;2213:107;1673:3;;;;;1634:696;;;1419:950;;;;;;;;:::o;925:59:3:-;980:4;925:59;:::o;6720:1894:4:-;7061:35;;:::i;:::-;7137:9;7112:22;7177:18;;;7156:88;;;;;;;;;;;;;;7298:1;7275:24;;7254:94;;;;;;;;;;;;;;7379:48;7399:6;7406:1;7399:9;;;;;;;;;;;;;;;;;;:24;;;7425:1;7379:19;:48::i;:::-;1204:32;;;;;;;;;;;;;;;;7358:69;;-1:-1:-1;7458:28:4;;;;;;;;:61;;-1:-1:-1;1292:47:4;;;;;;;;;;;;;;;;;;;;;7490:29;;;;;;;7458:61;7437:131;;;;;;;;;;;;;;;;7579:11;;;;;;;;;;;:19;;;7605:14;7579:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7579:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;1204:32:4;;;;;;;;;;;;;;;;7636:28;;;;;;;7632:505;;-1:-1:-1;7632:505:4;;-1:-1:-1;;7632:505:4;7699:190;7745:6;7769:10;7797:9;7824:13;7855:20;7699:28;:190::i;:::-;7680:209;;7632:505;;;1292:47;;;;;;;;;;;;;;;;;;;;;7910:29;;;;;;;7906:231;;;7974:152;8020:6;8044:10;8072:9;8099:13;7974:28;:152::i;:::-;7955:171;;7906:231;8262:39;;;;8244:57;;;8223:121;;;;;;;;;;;;;;8354:220;8394:64;8402:14;8418:16;:39;;;8394:7;:64::i;:::-;8472:16;:39;;;8525:13;8552:12;8354:26;:220::i;:::-;6720:1894;;;;;;;;;;;:::o;786:53:3:-;834:5;786:53;:::o;875:37::-;908:4;875:37;:::o;2778:732:2:-;2943:35;;:::i;:::-;2999:9;3052:37;3176:35;;:::i;:::-;3011:1;2999:13;;2994:477;3018:6;:13;3014:1;:17;2994:477;;;3092:70;3100:20;3122:16;:39;;;3092:7;:70::i;:::-;3052:110;;3214:62;3235:6;3242:1;3235:9;;;;;;;;;3214:62;3176:100;;3290:50;3305:16;3323;3290:14;:50::i;:::-;3401:20;3358:16;:39;;;:63;3354:107;;;3441:5;;3354:107;3033:3;;;;;2994:477;;;2778:732;;;;;;;:::o;3919:1414::-;4079:35;;:::i;:::-;4135:9;4188:30;4479:31;4747:35;;:::i;:::-;4147:1;4135:13;;4130:1164;4154:6;:13;4150:1;:17;4130:1164;;;4221:63;4229:13;4244:16;:39;;;4221:7;:63::i;:::-;4188:96;;4513:220;4547:6;4554:1;4547:9;;;;;;;;;;;;;;;;;;:26;;;4591:55;4599:6;4606:1;4599:9;;;;;;;;;;;;;;;;;;:26;;;4627:6;4634:1;4627:9;;;;;;;;;;;;;;;;;;:18;;;4591:7;:55::i;:::-;4697:22;4513:16;:220::i;:::-;4479:254;;4785:68;4806:6;4813:1;4806:9;;;;;;;;;;;;;;;;;;4817:35;4825:23;4850:1;4817:7;:35::i;:::-;4785:20;:68::i;:::-;4747:106;;4910:79;4918:16;:39;;;4959:16;:29;;;4910:7;:79::i;:::-;4868:121;;5003:50;5018:16;4868;5003:14;:50::i;:::-;5188:39;;:56;-1:-1:-1;5184:100:2;;5264:5;;5184:100;4169:3;;;;;4130:1164;;1147:183:6;961:52;;;;;;;;;;;;;;;;;;;;;1147:183;;;;;;:::o;1644:695:3:-;1795:20;1851:1;1835:13;:17;;;:47;;;;-1:-1:-1;1856:26:3;;;;;1835:47;1831:473;;;908:4;1923:24;;;;;1898:107;;;;;;;;;;;;;;2111:133;;;;834:5;2216:14;2111:16;:133::i;:::-;2258:35;;2096:148;;-1:-1:-1;2258:21:3;;;;:35;;;;;2096:148;;2258:35;;;;2096:148;2258:21;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2258:35:3;1644:695;;;;;:::o;501:207:30:-;587:7;631:6;;;;610:69;;;;;;;;;;;;;;-1:-1:-1;696:5:30;;;501:207;;;;;:::o;10259:886:29:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:29;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;11418:994:4:-;11602:35;;:::i;:::-;12042:23;11759:8;;:107;;;;;:8;;;;;:25;;:107;;11798:6;;11818:14;;11846:10;;11759:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11759:107:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11759:107:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;11759:107:4;;;;;;;;;11740:126;;12068:79;12076:16;:39;;;12117:16;:29;;;12068:7;:79::i;:::-;12042:105;;12178:79;12200:16;:39;;;12241:15;12178:21;:79::i;:::-;12157:148;;;;;;;;;;;;;;;;12315:57;;;11418:994;-1:-1:-1;;;11418:994:4:o;9162:1906::-;9429:35;;:::i;:::-;9480:31;9538:46;;:::i;:::-;9808:35;;:::i;:::-;10741:41;;:::i;:::-;9514:14;9480:48;;9587:50;9614:6;9622:14;9587:26;:50::i;:::-;9538:99;;9694:1;9651:27;:40;;;:44;9647:998;;;9846:150;9884:9;9911:13;9942:27;:40;;;9846:20;:150::i;:::-;9808:188;;10134:161;10177:14;10213:64;10221:14;10237:16;:39;;;10213:7;:64::i;:::-;10134:21;:161::i;:::-;10109:242;;;;;;;;;;;;;;;;10391:73;10399:23;10424:16;:39;;;10391:7;:73::i;:::-;10510:29;;;;;10478;;;:61;10595:39;;;;;10553;;;:81;10365:99;-1:-1:-1;9647:998:4;10785:8;;:116;;;;;:8;;;;;:25;;:116;;10824:6;;10844:23;;10881:10;;10785:116;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10785:116:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10785:116:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;10785:116:4;;;;;;;;;10741:160;;10972:56;10987:16;11005:22;10972:14;:56::i;:::-;9162:1906;;;;;;;;;;;:::o;1551:1224:6:-;866:38;;;;;;;;;;;;;;;;1809:12;;1824:10;;;;866:38;1835:105;;1908:2;;1924:6;;1835:105;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1835:105:6;;;49:4:-1;25:18;;61:17;;1835:105:6;182:15:-1;1835:105:6;;;;179:29:-1;;;;160:49;;1824:117:6;;;1835:105;;1824:117;;;;25:18:-1;1824:117:6;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1824:117:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1951:69:6;;;;;;;;;;;;;;;;;2399:14;2396:2;;;-1:-1:-1;2443:1:6;2467:14;2483:2;2464:22;2461:2;;;2605;2602:1;2599;2584:24;-1:-1:-1;2646:1:6;2640:8;2461:2;2720:7;2699:69;;;;;;;;;;;;;;;;1551:1224;;;;:::o;937:326:24:-;1091:21;1144:82;1165:26;1173:9;1184:6;1165:7;:26::i;:::-;1205:11;1144:7;:82::i;:::-;1128:98;937:326;-1:-1:-1;;;;937:326:24:o;5694:1215:2:-;5852:30;;:::i;:::-;5898:35;;:::i;:::-;6093:33;5936:8;;:28;;;;;6093:33;;5936:8;;;:21;;:28;;5958:5;;5936:28;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5936:28:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5936:28:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5936:28:2;;;;;;;;;5978:21;;5898:66;;-1:-1:-1;5978:61:2;;6009:29;5978:61;5974:110;;6055:18;;5974:110;6129:70;6137:5;:22;;;6161:9;:37;;;6129:7;:70::i;:::-;6093:106;;6242:55;6249:20;6271:25;6242:6;:55::i;:::-;6209:88;;6345:22;6308:11;:34;;:59;;;;;6414:134;6444:22;6480:5;:22;;;6516:5;:22;;;6414:16;:134::i;:::-;6377:171;;6651:22;;;;6687:14;;;;6585:126;;6615:22;;6585:16;:126::i;:::-;6558:24;;;:153;6814:22;;;;6850:14;;;;6748:126;;6778:22;;6748:16;:126::i;:::-;6721:24;;;:153;5694:1215;;;;;;;:::o;1772:648:23:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:23:o;15559:559:29:-;15679:13;15741:5;15749:1;15741:9;15729:1;:8;:21;;15708:105;;;;;;;;;;;;;;;;-1:-1:-1;;15869:2:29;15862:10;15856:17;16012:66;16000:79;;15559:559::o;13021:3595:4:-;13293:50;;:::i;:::-;13454:25;14027:35;;:::i;:::-;14951:45;;:::i;:::-;15236:38;;:::i;:::-;13482:50;13503:6;13510:1;13503:9;;;;;;;;;13482:50;13774:15;13747:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13454:78;;-1:-1:-1;13747:42:4;;13774:15;13747:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;13754:1;13747:9;;;;;;;;;;;;;;;;;;;:24;;:42;14105:9;;;14076:39;;;14105:9;;14076:39;14072:2304;;;14150:124;14188:6;14212:10;14240:20;14150;:124::i;:::-;14398:39;;14131:143;;-1:-1:-1;14398:63:4;-1:-1:-1;14398:63:4;14373:144;;;;;;;;;;;;;;14531:50;14546:16;14564;14531:14;:50::i;:::-;14620:244;14663:79;14671:16;:39;;;14712:16;:29;;;14663:7;:79::i;:::-;14777:39;;14620:21;:244::i;:::-;14595:325;;;;;;;;;;;;;;;;14072:2304;;;14999:55;15025:6;15033:20;14999:25;:55::i;:::-;14951:103;;15114:1;15072:26;:39;;;:43;15068:573;;;15277:165;15319:9;15350:13;15385:26;:39;;;15277:20;:165::i;:::-;15502:42;;;;;15460:39;;;:84;15594:32;;;;;15562:29;;;:64;15236:206;-1:-1:-1;15068:573:4;15759:8;;:128;;;;;:8;;;;;:24;;:128;;15801:6;;15825:20;;15863:10;;15759:128;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15759:128:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15759:128:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15759:128:4;;;;;;;;;15926:39;;15740:147;;-1:-1:-1;15926:63:4;;15901:144;;;;;;;;;;;;;;16059:50;16074:16;16092;16059:14;:50::i;:::-;16148:161;16191:16;:39;;;16252:16;:39;;;16148:21;:161::i;:::-;16123:242;;;;;;;;;;;;;;;;16440:136;16472:17;16503:10;16527:16;:39;;;16440:18;:136::i;17161:2228::-;17395:50;;:::i;:::-;17461:25;17496:20;17542:38;17625:9;18304:38;;:::i;:::-;18668:35;;:::i;:::-;17519:6;:13;17496:36;;17597:12;17583:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;17583:27:4;;17542:68;;17637:1;17625:13;;17620:543;17644:12;17640:1;:16;17620:543;;;17730:46;17738:17;17757:6;17764:1;17757:9;;;;;;;;;;;;;;;;;;:18;;;17730:7;:46::i;:::-;18004:15;17977:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17710:66;;-1:-1:-1;17977:42:4;;18004:15;17977:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;17984:1;17977:9;;;;;;;;;;;;;;;;;;;:24;;:42;18126:9;;:6;;18133:1;;18126:9;;;;;;;;;;;;;;:26;;;18099:21;18121:1;18099:24;;;;;;;;;;;;;;;;;;:53;17658:3;;;;;17620:543;;;18196:1;18176:17;:21;18172:487;;;18345:127;18383:9;18410:13;18441:17;18345:20;:127::i;:::-;18518:32;;;;;18486:29;;;:64;18606:42;;;;;18564:39;;;:84;18304:168;-1:-1:-1;18172:487:4;18706:8;;:119;;;;;:8;;;;;:30;;:119;;18750:6;;18770:21;;18805:10;;18706:119;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18706:119:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18706:119:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18706:119:4;;;;;;;;;18668:157;;18835:50;18850:16;18868;18835:14;:50::i;:::-;18916:149;18955:16;:39;;;19012:16;:39;;;18916:21;:149::i;:::-;18895:218;;;;;;;;;;;;;;;;19196:1;19192:5;;19187:163;19203:12;19199:1;:16;19187:163;;;19236:103;19273:6;19280:1;19273:9;;;;;;;;;;;;;;;;;;:24;;;19315:10;19236:19;:103::i;:::-;19217:3;;;;;19187:163;;;17161:2228;;;;;;;;;;;;:::o;2960:777:3:-;3391:20;3544:24;3267:1;3247:17;:21;3243:488;;;3284:11;;:39;;;;;:11;;;;;:20;;:39;;3305:17;;3284:39;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3284:39:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3284:39:3;;;;3414:116;3441:14;3473:13;3504:12;3414:9;:116::i;:::-;3391:139;;3571:40;3579:17;3598:12;3571:7;:40::i;:::-;3544:67;;3648:1;3629:16;:20;3625:96;;;3669:37;;:10;;:37;;;;;3689:16;;3669:37;;;;3689:16;3669:10;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3669:37:3;3625:96;2960:777;;;;;;:::o;714:230:30:-;800:7;835:5;;;871:6;;;;850:69;;;;;;;;;;;;;;936:1;929:8;;714:230;;;;;;:::o;4350:384:3:-;4482:4;;4533:138;980:4;834:5;4642:19;4533:16;:138::i;:::-;4688:39;;;;;4350:384;-1:-1:-1;;;4350:384:3:o;1831:2046:5:-;2006:35;;:::i;:::-;2062:9;2386:29;2675:31;3095:35;;:::i;:::-;2074:1;2062:13;;2057:1781;2081:6;:13;2077:1;:17;2057:1781;;;2235:14;2208:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2235:14;2208:41;;2235:14;2208:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2215:1;2208:9;;;;;;;;;;;;;;;;;;;;:24;;:41;;;;2290:15;2263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2290:15;2263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2270:1;2263:9;;;;;;;;;;;;;;;;;;;:24;;:42;2440:39;;2418:62;;2426:12;;2418:7;:62::i;:::-;2386:94;;2709:219;2743:6;2750:1;2743:9;;;;;;;;;;;;;;;;;;:26;;;2787:55;2795:6;2802:1;2795:9;;;;;;;;;;;;;;;;;;:26;;;2823:6;2830:1;2823:9;;;;;;;;;2709:219;3133:8;;3169:9;;2675:253;;-1:-1:-1;3133:8:5;;;:18;;3169:6;;3176:1;;3169:9;;;;;;;;;;;;;;3196:35;3204:23;3229:1;3196:7;:35::i;:::-;3249:10;3260:1;3249:13;;;;;;;;;;;;;;;;;;3133:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3133:143:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3133:143:5;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3133:143:5;;;;;;;;;3095:181;;3421:79;3429:16;:39;;;3470:16;:29;;;3421:7;:79::i;:::-;3379:121;;3584:50;3599:16;3379;3584:14;:50::i;:::-;3733:39;;:55;-1:-1:-1;3729:99:5;;3808:5;;3729:99;2096:3;;;;;2057:1781;;;1831:2046;;;;;;;;;:::o;50:288:30:-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:30;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;344:151;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:30:o;1369:135::-;1454:7;1488:1;1484;:5;:13;;1496:1;1484:13;;;-1:-1:-1;1492:1:30;;1477:20;-1:-1:-1;1369:135:30:o;2781:467:6:-;2929:13;;3033:25;2945;:9;2967:2;2945:25;:21;:25;:::i;:::-;2929:41;-1:-1:-1;2998:25:6;:9;3020:2;2998:25;:21;:25;:::i;:::-;2980:43;-1:-1:-1;3061:34:6;:9;3091:3;3061:34;:29;:34;:::i;:::-;3105:136;;;;;3033:62;;-1:-1:-1;3105:36:6;;;;;;:136;;3163:4;;3182:2;;3198:7;;3033:62;;3105:136;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3105:136:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3105:136:6;;;;2781:467;;;;;:::o;14699:195:29:-;14820:14;14865:21;14877:1;14880:5;14865:11;:21::i;16441:672::-;16570:19;16644:25;16672:21;16684:1;16687:5;16672:11;:21::i;:::-;16644:49;;16712:2;16703:11;;;;16848:17;16840:5;:25;16828:1;:8;:37;;16807:132;;;;;;;;;;;;;;;;-1:-1:-1;;17061:13:29;;16441:672::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:29;13620:2;13718:13;13712:20;;13281:490::o;834:576:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;834:576:0;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1622:122;;1700:39;1731:6;1725:13;1700:39;;1752:432;;1842:4;1830:17;;1826:27;-1:-1;1816:2;;1867:1;1864;1857:12;1816:2;1904:6;1891:20;1926:60;1941:44;1978:6;1941:44;;1926:60;1917:69;;2006:6;1999:5;1992:21;2042:4;2034:6;2030:17;2075:4;2068:5;2064:16;2110:3;2101:6;2096:3;2092:16;2089:25;2086:2;;;2127:1;2124;2117:12;2086:2;2137:41;2171:6;2166:3;2161;2137:41;;2681:865;;2810:4;2798:9;2793:3;2789:19;2785:30;2782:2;;;2828:1;2825;2818:12;2782:2;2846:20;2861:4;2846:20;;;2837:29;-1:-1;2934:1;2965:60;3021:3;3001:9;2965:60;;;2941:85;;-1:-1;3105:2;3138:60;3194:3;3170:22;;;3138:60;;;3131:4;3124:5;3120:16;3113:86;3047:163;3268:2;3301:60;3357:3;3348:6;3337:9;3333:22;3301:60;;;3294:4;3287:5;3283:16;3276:86;3220:153;3431:2;3464:60;3520:3;3511:6;3500:9;3496:22;3464:60;;;3457:4;3450:5;3446:16;3439:86;3383:153;2776:770;;;;;3585:689;;3712:4;3700:9;3695:3;3691:19;3687:30;3684:2;;;3730:1;3727;3720:12;3684:2;3748:20;3763:4;3748:20;;;3739:29;-1:-1;3825:1;3856:58;3910:3;3890:9;3856:58;;;3832:83;;-1:-1;3981:2;4014:60;4070:3;4046:22;;;4014:60;;;4007:4;4000:5;3996:16;3989:86;3936:150;4159:2;4192:60;4248:3;4239:6;4228:9;4224:22;4192:60;;;4185:4;4178:5;4174:16;4167:86;4096:168;3678:596;;;;;4309:2205;;4417:5;4405:9;4400:3;4396:19;4392:31;4389:2;;;4436:1;4433;4426:12;4389:2;4454:21;4469:5;4454:21;;;4445:30;-1:-1;4533:1;4564:49;4609:3;4589:9;4564:49;;;4540:74;;-1:-1;4683:2;4716:49;4761:3;4737:22;;;4716:49;;;4709:4;4702:5;4698:16;4691:75;4635:142;4842:2;4875:49;4920:3;4911:6;4900:9;4896:22;4875:49;;;4868:4;4861:5;4857:16;4850:75;4787:149;4995:2;5028:49;5073:3;5064:6;5053:9;5049:22;5028:49;;;5021:4;5014:5;5010:16;5003:75;4946:143;5151:3;5185:49;5230:3;5221:6;5210:9;5206:22;5185:49;;;5178:4;5171:5;5167:16;5160:75;5099:147;5308:3;5342:49;5387:3;5378:6;5367:9;5363:22;5342:49;;;5335:4;5328:5;5324:16;5317:75;5256:147;5457:3;5491:49;5536:3;5527:6;5516:9;5512:22;5491:49;;;5484:4;5477:5;5473:16;5466:75;5413:139;5606:3;5640:49;5685:3;5676:6;5665:9;5661:22;5640:49;;;5633:4;5626:5;5622:16;5615:75;5562:139;5768:3;5803:49;5848:3;5839:6;5828:9;5824:22;5803:49;;;5795:5;5788;5784:17;5777:76;5711:153;5914:3;5949:49;5994:3;5985:6;5974:9;5970:22;5949:49;;;5941:5;5934;5930:17;5923:76;5874:136;6098:3;6087:9;6083:19;6070:33;6123:18;6115:6;6112:30;6109:2;;;6155:1;6152;6145:12;6109:2;6191:54;6241:3;6232:6;6221:9;6217:22;6191:54;;;6183:5;6176;6172:17;6165:81;6020:237;6345:3;6334:9;6330:19;6317:33;6370:18;6362:6;6359:30;6356:2;;;6402:1;6399;6392:12;6356:2;6438:54;6488:3;6479:6;6468:9;6464:22;6438:54;;;6430:5;6423;6419:17;6412:81;6267:237;4383:2131;;;;;6521:116;;6587:45;6624:6;6611:20;6587:45;;6644:118;;6711:46;6749:6;6736:20;6711:46;;6898:118;;6974:37;7003:6;6997:13;6974:37;;7023:721;;;;;7187:3;7175:9;7166:7;7162:23;7158:33;7155:2;;;7204:1;7201;7194:12;7155:2;7239:1;7256:53;7301:7;7281:9;7256:53;;;7246:63;;7218:97;7346:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;;;7354:63;;7325:98;7454:2;7472:53;7517:7;7508:6;7497:9;7493:22;7472:53;;;7462:63;;7433:98;7590:2;7579:9;7575:18;7562:32;7614:18;7606:6;7603:30;7600:2;;;7646:1;7643;7636:12;7600:2;7666:62;7720:7;7711:6;7700:9;7696:22;7666:62;;;7656:72;;7541:193;7149:595;;;;;;;;7751;;;;7898:2;7886:9;7877:7;7873:23;7869:32;7866:2;;;7914:1;7911;7904:12;7866:2;7949:1;7966:53;8011:7;7991:9;7966:53;;;7956:63;;7928:97;8056:2;8074:53;8119:7;8110:6;8099:9;8095:22;8074:53;;;8064:63;;8035:98;8192:2;8181:9;8177:18;8164:32;8216:18;8208:6;8205:30;8202:2;;;8248:1;8245;8238:12;8202:2;8268:62;8322:7;8313:6;8302:9;8298:22;8268:62;;;8258:72;;8143:193;7860:486;;;;;;8353:1507;;;;;;;8689:3;8677:9;8668:7;8664:23;8660:33;8657:2;;;8706:1;8703;8696:12;8657:2;8741:31;;8792:18;8781:30;;8778:2;;;8824:1;8821;8814:12;8778:2;8844:97;8933:7;8924:6;8913:9;8909:22;8844:97;;;8834:107;;8720:227;9006:2;8995:9;8991:18;8978:32;9030:18;9022:6;9019:30;9016:2;;;9062:1;9059;9052:12;9016:2;9082:83;9157:7;9148:6;9137:9;9133:22;9082:83;;;9072:93;;8957:214;9230:2;9219:9;9215:18;9202:32;9254:18;9246:6;9243:30;9240:2;;;9286:1;9283;9276:12;9240:2;9306:97;9395:7;9386:6;9375:9;9371:22;9306:97;;;9296:107;;9181:228;9468:2;9457:9;9453:18;9440:32;9492:18;9484:6;9481:30;9478:2;;;9524:1;9521;9514:12;9478:2;9544:83;9619:7;9610:6;9599:9;9595:22;9544:83;;;9534:93;;9419:214;9664:3;9683:52;9727:7;9718:6;9707:9;9703:22;9683:52;;;9673:62;;9643:98;9772:3;9791:53;9836:7;9827:6;9816:9;9812:22;9791:53;;;9781:63;;9751:99;8651:1209;;;;;;;;;9867:1633;;;;;;;;10220:3;10208:9;10199:7;10195:23;10191:33;10188:2;;;10237:1;10234;10227:12;10188:2;10272:31;;10323:18;10312:30;;10309:2;;;10355:1;10352;10345:12;10309:2;10375:97;10464:7;10455:6;10444:9;10440:22;10375:97;;;10365:107;;10251:227;10537:2;10526:9;10522:18;10509:32;10561:18;10553:6;10550:30;10547:2;;;10593:1;10590;10583:12;10547:2;10613:83;10688:7;10679:6;10668:9;10664:22;10613:83;;;10603:93;;10488:214;10761:2;10750:9;10746:18;10733:32;10785:18;10777:6;10774:30;10771:2;;;10817:1;10814;10807:12;10771:2;10837:97;10926:7;10917:6;10906:9;10902:22;10837:97;;;10827:107;;10712:228;10999:2;10988:9;10984:18;10971:32;11023:18;11015:6;11012:30;11009:2;;;11055:1;11052;11045:12;11009:2;11075:83;11150:7;11141:6;11130:9;11126:22;11075:83;;;11065:93;;10950:214;11195:3;11214:53;11259:7;11250:6;11239:9;11235:22;11214:53;;;11204:63;;11174:99;11304:3;11323:52;11367:7;11358:6;11347:9;11343:22;11323:52;;;11313:62;;11283:98;11412:3;11431:53;11476:7;11467:6;11456:9;11452:22;11431:53;;;11421:63;;11391:99;10182:1318;;;;;;;;;;;11507:540;;;11672:2;11660:9;11651:7;11647:23;11643:32;11640:2;;;11688:1;11685;11678:12;11640:2;11723:31;;11774:18;11763:30;;11760:2;;;11806:1;11803;11796:12;11760:2;11826:97;11915:7;11906:6;11895:9;11891:22;11826:97;;;11816:107;;11702:227;11960:2;11978:53;12023:7;12014:6;12003:9;11999:22;11978:53;;;11968:63;;11939:98;11634:413;;;;;;12054:322;;12198:3;12186:9;12177:7;12173:23;12169:33;12166:2;;;12215:1;12212;12205:12;12166:2;12250:1;12267:93;12352:7;12332:9;12267:93;;12383:317;;12525:2;12513:9;12504:7;12500:23;12496:32;12493:2;;;12541:1;12538;12531:12;12493:2;12576:1;12593:91;12676:7;12656:9;12593:91;;12707:110;12780:31;12805:5;12780:31;;;12775:3;12768:44;12762:55;;;12851:766;;12996:59;13049:5;12996:59;;;13073:6;13068:3;13061:19;13097:4;13092:3;13088:14;13081:21;;13145:3;13187:4;13179:6;13175:17;13170:3;13166:27;13213:61;13268:5;13213:61;;;13295:1;13280:298;13305:6;13302:1;13299:13;13280:298;;;13367:9;13361:4;13357:20;13352:3;13345:33;13393:68;13456:4;13447:6;13441:13;13393:68;;;13385:76;;13478:65;13536:6;13478:65;;;13566:4;13557:14;;;;;13468:75;-1:-1;13327:1;13320:9;13280:298;;;-1:-1;13591:4;;12975:642;-1:-1;;;;;;12975:642;13684:864;;13857:73;13924:5;13857:73;;;13948:6;13943:3;13936:19;13972:4;13967:3;13963:14;13956:21;;14020:3;14062:4;14054:6;14050:17;14045:3;14041:27;14088:75;14157:5;14088:75;;;14184:1;14169:340;14194:6;14191:1;14188:13;14169:340;;;14256:9;14250:4;14246:20;14241:3;14234:33;14282:96;14373:4;14364:6;14358:13;14282:96;;;14274:104;;14395:79;14467:6;14395:79;;;14497:4;14488:14;;;;;14385:89;-1:-1;14216:1;14209:9;14169:340;;14587:590;;14722:54;14770:5;14722:54;;;14794:6;14789:3;14782:19;14818:4;14813:3;14809:14;14802:21;;14863:56;14913:5;14863:56;;;14940:1;14925:230;14950:6;14947:1;14944:13;14925:230;;;14990:53;15039:3;15030:6;15024:13;14990:53;;;15060:60;15113:6;15060:60;;;15143:4;15134:14;;;;;15050:70;-1:-1;14972:1;14965:9;14925:230;;;-1:-1;15168:3;;14701:476;-1:-1;;;;14701:476;15185:107;15256:30;15280:5;15256:30;;15299:297;;15399:38;15431:5;15399:38;;;15454:6;15449:3;15442:19;15466:63;15522:6;15515:4;15510:3;15506:14;15499:4;15492:5;15488:16;15466:63;;;15561:29;15583:6;15561:29;;;15541:50;;;15554:4;15541:50;;15379:217;-1:-1;;;15379:217;15900:397;16055:2;16043:15;;16092:66;16087:2;16078:12;;16071:88;16193:66;16188:2;16179:12;;16172:88;16288:2;16279:12;;16036:261;16306:296;16461:2;16449:15;;16498:66;16493:2;16484:12;;16477:88;16593:2;16584:12;;16442:160;16611:397;16766:2;16754:15;;16803:66;16798:2;16789:12;;16782:88;16904:66;16899:2;16890:12;;16883:88;16999:2;16990:12;;16747:261;17017:296;17172:2;17160:15;;17209:66;17204:2;17195:12;;17188:88;17304:2;17295:12;;17153:160;17322:397;17477:2;17465:15;;17514:66;17509:2;17500:12;;17493:88;17615:66;17610:2;17601:12;;17594:88;17710:2;17701:12;;17458:261;17728:296;17883:2;17871:15;;17920:66;17915:2;17906:12;;17899:88;18015:2;18006:12;;17864:160;18033:296;18188:2;18176:15;;18225:66;18220:2;18211:12;;18204:88;18320:2;18311:12;;18169:160;18338:296;18493:2;18481:15;;18530:66;18525:2;18516:12;;18509:88;18625:2;18616:12;;18474:160;18643:296;18798:2;18786:15;;18835:66;18830:2;18821:12;;18814:88;18930:2;18921:12;;18779:160;18948:397;19103:2;19091:15;;19140:66;19135:2;19126:12;;19119:88;19241:66;19236:2;19227:12;;19220:88;19336:2;19327:12;;19084:261;19354:296;19509:2;19497:15;;19546:66;19541:2;19532:12;;19525:88;19641:2;19632:12;;19490:160;19659:397;19814:2;19802:15;;19851:66;19846:2;19837:12;;19830:88;19952:66;19947:2;19938:12;;19931:88;20047:2;20038:12;;19795:261;20141:888;20369:22;;20282:4;20273:14;;;20403:61;20277:3;20369:22;20403:61;;;20302:174;20570:4;20563:5;20559:16;20553:23;20588:62;20644:4;20639:3;20635:14;20622:11;20588:62;;;20486:176;20746:4;20739:5;20735:16;20729:23;20764:62;20820:4;20815:3;20811:14;20798:11;20764:62;;;20672:166;20922:4;20915:5;20911:16;20905:23;20940:62;20996:4;20991:3;20987:14;20974:11;20940:62;;21089:2419;21304:22;;21089:2419;;21226:5;21217:15;;;21338:61;21221:3;21304:22;21338:61;;;21247:164;21495:4;21488:5;21484:16;21478:23;21513:62;21569:4;21564:3;21560:14;21547:11;21513:62;;;21421:166;21678:4;21671:5;21667:16;21661:23;21696:62;21752:4;21747:3;21743:14;21730:11;21696:62;;;21597:173;21855:4;21848:5;21844:16;21838:23;21873:62;21929:4;21924:3;21920:14;21907:11;21873:62;;;21780:167;22035:4;22028:5;22024:16;22018:23;22053:62;22109:4;22104:3;22100:14;22087:11;22053:62;;;21957:170;22215:4;22208:5;22204:16;22198:23;22233:62;22289:4;22284:3;22280:14;22267:11;22233:62;;;22137:170;22387:4;22380:5;22376:16;22370:23;22405:62;22461:4;22456:3;22452:14;22439:11;22405:62;;;22317:162;22559:4;22552:5;22548:16;22542:23;22577:62;22633:4;22628:3;22624:14;22611:11;22577:62;;;22489:162;22744:5;22737;22733:17;22727:24;22763:63;22819:5;22814:3;22810:15;22797:11;22763:63;;;22661:177;22914:5;22907;22903:17;22897:24;22933:63;22989:5;22984:3;22980:15;22967:11;22933:63;;;22848:160;23094:5;23087;23083:17;23077:24;23147:3;23141:4;23137:14;23129:5;23124:3;23120:15;23113:39;23167:66;23228:4;23215:11;23167:66;;;23159:74;;23018:227;23331:5;23324;23320:17;23314:24;23384:3;23378:4;23374:14;23366:5;23361:3;23357:15;23350:39;23404:66;23465:4;23452:11;23404:66;;;23396:74;21199:2309;-1:-1;;;;;21199:2309;25990:107;26061:30;26085:5;26061:30;;26104:110;26177:31;26202:5;26177:31;;26221:581;26431:3;26416:19;;26446:61;26420:9;26480:6;26446:61;;;26518:62;26576:2;26565:9;26561:18;26552:6;26518:62;;;26591;26649:2;26638:9;26634:18;26625:6;26591:62;;;26701:9;26695:4;26691:20;26686:2;26675:9;26671:18;26664:48;26726:66;26787:4;26778:6;26726:66;;;26718:74;26402:400;-1:-1;;;;;;26402:400;26809:294;26945:2;26930:18;;26959:61;26934:9;26993:6;26959:61;;;27031:62;27089:2;27078:9;27074:18;27065:6;27031:62;;27110:935;27472:2;27486:47;;;27457:18;;27547:136;27457:18;27669:6;27547:136;;;27539:144;;27731:9;27725:4;27721:20;27716:2;27705:9;27701:18;27694:48;27756:98;27849:4;27840:6;27756:98;;;27748:106;;27902:9;27896:4;27892:20;27887:2;27876:9;27872:18;27865:48;27927:108;28030:4;28021:6;27927:108;;28052:787;28364:2;28378:47;;;28349:18;;28439:136;28349:18;28561:6;28439:136;;;28431:144;;28586:62;28644:2;28633:9;28629:18;28620:6;28586:62;;;28696:9;28690:4;28686:20;28681:2;28670:9;28666:18;28659:48;28721:108;28824:4;28815:6;28721:108;;28846:189;28952:2;28937:18;;28966:59;28941:9;28998:6;28966:59;;29042:387;29223:2;29237:47;;;29208:18;;29298:121;29208:18;29298:121;;29436:387;29617:2;29631:47;;;29602:18;;29692:121;29602:18;29692:121;;29830:387;30011:2;30025:47;;;29996:18;;30086:121;29996:18;30086:121;;30224:387;30405:2;30419:47;;;30390:18;;30480:121;30390:18;30480:121;;30618:387;30799:2;30813:47;;;30784:18;;30874:121;30784:18;30874:121;;31012:387;31193:2;31207:47;;;31178:18;;31268:121;31178:18;31268:121;;31406:387;31587:2;31601:47;;;31572:18;;31662:121;31572:18;31662:121;;31800:387;31981:2;31995:47;;;31966:18;;32056:121;31966:18;32056:121;;32194:387;32375:2;32389:47;;;32360:18;;32450:121;32360:18;32450:121;;32588:387;32769:2;32783:47;;;32754:18;;32844:121;32754:18;32844:121;;32982:387;33163:2;33177:47;;;33148:18;;33238:121;33148:18;33238:121;;33376:387;33557:2;33571:47;;;33542:18;;33632:121;33542:18;33632:121;;33770:310;33936:3;33921:19;;33951:119;33925:9;34043:6;33951:119;;34087:333;34241:2;34255:47;;;34226:18;;34316:94;34226:18;34396:6;34316:94;;34427:603;34647:2;34661:47;;;34632:18;;34722:90;34632:18;34798:6;34722:90;;;34714:98;;34823:62;34881:2;34870:9;34866:18;34857:6;34823:62;;;34933:9;34927:4;34923:20;34918:2;34907:9;34903:18;34896:48;34958:62;35015:4;35006:6;34958:62;;35037:189;35143:2;35128:18;;35157:59;35132:9;35189:6;35157:59;;35233:193;35341:2;35326:18;;35355:61;35330:9;35389:6;35355:61;;35433:256;35495:2;35489:9;35521:17;;;35596:18;35581:34;;35617:22;;;35578:62;35575:2;;;35653:1;35650;35643:12;35575:2;35669;35662:22;35473:216;;-1:-1;35473:216;35696:263;;35860:18;35852:6;35849:30;35846:2;;;35892:1;35889;35882:12;35846:2;-1:-1;35921:4;35909:17;;;35939:15;;35783:176;36250:254;;36389:18;36381:6;36378:30;36375:2;;;36421:1;36418;36411:12;36375:2;-1:-1;36494:4;36465;36442:17;;;;36461:9;36438:33;36484:15;;36312:192;36778:126;36892:4;36880:17;;36861:43;37196:112;37291:12;;37275:33;38171:128;38251:42;38240:54;;38223:76;38306:151;38385:66;38374:78;;38357:100;38464:91;38543:6;38532:18;;38515:40;38562:79;38631:5;38614:27;39053:88;39131:4;39120:16;;39103:38;39149:145;39230:6;39225:3;39220;39207:30;-1:-1;39286:1;39268:16;;39261:27;39200:94;39303:268;39368:1;39375:101;39389:6;39386:1;39383:13;39375:101;;;39456:11;;;39450:18;39437:11;;;39430:39;39411:2;39404:10;39375:101;;;39491:6;39488:1;39485:13;39482:2;;;-1:-1;;39556:1;39538:16;;39531:27;39352:219;39579:97;39667:2;39647:14;39663:7;39643:28;;39627:49"
+ "object": "0x6080604052600436106100a35763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a0281146100ff578063169645f2146101355780631c5b1ec41461015557806320472cf714610175578063725cef0614610197578063b3cd4254146101aa578063bc063e1a146101bf578063c5e6e6ac146101d4578063e58e9c16146101f4578063f0b9e5ba14610214575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e71565b60405180910390fd5b005b34801561010b57600080fd5b5061011f61011a36600461248a565b610234565b60405161012c9190612e63565b60405180910390f35b610148610143366004612568565b610294565b60405161012c9190612f31565b34801561016157600080fd5b50610148610170366004612749565b610560565b34801561018157600080fd5b5061018a610626565b60405161012c9190612f82565b6101486101a536600461264e565b61062c565b3480156101b657600080fd5b5061018a6109fa565b3480156101cb57600080fd5b5061018a610a00565b3480156101e057600080fd5b506101486101ef366004612749565b610a06565b34801561020057600080fd5b5061014861020f366004612749565b610a79565b34801561022057600080fd5b5061011f61022f366004612503565b610b76565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b61029c6120ed565b34600080808084116102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6102e5848888610bd6565b92506102f18484610ca4565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b50505050506103ba8b60008151811015156103a457fe5b9060200190602002015161014001516010610ceb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508b600081518110151561047457fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff828116911614156104b8576104b18b8b84610d4c565b94506104c8565b6104c58b8b8b8b86610e66565b94505b6020850151841015610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b60208501518214610543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b61055281338760000151610fee565b505050509695505050505050565b6105686120ed565b60008060006105756120ed565b600093505b865184101561061c57610591868660000151610ca4565b92506105d487858151811015156105a457fe5b9060200190602002015160a0015188868151811015156105c057fe5b9060200190602002015160800151856111c8565b91506105f787858151811015156105e757fe5b90602001906020020151836111e5565b9050610603858261132e565b84518614156106115761061c565b60019093019261057a565b5050505092915050565b61251c81565b6106346120ed565b346000808211610670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b600086116106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6106d28a60008151811015156106bc57fe5b9060200190602002015161014001516000611390565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806107b45750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f11565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506108ff915050576108f88a8a8a8a8a6113fd565b9250610992565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156109925761098f8a8a8a8a611754565b92505b60208301518210156109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b6109ed6109e1838560200151610ca4565b84602001518787611a56565b5050979650505050505050565b61271081565b6103e881565b610a0e6120ed565b600080610a196120ed565b600092505b8551831015610a7057610a35858560200151610ca4565b9150610a4886848151811015156105e757fe5b9050610a54848261132e565b8484602001511415610a6557610a70565b600190920191610a1e565b50505092915050565b610a816120ed565b6000806000610a8e6120ed565b600093505b865184101561061c57610aaa868660000151610ca4565b9250610b118785815181101515610abd57fe5b9060200190602002015160a00151610b0b8987815181101515610adc57fe5b90602001906020020151608001518a88815181101515610af857fe5b9060200190602002015160e00151610ca4565b856111c8565b9150610b3e8785815181101515610b2457fe5b90602001906020020151610b39846001611b43565b6111e5565b9050610b5281600001518260600151610ca4565b8152610b5e858261132e565b84518611610b6b5761061c565b600190930192610a93565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000808361ffff16118015610c00575073ffffffffffffffffffffffffffffffffffffffff821615155b15610bcf576103e861ffff84161115610c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ed1565b610c5661ffff8416612710866111c8565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610c9c573d6000803e3d6000fd5b509392505050565b600082821115610ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b508082035b92915050565b600081601401835110151515610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f01565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b610d546120ed565b600080546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610daf90889087908990600401612e31565b608060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e01919081019061279a565b9150610e1582600001518360600151610ca4565b9050610e25826000015182611b8d565b1515610e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b81529392505050565b610e6e6120ed565b6000610e786120ed565b610e806120ed565b610e886120ed565b859350610e958a87610a06565b9250600083606001511115610f2957610eb388888560600151611baa565b9150610ecc86610ec7888560200151610ca4565b611b8d565b1515610f04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610f12848360200151610ca4565b606080840151908701526020808401519087015293505b6000546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610f83908d9088908e90600401612e31565b608060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd5919081019061279a565b9050610fe1858261132e565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff8616919061104c9086908690602401612ddd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156110f05781810151838201526020016110d8565b50505050905090810190601f16801561111d5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af19250505080151561116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b3d15611189575060003d602014156111895760206000803e506000515b8015156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b50505050565b60006111dd6111d78584611ee3565b84611f3e565b949350505050565b6111ed6120ed565b6111f5612116565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a819061124c908990600401612f3f565b606060405180830381600087803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061129e91908101906127b8565b805190935060ff166003146112b257610a70565b6112c48660a001518460400151610ca4565b91506112d08583611f55565b9050808460200181815250506112ef818760a0015188608001516111c8565b845260a086015160c08701516113069183916111c8565b604085015260a086015160e08701516113209183916111c8565b606085015250505092915050565b8151815161133c9190611b43565b8252602080830151908201516113529190611b43565b60208301526040808301519082015161136b9190611b43565b6040830152606080830151908201516113849190611b43565b60609092019190915250565b6000816004018351101515156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f21565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6114056120ed565b600061140f6120ed565b6114176120ed565b61141f6120ed565b6114318a60008151811015156103a457fe5b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b50505050508a60008151811015156114eb57fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff858116911614156115c9576115288a8a88611baa565b8051909350861115611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611570858461132e565b61158c61158586600001518760600151611b43565b8651611b8d565b15156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611745565b6115d38a87610560565b9150600082606001511115611608576115f188888460600151611baa565b602080820151908701526060808201519087015290505b6000546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611662908d908a908e90600401612e31565b608060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b4919081019061279a565b805190935086146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b6116fb858461132e565b61170d85602001518460200151611b8d565b1515611745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610fe184338560000151610fee565b61175c6120ed565b6000806060600061176b6120ed565b6117736120ed565b8a519450846040519080825280602002602001820160405280156117a1578160200160208202803883390190505b509350600092505b848310156118dd576117d6868c858151811015156117c357fe5b9060200190602002015160e00151611b43565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815293995083018282801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b50505050508b8481518110151561188f57fe5b6020908102909101015161016001528a518b90849081106118ac57fe5b9060200190602002015160a0015184848151811015156118c857fe5b602090810290910101526001909201916117a9565b6000861115611908576118f1898988611baa565b606080820151908901526020808201519089015291505b6000546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611962908e9088908f90600401612df8565b608060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b4919081019061279a565b90506119c0878261132e565b6119d287602001518260200151611b8d565b1515611a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b600092505b84831015611a4857611a3d8b84815181101515611a2857fe5b90602001906020020151610140015133611f6b565b600190920191611a0f565b505050505050949350505050565b6000806000861115611b3b576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611ab8908990600401612f90565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b50505050611af5858585610bd6565b9150611b018683610ca4565b90506000811115611b3b57604051339082156108fc029083906000818181858888f19350505050158015611b39573d6000803e3d6000fd5b505b505050505050565b600082820183811015611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b8091505b5092915050565b600080611b9f61251c612710866111c8565b909210159392505050565b611bb26120ed565b6000806000611bbf6120ed565b600093505b8751841015611ed8576003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c715780601f10611c4657610100808354040283529160200191611c71565b820191906000526020600020905b815481529060010190602001808311611c5457829003601f168201915b50505050508885815181101515611c8457fe5b602090810290910181015161014001919091526004805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015611d395780601f10611d0e57610100808354040283529160200191611d39565b820191906000526020600020905b815481529060010190602001808311611d1c57829003601f168201915b50505050508885815181101515611d4c57fe5b6020908102909101015161016001528451611d68908790610ca4565b9250611db68885815181101515611d7b57fe5b9060200190602002015160a00151610b0b8a87815181101515611d9a57fe5b90602001906020020151608001518b88815181101515610af857fe5b600054895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a9087908110611de757fe5b90602001906020020151611dfc856001611b43565b8a88815181101515611e0a57fe5b906020019060200201516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e4e93929190612f50565b608060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea0919081019061279a565b9050611eb481600001518260600151610ca4565b8152611ec0858261132e565b84518611611ecd57611ed8565b600190930192611bc4565b505050509392505050565b600080831515611ef65760009150611b86565b50828202828482811515611f0657fe5b0414611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b6000808284811515611f4c57fe5b04949350505050565b6000818310611f645781610bcf565b5090919050565b6000806060611f8185601063ffffffff610ceb16565b9250611f9485602463ffffffff61203b16565b9150611fa785606463ffffffff61204716565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde90612002903090889087908790600401612d99565b600060405180830381600087803b15801561201c57600080fd5b505af1158015612030573d6000803e3d6000fd5b505050505050505050565b6000610bcf83836120a2565b60606000612055848461203b565b905060208301925080830184511015151561209c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e91565b50500190565b6000816020018351101515156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612eb1565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610bcf8235613036565b6000601f8201831361215357600080fd5b813561216661216182612fc5565b612f9e565b81815260209384019390925082018360005b8381101561061c578135860161218e888261220d565b8452506020928301929190910190600101612178565b6000601f820183136121b557600080fd5b81356121c361216182612fc5565b81815260209384019390925082018360005b8381101561061c57813586016121eb888261231d565b84525060209283019291909101906001016121d5565b6000610bcf825161307b565b6000601f8201831361221e57600080fd5b813561222c61216182612fe6565b9150808252602083016020830185838301111561224857600080fd5b610a70838284613084565b60006080828403121561226557600080fd5b61226f6080612f9e565b9050600061227d8484612201565b825250602061228e84848301612201565b60208301525060406122a284828501612201565b60408301525060606122b684828501612201565b60608301525092915050565b6000606082840312156122d457600080fd5b6122de6060612f9e565b905060006122ec848461247e565b82525060206122fd84848301612201565b602083015250604061231184828501612201565b60408301525092915050565b6000610180828403121561233057600080fd5b61233b610180612f9e565b905060006123498484612136565b825250602061235a84848301612136565b602083015250604061236e84828501612136565b604083015250606061238284828501612136565b606083015250608061239684828501612472565b60808301525060a06123aa84828501612472565b60a08301525060c06123be84828501612472565b60c08301525060e06123d284828501612472565b60e0830152506101006123e784828501612472565b610100830152506101206123fd84828501612472565b6101208301525061014082013567ffffffffffffffff81111561241f57600080fd5b61242b8482850161220d565b6101408301525061016082013567ffffffffffffffff81111561244d57600080fd5b6124598482850161220d565b6101608301525092915050565b6000610bcf8235613074565b6000610bcf823561307b565b6000610bcf825161307e565b600080600080608085870312156124a057600080fd5b60006124ac8787612136565b94505060206124bd87828801612136565b93505060406124ce87828801612472565b925050606085013567ffffffffffffffff8111156124eb57600080fd5b6124f78782880161220d565b91505092959194509250565b60008060006060848603121561251857600080fd5b60006125248686612136565b935050602061253586828701612472565b925050604084013567ffffffffffffffff81111561255257600080fd5b61255e8682870161220d565b9150509250925092565b60008060008060008060c0878903121561258157600080fd5b863567ffffffffffffffff81111561259857600080fd5b6125a489828a016121a4565b965050602087013567ffffffffffffffff8111156125c157600080fd5b6125cd89828a01612142565b955050604087013567ffffffffffffffff8111156125ea57600080fd5b6125f689828a016121a4565b945050606087013567ffffffffffffffff81111561261357600080fd5b61261f89828a01612142565b935050608061263089828a01612466565b92505060a061264189828a01612136565b9150509295509295509295565b600080600080600080600060e0888a03121561266957600080fd5b873567ffffffffffffffff81111561268057600080fd5b61268c8a828b016121a4565b975050602088013567ffffffffffffffff8111156126a957600080fd5b6126b58a828b01612142565b965050604088013567ffffffffffffffff8111156126d257600080fd5b6126de8a828b016121a4565b955050606088013567ffffffffffffffff8111156126fb57600080fd5b6127078a828b01612142565b94505060806127188a828b01612472565b93505060a06127298a828b01612466565b92505060c061273a8a828b01612136565b91505092959891949750929550565b6000806040838503121561275c57600080fd5b823567ffffffffffffffff81111561277357600080fd5b61277f858286016121a4565b925050602061279085828601612472565b9150509250929050565b6000608082840312156127ac57600080fd5b60006111dd8484612253565b6000606082840312156127ca57600080fd5b60006111dd84846122c2565b6127df81613036565b82525050565b60006127f082613032565b808452602084019350836020820285016128098561302c565b60005b84811015612840578383038852612824838351612907565b925061282f8261302c565b60209890980197915060010161280c565b50909695505050505050565b600061285782613032565b808452602084019350836020820285016128708561302c565b60005b8481101561284057838303885261288b838351612c84565b92506128968261302c565b602098909801979150600101612873565b60006128b282613032565b8084526020840193506128c48361302c565b60005b828110156128f4576128da868351612d90565b6128e38261302c565b6020969096019591506001016128c7565b5093949350505050565b6127df8161304f565b600061291282613032565b808452612926816020860160208601613090565b61292f816130bc565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b80516080830190612c4b8482612d90565b506020820151612c5e6020850182612d90565b506040820151612c716040850182612d90565b5060608201516111c26060850182612d90565b8051600090610180840190612c9985826127d6565b506020830151612cac60208601826127d6565b506040830151612cbf60408601826127d6565b506060830151612cd260608601826127d6565b506080830151612ce56080860182612d90565b5060a0830151612cf860a0860182612d90565b5060c0830151612d0b60c0860182612d90565b5060e0830151612d1e60e0860182612d90565b50610100830151612d33610100860182612d90565b50610120830151612d48610120860182612d90565b50610140830151848203610140860152612d628282612907565b915050610160830151848203610160860152612d7e8282612907565b95945050505050565b6127df81613074565b6127df8161307b565b60808101612da782876127d6565b612db460208301866127d6565b612dc16040830185612d90565b8181036060830152612dd38184612907565b9695505050505050565b60408101612deb82856127d6565b610bcf6020830184612d90565b60608082528101612e09818661284c565b90508181036020830152612e1d81856128a7565b90508181036040830152612d7e81846127e5565b60608082528101612e42818661284c565b9050612e516020830185612d90565b8181036040830152612d7e81846127e5565b60208101610ce582846128fe565b60208082528101610ce58161293c565b60208082528101610ce581612992565b60208082528101610ce5816129c2565b60208082528101610ce581612a18565b60208082528101610ce581612a48565b60208082528101610ce581612a9e565b60208082528101610ce581612ace565b60208082528101610ce581612afe565b60208082528101610ce581612b2e565b60208082528101610ce581612b5e565b60208082528101610ce581612bb4565b60208082528101610ce581612be4565b60808101610ce58284612c3a565b60208082528101610bcf8184612c84565b60608082528101612f618186612c84565b9050612f706020830185612d90565b8181036040830152612d7e8184612907565b60208101610ce58284612d87565b60208101610ce58284612d90565b60405181810167ffffffffffffffff81118282101715612fbd57600080fd5b604052919050565b600067ffffffffffffffff821115612fdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612ffd57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b60ff1690565b82818337506000910152565b60005b838110156130ab578181015183820152602001613093565b838111156111c25750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820ff5c1e325698909ffd3590166bdff6a2f31ff4394822a4e1b9ea119a6a813e6c6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0xFF JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0xC5E6E6AC EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x1F4 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x214 JUMPI JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x248A JUMP JUMPDEST PUSH2 0x234 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2E63 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x148 PUSH2 0x143 CALLDATASIZE PUSH1 0x4 PUSH2 0x2568 JUMP JUMPDEST PUSH2 0x294 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0x560 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x626 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F82 JUMP JUMPDEST PUSH2 0x148 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x264E JUMP JUMPDEST PUSH2 0x62C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x9FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0xA00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x1EF CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x20F CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x2503 JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x29C PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x2DA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x2E5 DUP5 DUP9 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2F1 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x379 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x38D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x3BA DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0xCEB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x460 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x435 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x460 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x443 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x474 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4B8 JUMPI PUSH2 0x4B1 DUP12 DUP12 DUP5 PUSH2 0xD4C JUMP JUMPDEST SWAP5 POP PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0x4C5 DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0xE66 JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x506 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x543 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x552 DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x568 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x575 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0x591 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x5D4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5C0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0x5F7 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0x603 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x611 JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x57A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH2 0x634 PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x670 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x6AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x6D2 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6BC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x1390 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x7B4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x872 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x886 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x8FF SWAP2 POP POP JUMPI PUSH2 0x8F8 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x13FD JUMP JUMPDEST SWAP3 POP PUSH2 0x992 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x992 JUMPI PUSH2 0x98F DUP11 DUP11 DUP11 DUP11 PUSH2 0x1754 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH2 0x9ED PUSH2 0x9E1 DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1A56 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xA0E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA19 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0xA70 JUMPI PUSH2 0xA35 DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0xA48 DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xA54 DUP5 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0xA65 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xA1E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA81 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA8E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0xAAA DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0xB11 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0xB3E DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xB39 DUP5 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0xB52 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0xB5E DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xB6B JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xA93 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xC00 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBCF JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0xC56 PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC9C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xCE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xD2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xD54 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xDAF SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDDD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xE01 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP2 POP PUSH2 0xE15 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH2 0xE25 DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE6E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE78 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE80 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE88 PUSH2 0x20ED JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0xE95 DUP11 DUP8 PUSH2 0xA06 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0xF29 JUMPI PUSH2 0xEB3 DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST SWAP2 POP PUSH2 0xECC DUP7 PUSH2 0xEC7 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xF12 DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xF83 SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFD5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0xFE1 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x104C SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x2DDD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x10D8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x111D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x116C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1189 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1189 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x11C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DD PUSH2 0x11D7 DUP6 DUP5 PUSH2 0x1EE3 JUMP JUMPDEST DUP5 PUSH2 0x1F3E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x11ED PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x11F5 PUSH2 0x2116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x124C SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x127A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x129E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x27B8 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x12B2 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH2 0x12C4 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0x12D0 DUP6 DUP4 PUSH2 0x1F55 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x12EF DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x11C8 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x1306 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1320 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x133C SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1352 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x136B SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1384 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x1405 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1417 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x141F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1431 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14D7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x1528 DUP11 DUP11 DUP9 PUSH2 0x1BAA JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1570 DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x158C PUSH2 0x1585 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x15D3 DUP11 DUP8 PUSH2 0x560 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x1608 JUMPI PUSH2 0x15F1 DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1662 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x167C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1690 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x16F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x16FB DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x170D DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1745 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xFE1 DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST PUSH2 0x175C PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x176B PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x20ED JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x18DD JUMPI PUSH2 0x17D6 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x187C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1851 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x187C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x185F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x188F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x18AC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17A9 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1908 JUMPI PUSH2 0x18F1 DUP10 DUP10 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1962 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DF8 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1990 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x19B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x19C0 DUP8 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x19D2 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1A48 JUMPI PUSH2 0x1A3D DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A28 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x1F6B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1A0F JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1AB8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AE6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1AF5 DUP6 DUP6 DUP6 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B01 DUP7 DUP4 PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1B39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B9F PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1BB2 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1BBF PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x1ED8 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C71 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C71 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C54 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C84 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1D39 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D0E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D39 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D1C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D4C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x1D68 SWAP1 DUP8 SWAP1 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x1DB6 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x1DE7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DFC DUP6 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E0A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E4E SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F50 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E7C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1EA0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x1EB4 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1EC0 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x1ECD JUMPI PUSH2 0x1ED8 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1BC4 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1EF6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1B86 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1F06 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1F4C JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1F64 JUMPI DUP2 PUSH2 0xBCF JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x1F81 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xCEB AND JUMP JUMPDEST SWAP3 POP PUSH2 0x1F94 DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x203B AND JUMP JUMPDEST SWAP2 POP PUSH2 0x1FA7 DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x2047 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x2002 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D99 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2030 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP4 DUP4 PUSH2 0x20A2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x2055 DUP5 DUP5 PUSH2 0x203B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x209C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E91 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x20E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EB1 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3036 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2166 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST PUSH2 0x2F9E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x218E DUP9 DUP3 PUSH2 0x220D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2178 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x21B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21C3 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x21EB DUP9 DUP3 PUSH2 0x231D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x221E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x222C PUSH2 0x2161 DUP3 PUSH2 0x2FE6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA70 DUP4 DUP3 DUP5 PUSH2 0x3084 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x226F PUSH1 0x80 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x227D DUP5 DUP5 PUSH2 0x2201 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x228E DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x22A2 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x22B6 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22DE PUSH1 0x60 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22EC DUP5 DUP5 PUSH2 0x247E JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x22FD DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2311 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x233B PUSH2 0x180 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2349 DUP5 DUP5 PUSH2 0x2136 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x235A DUP5 DUP5 DUP4 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x236E DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2382 DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2396 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x23AA DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x23BE DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x23D2 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x23E7 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x23FD DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x241F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x242B DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2459 DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3074 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x24A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x24AC DUP8 DUP8 PUSH2 0x2136 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x24BD DUP8 DUP3 DUP9 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x24CE DUP8 DUP3 DUP9 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x24EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F7 DUP8 DUP3 DUP9 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2524 DUP7 DUP7 PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2535 DUP7 DUP3 DUP8 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x255E DUP7 DUP3 DUP8 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25A4 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25CD DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F6 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2613 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x261F DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2630 DUP10 DUP3 DUP11 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2641 DUP10 DUP3 DUP11 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2669 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268C DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26DE DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2707 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2718 DUP11 DUP3 DUP12 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2729 DUP11 DUP3 DUP12 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x273A DUP11 DUP3 DUP12 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x275C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x277F DUP6 DUP3 DUP7 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2790 DUP6 DUP3 DUP7 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x2253 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x22C2 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3036 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F0 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2809 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2824 DUP4 DUP4 MLOAD PUSH2 0x2907 JUMP JUMPDEST SWAP3 POP PUSH2 0x282F DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x280C JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2857 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2870 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x288B DUP4 DUP4 MLOAD PUSH2 0x2C84 JUMP JUMPDEST SWAP3 POP PUSH2 0x2896 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2873 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B2 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x28C4 DUP4 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x28F4 JUMPI PUSH2 0x28DA DUP7 DUP4 MLOAD PUSH2 0x2D90 JUMP JUMPDEST PUSH2 0x28E3 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x28C7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x304F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2912 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2926 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3090 JUMP JUMPDEST PUSH2 0x292F DUP2 PUSH2 0x30BC JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x2C4B DUP5 DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2C5E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2C71 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x11C2 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x2C99 DUP6 DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x2CAC PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2CBF PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2CD2 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x2CE5 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x2CF8 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x2D0B PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x2D1E PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x2D33 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x2D48 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x2D62 DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x2D7E DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3074 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x307B JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2DA7 DUP3 DUP8 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DB4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DC1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2DD3 DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2DEB DUP3 DUP6 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E09 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E1D DUP2 DUP6 PUSH2 0x28A7 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E42 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP PUSH2 0x2E51 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x28FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x293C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2992 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x29C2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A18 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A48 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B2E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B5E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BB4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BE4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2C3A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCF DUP2 DUP5 PUSH2 0x2C84 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2F61 DUP2 DUP7 PUSH2 0x2C84 JUMP JUMPDEST SWAP1 POP PUSH2 0x2F70 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x30AB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3093 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11C2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SELFDESTRUCT 0x5c 0x1e ORIGIN JUMP SWAP9 SWAP1 SWAP16 REVERT CALLDATALOAD SWAP1 AND PUSH12 0xDFF6A2F31FF4394822A4E1B9 0xea GT SWAP11 PUSH11 0x813E6C6C6578706572696D PUSH6 0x6E74616CF500 CALLDATACOPY ",
+ "sourceMap": "834:541:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1170:11:3;;;;1148:10;:34;1127:116;;;;;;;;;;;;;;;;;;;;;;834:541:0;1336:209:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1336:209:6;;;;;;;;;;;;;;;;;;;;;;;;;2954:2408:4;;;;;;;;;;;;;;;;;;1419:950:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1419:950:2;;;;;;;;;925:59:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;925:59:3;;;;;;;;;;;;6720:1894:4;;;;;;;;;;786:53:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;786:53:3;;;;875:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;875:37:3;;;;2778:732:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2778:732:2;;;;;;;;;3919:1414;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3919:1414:2;;;;;;;;;1147:183:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1147:183:6;;;;;;;;;1336:209;1079:60;;;;;;;;;;;;;;;;;;;;;1336:209;;;;;;:::o;2954:2408:4:-;3256:35;;:::i;:::-;3332:9;3307:22;;;3372:18;;;3351:88;;;;;;;;;;;;;;3535:100;3558:14;3586:13;3613:12;3535:9;:100::i;:::-;3512:123;;3670:37;3678:14;3694:12;3670:7;:37::i;:::-;3645:62;;3774:11;;;;;;;;;;;:19;;;3800:14;3774:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3774:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3774:43:4;;;;;4011:50;4032:6;4039:1;4032:9;;;;;;;;;;;;;;;;;;:24;;;4058:2;4011:20;:50::i;:::-;4098:15;4071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3983:78;;-1:-1:-1;4071:42:4;;4098:15;4071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;4078:1;4071:9;;;;;;;;;;;;;;;;;;;:24;;:42;4156:9;;;4127:39;;;4156:9;;4127:39;4123:614;;;4366:125;4411:6;4435:10;4463:14;4366:27;:125::i;:::-;4347:144;;4123:614;;;4541:185;4588:6;4612:10;4640:9;4667:13;4698:14;4541:29;:185::i;:::-;4522:204;;4123:614;4862:39;;;;4844:57;;;4823:121;;;;;;;;;;;;;;5044:39;;;;5026:57;;5005:126;;;;;;;;;;;;;;5186:136;5218:17;5249:10;5273:16;:39;;;5186:18;:136::i;:::-;2954:2408;;;;;;;;;;;;:::o;1419:950:2:-;1583:35;;:::i;:::-;1639:9;1692:37;1816;2035:35;;:::i;:::-;1651:1;1639:13;;1634:696;1658:6;:13;1654:1;:17;1634:696;;;1732:70;1740:20;1762:16;:39;;;1732:7;:70::i;:::-;1692:110;;1856:165;1890:6;1897:1;1890:9;;;;;;;;;;;;;;;;;;:26;;;1934:6;1941:1;1934:9;;;;;;;;;;;;;;;;;;:26;;;1978:29;1856:16;:165::i;:::-;1816:205;;2073:62;2094:6;2101:1;2094:9;;;;;;;;;;;;;;;;;;2105:29;2073:20;:62::i;:::-;2035:100;;2149:50;2164:16;2182;2149:14;:50::i;:::-;2217:39;;:63;;2213:107;;;2300:5;;2213:107;1673:3;;;;;1634:696;;;1419:950;;;;;;;;:::o;925:59:3:-;980:4;925:59;:::o;6720:1894:4:-;7061:35;;:::i;:::-;7137:9;7112:22;7177:18;;;7156:88;;;;;;;;;;;;;;7298:1;7275:24;;7254:94;;;;;;;;;;;;;;7379:48;7399:6;7406:1;7399:9;;;;;;;;;;;;;;;;;;:24;;;7425:1;7379:19;:48::i;:::-;1204:32;;;;;;;;;;;;;;;;7358:69;;-1:-1:-1;7458:28:4;;;;;;;;:61;;-1:-1:-1;1292:47:4;;;;;;;;;;;;;;;;;;;;;7490:29;;;;;;;7458:61;7437:131;;;;;;;;;;;;;;;;7579:11;;;;;;;;;;;:19;;;7605:14;7579:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7579:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;1204:32:4;;;;;;;;;;;;;;;;7636:28;;;;;;;7632:505;;-1:-1:-1;7632:505:4;;-1:-1:-1;;7632:505:4;7699:190;7745:6;7769:10;7797:9;7824:13;7855:20;7699:28;:190::i;:::-;7680:209;;7632:505;;;1292:47;;;;;;;;;;;;;;;;;;;;;7910:29;;;;;;;7906:231;;;7974:152;8020:6;8044:10;8072:9;8099:13;7974:28;:152::i;:::-;7955:171;;7906:231;8262:39;;;;8244:57;;;8223:121;;;;;;;;;;;;;;8354:220;8394:64;8402:14;8418:16;:39;;;8394:7;:64::i;:::-;8472:16;:39;;;8525:13;8552:12;8354:26;:220::i;:::-;6720:1894;;;;;;;;;;;:::o;786:53:3:-;834:5;786:53;:::o;875:37::-;908:4;875:37;:::o;2778:732:2:-;2943:35;;:::i;:::-;2999:9;3052:37;3176:35;;:::i;:::-;3011:1;2999:13;;2994:477;3018:6;:13;3014:1;:17;2994:477;;;3092:70;3100:20;3122:16;:39;;;3092:7;:70::i;:::-;3052:110;;3214:62;3235:6;3242:1;3235:9;;;;;;;;;3214:62;3176:100;;3290:50;3305:16;3323;3290:14;:50::i;:::-;3401:20;3358:16;:39;;;:63;3354:107;;;3441:5;;3354:107;3033:3;;;;;2994:477;;;2778:732;;;;;;;:::o;3919:1414::-;4079:35;;:::i;:::-;4135:9;4188:30;4479:31;4747:35;;:::i;:::-;4147:1;4135:13;;4130:1164;4154:6;:13;4150:1;:17;4130:1164;;;4221:63;4229:13;4244:16;:39;;;4221:7;:63::i;:::-;4188:96;;4513:220;4547:6;4554:1;4547:9;;;;;;;;;;;;;;;;;;:26;;;4591:55;4599:6;4606:1;4599:9;;;;;;;;;;;;;;;;;;:26;;;4627:6;4634:1;4627:9;;;;;;;;;;;;;;;;;;:18;;;4591:7;:55::i;:::-;4697:22;4513:16;:220::i;:::-;4479:254;;4785:68;4806:6;4813:1;4806:9;;;;;;;;;;;;;;;;;;4817:35;4825:23;4850:1;4817:7;:35::i;:::-;4785:20;:68::i;:::-;4747:106;;4910:79;4918:16;:39;;;4959:16;:29;;;4910:7;:79::i;:::-;4868:121;;5003:50;5018:16;4868;5003:14;:50::i;:::-;5188:39;;:56;-1:-1:-1;5184:100:2;;5264:5;;5184:100;4169:3;;;;;4130:1164;;1147:183:6;961:52;;;;;;;;;;;;;;;;;;;;;1147:183;;;;;;:::o;1644:695:3:-;1795:20;1851:1;1835:13;:17;;;:47;;;;-1:-1:-1;1856:26:3;;;;;1835:47;1831:473;;;908:4;1923:24;;;;;1898:107;;;;;;;;;;;;;;2111:133;;;;834:5;2216:14;2111:16;:133::i;:::-;2258:35;;2096:148;;-1:-1:-1;2258:21:3;;;;:35;;;;;2096:148;;2258:35;;;;2096:148;2258:21;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2258:35:3;1644:695;;;;;:::o;501:207:30:-;587:7;631:6;;;;610:69;;;;;;;;;;;;;;-1:-1:-1;696:5:30;;;501:207;;;;;:::o;10259:886:29:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:29;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;11418:994:4:-;11602:35;;:::i;:::-;12042:23;11759:8;;:107;;;;;:8;;;;;:25;;:107;;11798:6;;11818:14;;11846:10;;11759:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11759:107:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11759:107:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;11759:107:4;;;;;;;;;11740:126;;12068:79;12076:16;:39;;;12117:16;:29;;;12068:7;:79::i;:::-;12042:105;;12178:79;12200:16;:39;;;12241:15;12178:21;:79::i;:::-;12157:148;;;;;;;;;;;;;;;;12315:57;;;11418:994;-1:-1:-1;;;11418:994:4:o;9162:1906::-;9429:35;;:::i;:::-;9480:31;9538:46;;:::i;:::-;9808:35;;:::i;:::-;10741:41;;:::i;:::-;9514:14;9480:48;;9587:50;9614:6;9622:14;9587:26;:50::i;:::-;9538:99;;9694:1;9651:27;:40;;;:44;9647:998;;;9846:150;9884:9;9911:13;9942:27;:40;;;9846:20;:150::i;:::-;9808:188;;10134:161;10177:14;10213:64;10221:14;10237:16;:39;;;10213:7;:64::i;:::-;10134:21;:161::i;:::-;10109:242;;;;;;;;;;;;;;;;10391:73;10399:23;10424:16;:39;;;10391:7;:73::i;:::-;10510:29;;;;;10478;;;:61;10595:39;;;;;10553;;;:81;10365:99;-1:-1:-1;9647:998:4;10785:8;;:116;;;;;:8;;;;;:25;;:116;;10824:6;;10844:23;;10881:10;;10785:116;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10785:116:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10785:116:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;10785:116:4;;;;;;;;;10741:160;;10972:56;10987:16;11005:22;10972:14;:56::i;:::-;9162:1906;;;;;;;;;;;:::o;1551:1224:6:-;866:38;;;;;;;;;;;;;;;;1809:12;;1824:10;;;;866:38;1835:105;;1908:2;;1924:6;;1835:105;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1835:105:6;;;49:4:-1;25:18;;61:17;;1835:105:6;182:15:-1;1835:105:6;;;;179:29:-1;;;;160:49;;1824:117:6;;;1835:105;;1824:117;;;;25:18:-1;1824:117:6;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1824:117:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1951:69:6;;;;;;;;;;;;;;;;;2399:14;2396:2;;;-1:-1:-1;2443:1:6;2467:14;2483:2;2464:22;2461:2;;;2605;2602:1;2599;2584:24;-1:-1:-1;2646:1:6;2640:8;2461:2;2720:7;2699:69;;;;;;;;;;;;;;;;1551:1224;;;;:::o;937:326:24:-;1091:21;1144:82;1165:26;1173:9;1184:6;1165:7;:26::i;:::-;1205:11;1144:7;:82::i;:::-;1128:98;937:326;-1:-1:-1;;;;937:326:24:o;5694:1215:2:-;5852:30;;:::i;:::-;5898:35;;:::i;:::-;6093:33;5936:8;;:28;;;;;6093:33;;5936:8;;;:21;;:28;;5958:5;;5936:28;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5936:28:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5936:28:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5936:28:2;;;;;;;;;5978:21;;5898:66;;-1:-1:-1;5978:61:2;;6009:29;5978:61;5974:110;;6055:18;;5974:110;6129:70;6137:5;:22;;;6161:9;:37;;;6129:7;:70::i;:::-;6093:106;;6242:55;6249:20;6271:25;6242:6;:55::i;:::-;6209:88;;6345:22;6308:11;:34;;:59;;;;;6414:134;6444:22;6480:5;:22;;;6516:5;:22;;;6414:16;:134::i;:::-;6377:171;;6651:22;;;;6687:14;;;;6585:126;;6615:22;;6585:16;:126::i;:::-;6558:24;;;:153;6814:22;;;;6850:14;;;;6748:126;;6778:22;;6748:16;:126::i;:::-;6721:24;;;:153;5694:1215;;;;;;;:::o;1772:648:23:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:23:o;15559:559:29:-;15679:13;15741:5;15749:1;15741:9;15729:1;:8;:21;;15708:105;;;;;;;;;;;;;;;;-1:-1:-1;;15869:2:29;15862:10;15856:17;16012:66;16000:79;;15559:559::o;13021:3595:4:-;13293:50;;:::i;:::-;13454:25;14027:35;;:::i;:::-;14951:45;;:::i;:::-;15236:38;;:::i;:::-;13482:50;13503:6;13510:1;13503:9;;;;;;;;;13482:50;13774:15;13747:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13454:78;;-1:-1:-1;13747:42:4;;13774:15;13747:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;13754:1;13747:9;;;;;;;;;;;;;;;;;;;:24;;:42;14105:9;;;14076:39;;;14105:9;;14076:39;14072:2304;;;14150:124;14188:6;14212:10;14240:20;14150;:124::i;:::-;14398:39;;14131:143;;-1:-1:-1;14398:63:4;-1:-1:-1;14398:63:4;14373:144;;;;;;;;;;;;;;14531:50;14546:16;14564;14531:14;:50::i;:::-;14620:244;14663:79;14671:16;:39;;;14712:16;:29;;;14663:7;:79::i;:::-;14777:39;;14620:21;:244::i;:::-;14595:325;;;;;;;;;;;;;;;;14072:2304;;;14999:55;15025:6;15033:20;14999:25;:55::i;:::-;14951:103;;15114:1;15072:26;:39;;;:43;15068:573;;;15277:165;15319:9;15350:13;15385:26;:39;;;15277:20;:165::i;:::-;15502:42;;;;;15460:39;;;:84;15594:32;;;;;15562:29;;;:64;15236:206;-1:-1:-1;15068:573:4;15759:8;;:128;;;;;:8;;;;;:24;;:128;;15801:6;;15825:20;;15863:10;;15759:128;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15759:128:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15759:128:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15759:128:4;;;;;;;;;15926:39;;15740:147;;-1:-1:-1;15926:63:4;;15901:144;;;;;;;;;;;;;;16059:50;16074:16;16092;16059:14;:50::i;:::-;16148:161;16191:16;:39;;;16252:16;:39;;;16148:21;:161::i;:::-;16123:242;;;;;;;;;;;;;;;;16440:136;16472:17;16503:10;16527:16;:39;;;16440:18;:136::i;17161:2228::-;17395:50;;:::i;:::-;17461:25;17496:20;17542:38;17625:9;18304:38;;:::i;:::-;18668:35;;:::i;:::-;17519:6;:13;17496:36;;17597:12;17583:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;17583:27:4;;17542:68;;17637:1;17625:13;;17620:543;17644:12;17640:1;:16;17620:543;;;17730:46;17738:17;17757:6;17764:1;17757:9;;;;;;;;;;;;;;;;;;:18;;;17730:7;:46::i;:::-;18004:15;17977:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17710:66;;-1:-1:-1;17977:42:4;;18004:15;17977:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;17984:1;17977:9;;;;;;;;;;;;;;;;;;;:24;;:42;18126:9;;:6;;18133:1;;18126:9;;;;;;;;;;;;;;:26;;;18099:21;18121:1;18099:24;;;;;;;;;;;;;;;;;;:53;17658:3;;;;;17620:543;;;18196:1;18176:17;:21;18172:487;;;18345:127;18383:9;18410:13;18441:17;18345:20;:127::i;:::-;18518:32;;;;;18486:29;;;:64;18606:42;;;;;18564:39;;;:84;18304:168;-1:-1:-1;18172:487:4;18706:8;;:119;;;;;:8;;;;;:30;;:119;;18750:6;;18770:21;;18805:10;;18706:119;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18706:119:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18706:119:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18706:119:4;;;;;;;;;18668:157;;18835:50;18850:16;18868;18835:14;:50::i;:::-;18916:149;18955:16;:39;;;19012:16;:39;;;18916:21;:149::i;:::-;18895:218;;;;;;;;;;;;;;;;19196:1;19192:5;;19187:163;19203:12;19199:1;:16;19187:163;;;19236:103;19273:6;19280:1;19273:9;;;;;;;;;;;;;;;;;;:24;;;19315:10;19236:19;:103::i;:::-;19217:3;;;;;19187:163;;;17161:2228;;;;;;;;;;;;:::o;2960:777:3:-;3391:20;3544:24;3267:1;3247:17;:21;3243:488;;;3284:11;;:39;;;;;:11;;;;;:20;;:39;;3305:17;;3284:39;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3284:39:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3284:39:3;;;;3414:116;3441:14;3473:13;3504:12;3414:9;:116::i;:::-;3391:139;;3571:40;3579:17;3598:12;3571:7;:40::i;:::-;3544:67;;3648:1;3629:16;:20;3625:96;;;3669:37;;:10;;:37;;;;;3689:16;;3669:37;;;;3689:16;3669:10;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3669:37:3;3625:96;2960:777;;;;;;:::o;714:230:30:-;800:7;835:5;;;871:6;;;;850:69;;;;;;;;;;;;;;936:1;929:8;;714:230;;;;;;:::o;4350:384:3:-;4482:4;;4533:138;980:4;834:5;4642:19;4533:16;:138::i;:::-;4688:39;;;;;4350:384;-1:-1:-1;;;4350:384:3:o;1831:2046:5:-;2006:35;;:::i;:::-;2062:9;2386:29;2675:31;3095:35;;:::i;:::-;2074:1;2062:13;;2057:1781;2081:6;:13;2077:1;:17;2057:1781;;;2235:14;2208:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2235:14;2208:41;;2235:14;2208:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2215:1;2208:9;;;;;;;;;;;;;;;;;;;;:24;;:41;;;;2290:15;2263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2290:15;2263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2270:1;2263:9;;;;;;;;;;;;;;;;;;;:24;;:42;2440:39;;2418:62;;2426:12;;2418:7;:62::i;:::-;2386:94;;2709:219;2743:6;2750:1;2743:9;;;;;;;;;;;;;;;;;;:26;;;2787:55;2795:6;2802:1;2795:9;;;;;;;;;;;;;;;;;;:26;;;2823:6;2830:1;2823:9;;;;;;;;;2709:219;3133:8;;3169:9;;2675:253;;-1:-1:-1;3133:8:5;;;:18;;3169:6;;3176:1;;3169:9;;;;;;;;;;;;;;3196:35;3204:23;3229:1;3196:7;:35::i;:::-;3249:10;3260:1;3249:13;;;;;;;;;;;;;;;;;;3133:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3133:143:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3133:143:5;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3133:143:5;;;;;;;;;3095:181;;3421:79;3429:16;:39;;;3470:16;:29;;;3421:7;:79::i;:::-;3379:121;;3584:50;3599:16;3379;3584:14;:50::i;:::-;3733:39;;:55;-1:-1:-1;3729:99:5;;3808:5;;3729:99;2096:3;;;;;2057:1781;;;1831:2046;;;;;;;;;:::o;50:288:30:-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:30;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;344:151;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:30:o;1369:135::-;1454:7;1488:1;1484;:5;:13;;1496:1;1484:13;;;-1:-1:-1;1492:1:30;;1477:20;-1:-1:-1;1369:135:30:o;2781:467:6:-;2929:13;;3033:25;2945;:9;2967:2;2945:25;:21;:25;:::i;:::-;2929:41;-1:-1:-1;2998:25:6;:9;3020:2;2998:25;:21;:25;:::i;:::-;2980:43;-1:-1:-1;3061:34:6;:9;3091:3;3061:34;:29;:34;:::i;:::-;3105:136;;;;;3033:62;;-1:-1:-1;3105:36:6;;;;;;:136;;3163:4;;3182:2;;3198:7;;3033:62;;3105:136;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3105:136:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3105:136:6;;;;2781:467;;;;;:::o;14699:195:29:-;14820:14;14865:21;14877:1;14880:5;14865:11;:21::i;16441:672::-;16570:19;16644:25;16672:21;16684:1;16687:5;16672:11;:21::i;:::-;16644:49;;16712:2;16703:11;;;;16848:17;16840:5;:25;16828:1;:8;:37;;16807:132;;;;;;;;;;;;;;;;-1:-1:-1;;17061:13:29;;16441:672::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:29;13620:2;13718:13;13712:20;;13281:490::o;834:541:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;834:541:0;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1622:122;;1700:39;1731:6;1725:13;1700:39;;1752:432;;1842:4;1830:17;;1826:27;-1:-1;1816:2;;1867:1;1864;1857:12;1816:2;1904:6;1891:20;1926:60;1941:44;1978:6;1941:44;;1926:60;1917:69;;2006:6;1999:5;1992:21;2042:4;2034:6;2030:17;2075:4;2068:5;2064:16;2110:3;2101:6;2096:3;2092:16;2089:25;2086:2;;;2127:1;2124;2117:12;2086:2;2137:41;2171:6;2166:3;2161;2137:41;;2681:865;;2810:4;2798:9;2793:3;2789:19;2785:30;2782:2;;;2828:1;2825;2818:12;2782:2;2846:20;2861:4;2846:20;;;2837:29;-1:-1;2934:1;2965:60;3021:3;3001:9;2965:60;;;2941:85;;-1:-1;3105:2;3138:60;3194:3;3170:22;;;3138:60;;;3131:4;3124:5;3120:16;3113:86;3047:163;3268:2;3301:60;3357:3;3348:6;3337:9;3333:22;3301:60;;;3294:4;3287:5;3283:16;3276:86;3220:153;3431:2;3464:60;3520:3;3511:6;3500:9;3496:22;3464:60;;;3457:4;3450:5;3446:16;3439:86;3383:153;2776:770;;;;;3585:689;;3712:4;3700:9;3695:3;3691:19;3687:30;3684:2;;;3730:1;3727;3720:12;3684:2;3748:20;3763:4;3748:20;;;3739:29;-1:-1;3825:1;3856:58;3910:3;3890:9;3856:58;;;3832:83;;-1:-1;3981:2;4014:60;4070:3;4046:22;;;4014:60;;;4007:4;4000:5;3996:16;3989:86;3936:150;4159:2;4192:60;4248:3;4239:6;4228:9;4224:22;4192:60;;;4185:4;4178:5;4174:16;4167:86;4096:168;3678:596;;;;;4309:2205;;4417:5;4405:9;4400:3;4396:19;4392:31;4389:2;;;4436:1;4433;4426:12;4389:2;4454:21;4469:5;4454:21;;;4445:30;-1:-1;4533:1;4564:49;4609:3;4589:9;4564:49;;;4540:74;;-1:-1;4683:2;4716:49;4761:3;4737:22;;;4716:49;;;4709:4;4702:5;4698:16;4691:75;4635:142;4842:2;4875:49;4920:3;4911:6;4900:9;4896:22;4875:49;;;4868:4;4861:5;4857:16;4850:75;4787:149;4995:2;5028:49;5073:3;5064:6;5053:9;5049:22;5028:49;;;5021:4;5014:5;5010:16;5003:75;4946:143;5151:3;5185:49;5230:3;5221:6;5210:9;5206:22;5185:49;;;5178:4;5171:5;5167:16;5160:75;5099:147;5308:3;5342:49;5387:3;5378:6;5367:9;5363:22;5342:49;;;5335:4;5328:5;5324:16;5317:75;5256:147;5457:3;5491:49;5536:3;5527:6;5516:9;5512:22;5491:49;;;5484:4;5477:5;5473:16;5466:75;5413:139;5606:3;5640:49;5685:3;5676:6;5665:9;5661:22;5640:49;;;5633:4;5626:5;5622:16;5615:75;5562:139;5768:3;5803:49;5848:3;5839:6;5828:9;5824:22;5803:49;;;5795:5;5788;5784:17;5777:76;5711:153;5914:3;5949:49;5994:3;5985:6;5974:9;5970:22;5949:49;;;5941:5;5934;5930:17;5923:76;5874:136;6098:3;6087:9;6083:19;6070:33;6123:18;6115:6;6112:30;6109:2;;;6155:1;6152;6145:12;6109:2;6191:54;6241:3;6232:6;6221:9;6217:22;6191:54;;;6183:5;6176;6172:17;6165:81;6020:237;6345:3;6334:9;6330:19;6317:33;6370:18;6362:6;6359:30;6356:2;;;6402:1;6399;6392:12;6356:2;6438:54;6488:3;6479:6;6468:9;6464:22;6438:54;;;6430:5;6423;6419:17;6412:81;6267:237;4383:2131;;;;;6521:116;;6587:45;6624:6;6611:20;6587:45;;6644:118;;6711:46;6749:6;6736:20;6711:46;;6898:118;;6974:37;7003:6;6997:13;6974:37;;7023:721;;;;;7187:3;7175:9;7166:7;7162:23;7158:33;7155:2;;;7204:1;7201;7194:12;7155:2;7239:1;7256:53;7301:7;7281:9;7256:53;;;7246:63;;7218:97;7346:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;;;7354:63;;7325:98;7454:2;7472:53;7517:7;7508:6;7497:9;7493:22;7472:53;;;7462:63;;7433:98;7590:2;7579:9;7575:18;7562:32;7614:18;7606:6;7603:30;7600:2;;;7646:1;7643;7636:12;7600:2;7666:62;7720:7;7711:6;7700:9;7696:22;7666:62;;;7656:72;;7541:193;7149:595;;;;;;;;7751;;;;7898:2;7886:9;7877:7;7873:23;7869:32;7866:2;;;7914:1;7911;7904:12;7866:2;7949:1;7966:53;8011:7;7991:9;7966:53;;;7956:63;;7928:97;8056:2;8074:53;8119:7;8110:6;8099:9;8095:22;8074:53;;;8064:63;;8035:98;8192:2;8181:9;8177:18;8164:32;8216:18;8208:6;8205:30;8202:2;;;8248:1;8245;8238:12;8202:2;8268:62;8322:7;8313:6;8302:9;8298:22;8268:62;;;8258:72;;8143:193;7860:486;;;;;;8353:1507;;;;;;;8689:3;8677:9;8668:7;8664:23;8660:33;8657:2;;;8706:1;8703;8696:12;8657:2;8741:31;;8792:18;8781:30;;8778:2;;;8824:1;8821;8814:12;8778:2;8844:97;8933:7;8924:6;8913:9;8909:22;8844:97;;;8834:107;;8720:227;9006:2;8995:9;8991:18;8978:32;9030:18;9022:6;9019:30;9016:2;;;9062:1;9059;9052:12;9016:2;9082:83;9157:7;9148:6;9137:9;9133:22;9082:83;;;9072:93;;8957:214;9230:2;9219:9;9215:18;9202:32;9254:18;9246:6;9243:30;9240:2;;;9286:1;9283;9276:12;9240:2;9306:97;9395:7;9386:6;9375:9;9371:22;9306:97;;;9296:107;;9181:228;9468:2;9457:9;9453:18;9440:32;9492:18;9484:6;9481:30;9478:2;;;9524:1;9521;9514:12;9478:2;9544:83;9619:7;9610:6;9599:9;9595:22;9544:83;;;9534:93;;9419:214;9664:3;9683:52;9727:7;9718:6;9707:9;9703:22;9683:52;;;9673:62;;9643:98;9772:3;9791:53;9836:7;9827:6;9816:9;9812:22;9791:53;;;9781:63;;9751:99;8651:1209;;;;;;;;;9867:1633;;;;;;;;10220:3;10208:9;10199:7;10195:23;10191:33;10188:2;;;10237:1;10234;10227:12;10188:2;10272:31;;10323:18;10312:30;;10309:2;;;10355:1;10352;10345:12;10309:2;10375:97;10464:7;10455:6;10444:9;10440:22;10375:97;;;10365:107;;10251:227;10537:2;10526:9;10522:18;10509:32;10561:18;10553:6;10550:30;10547:2;;;10593:1;10590;10583:12;10547:2;10613:83;10688:7;10679:6;10668:9;10664:22;10613:83;;;10603:93;;10488:214;10761:2;10750:9;10746:18;10733:32;10785:18;10777:6;10774:30;10771:2;;;10817:1;10814;10807:12;10771:2;10837:97;10926:7;10917:6;10906:9;10902:22;10837:97;;;10827:107;;10712:228;10999:2;10988:9;10984:18;10971:32;11023:18;11015:6;11012:30;11009:2;;;11055:1;11052;11045:12;11009:2;11075:83;11150:7;11141:6;11130:9;11126:22;11075:83;;;11065:93;;10950:214;11195:3;11214:53;11259:7;11250:6;11239:9;11235:22;11214:53;;;11204:63;;11174:99;11304:3;11323:52;11367:7;11358:6;11347:9;11343:22;11323:52;;;11313:62;;11283:98;11412:3;11431:53;11476:7;11467:6;11456:9;11452:22;11431:53;;;11421:63;;11391:99;10182:1318;;;;;;;;;;;11507:540;;;11672:2;11660:9;11651:7;11647:23;11643:32;11640:2;;;11688:1;11685;11678:12;11640:2;11723:31;;11774:18;11763:30;;11760:2;;;11806:1;11803;11796:12;11760:2;11826:97;11915:7;11906:6;11895:9;11891:22;11826:97;;;11816:107;;11702:227;11960:2;11978:53;12023:7;12014:6;12003:9;11999:22;11978:53;;;11968:63;;11939:98;11634:413;;;;;;12054:322;;12198:3;12186:9;12177:7;12173:23;12169:33;12166:2;;;12215:1;12212;12205:12;12166:2;12250:1;12267:93;12352:7;12332:9;12267:93;;12383:317;;12525:2;12513:9;12504:7;12500:23;12496:32;12493:2;;;12541:1;12538;12531:12;12493:2;12576:1;12593:91;12676:7;12656:9;12593:91;;12707:110;12780:31;12805:5;12780:31;;;12775:3;12768:44;12762:55;;;12851:766;;12996:59;13049:5;12996:59;;;13073:6;13068:3;13061:19;13097:4;13092:3;13088:14;13081:21;;13145:3;13187:4;13179:6;13175:17;13170:3;13166:27;13213:61;13268:5;13213:61;;;13295:1;13280:298;13305:6;13302:1;13299:13;13280:298;;;13367:9;13361:4;13357:20;13352:3;13345:33;13393:68;13456:4;13447:6;13441:13;13393:68;;;13385:76;;13478:65;13536:6;13478:65;;;13566:4;13557:14;;;;;13468:75;-1:-1;13327:1;13320:9;13280:298;;;-1:-1;13591:4;;12975:642;-1:-1;;;;;;12975:642;13684:864;;13857:73;13924:5;13857:73;;;13948:6;13943:3;13936:19;13972:4;13967:3;13963:14;13956:21;;14020:3;14062:4;14054:6;14050:17;14045:3;14041:27;14088:75;14157:5;14088:75;;;14184:1;14169:340;14194:6;14191:1;14188:13;14169:340;;;14256:9;14250:4;14246:20;14241:3;14234:33;14282:96;14373:4;14364:6;14358:13;14282:96;;;14274:104;;14395:79;14467:6;14395:79;;;14497:4;14488:14;;;;;14385:89;-1:-1;14216:1;14209:9;14169:340;;14587:590;;14722:54;14770:5;14722:54;;;14794:6;14789:3;14782:19;14818:4;14813:3;14809:14;14802:21;;14863:56;14913:5;14863:56;;;14940:1;14925:230;14950:6;14947:1;14944:13;14925:230;;;14990:53;15039:3;15030:6;15024:13;14990:53;;;15060:60;15113:6;15060:60;;;15143:4;15134:14;;;;;15050:70;-1:-1;14972:1;14965:9;14925:230;;;-1:-1;15168:3;;14701:476;-1:-1;;;;14701:476;15185:107;15256:30;15280:5;15256:30;;15299:297;;15399:38;15431:5;15399:38;;;15454:6;15449:3;15442:19;15466:63;15522:6;15515:4;15510:3;15506:14;15499:4;15492:5;15488:16;15466:63;;;15561:29;15583:6;15561:29;;;15541:50;;;15554:4;15541:50;;15379:217;-1:-1;;;15379:217;15900:397;16055:2;16043:15;;16092:66;16087:2;16078:12;;16071:88;16193:66;16188:2;16179:12;;16172:88;16288:2;16279:12;;16036:261;16306:296;16461:2;16449:15;;16498:66;16493:2;16484:12;;16477:88;16593:2;16584:12;;16442:160;16611:397;16766:2;16754:15;;16803:66;16798:2;16789:12;;16782:88;16904:66;16899:2;16890:12;;16883:88;16999:2;16990:12;;16747:261;17017:296;17172:2;17160:15;;17209:66;17204:2;17195:12;;17188:88;17304:2;17295:12;;17153:160;17322:397;17477:2;17465:15;;17514:66;17509:2;17500:12;;17493:88;17615:66;17610:2;17601:12;;17594:88;17710:2;17701:12;;17458:261;17728:296;17883:2;17871:15;;17920:66;17915:2;17906:12;;17899:88;18015:2;18006:12;;17864:160;18033:296;18188:2;18176:15;;18225:66;18220:2;18211:12;;18204:88;18320:2;18311:12;;18169:160;18338:296;18493:2;18481:15;;18530:66;18525:2;18516:12;;18509:88;18625:2;18616:12;;18474:160;18643:296;18798:2;18786:15;;18835:66;18830:2;18821:12;;18814:88;18930:2;18921:12;;18779:160;18948:397;19103:2;19091:15;;19140:66;19135:2;19126:12;;19119:88;19241:66;19236:2;19227:12;;19220:88;19336:2;19327:12;;19084:261;19354:296;19509:2;19497:15;;19546:66;19541:2;19532:12;;19525:88;19641:2;19632:12;;19490:160;19659:397;19814:2;19802:15;;19851:66;19846:2;19837:12;;19830:88;19952:66;19947:2;19938:12;;19931:88;20047:2;20038:12;;19795:261;20141:888;20369:22;;20282:4;20273:14;;;20403:61;20277:3;20369:22;20403:61;;;20302:174;20570:4;20563:5;20559:16;20553:23;20588:62;20644:4;20639:3;20635:14;20622:11;20588:62;;;20486:176;20746:4;20739:5;20735:16;20729:23;20764:62;20820:4;20815:3;20811:14;20798:11;20764:62;;;20672:166;20922:4;20915:5;20911:16;20905:23;20940:62;20996:4;20991:3;20987:14;20974:11;20940:62;;21089:2419;21304:22;;21089:2419;;21226:5;21217:15;;;21338:61;21221:3;21304:22;21338:61;;;21247:164;21495:4;21488:5;21484:16;21478:23;21513:62;21569:4;21564:3;21560:14;21547:11;21513:62;;;21421:166;21678:4;21671:5;21667:16;21661:23;21696:62;21752:4;21747:3;21743:14;21730:11;21696:62;;;21597:173;21855:4;21848:5;21844:16;21838:23;21873:62;21929:4;21924:3;21920:14;21907:11;21873:62;;;21780:167;22035:4;22028:5;22024:16;22018:23;22053:62;22109:4;22104:3;22100:14;22087:11;22053:62;;;21957:170;22215:4;22208:5;22204:16;22198:23;22233:62;22289:4;22284:3;22280:14;22267:11;22233:62;;;22137:170;22387:4;22380:5;22376:16;22370:23;22405:62;22461:4;22456:3;22452:14;22439:11;22405:62;;;22317:162;22559:4;22552:5;22548:16;22542:23;22577:62;22633:4;22628:3;22624:14;22611:11;22577:62;;;22489:162;22744:5;22737;22733:17;22727:24;22763:63;22819:5;22814:3;22810:15;22797:11;22763:63;;;22661:177;22914:5;22907;22903:17;22897:24;22933:63;22989:5;22984:3;22980:15;22967:11;22933:63;;;22848:160;23094:5;23087;23083:17;23077:24;23147:3;23141:4;23137:14;23129:5;23124:3;23120:15;23113:39;23167:66;23228:4;23215:11;23167:66;;;23159:74;;23018:227;23331:5;23324;23320:17;23314:24;23384:3;23378:4;23374:14;23366:5;23361:3;23357:15;23350:39;23404:66;23465:4;23452:11;23404:66;;;23396:74;21199:2309;-1:-1;;;;;21199:2309;25990:107;26061:30;26085:5;26061:30;;26104:110;26177:31;26202:5;26177:31;;26221:581;26431:3;26416:19;;26446:61;26420:9;26480:6;26446:61;;;26518:62;26576:2;26565:9;26561:18;26552:6;26518:62;;;26591;26649:2;26638:9;26634:18;26625:6;26591:62;;;26701:9;26695:4;26691:20;26686:2;26675:9;26671:18;26664:48;26726:66;26787:4;26778:6;26726:66;;;26718:74;26402:400;-1:-1;;;;;;26402:400;26809:294;26945:2;26930:18;;26959:61;26934:9;26993:6;26959:61;;;27031:62;27089:2;27078:9;27074:18;27065:6;27031:62;;27110:935;27472:2;27486:47;;;27457:18;;27547:136;27457:18;27669:6;27547:136;;;27539:144;;27731:9;27725:4;27721:20;27716:2;27705:9;27701:18;27694:48;27756:98;27849:4;27840:6;27756:98;;;27748:106;;27902:9;27896:4;27892:20;27887:2;27876:9;27872:18;27865:48;27927:108;28030:4;28021:6;27927:108;;28052:787;28364:2;28378:47;;;28349:18;;28439:136;28349:18;28561:6;28439:136;;;28431:144;;28586:62;28644:2;28633:9;28629:18;28620:6;28586:62;;;28696:9;28690:4;28686:20;28681:2;28670:9;28666:18;28659:48;28721:108;28824:4;28815:6;28721:108;;28846:189;28952:2;28937:18;;28966:59;28941:9;28998:6;28966:59;;29042:387;29223:2;29237:47;;;29208:18;;29298:121;29208:18;29298:121;;29436:387;29617:2;29631:47;;;29602:18;;29692:121;29602:18;29692:121;;29830:387;30011:2;30025:47;;;29996:18;;30086:121;29996:18;30086:121;;30224:387;30405:2;30419:47;;;30390:18;;30480:121;30390:18;30480:121;;30618:387;30799:2;30813:47;;;30784:18;;30874:121;30784:18;30874:121;;31012:387;31193:2;31207:47;;;31178:18;;31268:121;31178:18;31268:121;;31406:387;31587:2;31601:47;;;31572:18;;31662:121;31572:18;31662:121;;31800:387;31981:2;31995:47;;;31966:18;;32056:121;31966:18;32056:121;;32194:387;32375:2;32389:47;;;32360:18;;32450:121;32360:18;32450:121;;32588:387;32769:2;32783:47;;;32754:18;;32844:121;32754:18;32844:121;;32982:387;33163:2;33177:47;;;33148:18;;33238:121;33148:18;33238:121;;33376:387;33557:2;33571:47;;;33542:18;;33632:121;33542:18;33632:121;;33770:310;33936:3;33921:19;;33951:119;33925:9;34043:6;33951:119;;34087:333;34241:2;34255:47;;;34226:18;;34316:94;34226:18;34396:6;34316:94;;34427:603;34647:2;34661:47;;;34632:18;;34722:90;34632:18;34798:6;34722:90;;;34714:98;;34823:62;34881:2;34870:9;34866:18;34857:6;34823:62;;;34933:9;34927:4;34923:20;34918:2;34907:9;34903:18;34896:48;34958:62;35015:4;35006:6;34958:62;;35037:189;35143:2;35128:18;;35157:59;35132:9;35189:6;35157:59;;35233:193;35341:2;35326:18;;35355:61;35330:9;35389:6;35355:61;;35433:256;35495:2;35489:9;35521:17;;;35596:18;35581:34;;35617:22;;;35578:62;35575:2;;;35653:1;35650;35643:12;35575:2;35669;35662:22;35473:216;;-1:-1;35473:216;35696:263;;35860:18;35852:6;35849:30;35846:2;;;35892:1;35889;35882:12;35846:2;-1:-1;35921:4;35909:17;;;35939:15;;35783:176;36250:254;;36389:18;36381:6;36378:30;36375:2;;;36421:1;36418;36411:12;36375:2;-1:-1;36494:4;36465;36442:17;;;;36461:9;36438:33;36484:15;;36312:192;36778:126;36892:4;36880:17;;36861:43;37196:112;37291:12;;37275:33;38171:128;38251:42;38240:54;;38223:76;38306:151;38385:66;38374:78;;38357:100;38464:91;38543:6;38532:18;;38515:40;38562:79;38631:5;38614:27;39053:88;39131:4;39120:16;;39103:38;39149:145;39230:6;39225:3;39220;39207:30;-1:-1;39286:1;39268:16;;39261:27;39200:94;39303:268;39368:1;39375:101;39389:6;39386:1;39383:13;39375:101;;;39456:11;;;39450:18;39437:11;;;39430:39;39411:2;39404:10;39375:101;;;39491:6;39488:1;39485:13;39482:2;;;-1:-1;;39556:1;39538:16;;39531:27;39352:219;39579:97;39667:2;39647:14;39663:7;39643:28;;39627:49"
}
}
},
@@ -838,7 +838,7 @@
}
},
"sourceCodes": {
- "2.0.0/forwarder/Forwarder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./MixinFees.sol\";\nimport \"./MixinForwarderCore.sol\";\nimport \"./MixinConstants.sol\";\nimport \"./MixinMarketBuyZrx.sol\";\nimport \"./MixinExpectedResults.sol\";\nimport \"./MixinTransfer.sol\";\n\n\ncontract Forwarder is\n MixinConstants,\n MixinExpectedResults,\n MixinFees,\n MixinMarketBuyZrx,\n MixinTransfer,\n MixinForwarderCore\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes4 _erc20AssetProxyId,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n MixinConstants(\n _exchange,\n _etherToken,\n _zrxToken,\n _zrxAssetData,\n _wethAssetData\n )\n MixinForwarderCore()\n {}\n}\n",
+ "2.0.0/forwarder/Forwarder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./MixinFees.sol\";\nimport \"./MixinForwarderCore.sol\";\nimport \"./MixinConstants.sol\";\nimport \"./MixinMarketBuyZrx.sol\";\nimport \"./MixinExpectedResults.sol\";\nimport \"./MixinTransfer.sol\";\n\n\ncontract Forwarder is\n MixinConstants,\n MixinExpectedResults,\n MixinFees,\n MixinMarketBuyZrx,\n MixinTransfer,\n MixinForwarderCore\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n MixinConstants(\n _exchange,\n _etherToken,\n _zrxToken,\n _zrxAssetData,\n _wethAssetData\n )\n MixinForwarderCore()\n {}\n}\n",
"2.0.0/forwarder/MixinConstants.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"./mixins/MConstants.sol\";\n\n\ncontract MixinConstants is\n MConstants\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n {\n EXCHANGE = IExchange(_exchange);\n ETHER_TOKEN = IEtherToken(_etherToken);\n ZRX_TOKEN = IERC20Token(_zrxToken);\n ZRX_ASSET_DATA = _zrxAssetData;\n WETH_ASSET_DATA = _wethAssetData;\n }\n}\n",
"2.0.0/forwarder/MixinExpectedResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MExpectedResults.sol\";\n\n\ncontract MixinExpectedResults is\n LibMath,\n LibFillResults,\n MConstants,\n MExpectedResults\n{\n\n /// @dev Calculates a total FillResults for buying makerAssetFillAmount over all orders.\n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param makerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketBuyResults(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n FillResults memory singleFillResult = calculateFillResults(orders[i], remainingTakerAssetFillAmount);\n addFillResults(totalFillResults, singleFillResult);\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Calculates a FillResults total for selling takerAssetFillAmount over all orders. \n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketSellResults(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n FillResults memory singleFillResult = calculateFillResults(orders[i], remainingTakerAssetFillAmount);\n addFillResults(totalFillResults, singleFillResult);\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Calculates fill results for buyFeeTokens. This handles fees on buying ZRX\n /// so the end result is the expected amount of ZRX (not less after fees).\n /// @param orders An array of Order struct containing order specifications.\n /// @param zrxFillAmount A number representing the amount zrx to buy\n /// @return totalFillResults Expected fill result amounts from buying fees\n function calculateMarketBuyZrxResults(\n LibOrder.Order[] memory orders,\n uint256 zrxFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingZrxFillAmount = safeSub(zrxFillAmount, totalFillResults.makerAssetFilledAmount);\n // Convert the remaining amount of makerToken to buy into remaining amount\n // of takerToken to sell, assuming entire amount can be sold in the current order\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxFillAmount\n );\n FillResults memory singleFillResult = calculateFillResults(orders[i], safeAdd(remainingWethSellAmount, 1));\n\n singleFillResult.makerAssetFilledAmount = safeSub(singleFillResult.makerAssetFilledAmount, singleFillResult.takerFeePaid);\n addFillResults(totalFillResults, singleFillResult);\n // As we compensate for the rounding issue above have slightly more ZRX than the requested zrxFillAmount\n if (totalFillResults.makerAssetFilledAmount >= zrxFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Simulates the 0x Exchange fillOrder validation and calculations, without performing any state changes.\n /// @param order An Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount\n )\n internal\n view\n returns (FillResults memory fillResults)\n {\n LibOrder.OrderInfo memory orderInfo = EXCHANGE.getOrderInfo(order);\n if (orderInfo.orderStatus != uint8(LibOrder.OrderStatus.FILLABLE)) {\n return fillResults;\n }\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n return fillResults;\n }\n}\n",
"2.0.0/forwarder/MixinFees.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MFees.sol\";\n\n\ncontract MixinFees is\n LibMath,\n MConstants,\n MFees\n{\n\n uint16 constant public PERCENTAGE_DENOMINATOR = 10000; // 9800 == 98%, 10000 == 100%\n uint16 constant public MAX_FEE = 1000; // 10%\n uint16 constant public ALLOWABLE_EXCHANGE_PERCENTAGE = 9500; // 95%\n\n /// @dev Default payabale function, this allows us to withdraw WETH\n function ()\n public\n payable\n {\n require(\n msg.sender == address(ETHER_TOKEN),\n \"DEFAULT_FUNCTION_WETH_CONTRACT_ONLY\"\n );\n }\n\n /// @dev Pays the feeRecipient feeProportion of the total takerEthAmount, denominated in ETH\n /// @param takerEthAmount The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n /// @return ethFeeAmount Amount of ETH paid to feeRecipient as fee.\n function payEthFee(\n uint256 takerEthAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n returns (uint256 ethFeeAmount)\n {\n if (feeProportion > 0 && feeRecipient != address(0)) {\n require(\n feeProportion <= MAX_FEE,\n \"FEE_PROPORTION_TOO_LARGE\"\n );\n // 1.5% is 150, allowing for 2 decimal precision, i.e 0.05% is 5\n ethFeeAmount = getPartialAmount(\n feeProportion,\n PERCENTAGE_DENOMINATOR,\n takerEthAmount\n );\n feeRecipient.transfer(ethFeeAmount);\n }\n return ethFeeAmount;\n }\n\n /// @dev Withdraws the remaining WETH, deduct and pay fees from this amount based on the takerTokenAmount to the feeRecipient.\n /// If a user overpaid ETH initially, the fees are calculated from the amount traded and deducted from withdrawAmount.\n /// Any remaining ETH is sent back to the user.\n /// @param ethWithdrawAmount The amount to withdraw from the WETH contract.\n /// @param wethAmountSold The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n function withdrawPayAndDeductEthFee(\n uint256 ethWithdrawAmount,\n uint256 wethAmountSold,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n {\n // Return all of the excess WETH if any after deducting fees on the amount\n if (ethWithdrawAmount > 0) {\n ETHER_TOKEN.withdraw(ethWithdrawAmount);\n // Fees proportional to the amount traded\n uint256 ethFeeAmount = payEthFee(\n wethAmountSold,\n feeProportion,\n feeRecipient\n );\n uint256 unspentEthAmount = safeSub(ethWithdrawAmount, ethFeeAmount);\n if (unspentEthAmount > 0) {\n msg.sender.transfer(unspentEthAmount);\n }\n }\n }\n\n /// @dev Checks whether the amount of tokens sold against the amount of tokens requested\n /// is within a certain threshold. This ensures the caller gets a fair deal when\n /// performing any token fee abstraction. Threshold is 95%. If fee abstraction costs more than\n /// 5% of the total transaction, we return false.\n /// @param requestedSellAmount The amount the user requested, or sent in to a payable function\n /// @param tokenAmountSold The amount of the token that was sold after fee abstraction\n /// @return bool of whether this is within an acceptable threshold\n function isAcceptableThreshold(uint256 requestedSellAmount, uint256 tokenAmountSold)\n internal\n pure\n returns (bool)\n {\n uint256 acceptableSellAmount = getPartialAmount(\n ALLOWABLE_EXCHANGE_PERCENTAGE,\n PERCENTAGE_DENOMINATOR,\n requestedSellAmount\n );\n return tokenAmountSold >= acceptableSellAmount;\n }\n}\n",
@@ -859,7 +859,7 @@
"2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
"2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
"2.0.0/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
- "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n\n /// @dev Fetches information for all passed in orders\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory);\n}\n",
"2.0.0/protocol/Exchange/libs/LibEIP712.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 public constant EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encode(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n address(this)\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, hashStruct));\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibFillResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibMath.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target)\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target)\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\n }\n}\n",
@@ -870,7 +870,7 @@
"2.0.0/utils/LibBytes/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
"2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_OVERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
},
- "sourceTreeHashHex": "0x0f198ef84d525cd3b047237f12a39fb891a6b342bcf0bb35fc92b0b91c50a880",
+ "sourceTreeHashHex": "0xe5560a5c22d8ed65136ac6d596bd8540f0c92f2a0b1e192720af2ab8dd3fca8b",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
@@ -896,7 +896,7 @@
"50": {
"address": "0xb69e673309512a9d726f87304c6984054f87a93b",
"links": {},
- "constructorArgs": "[\"0x48bacb9266a570d521063ef5dd96e61686dbe788\",\"0x0b1ba0af832d7c05fd64161e0db78e85978e8082\",\"0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b0\",\"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082\"]"
+ "constructorArgs": "[\"0x48bacb9266a570d521063ef5dd96e61686dbe788\",\"0x0b1ba0af832d7c05fd64161e0db78e85978e8082\",\"0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082\"]"
}
}
-}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json b/packages/migrations/artifacts/2.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json
deleted file mode 100644
index a034dab36..000000000
--- a/packages/migrations/artifacts/2.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json
+++ /dev/null
@@ -1,723 +0,0 @@
-{
- "schemaVersion": "2.0.0",
- "contractName": "MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress",
- "compilerOutput": {
- "abi": [
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "owners",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "owner",
- "type": "address"
- }
- ],
- "name": "removeOwner",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "revokeConfirmation",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "name": "isOwner",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "uint256"
- },
- {
- "name": "",
- "type": "address"
- }
- ],
- "name": "confirmations",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "secondsTimeLocked",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "pending",
- "type": "bool"
- },
- {
- "name": "executed",
- "type": "bool"
- }
- ],
- "name": "getTransactionCount",
- "outputs": [
- {
- "name": "count",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "data",
- "type": "bytes"
- }
- ],
- "name": "isFunctionRemoveAuthorizedAddress",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "executeRemoveAuthorizedAddress",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "owner",
- "type": "address"
- }
- ],
- "name": "addOwner",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "isConfirmed",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_secondsTimeLocked",
- "type": "uint256"
- }
- ],
- "name": "changeTimeLock",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "getConfirmationCount",
- "outputs": [
- {
- "name": "count",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "transactions",
- "outputs": [
- {
- "name": "destination",
- "type": "address"
- },
- {
- "name": "value",
- "type": "uint256"
- },
- {
- "name": "data",
- "type": "bytes"
- },
- {
- "name": "executed",
- "type": "bool"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "getOwners",
- "outputs": [
- {
- "name": "",
- "type": "address[]"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "from",
- "type": "uint256"
- },
- {
- "name": "to",
- "type": "uint256"
- },
- {
- "name": "pending",
- "type": "bool"
- },
- {
- "name": "executed",
- "type": "bool"
- }
- ],
- "name": "getTransactionIds",
- "outputs": [
- {
- "name": "_transactionIds",
- "type": "uint256[]"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "TOKEN_TRANSFER_PROXY_CONTRACT",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "getConfirmations",
- "outputs": [
- {
- "name": "_confirmations",
- "type": "address[]"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "transactionCount",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_required",
- "type": "uint256"
- }
- ],
- "name": "changeRequirement",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "confirmTransaction",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "destination",
- "type": "address"
- },
- {
- "name": "value",
- "type": "uint256"
- },
- {
- "name": "data",
- "type": "bytes"
- }
- ],
- "name": "submitTransaction",
- "outputs": [
- {
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "confirmationTimes",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "MAX_OWNER_COUNT",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "required",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "owner",
- "type": "address"
- },
- {
- "name": "newOwner",
- "type": "address"
- }
- ],
- "name": "replaceOwner",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "executeTransaction",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "name": "_owners",
- "type": "address[]"
- },
- {
- "name": "_required",
- "type": "uint256"
- },
- {
- "name": "_secondsTimeLocked",
- "type": "uint256"
- },
- {
- "name": "_tokenTransferProxy",
- "type": "address"
- }
- ],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "constructor"
- },
- {
- "payable": true,
- "stateMutability": "payable",
- "type": "fallback"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "transactionId",
- "type": "uint256"
- },
- {
- "indexed": false,
- "name": "confirmationTime",
- "type": "uint256"
- }
- ],
- "name": "ConfirmationTimeSet",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "name": "secondsTimeLocked",
- "type": "uint256"
- }
- ],
- "name": "TimeLockChange",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "sender",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "Confirmation",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "sender",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "Revocation",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "Submission",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "Execution",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "transactionId",
- "type": "uint256"
- }
- ],
- "name": "ExecutionFailure",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "sender",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "value",
- "type": "uint256"
- }
- ],
- "name": "Deposit",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "owner",
- "type": "address"
- }
- ],
- "name": "OwnerAddition",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "owner",
- "type": "address"
- }
- ],
- "name": "OwnerRemoval",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "name": "required",
- "type": "uint256"
- }
- ],
- "name": "RequirementChange",
- "type": "event"
- }
- ],
- "evm": {
- "bytecode": {
- "linkReferences": {},
- "object": "0x60806040523480156200001157600080fd5b5060405162002022380380620020228339810160409081528151602083015191830151606084015191909301805190939190849084908490839083906000908260328211806200006057508181115b806200006a575080155b8062000074575081155b156200007f57600080fd5b600092505b84518310156200015357600260008685815181101515620000a157fe5b6020908102909101810151600160a060020a031682528101919091526040016000205460ff1680620000f457508483815181101515620000dd57fe5b90602001906020020151600160a060020a03166000145b15620000ff57600080fd5b60016002600087868151811015156200011457fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff19169115159190911790556001929092019162000084565b845162000168906003906020880190620001a2565b5050506004919091555050600655505060088054600160a060020a031916600160a060020a03929092169190911790555062000236915050565b828054828255906000526020600020908101928215620001fa579160200282015b82811115620001fa5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190620001c3565b50620002089291506200020c565b5090565b6200023391905b8082111562000208578054600160a060020a031916815560010162000213565b90565b611ddc80620002466000396000f30060806040526004361061015e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c2781146101a0578063173825d9146101e157806320ea8d861461020f5780632f54bf6e146102275780633411c81c1461026957806337bd78a01461029a57806354741525146102c1578063553a48fd146102e05780635711b311146103395780637065cb4814610351578063784547a71461037f5780637ad28c51146103975780638b51d13f146103af5780639ace38c2146103c7578063a0e67e2b1461049c578063a8abe69a14610501578063add1cbc514610526578063b5dc40c31461053b578063b77bf60014610553578063ba51a6df14610568578063c01a8c8414610580578063c642747414610598578063d38f2d821461060e578063d74f8edd14610626578063dc8452cd1461063b578063e20056e614610650578063ee22610b14610684575b600034111561019e5760408051348152905133917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b005b3480156101ac57600080fd5b506101b860043561069c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ed57600080fd5b5061019e73ffffffffffffffffffffffffffffffffffffffff600435166106d1565b34801561021b57600080fd5b5061019e600435610928565b34801561023357600080fd5b5061025573ffffffffffffffffffffffffffffffffffffffff60043516610a15565b604080519115158252519081900360200190f35b34801561027557600080fd5b5061025560043573ffffffffffffffffffffffffffffffffffffffff60243516610a2a565b3480156102a657600080fd5b506102af610a4a565b60408051918252519081900360200190f35b3480156102cd57600080fd5b506102af60043515156024351515610a50565b3480156102ec57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610255943694929360249392840191908190840183828082843750949750610abc9650505050505050565b34801561034557600080fd5b5061019e600435610bc7565b34801561035d57600080fd5b5061019e73ffffffffffffffffffffffffffffffffffffffff60043516610e90565b34801561038b57600080fd5b50610255600435610ffd565b3480156103a357600080fd5b5061019e600435611087565b3480156103bb57600080fd5b506102af6004356110ce565b3480156103d357600080fd5b506103df60043561114a565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b8381101561045e578181015183820152602001610446565b50505050905090810190601f16801561048b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b3480156104a857600080fd5b506104b1611233565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104ed5781810151838201526020016104d5565b505050509050019250505060405180910390f35b34801561050d57600080fd5b506104b1600435602435604435151560643515156112a3565b34801561053257600080fd5b506101b86113dc565b34801561054757600080fd5b506104b16004356113f8565b34801561055f57600080fd5b506102af6115a5565b34801561057457600080fd5b5061019e6004356115ab565b34801561058c57600080fd5b5061019e600435611622565b3480156105a457600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102af94823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506117349650505050505050565b34801561061a57600080fd5b506102af600435611753565b34801561063257600080fd5b506102af611765565b34801561064757600080fd5b506102af61176a565b34801561065c57600080fd5b5061019e73ffffffffffffffffffffffffffffffffffffffff60043581169060243516611770565b34801561069057600080fd5b5061019e600435611980565b60038054829081106106aa57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60003330146106df57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16151561071557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905591505b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821015610898578273ffffffffffffffffffffffffffffffffffffffff166003838154811015156107b557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561088d57600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061080d57fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918490811061084057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610898565b600190910190610763565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108c99082611cef565b5060035460045411156108e2576003546108e2906115ab565b60405173ffffffffffffffffffffffffffffffffffffffff8416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a2505050565b3360008181526002602052604090205460ff16151561094657600080fd5b60008281526001602090815260408083203380855292529091205483919060ff16151561097257600080fd5b600084815260208190526040902060030154849060ff161561099357600080fd5b8461099d81610ffd565b156109a757600080fd5b600086815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a3505050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b60065481565b6000805b600554811015610ab557838015610a7d575060008181526020819052604090206003015460ff16155b80610aa15750828015610aa1575060008181526020819052604090206003015460ff165b15610aad576001820191505b600101610a54565b5092915050565b604080517f72656d6f7665417574686f72697a65644164647265737328616464726573732981529051908190036020019020600090815b6004811015610bbb57818160048110610b0857fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515610b5b57fe5b6020910101517f010000000000000000000000000000000000000000000000000000000000000090819004027fff000000000000000000000000000000000000000000000000000000000000001614610bb357600080fd5b600101610af3565b600192505b5050919050565b600081815260208190526040812060030154829060ff1615610be857600080fd5b82610bf281610ffd565b1515610bfd57600080fd5b6000848152602081905260409020600854815486929173ffffffffffffffffffffffffffffffffffffffff918216911614610c3757600080fd5b600281810180546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931694909404601f8101839004830285018301909152808452610cea939291830182828015610ce05780601f10610cb557610100808354040283529160200191610ce0565b820191906000526020600020905b815481529060010190602001808311610cc357829003601f168201915b5050505050610abc565b1515610cf557600080fd5b600086815260208190526040908190206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815481830154935160028085018054959b5073ffffffffffffffffffffffffffffffffffffffff909316959492939192839285927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918316156101000291909101909116048015610de75780601f10610dbc57610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610dca57829003601f168201915b505091505060006040518083038185875af19250505015610e325760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2610e88565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a26003850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b505050505050565b333014610e9c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff1615610ed157600080fd5b8173ffffffffffffffffffffffffffffffffffffffff81161515610ef457600080fd5b6003805490506001016004546032821180610f0e57508181115b80610f17575080155b80610f20575081155b15610f2a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600080805b600354811015610bc0576000848152600160205260408120600380549192918490811061102b57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561106c576001820191505b60045482141561107f5760019250610bc0565b600101611002565b33301461109357600080fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a150565b6000805b60035481101561114457600083815260016020526040812060038054919291849081106110fb57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561113c576001820191505b6001016110d2565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff909316959094919291908301828280156112205780601f106111f557610100808354040283529160200191611220565b820191906000526020600020905b81548152906001019060200180831161120357829003601f168201915b5050506003909301549192505060ff1684565b6060600380548060200260200160405190810160405280929190818152602001828054801561129857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161126d575b505050505090505b90565b6060806000806005546040519080825280602002602001820160405280156112d5578160200160208202803883390190505b50925060009150600090505b60055481101561135c5785801561130a575060008181526020819052604090206003015460ff16155b8061132e575084801561132e575060008181526020819052604090206003015460ff165b156113545780838381518110151561134257fe5b60209081029091010152600191909101905b6001016112e1565b878703604051908082528060200260200182016040528015611388578160200160208202803883390190505b5093508790505b868110156113d15782818151811015156113a557fe5b90602001906020020151848983038151811015156113bf57fe5b6020908102909101015260010161138f565b505050949350505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60608060008060038054905060405190808252806020026020018201604052801561142d578160200160208202803883390190505b50925060009150600090505b600354811015611511576000858152600160205260408120600380549192918490811061146257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff16156115095760038054829081106114aa57fe5b600091825260209091200154835173ffffffffffffffffffffffffffffffffffffffff909116908490849081106114dd57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600191909101905b600101611439565b8160405190808252806020026020018201604052801561153b578160200160208202803883390190505b509350600090505b8181101561159d57828181518110151561155957fe5b90602001906020020151848281518110151561157157fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600101611543565b505050919050565b60055481565b3330146115b757600080fd5b6003548160328211806115c957508181115b806115d2575080155b806115db575081155b156115e557600080fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a1505050565b3360008181526002602052604090205460ff16151561164057600080fd5b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16151561167257600080fd5b60008381526001602090815260408083203380855292529091205484919060ff161561169d57600080fd5b846116a781610ffd565b156116b157600080fd5b600086815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a361172586610ffd565b15610e8857610e888642611b71565b6000611741848484611bbc565b905061174c81611622565b9392505050565b60076020526000908152604090205481565b603281565b60045481565b600033301461177e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff1615156117b457600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff16156117e957600080fd5b600092505b6003548310156118ae578473ffffffffffffffffffffffffffffffffffffffff1660038481548110151561181e57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156118a3578360038481548110151561185657fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506118ae565b6001909201916117ee565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25050505050565b600081815260208190526040812060030154829060ff16156119a157600080fd5b826119ab81610ffd565b15156119b657600080fd5b6006546000858152600760205260409020548591014210156119d757600080fd5b600085815260208190526040908190206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815481830154935160028085018054959a5073ffffffffffffffffffffffffffffffffffffffff909316959492939192839285927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918316156101000291909101909116048015611ac95780601f10611a9e57610100808354040283529160200191611ac9565b820191906000526020600020905b815481529060010190602001808311611aac57829003601f168201915b505091505060006040518083038185875af19250505015611b145760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2611b6a565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a26003840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5050505050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25050565b60008373ffffffffffffffffffffffffffffffffffffffff81161515611be157600080fd5b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783555160018301559251805194965091939092611c79926002850192910190611d18565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b815481835581811115611d1357600083815260209020611d13918101908301611d96565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d5957805160ff1916838001178555611d86565b82800160010185558215611d86579182015b82811115611d86578251825591602001919060010190611d6b565b50611d92929150611d96565b5090565b6112a091905b80821115611d925760008155600101611d9c5600a165627a7a72305820c81714a70282119c05387ce5b5ac99a4ae80fd3927672ef71a91cf576988fa3b0029",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2022 CODESIZE SUB DUP1 PUSH3 0x2022 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD SWAP2 DUP4 ADD MLOAD PUSH1 0x60 DUP5 ADD MLOAD SWAP2 SWAP1 SWAP4 ADD DUP1 MLOAD SWAP1 SWAP4 SWAP2 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP4 SWAP1 DUP4 SWAP1 PUSH1 0x0 SWAP1 DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x60 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x6A JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH3 0x74 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH3 0x7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x153 JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xA1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0xFF AND DUP1 PUSH3 0xF4 JUMPI POP DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xDD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 EQ JUMPDEST ISZERO PUSH3 0xFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x114 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH3 0x84 JUMP JUMPDEST DUP5 MLOAD PUSH3 0x168 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH3 0x1A2 JUMP JUMPDEST POP POP POP PUSH1 0x4 SWAP2 SWAP1 SWAP2 SSTORE POP POP PUSH1 0x6 SSTORE POP POP PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP PUSH3 0x236 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x1FA JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x1FA JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x1C3 JUMP JUMPDEST POP PUSH3 0x208 SWAP3 SWAP2 POP PUSH3 0x20C JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x233 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x208 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x213 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1DDC DUP1 PUSH3 0x246 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x15E JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1E1 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x20F JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x269 JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x2C1 JUMPI DUP1 PUSH4 0x553A48FD EQ PUSH2 0x2E0 JUMPI DUP1 PUSH4 0x5711B311 EQ PUSH2 0x339 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x351 JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x37F JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x397 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x3AF JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x3C7 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x49C JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x501 JUMPI DUP1 PUSH4 0xADD1CBC5 EQ PUSH2 0x526 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x53B JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x553 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x568 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x580 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x598 JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x60E JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x626 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x63B JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x650 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x684 JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x19E JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B8 PUSH1 0x4 CALLDATALOAD PUSH2 0x69C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x6D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x928 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x255 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xA15 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x255 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0xA2A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH2 0xA4A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xA50 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x255 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xABC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x345 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0xBC7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xE90 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x255 PUSH1 0x4 CALLDATALOAD PUSH2 0xFFD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x1087 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH1 0x4 CALLDATALOAD PUSH2 0x10CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3DF PUSH1 0x4 CALLDATALOAD PUSH2 0x114A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x45E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x446 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x48B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B1 PUSH2 0x1233 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4ED JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4D5 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B1 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0x12A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x532 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B8 PUSH2 0x13DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x547 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B1 PUSH1 0x4 CALLDATALOAD PUSH2 0x13F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x55F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH2 0x15A5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x574 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x15AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x1622 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x2AF SWAP5 DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1734 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH1 0x4 CALLDATALOAD PUSH2 0x1753 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x632 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH2 0x1765 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x647 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH2 0x176A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x65C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x1770 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x690 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x1980 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x6AA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x715 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP3 LT ISZERO PUSH2 0x898 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7B5 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x88D JUMPI PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x80D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x840 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x898 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x763 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x8C9 SWAP1 DUP3 PUSH2 0x1CEF JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x8E2 JUMPI PUSH1 0x3 SLOAD PUSH2 0x8E2 SWAP1 PUSH2 0x15AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x946 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x972 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x993 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x99D DUP2 PUSH2 0xFFD JUMP JUMPDEST ISZERO PUSH2 0x9A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE MLOAD DUP9 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xAB5 JUMPI DUP4 DUP1 ISZERO PUSH2 0xA7D JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xAA1 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xAA1 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0xAAD JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xA54 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x72656D6F7665417574686F72697A656441646472657373286164647265737329 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 KECCAK256 PUSH1 0x0 SWAP1 DUP2 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0xBBB JUMPI DUP2 DUP2 PUSH1 0x4 DUP2 LT PUSH2 0xB08 JUMPI INVALID JUMPDEST BYTE PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB5B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP2 ADD ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 AND EQ PUSH2 0xBB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 ADD PUSH2 0xAF3 JUMP JUMPDEST PUSH1 0x1 SWAP3 POP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xBE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0xBF2 DUP2 PUSH2 0xFFD JUMP JUMPDEST ISZERO ISZERO PUSH2 0xBFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x8 SLOAD DUP2 SLOAD DUP7 SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 AND EQ PUSH2 0xC37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x2 DUP2 DUP2 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP4 SWAP1 DIV DUP4 MUL DUP6 ADD DUP4 ADD SWAP1 SWAP2 MSTORE DUP1 DUP5 MSTORE PUSH2 0xCEA SWAP4 SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xCE0 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCB5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xCE0 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCC3 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP PUSH2 0xABC JUMP JUMPDEST ISZERO ISZERO PUSH2 0xCF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP12 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0xDE7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xDBC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xDE7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xDCA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0xE32 JUMPI PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0xE88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP6 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0xE9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xED1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0xEF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xF0E JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xF17 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xF20 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xF2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0xC2575A0E9E593C00F959F8C92F12DB2869C3395A3B0502D05E2516446F71F85B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP2 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xBC0 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x102B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x106C JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x107F JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0xBC0 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1002 JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x1093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1144 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x10FB JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x113C JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x10D2 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP1 DUP4 ADD SLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD DUP8 MLOAD PUSH2 0x100 SWAP6 DUP3 AND ISZERO SWAP6 SWAP1 SWAP6 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP9 SWAP1 DIV DUP9 MUL DUP5 ADD DUP9 ADD SWAP1 SWAP7 MSTORE DUP6 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1220 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x11F5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1220 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1203 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 POP POP PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1298 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x126D JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x12D5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x135C JUMPI DUP6 DUP1 ISZERO PUSH2 0x130A JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x132E JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x132E JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0x1354 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1342 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0x12E1 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1388 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x13D1 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13A5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13BF JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x138F JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x142D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1511 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x1462 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1509 JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x14AA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x14DD JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0x1439 JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x153B JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x159D JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1559 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1571 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1543 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x15B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x15C9 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x15D2 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x15DB JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x15E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1640 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO PUSH2 0x1672 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x169D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x16A7 DUP2 PUSH2 0xFFD JUMP JUMPDEST ISZERO PUSH2 0x16B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 CALLER DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP9 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x1725 DUP7 PUSH2 0xFFD JUMP JUMPDEST ISZERO PUSH2 0xE88 JUMPI PUSH2 0xE88 DUP7 TIMESTAMP PUSH2 0x1B71 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1741 DUP5 DUP5 DUP5 PUSH2 0x1BBC JUMP JUMPDEST SWAP1 POP PUSH2 0x174C DUP2 PUSH2 0x1622 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x177E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x17B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x17E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x18AE JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x181E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x18A3 JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1856 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x18AE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17EE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x19A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x19AB DUP2 PUSH2 0xFFD JUMP JUMPDEST ISZERO ISZERO PUSH2 0x19B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP6 SWAP2 ADD TIMESTAMP LT ISZERO PUSH2 0x19D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP11 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x1AC9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1A9E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1AC9 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1AAC JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1B14 JUMPI PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x1B6A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 SWAP1 SSTORE DUP2 MLOAD DUP4 DUP2 MSTORE SWAP2 MLOAD DUP5 SWAP3 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x1BE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x1C79 SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1D18 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x1D13 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x1D13 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1D96 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1D59 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1D86 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1D86 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1D86 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1D6B JUMP JUMPDEST POP PUSH2 0x1D92 SWAP3 SWAP2 POP PUSH2 0x1D96 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x12A0 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1D92 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1D9C JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc8 OR EQ 0xa7 MUL DUP3 GT SWAP13 SDIV CODESIZE PUSH29 0xE5B5AC99A4AE80FD3927672EF71A91CF576988FA3B0029000000000000 ",
- "sourceMap": "671:2422:2:-;;;1539:349;8:9:-1;5:2;;;30:1;27;20:12;5:2;1539:349:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2913:14:0;;1539:349:2;;;;;;;;;;;;;;2959:6:0;;1539:349:2;256:2:0;2236:28;;;:66;;;2292:10;2280:9;:22;2236:66;:96;;;-1:-1:-1;2318:14:0;;2236:96;:127;;;-1:-1:-1;2348:15:0;;2236:127;2229:153;;;2377:5;;;2229:153;2966:1;2959:8;;2954:168;2971:7;:14;2969:1;:16;2954:168;;;3010:7;:19;3018:7;3026:1;3018:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3010:19:0;;;;;;;;;;;-1:-1:-1;3010:19:0;;;;;:38;;;3033:7;3041:1;3033:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3033:15:0;3047:1;3033:15;3010:38;3006:65;;;3066:5;;;3006:65;3107:4;3085:7;:19;3093:7;3101:1;3093:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3085:19:0;;;;;;;;;;;-1:-1:-1;3085:19:0;:26;;-1:-1:-1;;3085:26:0;;;;;;;;;;-1:-1:-1;2987:3:0;;;;;2954:168;;;3131:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;;;3157:8:0;:20;;;;-1:-1:-1;;2032:17:1;:38;-1:-1:-1;;1830:29:2;:51;;-1:-1:-1;;;;;;1830:51:2;-1:-1:-1;;;;;1830:51:2;;;;;;;;;;-1:-1:-1;671:2422:2;;-1:-1:-1;;671:2422:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;671:2422:2;-1:-1:-1;;;;;671:2422:2;;;;;;;;;;;-1:-1:-1;671:2422:2;;;;;;;-1:-1:-1;671:2422:2;;;-1:-1:-1;671:2422:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;671:2422:2;;;;;;;;;:::o;:::-;;;;;;;"
- },
- "deployedBytecode": {
- "linkReferences": {},
- "object": "0x60806040526004361061015e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c2781146101a0578063173825d9146101e157806320ea8d861461020f5780632f54bf6e146102275780633411c81c1461026957806337bd78a01461029a57806354741525146102c1578063553a48fd146102e05780635711b311146103395780637065cb4814610351578063784547a71461037f5780637ad28c51146103975780638b51d13f146103af5780639ace38c2146103c7578063a0e67e2b1461049c578063a8abe69a14610501578063add1cbc514610526578063b5dc40c31461053b578063b77bf60014610553578063ba51a6df14610568578063c01a8c8414610580578063c642747414610598578063d38f2d821461060e578063d74f8edd14610626578063dc8452cd1461063b578063e20056e614610650578063ee22610b14610684575b600034111561019e5760408051348152905133917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b005b3480156101ac57600080fd5b506101b860043561069c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ed57600080fd5b5061019e73ffffffffffffffffffffffffffffffffffffffff600435166106d1565b34801561021b57600080fd5b5061019e600435610928565b34801561023357600080fd5b5061025573ffffffffffffffffffffffffffffffffffffffff60043516610a15565b604080519115158252519081900360200190f35b34801561027557600080fd5b5061025560043573ffffffffffffffffffffffffffffffffffffffff60243516610a2a565b3480156102a657600080fd5b506102af610a4a565b60408051918252519081900360200190f35b3480156102cd57600080fd5b506102af60043515156024351515610a50565b3480156102ec57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610255943694929360249392840191908190840183828082843750949750610abc9650505050505050565b34801561034557600080fd5b5061019e600435610bc7565b34801561035d57600080fd5b5061019e73ffffffffffffffffffffffffffffffffffffffff60043516610e90565b34801561038b57600080fd5b50610255600435610ffd565b3480156103a357600080fd5b5061019e600435611087565b3480156103bb57600080fd5b506102af6004356110ce565b3480156103d357600080fd5b506103df60043561114a565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b8381101561045e578181015183820152602001610446565b50505050905090810190601f16801561048b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b3480156104a857600080fd5b506104b1611233565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104ed5781810151838201526020016104d5565b505050509050019250505060405180910390f35b34801561050d57600080fd5b506104b1600435602435604435151560643515156112a3565b34801561053257600080fd5b506101b86113dc565b34801561054757600080fd5b506104b16004356113f8565b34801561055f57600080fd5b506102af6115a5565b34801561057457600080fd5b5061019e6004356115ab565b34801561058c57600080fd5b5061019e600435611622565b3480156105a457600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102af94823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506117349650505050505050565b34801561061a57600080fd5b506102af600435611753565b34801561063257600080fd5b506102af611765565b34801561064757600080fd5b506102af61176a565b34801561065c57600080fd5b5061019e73ffffffffffffffffffffffffffffffffffffffff60043581169060243516611770565b34801561069057600080fd5b5061019e600435611980565b60038054829081106106aa57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60003330146106df57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16151561071557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905591505b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821015610898578273ffffffffffffffffffffffffffffffffffffffff166003838154811015156107b557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561088d57600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061080d57fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918490811061084057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610898565b600190910190610763565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108c99082611cef565b5060035460045411156108e2576003546108e2906115ab565b60405173ffffffffffffffffffffffffffffffffffffffff8416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a2505050565b3360008181526002602052604090205460ff16151561094657600080fd5b60008281526001602090815260408083203380855292529091205483919060ff16151561097257600080fd5b600084815260208190526040902060030154849060ff161561099357600080fd5b8461099d81610ffd565b156109a757600080fd5b600086815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a3505050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b60065481565b6000805b600554811015610ab557838015610a7d575060008181526020819052604090206003015460ff16155b80610aa15750828015610aa1575060008181526020819052604090206003015460ff165b15610aad576001820191505b600101610a54565b5092915050565b604080517f72656d6f7665417574686f72697a65644164647265737328616464726573732981529051908190036020019020600090815b6004811015610bbb57818160048110610b0857fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515610b5b57fe5b6020910101517f010000000000000000000000000000000000000000000000000000000000000090819004027fff000000000000000000000000000000000000000000000000000000000000001614610bb357600080fd5b600101610af3565b600192505b5050919050565b600081815260208190526040812060030154829060ff1615610be857600080fd5b82610bf281610ffd565b1515610bfd57600080fd5b6000848152602081905260409020600854815486929173ffffffffffffffffffffffffffffffffffffffff918216911614610c3757600080fd5b600281810180546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931694909404601f8101839004830285018301909152808452610cea939291830182828015610ce05780601f10610cb557610100808354040283529160200191610ce0565b820191906000526020600020905b815481529060010190602001808311610cc357829003601f168201915b5050505050610abc565b1515610cf557600080fd5b600086815260208190526040908190206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815481830154935160028085018054959b5073ffffffffffffffffffffffffffffffffffffffff909316959492939192839285927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918316156101000291909101909116048015610de75780601f10610dbc57610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610dca57829003601f168201915b505091505060006040518083038185875af19250505015610e325760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2610e88565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a26003850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b505050505050565b333014610e9c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff1615610ed157600080fd5b8173ffffffffffffffffffffffffffffffffffffffff81161515610ef457600080fd5b6003805490506001016004546032821180610f0e57508181115b80610f17575080155b80610f20575081155b15610f2a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600080805b600354811015610bc0576000848152600160205260408120600380549192918490811061102b57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561106c576001820191505b60045482141561107f5760019250610bc0565b600101611002565b33301461109357600080fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a150565b6000805b60035481101561114457600083815260016020526040812060038054919291849081106110fb57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561113c576001820191505b6001016110d2565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff909316959094919291908301828280156112205780601f106111f557610100808354040283529160200191611220565b820191906000526020600020905b81548152906001019060200180831161120357829003601f168201915b5050506003909301549192505060ff1684565b6060600380548060200260200160405190810160405280929190818152602001828054801561129857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161126d575b505050505090505b90565b6060806000806005546040519080825280602002602001820160405280156112d5578160200160208202803883390190505b50925060009150600090505b60055481101561135c5785801561130a575060008181526020819052604090206003015460ff16155b8061132e575084801561132e575060008181526020819052604090206003015460ff165b156113545780838381518110151561134257fe5b60209081029091010152600191909101905b6001016112e1565b878703604051908082528060200260200182016040528015611388578160200160208202803883390190505b5093508790505b868110156113d15782818151811015156113a557fe5b90602001906020020151848983038151811015156113bf57fe5b6020908102909101015260010161138f565b505050949350505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60608060008060038054905060405190808252806020026020018201604052801561142d578160200160208202803883390190505b50925060009150600090505b600354811015611511576000858152600160205260408120600380549192918490811061146257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff16156115095760038054829081106114aa57fe5b600091825260209091200154835173ffffffffffffffffffffffffffffffffffffffff909116908490849081106114dd57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600191909101905b600101611439565b8160405190808252806020026020018201604052801561153b578160200160208202803883390190505b509350600090505b8181101561159d57828181518110151561155957fe5b90602001906020020151848281518110151561157157fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600101611543565b505050919050565b60055481565b3330146115b757600080fd5b6003548160328211806115c957508181115b806115d2575080155b806115db575081155b156115e557600080fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a1505050565b3360008181526002602052604090205460ff16151561164057600080fd5b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16151561167257600080fd5b60008381526001602090815260408083203380855292529091205484919060ff161561169d57600080fd5b846116a781610ffd565b156116b157600080fd5b600086815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a361172586610ffd565b15610e8857610e888642611b71565b6000611741848484611bbc565b905061174c81611622565b9392505050565b60076020526000908152604090205481565b603281565b60045481565b600033301461177e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff1615156117b457600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff16156117e957600080fd5b600092505b6003548310156118ae578473ffffffffffffffffffffffffffffffffffffffff1660038481548110151561181e57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156118a3578360038481548110151561185657fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506118ae565b6001909201916117ee565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25050505050565b600081815260208190526040812060030154829060ff16156119a157600080fd5b826119ab81610ffd565b15156119b657600080fd5b6006546000858152600760205260409020548591014210156119d757600080fd5b600085815260208190526040908190206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815481830154935160028085018054959a5073ffffffffffffffffffffffffffffffffffffffff909316959492939192839285927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918316156101000291909101909116048015611ac95780601f10611a9e57610100808354040283529160200191611ac9565b820191906000526020600020905b815481529060010190602001808311611aac57829003601f168201915b505091505060006040518083038185875af19250505015611b145760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2611b6a565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a26003840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5050505050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25050565b60008373ffffffffffffffffffffffffffffffffffffffff81161515611be157600080fd5b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783555160018301559251805194965091939092611c79926002850192910190611d18565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b815481835581811115611d1357600083815260209020611d13918101908301611d96565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d5957805160ff1916838001178555611d86565b82800160010185558215611d86579182015b82811115611d86578251825591602001919060010190611d6b565b50611d92929150611d96565b5090565b6112a091905b80821115611d925760008155600101611d9c5600a165627a7a72305820c81714a70282119c05387ce5b5ac99a4ae80fd3927672ef71a91cf576988fa3b0029",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x15E JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1E1 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x20F JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x269 JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x2C1 JUMPI DUP1 PUSH4 0x553A48FD EQ PUSH2 0x2E0 JUMPI DUP1 PUSH4 0x5711B311 EQ PUSH2 0x339 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x351 JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x37F JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x397 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x3AF JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x3C7 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x49C JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x501 JUMPI DUP1 PUSH4 0xADD1CBC5 EQ PUSH2 0x526 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x53B JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x553 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x568 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x580 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x598 JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x60E JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x626 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x63B JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x650 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x684 JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x19E JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B8 PUSH1 0x4 CALLDATALOAD PUSH2 0x69C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x6D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x928 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x255 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xA15 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x255 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0xA2A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH2 0xA4A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xA50 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x255 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xABC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x345 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0xBC7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xE90 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x255 PUSH1 0x4 CALLDATALOAD PUSH2 0xFFD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x1087 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH1 0x4 CALLDATALOAD PUSH2 0x10CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3DF PUSH1 0x4 CALLDATALOAD PUSH2 0x114A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x45E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x446 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x48B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B1 PUSH2 0x1233 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4ED JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4D5 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B1 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0x12A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x532 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B8 PUSH2 0x13DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x547 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B1 PUSH1 0x4 CALLDATALOAD PUSH2 0x13F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x55F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH2 0x15A5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x574 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x15AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x1622 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x2AF SWAP5 DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1734 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH1 0x4 CALLDATALOAD PUSH2 0x1753 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x632 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH2 0x1765 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x647 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AF PUSH2 0x176A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x65C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x1770 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x690 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19E PUSH1 0x4 CALLDATALOAD PUSH2 0x1980 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x6AA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x715 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP3 LT ISZERO PUSH2 0x898 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7B5 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x88D JUMPI PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x80D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x840 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x898 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x763 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x8C9 SWAP1 DUP3 PUSH2 0x1CEF JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x8E2 JUMPI PUSH1 0x3 SLOAD PUSH2 0x8E2 SWAP1 PUSH2 0x15AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x946 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x972 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x993 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x99D DUP2 PUSH2 0xFFD JUMP JUMPDEST ISZERO PUSH2 0x9A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE MLOAD DUP9 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xAB5 JUMPI DUP4 DUP1 ISZERO PUSH2 0xA7D JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xAA1 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xAA1 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0xAAD JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xA54 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x72656D6F7665417574686F72697A656441646472657373286164647265737329 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 KECCAK256 PUSH1 0x0 SWAP1 DUP2 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0xBBB JUMPI DUP2 DUP2 PUSH1 0x4 DUP2 LT PUSH2 0xB08 JUMPI INVALID JUMPDEST BYTE PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB5B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP2 ADD ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 AND EQ PUSH2 0xBB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 ADD PUSH2 0xAF3 JUMP JUMPDEST PUSH1 0x1 SWAP3 POP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xBE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0xBF2 DUP2 PUSH2 0xFFD JUMP JUMPDEST ISZERO ISZERO PUSH2 0xBFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x8 SLOAD DUP2 SLOAD DUP7 SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 AND EQ PUSH2 0xC37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x2 DUP2 DUP2 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP4 SWAP1 DIV DUP4 MUL DUP6 ADD DUP4 ADD SWAP1 SWAP2 MSTORE DUP1 DUP5 MSTORE PUSH2 0xCEA SWAP4 SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xCE0 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCB5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xCE0 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCC3 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP PUSH2 0xABC JUMP JUMPDEST ISZERO ISZERO PUSH2 0xCF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP12 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0xDE7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xDBC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xDE7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xDCA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0xE32 JUMPI PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0xE88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP6 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0xE9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xED1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0xEF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xF0E JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xF17 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xF20 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xF2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0xC2575A0E9E593C00F959F8C92F12DB2869C3395A3B0502D05E2516446F71F85B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP2 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xBC0 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x102B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x106C JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x107F JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0xBC0 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1002 JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x1093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1144 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x10FB JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x113C JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x10D2 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP1 DUP4 ADD SLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD DUP8 MLOAD PUSH2 0x100 SWAP6 DUP3 AND ISZERO SWAP6 SWAP1 SWAP6 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP9 SWAP1 DIV DUP9 MUL DUP5 ADD DUP9 ADD SWAP1 SWAP7 MSTORE DUP6 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1220 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x11F5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1220 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1203 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 POP POP PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1298 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x126D JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x12D5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x135C JUMPI DUP6 DUP1 ISZERO PUSH2 0x130A JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x132E JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x132E JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0x1354 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1342 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0x12E1 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1388 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x13D1 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13A5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13BF JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x138F JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x142D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1511 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x1462 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1509 JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x14AA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x14DD JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0x1439 JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x153B JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x159D JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1559 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1571 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1543 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x15B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x15C9 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x15D2 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x15DB JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x15E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1640 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO PUSH2 0x1672 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x169D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x16A7 DUP2 PUSH2 0xFFD JUMP JUMPDEST ISZERO PUSH2 0x16B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 CALLER DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP9 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x1725 DUP7 PUSH2 0xFFD JUMP JUMPDEST ISZERO PUSH2 0xE88 JUMPI PUSH2 0xE88 DUP7 TIMESTAMP PUSH2 0x1B71 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1741 DUP5 DUP5 DUP5 PUSH2 0x1BBC JUMP JUMPDEST SWAP1 POP PUSH2 0x174C DUP2 PUSH2 0x1622 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x177E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x17B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x17E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x18AE JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x181E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x18A3 JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1856 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x18AE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17EE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x19A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x19AB DUP2 PUSH2 0xFFD JUMP JUMPDEST ISZERO ISZERO PUSH2 0x19B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP6 SWAP2 ADD TIMESTAMP LT ISZERO PUSH2 0x19D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP11 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x1AC9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1A9E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1AC9 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1AAC JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1B14 JUMPI PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x1B6A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 SWAP1 SSTORE DUP2 MLOAD DUP4 DUP2 MSTORE SWAP2 MLOAD DUP5 SWAP3 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x1BE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x1C79 SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1D18 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x1D13 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x1D13 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1D96 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1D59 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1D86 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1D86 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1D86 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1D6B JUMP JUMPDEST POP PUSH2 0x1D92 SWAP3 SWAP2 POP PUSH2 0x1D96 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x12A0 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1D92 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1D9C JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc8 OR EQ 0xa7 MUL DUP3 GT SWAP13 SDIV CODESIZE PUSH29 0xE5B5AC99A4AE80FD3927672EF71A91CF576988FA3B0029000000000000 ",
- "sourceMap": "671:2422:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2519:1:0;2507:9;:13;2503:61;;;2534:30;;;2554:9;2534:30;;;;2542:10;;2534:30;;;;;;;;;;2503:61;671:2422:2;936:23:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;936:23:0;;;;;;;;;;;;;;;;;;;;;;;;3711:460;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3711:460:0;;;;;;;3156:332:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3156:332:1;;;;;890:40:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;890:40:0;;;;;;;;;;;;;;;;;;;;;;;;;820:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;820:64:0;;;;;;;;;1009:29:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1009:29:1;;;;;;;;;;;;;;;;;;;;9136:319:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9136:319:0;;;;;;;;;;;2731:360:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2731:360:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2731:360:2;;-1:-1:-1;2731:360:2;;-1:-1:-1;;;;;;;2731:360:2;2015:502;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2015:502:2;;;;;3311:277:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3311:277:0;;;;;;;7304:337;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7304:337:0;;;;;2281:186:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2281:186:1;;;;;8622:252:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8622:252:0;;;;;765:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;765:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;765:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9539:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9539:115:0;;;;;;;;;;;;;;;;;10757:676;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10757:676:0;;;;;;;;;;;;;;;773:44:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;773:44:2;;;;9833:575:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9833:575:0;;;;;991:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;991:28:0;;;;4990:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4990:207:0;;;;;2573:459:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2573:459:1;;;;;5456:244:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5456:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5456:244:0;;-1:-1:-1;5456:244:0;;-1:-1:-1;;;;;;;5456:244:0;1045:47:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1045:47:1;;;;;217:41:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;217:41:0;;;;965:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;965:20:0;;;;4370:449;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4370:449:0;;;;;;;;;;;;3602:472:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3602:472:1;;;;;936:23:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;936:23:0;:::o;3711:460::-;3859:6;1186:10;1208:4;1186:27;1182:50;;1227:5;;;1182:50;1420:14;;;;;;;:7;:14;;;;;;3801:5;;1420:14;;1419:15;1415:38;;;1448:5;;;1415:38;3822:14;;;3839:5;3822:14;;;:7;:14;;;;;:22;;;;;;3839:5;-1:-1:-1;3854:170:0;3871:6;:13;:17;;3869:19;;3854:170;;;3924:5;3911:18;;:6;3918:1;3911:9;;;;;;;;;;;;;;;;;;;;;;:18;3907:117;;;3961:6;3968:13;;:17;;;;3961:25;;;;;;;;;;;;;;;;3949:6;:9;;3961:25;;;;;3956:1;;3949:9;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4004:5;;3907:117;3890:3;;;;;3854:170;;;4033:6;:18;;;;;;;;;:::i;:::-;-1:-1:-1;4076:6:0;:13;4065:8;;:24;4061:74;;;4121:6;:13;4103:32;;:17;:32::i;:::-;4145:19;;;;;;;;;;;1242:1;3711:460;;:::o;3156:332:1:-;3239:10;1420:14:0;;;;:7;:14;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;1694:28;;;;:13;:28;;;;;;;;3284:10:1;1694:35:0;;;;;;;;;3269:13:1;;3284:10;1694:35:0;;1693:36;1689:59;;;1743:5;;;1689:59;1976:12;:27;;;;;;;;;;:36;;;3316:13:1;;1976:36:0;;1972:59;;;2026:5;;;1972:59;3357:13:1;1165:26;1177:13;1165:11;:26::i;:::-;1164:27;1156:36;;;;;;3429:5;3386:28;;;:13;:28;;;;;;;;3415:10;3386:40;;;;;;;;:48;;;;;;3444:37;3400:13;;3444:37;;;2041:1:0;1758;1463;;3156:332:1;;:::o;890:40:0:-;;;;;;;;;;;;;;;:::o;820:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1009:29:1:-;;;;:::o;9136:319:0:-;9243:10;;9269:179;9286:16;;9284:1;:18;9269:179;;;9328:7;:36;;;;-1:-1:-1;9340:12:0;:15;;;;;;;;;;:24;;;;;9339:25;9328:36;:92;;;;9384:8;:36;;;;-1:-1:-1;9396:12:0;:15;;;;;;;;;;:24;;;;;9384:36;9321:127;;;9447:1;9438:10;;;;9321:127;9304:3;;9269:179;;;9136:319;;;;;:::o;2731:360:2:-;2904:40;;;;;;;;;;;;;;;;2835:4;;;2955:109;2976:1;2972;:5;2955:109;;;3017:32;3050:1;3017:35;;;;;;;;;;3006:46;;;:4;3011:1;3006:7;;;;;;;;;;;;;;;;;;;;;:46;;;2998:55;;;;;;2979:3;;2955:109;;;3080:4;3073:11;;2731:360;;;;;;:::o;2015:502::-;2231:22;1976:27:0;;;;;;;;;;:36;;;2110:13:2;;1976:36:0;;1972:59;;;2026:5;;;1972:59;2148:13:2;1278:26:1;1290:13;1278:11;:26::i;:::-;1270:35;;;;;;;;894:22:2;919:27;;;;;;;;;;982:29;;964:14;;2202:13;;919:27;982:29;964:14;;;982:29;;964:47;956:56;;;;;;1064:7;;;;1030:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1064:7;1030:42;;1064:7;1030:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;:42::i;:::-;1022:51;;;;;;;;2256:12;:27;;;;;;;;;;;;2293:11;;;:18;;;;2307:4;2293:18;;;;;;2325:14;;2351:8;;;;2325:44;;2361:7;;;;2325:44;;2256:27;;-1:-1:-1;2325:14:2;;;;;2351:8;2361:7;;2325:44;;;;2361:7;;2325:44;;;;;2293:18;2325:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:190;;;2383:24;;2393:13;;2383:24;;;;;2321:190;;;2436:31;;2453:13;;2436:31;;;;;2481:11;;;:19;;;;;;2321:190;1315:1:1;;2041::0;2015:502:2;;;:::o;3311:277:0:-;1186:10;1208:4;1186:27;1182:50;;1227:5;;;1182:50;1312:14;;;;;;;:7;:14;;;;;;3404:5;;1312:14;;1308:37;;;1340:5;;;1308:37;3427:5;2104:13;;;;2100:36;;;2131:5;;;2100:36;3459:6;:13;;;;3475:1;3459:17;3478:8;;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;-1:-1:-1;2318:14:0;;2236:96;:127;;;-1:-1:-1;2348:15:0;;2236:127;2229:153;;;2377:5;;;2229:153;3502:14;;;;;;;:7;:14;;;;;;:21;;;;3519:4;3502:21;;;;;;3533:6;27:10:-1;;23:18;;;45:23;;3533:18:0;;;;;;;;;;;;3561:20;;;3502:14;3561:20;2146:1;;1355;1242;3311:277;:::o;7304:337::-;7394:4;;;7438:197;7455:6;:13;7453:15;;7438:197;;;7493:28;;;;:13;:28;;;;;7522:6;:9;;7493:28;;;7529:1;;7522:9;;;;;;;;;;;;;;;;;;;;7493:39;;;;;;;;;;;;;;;7489:71;;;7559:1;7550:10;;;;7489:71;7587:8;;7578:5;:17;7574:50;;;7620:4;7613:11;;;;7574:50;7470:3;;7438:197;;2281:186:1;1186:10:0;1208:4;1186:27;1182:50;;1227:5;;;1182:50;2378:17:1;:38;;;2426:34;;;;;;;;;;;;;;;;;2281:186;:::o;8622:252:0:-;8721:10;;8747:120;8764:6;:13;8762:15;;8747:120;;;8800:28;;;;:13;:28;;;;;8829:6;:9;;8800:28;;;8836:1;;8829:9;;;;;;;;;;;;;;;;;;;;8800:39;;;;;;;;;;;;;;;8796:71;;;8866:1;8857:10;;;;8796:71;8779:3;;8747:120;;;8622:252;;;;:::o;765:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;765:49:0;;;;;;;-1:-1:-1;;765:49:0;;;:::o;9539:115::-;9609:9;9641:6;9634:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:115;;:::o;10757:676::-;10882:22;10920:32;10993:10;11017:6;10966:16;;10955:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10955:28:0;;10920:63;;11006:1;10993:14;;11040:1;11038:3;;11033:250;11045:16;;11043:1;:18;11033:250;;;11087:7;:36;;;;-1:-1:-1;11099:12:0;:15;;;;;;;;;;:24;;;;;11098:25;11087:36;:92;;;;11143:8;:36;;;;-1:-1:-1;11155:12:0;:15;;;;;;;;;;:24;;;;;11143:36;11080:203;;;11239:1;11211:18;11230:5;11211:25;;;;;;;;;;;;;;;;;;:29;11267:1;11258:10;;;;;11080:203;11063:3;;11033:250;;;11326:4;11321:2;:9;11310:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;11310:21:0;;11292:39;;11348:4;11346:6;;11341:85;11356:2;11354:1;:4;11341:85;;;11405:18;11424:1;11405:21;;;;;;;;;;;;;;;;;;11377:15;11397:4;11393:1;:8;11377:25;;;;;;;;;;;;;;;;;;:49;11360:3;;11341:85;;;10757:676;;;;;;;;;:::o;773:44:2:-;;;;;;:::o;9833:575:0:-;9928:24;9968:34;10043:10;10067:6;10019;:13;;;;10005:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10005:28:0;;9968:65;;10056:1;10043:14;;10090:1;10088:3;;10083:186;10095:6;:13;10093:15;;10083:186;;;10131:28;;;;:13;:28;;;;;10160:6;:9;;10131:28;;;10167:1;;10160:9;;;;;;;;;;;;;;;;;;;;10131:39;;;;;;;;;;;;;;;10127:142;;;10217:6;:9;;10224:1;;10217:9;;;;;;;;;;;;;;;;10190:24;;10217:9;;;;;10190:17;;10208:5;;10190:24;;;;;;:36;;;;:24;;;;;;;;;;:36;10253:1;10244:10;;;;;10127:142;10110:3;;10083:186;;;10309:5;10295:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10295:20:0;;10278:37;;10332:1;10330:3;;10325:76;10337:5;10335:1;:7;10325:76;;;10381:17;10399:1;10381:20;;;;;;;;;;;;;;;;;;10361:14;10376:1;10361:17;;;;;;;;;;:40;;;;:17;;;;;;;;;;:40;10344:3;;10325:76;;;9833:575;;;;;;:::o;991:28::-;;;;:::o;4990:207::-;1186:10;1208:4;1186:27;1182:50;;1227:5;;;1182:50;5092:6;:13;5107:9;256:2;2236:28;;;:66;;;2292:10;2280:9;:22;2236:66;:96;;;-1:-1:-1;2318:14:0;;2236:96;:127;;;-1:-1:-1;2348:15:0;;2236:127;2229:153;;;2377:5;;;2229:153;5132:8;:20;;;5162:28;;;;;;;;;;;;;;;;;1242:1;;4990:207;:::o;2573:459:1:-;2656:10;1420:14:0;;;;:7;:14;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;1538:12;:27;;;;;;;;;;:39;2694:13:1;;1538:39:0;;:44;1534:67;;;1596:5;;;1534:67;1843:28;;;;:13;:28;;;;;;;;2745:10:1;1843:35:0;;;;;;;;;2730:13:1;;2745:10;1843:35:0;;1839:58;;;1892:5;;;1839:58;2783:13:1;1165:26;1177:13;1165:11;:26::i;:::-;1164:27;1156:36;;;;;;2812:28;;;;2855:4;2812:28;;;;;;;;2841:10;2812:40;;;;;;;;:47;;;;;;;;;;2869:39;;2826:13;;2869:39;;;2922:26;2934:13;2922:11;:26::i;:::-;2918:108;;;2964:51;2984:13;2999:15;2964:19;:51::i;5456:244:0:-;5560:18;5610:40;5625:11;5638:5;5645:4;5610:14;:40::i;:::-;5594:56;;5660:33;5679:13;5660:18;:33::i;:::-;5456:244;;;;;:::o;1045:47:1:-;;;;;;;;;;;;;:::o;217:41:0:-;256:2;217:41;:::o;965:20::-;;;;:::o;4370:449::-;4541:6;1186:10;1208:4;1186:27;1182:50;;1227:5;;;1182:50;1420:14;;;;;;;:7;:14;;;;;;4479:5;;1420:14;;1419:15;1415:38;;;1448:5;;;1415:38;1312:14;;;;;;;:7;:14;;;;;;4512:8;;1312:14;;1308:37;;;1340:5;;;1308:37;4548:1;4541:8;;4536:149;4553:6;:13;4551:15;;4536:149;;;4602:5;4589:18;;:6;4596:1;4589:9;;;;;;;;;;;;;;;;;;;;;;:18;4585:100;;;4639:8;4627:6;4634:1;4627:9;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4665:5;;4585:100;4568:3;;;;;4536:149;;;4694:14;;;;4711:5;4694:14;;;:7;:14;;;;;;:22;;;;;;;;;4726:17;;;;;;;;:24;;;;;4694:22;4726:24;;;;4760:19;;4694:14;;4760:19;;;4789:23;;;;;;;;;;;1463:1;1242;4370:449;;;:::o;3602:472:1:-;3788:22;1976:27:0;;;;;;;;;;:36;;;3685:13:1;;1976:36:0;;1972:59;;;2026:5;;;1972:59;3723:13:1;1278:26;1290:13;1278:11;:26::i;:::-;1270:35;;;;;;;;1443:17;;1408:32;;;;:17;:32;;;;;;3759:13;;1408:52;1389:15;:71;;1381:80;;;;;;3813:12;:27;;;;;;;;;;;;3850:11;;;:18;;;;3864:4;3850:18;;;;;;3882:14;;3908:8;;;;3882:44;;3918:7;;;;3882:44;;3813:27;;-1:-1:-1;3882:14:1;;;;;3908:8;3918:7;;3882:44;;;;3918:7;;3882:44;;;;;3850:18;3882:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3878:190;;;3940:24;;3950:13;;3940:24;;;;;3878:190;;;3993:31;;4010:13;;3993:31;;;;;4038:11;;;:19;;;;;;3878:190;1315:1;2041::0;3602:472:1;;;:::o;4184:223::-;4287:32;;;;:17;:32;;;;;;;;;:51;;;4348:52;;;;;;;4305:13;;4348:52;;;;;;;;;4184:223;;:::o;7974:451:0:-;8106:18;8076:11;2104:13;;;;2100:36;;;2131:5;;;2100:36;8156:16;;8212:140;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8212:140:0;;;;;;8182:27;;;;;;;;;;:170;;;;;;;;;;;;;;;-1:-1:-1;8182:170:0;;;;;;;8156:16;;-1:-1:-1;8212:140:0;;8182:27;;:170;;;;;;;;;;:::i;:::-;-1:-1:-1;8182:170:0;;;;;;;;;;;;;;;;;;;;;;;8362:16;:21;;-1:-1:-1;8362:21:0;;;8393:25;;8404:13;;8393:25;;-1:-1:-1;;8393:25:0;7974:451;;;;;;:::o;671:2422:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;671:2422:2;;;-1:-1:-1;671:2422:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;"
- }
- }
- },
- "sources": {
- "current/multisig/MultiSigWallet.sol": {
- "id": 0
- },
- "current/multisig/MultiSigWalletWithTimeLock.sol": {
- "id": 1
- },
- "previous/MultiSigWalletWithTImeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol": {
- "id": 2
- }
- },
- "sourceCodes": {
- "current/multisig/MultiSigWallet.sol": "pragma solidity ^0.4.10;\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n",
- "current/multisig/MultiSigWalletWithTimeLock.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.10;\n\nimport \"./MultiSigWallet.sol\";\n\n/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.\n/// @author Amir Bandeali - <amir@0xProject.com>\ncontract MultiSigWalletWithTimeLock is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint secondsTimeLocked);\n\n uint public secondsTimeLocked;\n\n mapping (uint => uint) public confirmationTimes;\n\n modifier notFullyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier fullyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);\n _;\n }\n\n /*\n * Public functions\n */\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)\n public\n MultiSigWallet(_owners, _required)\n {\n secondsTimeLocked = _secondsTimeLocked;\n }\n\n /// @dev Changes the duration of the time lock for transactions.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function changeTimeLock(uint _secondsTimeLocked)\n public\n onlyWallet\n {\n secondsTimeLocked = _secondsTimeLocked;\n TimeLockChange(_secondsTimeLocked);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n if (isConfirmed(transactionId)) {\n setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /*\n * Internal functions\n */\n\n /// @dev Sets the time of when a submission first passed.\n function setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n confirmationTimes[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n}\n",
- "previous/MultiSigWalletWithTImeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.10;\n\nimport \"../../current/multisig/MultiSigWalletWithTimeLock.sol\";\n\ncontract MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress is MultiSigWalletWithTimeLock {\n\n address public TOKEN_TRANSFER_PROXY_CONTRACT;\n\n modifier validRemoveAuthorizedAddressTx(uint transactionId) {\n Transaction storage tx = transactions[transactionId];\n require(tx.destination == TOKEN_TRANSFER_PROXY_CONTRACT);\n require(isFunctionRemoveAuthorizedAddress(tx.data));\n _;\n }\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, time lock, and tokenTransferProxy address.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n /// @param _tokenTransferProxy Address of TokenTransferProxy contract.\n function MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress(\n address[] _owners,\n uint _required,\n uint _secondsTimeLocked,\n address _tokenTransferProxy)\n public\n MultiSigWalletWithTimeLock(_owners, _required, _secondsTimeLocked)\n {\n TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;\n }\n\n /// @dev Allows execution of removeAuthorizedAddress without time lock.\n /// @param transactionId Transaction ID.\n function executeRemoveAuthorizedAddress(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n validRemoveAuthorizedAddressTx(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /// @dev Compares first 4 bytes of byte array to removeAuthorizedAddress function signature.\n /// @param data Transaction data.\n /// @return Successful if data is a call to removeAuthorizedAddress.\n function isFunctionRemoveAuthorizedAddress(bytes data)\n public\n constant\n returns (bool)\n {\n bytes4 removeAuthorizedAddressSignature = bytes4(sha3(\"removeAuthorizedAddress(address)\"));\n for (uint i = 0; i < 4; i++) {\n require(data[i] == removeAuthorizedAddressSignature[i]);\n }\n return true;\n }\n}"
- },
- "sourceTreeHashHex": "0x573413fc71759cd8ee69df44c180fd3960f501349cf046e93ee8b239b4814d35",
- "compiler": {
- "name": "solc",
- "version": "soljson-v0.4.24+commit.e67f0147.js",
- "settings": {
- "optimizer": {
- "enabled": true,
- "runs": 1000000
- },
- "outputSelection": {
- "*": {
- "*": [
- "abi",
- "evm.bytecode.object",
- "evm.bytecode.sourceMap",
- "evm.deployedBytecode.object",
- "evm.deployedBytecode.sourceMap"
- ]
- }
- }
- }
- },
- "networks": {}
-} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TokenRegistry.json b/packages/migrations/artifacts/2.0.0/TokenRegistry.json
index 9c7403464..0ed4df473 100644
--- a/packages/migrations/artifacts/2.0.0/TokenRegistry.json
+++ b/packages/migrations/artifacts/2.0.0/TokenRegistry.json
@@ -548,29 +548,29 @@
"evm": {
"bytecode": {
"linkReferences": {},
- "object": "0x608060405260008054600160a060020a03191633179055612d9a806100256000396000f3006080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166313baf1e681146100ea5780632fbfeba91461011d5780633550b6d91461019f57806356318820146101f85780637abccac91461026c5780638da5cb5b14610484578063a880319d14610499578063c370c86d146105d0578063e486033914610644578063e5df8b8414610672578063e73fc0c31461068a578063ee8c24b8146106e3578063eef05f6514610748578063efa74f1f146107bc578063f036417f14610815578063f2fde38b14610889575b600080fd5b3480156100f657600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff600435166024356108b7565b005b34801561012957600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610efb9650505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ab57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610fb59650505050505050565b34801561020457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506110069650505050505050565b34801561027857600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166111d8565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610321578181015183820152602001610309565b50505050905090810190601f16801561034e5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015610381578181015183820152602001610369565b50505050905090810190601f1680156103ae5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b838110156103e15781810151838201526020016103c9565b50505050905090810190601f16801561040e5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015610441578181015183820152602001610429565b50505050905090810190601f16801561046e5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561049057600080fd5b50610176611528565b3480156104a557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff1695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b60ff8b35169b909a90999401975091955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506115449650505050505050565b3480156105dc57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff16953695604494919390910191908190840183828082843750949750611cbc9650505050505050565b34801561065057600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166120d9565b34801561067e57600080fd5b506101766004356123ce565b34801561069657600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a9436949293602493928401919081908401838280828437509497506124039650505050505050565b3480156106ef57600080fd5b506106f86124e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073457818101518382015260200161071c565b505050509050019250505060405180910390f35b34801561075457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506125539650505050505050565b3480156107c857600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a94369492936024939284019190819084018382808284375094975061271e9650505050505050565b34801561082157600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506127799650505050505050565b34801561089557600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff60043516612b95565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146108dc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561091157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660048481548110151561093757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161461096357600080fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061099357fe5b6000918252602090912001546004805473ffffffffffffffffffffffffffffffffffffffff90921691859081106109c657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610a459082612c19565b5073ffffffffffffffffffffffffffffffffffffffff80851660009081526001602081815260409283902080546003820154855160ff90911695810186905260a0808252838601805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9882161561010002989098011687900491830182905293995091909616957f32c54f1e2ea75844ded7517e7dbcd3895da7cd0c28f9ab9f9cf6ecf5f83762c695929489019360048a019260058b0192918291908201906060830190608084019060c08501908b908015610b655780601f10610b3a57610100808354040283529160200191610b65565b820191906000526020600020905b815481529060010190602001808311610b4857829003601f168201915b50508581038452895460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116048082526020909101908a908015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b50508581038352875460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019088908015610c895780601f10610c5e57610100808354040283529160200191610c89565b820191906000526020600020905b815481529060010190602001808311610c6c57829003601f168201915b50508581038252865460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019087908015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050995050505050505050505060405180910390a26002826002016040518082805460018160011615610100020316600290048015610d915780601f10610d6f576101008083540402835291820191610d91565b820191906000526020600020905b815481529060010190602001808311610d7d575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556003826001016040518082805460018160011615610100020316600290048015610e285780601f10610e06576101008083540402835291820191610e28565b820191906000526020600020905b815481529060010190602001808311610e14575b50509283525050604080516020928190038301902080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff871660009081526001938490529182208054909116815591610e9f90830182612c42565b610ead600283016000612c42565b6003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610ee5600483016000612c42565b610ef3600583016000612c42565b505050505050565b60006003826040518082805190602001908083835b60208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16949350505050565b600060028260405180828051906020019080838360208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461102b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561106057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600582018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507fc3168fdc13112e44a031057dbf6c609b33353addb4d8037d24543e22cbfe2acd93889282919082019060608301908690801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611180578181015183820152602001611168565b50505050905090810190601f1680156111ad5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060058401906020860190612c86565b5050505050565b600060608060006060806111ea612d04565b73ffffffffffffffffffffffffffffffffffffffff888116600090815260016020818152604092839020835160c0810185528154909516855280830180548551600261010096831615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911694909404601f8101849004840285018401909552848452909385830193928301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b5050509183525050600282810180546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931694909404601f8101839004830285018301909152808452938101939083018282801561137b5780601f106113505761010080835404028352916020019161137b565b820191906000526020600020905b81548152906001019060200180831161135e57829003601f168201915b5050509183525050600382015460ff1660208083019190915260048301805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600186161561010002019094169390930492830185900485028101850182528281529401939283018282801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050918352505060058201805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529382019392918301828280156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b5050509190925250508151602083015160408401516060850151608086015160a090960151939e929d50909b5099509297509550909350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461156857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600160205260409020548791161561159c57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff811615156115bf57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061162857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115eb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611699905057600080fd5b87600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831061170257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016116c5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611773905057600080fd5b6040805160c08101825273ffffffffffffffffffffffffffffffffffffffff8c811680835260208084018e81528486018e905260ff8d166060860152608085018c905260a085018b90526000928352600180835295909220845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783559051805193949293611812938501929190910190612c86565b506040820151805161182e916002840191602090910190612c86565b5060608201516003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560808201518051611882916004840191602090910190612c86565b5060a0820151805161189e916005840191602090910190612c86565b5050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d161790555060405188518b916002918b9190819060208401908083835b6020831061196657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611929565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250604051938490038101842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff969096169590951790945550508a518c926003928d9290918291908401908083835b60208310611a4757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611a0a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060408051948590038201852080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff97881617905560ff8d169085015260a08085528e51908501528d51948f16947fd8d928b0b50ca11d9dc273236b46f3526515b03602f71f3a6af4f45bd9fa9144948f94508e93508d928d928d92918291828201916060840191608085019160c0860191908c019080838360005b83811015611b4f578181015183820152602001611b37565b50505050905090810190601f168015611b7c5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015611baf578181015183820152602001611b97565b50505050905090810190601f168015611bdc5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b83811015611c0f578181015183820152602001611bf7565b50505050905090810190601f168015611c3c5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015611c6f578181015183820152602001611c57565b50505050905090810190601f168015611c9c5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a250505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314611ce157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160205260409020548491161515611d1657600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b60208310611d7f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611d42565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611df0905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481528184018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529097507f4a6dbfc867b179991dec22ff19960f0a94d8d9d891fc556f547764670340e8ae938992829190820190606083019086908015611edb5780601f10611eb057610100808354040283529160200191611edb565b820191906000526020600020905b815481529060010190602001808311611ebe57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611f0f578181015183820152602001611ef7565b50505050905090810190601f168015611f3c5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26003836001016040518082805460018160011615610100020316600290048015611fac5780601f10611f8a576101008083540402835291820191611fac565b820191906000526020600020905b815481529060010190602001808311611f98575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600392889282918401908083835b6020831061203657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611ff9565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506001860191870190612c86565b600160208181526000928352604092839020805481840180548651600261010097831615979097027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911695909504601f810185900485028601850190965285855273ffffffffffffffffffffffffffffffffffffffff909116949193929091908301828280156121ad5780601f10612182576101008083540402835291602001916121ad565b820191906000526020600020905b81548152906001019060200180831161219057829003601f168201915b50505060028085018054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169590950492830185900485028101850190915281815295969594509092509083018282801561225d5780601f106122325761010080835404028352916020019161225d565b820191906000526020600020905b81548152906001019060200180831161224057829003601f168201915b50505050600383015460048401805460408051602060026101006001861615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152959660ff90941695939450908301828280156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b5050505060058301805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529495949350908301828280156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b5050505050905086565b60048054829081106123dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000606080600060608060006003886040518082805190602001908083835b6020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff1692506124ce91508290506111d8565b949d939c50919a509850965090945092505050565b6060600480548060200260200160405190810160405280929190818152602001828054801561254857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161251d575b505050505090505b90565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461257857600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156125ad57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600482018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507f5b19f79ac4e8cfa820815502e11615f1a449e28155dc289ec5cac1a11f9086949388928291908201906060830190869080156126995780601f1061266e57610100808354040283529160200191612699565b820191906000526020600020905b81548152906001019060200180831161267c57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156126cd5781810151838201526020016126b5565b50505050905090810190601f1680156126fa5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060048401906020860190612c86565b6000606080600060608060006002886040518082805190602001908083836020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461279e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156127d357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061283c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016127ff565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff169290921491506128ad905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481526002808301805495861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909516049481018590529097507f53d878a6530e56c9bc96548fa0a8cae4f1d1f49c86b0e934c086b992ebb6998f9389928291908201906060830190869080156129975780601f1061296c57610100808354040283529160200191612997565b820191906000526020600020905b81548152906001019060200180831161297a57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156129cb5781810151838201526020016129b3565b50505050905090810190601f1680156129f85780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26002836002016040518082805460018160011615610100020316600290048015612a685780601f10612a46576101008083540402835291820191612a68565b820191906000526020600020905b815481529060010190602001808311612a54575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600292889282918401908083835b60208310612af257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ab5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506002860191870190612c86565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bb957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811615612c1657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115612c3d57600083815260209020612c3d918101908301612d54565b505050565b50805460018160011615610100020316600290046000825580601f10612c685750612c16565b601f016020900490600052602060002090810190612c169190612d54565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612cc757805160ff1916838001178555612cf4565b82800160010185558215612cf4579182015b82811115612cf4578251825591602001919060010190612cd9565b50612d00929150612d54565b5090565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160608152602001606081525090565b61255091905b80821115612d005760008155600101612d5a5600a165627a7a7230582084e95a0a2a2f6b98236222635755a082c937f66b7dd9529673a6c9fe221f8eb00029",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x2D9A DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE5 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x13BAF1E6 DUP2 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x2FBFEBA9 EQ PUSH2 0x11D JUMPI DUP1 PUSH4 0x3550B6D9 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x56318820 EQ PUSH2 0x1F8 JUMPI DUP1 PUSH4 0x7ABCCAC9 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xA880319D EQ PUSH2 0x499 JUMPI DUP1 PUSH4 0xC370C86D EQ PUSH2 0x5D0 JUMPI DUP1 PUSH4 0xE4860339 EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0xE5DF8B84 EQ PUSH2 0x672 JUMPI DUP1 PUSH4 0xE73FC0C3 EQ PUSH2 0x68A JUMPI DUP1 PUSH4 0xEE8C24B8 EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0xEEF05F65 EQ PUSH2 0x748 JUMPI DUP1 PUSH4 0xEFA74F1F EQ PUSH2 0x7BC JUMPI DUP1 PUSH4 0xF036417F EQ PUSH2 0x815 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x889 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x8B7 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x129 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xEFB SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xFB5 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1006 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x11D8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x321 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x309 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x34E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x381 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x369 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3AE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x441 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x429 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x46E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x1528 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP2 DUP11 ADD CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD DUP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 PUSH1 0xFF DUP12 CALLDATALOAD AND SWAP12 SWAP1 SWAP11 SWAP1 SWAP10 SWAP5 ADD SWAP8 POP SWAP2 SWAP6 POP SWAP2 DUP3 ADD SWAP4 POP SWAP2 POP DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1544 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1CBC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x20D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH1 0x4 CALLDATALOAD PUSH2 0x23CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x696 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2403 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6F8 PUSH2 0x24E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x734 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x71C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2553 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x271E SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x821 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2779 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x8DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x937 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x963 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x993 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x4 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP6 SWAP1 DUP2 LT PUSH2 0x9C6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xA45 SWAP1 DUP3 PUSH2 0x2C19 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x3 DUP3 ADD SLOAD DUP6 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP6 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP1 DUP3 MSTORE DUP4 DUP7 ADD DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 DUP3 AND ISZERO PUSH2 0x100 MUL SWAP9 SWAP1 SWAP9 ADD AND DUP8 SWAP1 DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE SWAP4 SWAP10 POP SWAP2 SWAP1 SWAP7 AND SWAP6 PUSH32 0x32C54F1E2EA75844DED7517E7DBCD3895DA7CD0C28F9AB9F9CF6ECF5F83762C6 SWAP6 SWAP3 SWAP5 DUP10 ADD SWAP4 PUSH1 0x4 DUP11 ADD SWAP3 PUSH1 0x5 DUP12 ADD SWAP3 SWAP2 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 PUSH1 0x80 DUP5 ADD SWAP1 PUSH1 0xC0 DUP6 ADD SWAP1 DUP12 SWAP1 DUP1 ISZERO PUSH2 0xB65 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB3A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB65 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB48 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP11 SWAP1 DUP1 ISZERO PUSH2 0xBF7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBCC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBF7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBDA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP9 SWAP1 DUP1 ISZERO PUSH2 0xC89 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC5E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC89 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC6C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP8 SWAP1 DUP1 ISZERO PUSH2 0xD1B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCF0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD1B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCFE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP3 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD6F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xD91 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD7D JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x3 DUP3 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xE28 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xE06 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xE28 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE14 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 SWAP3 DUP2 SWAP1 SUB DUP4 ADD SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP4 DUP5 SWAP1 MSTORE SWAP2 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND DUP2 SSTORE SWAP2 PUSH2 0xE9F SWAP1 DUP4 ADD DUP3 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEAD PUSH1 0x2 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH2 0xEE5 PUSH1 0x4 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEF3 PUSH1 0x5 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x102B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1060 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0xC3168FDC13112E44A031057DBF6C609B33353ADDB4D8037D24543E22CBFE2ACD SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x114C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1121 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x114C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x112F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1180 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1168 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11AD JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x5 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x11EA PUSH2 0x2D04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD PUSH1 0xC0 DUP2 ADD DUP6 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE DUP1 DUP4 ADD DUP1 SLOAD DUP6 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP7 DUP4 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE SWAP1 SWAP4 DUP6 DUP4 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x12CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x12A0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x12CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12AE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x2 DUP3 DUP2 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP4 SWAP1 DIV DUP4 MUL DUP6 ADD DUP4 ADD SWAP1 SWAP2 MSTORE DUP1 DUP5 MSTORE SWAP4 DUP2 ADD SWAP4 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x137B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1350 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x137B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x135E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0xFF AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 DUP7 AND ISZERO PUSH2 0x100 MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD DUP3 MSTORE DUP3 DUP2 MSTORE SWAP5 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x143A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x140F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x143A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x141D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14C1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14CF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0xA0 SWAP1 SWAP7 ADD MLOAD SWAP4 SWAP15 SWAP3 SWAP14 POP SWAP1 SWAP12 POP SWAP10 POP SWAP3 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP8 SWAP2 AND ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x15BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1628 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15EB JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1699 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1702 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x16C5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1773 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0x20 DUP1 DUP5 ADD DUP15 DUP2 MSTORE DUP5 DUP7 ADD DUP15 SWAP1 MSTORE PUSH1 0xFF DUP14 AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x80 DUP6 ADD DUP13 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD DUP12 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 DUP1 DUP4 MSTORE SWAP6 SWAP1 SWAP3 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE SWAP1 MLOAD DUP1 MLOAD SWAP4 SWAP5 SWAP3 SWAP4 PUSH2 0x1812 SWAP4 DUP6 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x182E SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x1882 SWAP2 PUSH1 0x4 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x189E SWAP2 PUSH1 0x5 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x8A35ACFBC15FF81A39AE7D344FD709F28E8600B4AA8C65C6B64BFE7FE36BD19B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND OR SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP9 MLOAD DUP12 SWAP2 PUSH1 0x2 SWAP2 DUP12 SWAP2 SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1966 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1929 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE POP POP DUP11 MLOAD DUP13 SWAP3 PUSH1 0x3 SWAP3 DUP14 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1A47 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1A0A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 SWAP1 SUB DUP3 ADD DUP6 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND OR SWAP1 SSTORE PUSH1 0xFF DUP14 AND SWAP1 DUP6 ADD MSTORE PUSH1 0xA0 DUP1 DUP6 MSTORE DUP15 MLOAD SWAP1 DUP6 ADD MSTORE DUP14 MLOAD SWAP5 DUP16 AND SWAP5 PUSH32 0xD8D928B0B50CA11D9DC273236B46F3526515B03602F71F3A6AF4F45BD9FA9144 SWAP5 DUP16 SWAP5 POP DUP15 SWAP4 POP DUP14 SWAP3 DUP14 SWAP3 DUP14 SWAP3 SWAP2 DUP3 SWAP2 DUP3 DUP3 ADD SWAP2 PUSH1 0x60 DUP5 ADD SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 PUSH1 0xC0 DUP7 ADD SWAP2 SWAP1 DUP13 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B4F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B37 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B7C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B97 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BDC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1BF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1C57 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C9C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1CE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1D16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D7F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1D42 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1DF0 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE DUP2 DUP5 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x4A6DBFC867B179991DEC22FF19960F0A94D8D9D891FC556F547764670340E8AE SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x1EDB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1EB0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EDB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1EBE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1EF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1F3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x3 DUP4 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1FAC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F8A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x1FAC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F98 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x3 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2036 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1FF9 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x1 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD DUP2 DUP5 ADD DUP1 SLOAD DUP7 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP8 DUP4 AND ISZERO SWAP8 SWAP1 SWAP8 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP6 SWAP1 SWAP6 DIV PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP5 SWAP2 SWAP4 SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x21AD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2182 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x21AD JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2190 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP6 SWAP1 SWAP6 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 SWAP6 SWAP5 POP SWAP1 SWAP3 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x225D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2232 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x225D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2240 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 PUSH1 0xFF SWAP1 SWAP5 AND SWAP6 SWAP4 SWAP5 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2316 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x22EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2316 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x22F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x5 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP5 SWAP6 SWAP5 SWAP4 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x23C4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2399 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x23C4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x23A7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP7 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x23DC JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x3 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 POP PUSH2 0x24CE SWAP2 POP DUP3 SWAP1 POP PUSH2 0x11D8 JUMP JUMPDEST SWAP5 SWAP14 SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2548 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x251D JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x25AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0x5B19F79AC4E8CFA820815502E11615F1A449E28155DC289EC5CAC1A11F908694 SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2699 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x266E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2699 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x267C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26CD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x26B5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x26FA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x4 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x279E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x27D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x283C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x27FF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x28AD SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x2 DUP1 DUP4 ADD DUP1 SLOAD SWAP6 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x53D878A6530E56C9BC96548FA0A8CAE4F1D1F49C86B0E934C086B992EBB6998F SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2997 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x296C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2997 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x297A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x29CB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x29B3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2A68 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x2A68 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A54 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x2 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2AF2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AB5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x2 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2C3D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x2C3D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x2D54 JUMP JUMPDEST POP POP POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x2C68 JUMPI POP PUSH2 0x2C16 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2C16 SWAP2 SWAP1 PUSH2 0x2D54 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2CC7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2CF4 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2CF4 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2CF4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2CD9 JUMP JUMPDEST POP PUSH2 0x2D00 SWAP3 SWAP2 POP PUSH2 0x2D54 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x2550 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2D00 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2D5A JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP5 0xe9 GAS EXP 0x2a 0x2f PUSH12 0x98236222635755A082C937F6 PUSH12 0x7DD9529673A6C9FE221F8EB0 STOP 0x29 ",
+ "object": "0x608060405260008054600160a060020a03191633179055612d9a806100256000396000f3006080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166313baf1e681146100ea5780632fbfeba91461011d5780633550b6d91461019f57806356318820146101f85780637abccac91461026c5780638da5cb5b14610484578063a880319d14610499578063c370c86d146105d0578063e486033914610644578063e5df8b8414610672578063e73fc0c31461068a578063ee8c24b8146106e3578063eef05f6514610748578063efa74f1f146107bc578063f036417f14610815578063f2fde38b14610889575b600080fd5b3480156100f657600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff600435166024356108b7565b005b34801561012957600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610efb9650505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ab57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610fb59650505050505050565b34801561020457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506110069650505050505050565b34801561027857600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166111d8565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610321578181015183820152602001610309565b50505050905090810190601f16801561034e5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015610381578181015183820152602001610369565b50505050905090810190601f1680156103ae5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b838110156103e15781810151838201526020016103c9565b50505050905090810190601f16801561040e5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015610441578181015183820152602001610429565b50505050905090810190601f16801561046e5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561049057600080fd5b50610176611528565b3480156104a557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff1695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b60ff8b35169b909a90999401975091955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506115449650505050505050565b3480156105dc57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff16953695604494919390910191908190840183828082843750949750611cbc9650505050505050565b34801561065057600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166120d9565b34801561067e57600080fd5b506101766004356123ce565b34801561069657600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a9436949293602493928401919081908401838280828437509497506124039650505050505050565b3480156106ef57600080fd5b506106f86124e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073457818101518382015260200161071c565b505050509050019250505060405180910390f35b34801561075457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506125539650505050505050565b3480156107c857600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a94369492936024939284019190819084018382808284375094975061271e9650505050505050565b34801561082157600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506127799650505050505050565b34801561089557600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff60043516612b95565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146108dc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561091157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660048481548110151561093757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161461096357600080fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061099357fe5b6000918252602090912001546004805473ffffffffffffffffffffffffffffffffffffffff90921691859081106109c657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610a459082612c19565b5073ffffffffffffffffffffffffffffffffffffffff80851660009081526001602081815260409283902080546003820154855160ff90911695810186905260a0808252838601805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9882161561010002989098011687900491830182905293995091909616957f32c54f1e2ea75844ded7517e7dbcd3895da7cd0c28f9ab9f9cf6ecf5f83762c695929489019360048a019260058b0192918291908201906060830190608084019060c08501908b908015610b655780601f10610b3a57610100808354040283529160200191610b65565b820191906000526020600020905b815481529060010190602001808311610b4857829003601f168201915b50508581038452895460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116048082526020909101908a908015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b50508581038352875460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019088908015610c895780601f10610c5e57610100808354040283529160200191610c89565b820191906000526020600020905b815481529060010190602001808311610c6c57829003601f168201915b50508581038252865460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019087908015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050995050505050505050505060405180910390a26002826002016040518082805460018160011615610100020316600290048015610d915780601f10610d6f576101008083540402835291820191610d91565b820191906000526020600020905b815481529060010190602001808311610d7d575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556003826001016040518082805460018160011615610100020316600290048015610e285780601f10610e06576101008083540402835291820191610e28565b820191906000526020600020905b815481529060010190602001808311610e14575b50509283525050604080516020928190038301902080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff871660009081526001938490529182208054909116815591610e9f90830182612c42565b610ead600283016000612c42565b6003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610ee5600483016000612c42565b610ef3600583016000612c42565b505050505050565b60006003826040518082805190602001908083835b60208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16949350505050565b600060028260405180828051906020019080838360208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461102b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561106057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600582018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507fc3168fdc13112e44a031057dbf6c609b33353addb4d8037d24543e22cbfe2acd93889282919082019060608301908690801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611180578181015183820152602001611168565b50505050905090810190601f1680156111ad5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060058401906020860190612c86565b5050505050565b600060608060006060806111ea612d04565b73ffffffffffffffffffffffffffffffffffffffff888116600090815260016020818152604092839020835160c0810185528154909516855280830180548551600261010096831615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911694909404601f8101849004840285018401909552848452909385830193928301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b5050509183525050600282810180546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931694909404601f8101839004830285018301909152808452938101939083018282801561137b5780601f106113505761010080835404028352916020019161137b565b820191906000526020600020905b81548152906001019060200180831161135e57829003601f168201915b5050509183525050600382015460ff1660208083019190915260048301805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600186161561010002019094169390930492830185900485028101850182528281529401939283018282801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050918352505060058201805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529382019392918301828280156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b5050509190925250508151602083015160408401516060850151608086015160a090960151939e929d50909b5099509297509550909350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461156857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600160205260409020548791161561159c57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff811615156115bf57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061162857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115eb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611699905057600080fd5b87600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831061170257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016116c5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611773905057600080fd5b6040805160c08101825273ffffffffffffffffffffffffffffffffffffffff8c811680835260208084018e81528486018e905260ff8d166060860152608085018c905260a085018b90526000928352600180835295909220845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783559051805193949293611812938501929190910190612c86565b506040820151805161182e916002840191602090910190612c86565b5060608201516003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560808201518051611882916004840191602090910190612c86565b5060a0820151805161189e916005840191602090910190612c86565b5050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d161790555060405188518b916002918b9190819060208401908083835b6020831061196657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611929565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250604051938490038101842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff969096169590951790945550508a518c926003928d9290918291908401908083835b60208310611a4757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611a0a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060408051948590038201852080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff97881617905560ff8d169085015260a08085528e51908501528d51948f16947fd8d928b0b50ca11d9dc273236b46f3526515b03602f71f3a6af4f45bd9fa9144948f94508e93508d928d928d92918291828201916060840191608085019160c0860191908c019080838360005b83811015611b4f578181015183820152602001611b37565b50505050905090810190601f168015611b7c5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015611baf578181015183820152602001611b97565b50505050905090810190601f168015611bdc5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b83811015611c0f578181015183820152602001611bf7565b50505050905090810190601f168015611c3c5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015611c6f578181015183820152602001611c57565b50505050905090810190601f168015611c9c5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a250505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314611ce157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160205260409020548491161515611d1657600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b60208310611d7f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611d42565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611df0905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481528184018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529097507f4a6dbfc867b179991dec22ff19960f0a94d8d9d891fc556f547764670340e8ae938992829190820190606083019086908015611edb5780601f10611eb057610100808354040283529160200191611edb565b820191906000526020600020905b815481529060010190602001808311611ebe57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611f0f578181015183820152602001611ef7565b50505050905090810190601f168015611f3c5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26003836001016040518082805460018160011615610100020316600290048015611fac5780601f10611f8a576101008083540402835291820191611fac565b820191906000526020600020905b815481529060010190602001808311611f98575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600392889282918401908083835b6020831061203657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611ff9565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506001860191870190612c86565b600160208181526000928352604092839020805481840180548651600261010097831615979097027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911695909504601f810185900485028601850190965285855273ffffffffffffffffffffffffffffffffffffffff909116949193929091908301828280156121ad5780601f10612182576101008083540402835291602001916121ad565b820191906000526020600020905b81548152906001019060200180831161219057829003601f168201915b50505060028085018054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169590950492830185900485028101850190915281815295969594509092509083018282801561225d5780601f106122325761010080835404028352916020019161225d565b820191906000526020600020905b81548152906001019060200180831161224057829003601f168201915b50505050600383015460048401805460408051602060026101006001861615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152959660ff90941695939450908301828280156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b5050505060058301805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529495949350908301828280156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b5050505050905086565b60048054829081106123dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000606080600060608060006003886040518082805190602001908083835b6020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff1692506124ce91508290506111d8565b949d939c50919a509850965090945092505050565b6060600480548060200260200160405190810160405280929190818152602001828054801561254857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161251d575b505050505090505b90565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461257857600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156125ad57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600482018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507f5b19f79ac4e8cfa820815502e11615f1a449e28155dc289ec5cac1a11f9086949388928291908201906060830190869080156126995780601f1061266e57610100808354040283529160200191612699565b820191906000526020600020905b81548152906001019060200180831161267c57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156126cd5781810151838201526020016126b5565b50505050905090810190601f1680156126fa5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060048401906020860190612c86565b6000606080600060608060006002886040518082805190602001908083836020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461279e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156127d357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061283c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016127ff565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff169290921491506128ad905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481526002808301805495861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909516049481018590529097507f53d878a6530e56c9bc96548fa0a8cae4f1d1f49c86b0e934c086b992ebb6998f9389928291908201906060830190869080156129975780601f1061296c57610100808354040283529160200191612997565b820191906000526020600020905b81548152906001019060200180831161297a57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156129cb5781810151838201526020016129b3565b50505050905090810190601f1680156129f85780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26002836002016040518082805460018160011615610100020316600290048015612a685780601f10612a46576101008083540402835291820191612a68565b820191906000526020600020905b815481529060010190602001808311612a54575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600292889282918401908083835b60208310612af257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ab5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506002860191870190612c86565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bb957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811615612c1657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115612c3d57600083815260209020612c3d918101908301612d54565b505050565b50805460018160011615610100020316600290046000825580601f10612c685750612c16565b601f016020900490600052602060002090810190612c169190612d54565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612cc757805160ff1916838001178555612cf4565b82800160010185558215612cf4579182015b82811115612cf4578251825591602001919060010190612cd9565b50612d00929150612d54565b5090565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160608152602001606081525090565b61255091905b80821115612d005760008155600101612d5a5600a165627a7a72305820a2b015e1c6a978406b24e8687202ced017fe0b041c7b9b9d741eb9bcb14a014e0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x2D9A DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE5 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x13BAF1E6 DUP2 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x2FBFEBA9 EQ PUSH2 0x11D JUMPI DUP1 PUSH4 0x3550B6D9 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x56318820 EQ PUSH2 0x1F8 JUMPI DUP1 PUSH4 0x7ABCCAC9 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xA880319D EQ PUSH2 0x499 JUMPI DUP1 PUSH4 0xC370C86D EQ PUSH2 0x5D0 JUMPI DUP1 PUSH4 0xE4860339 EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0xE5DF8B84 EQ PUSH2 0x672 JUMPI DUP1 PUSH4 0xE73FC0C3 EQ PUSH2 0x68A JUMPI DUP1 PUSH4 0xEE8C24B8 EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0xEEF05F65 EQ PUSH2 0x748 JUMPI DUP1 PUSH4 0xEFA74F1F EQ PUSH2 0x7BC JUMPI DUP1 PUSH4 0xF036417F EQ PUSH2 0x815 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x889 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x8B7 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x129 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xEFB SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xFB5 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1006 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x11D8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x321 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x309 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x34E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x381 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x369 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3AE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x441 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x429 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x46E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x1528 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP2 DUP11 ADD CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD DUP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 PUSH1 0xFF DUP12 CALLDATALOAD AND SWAP12 SWAP1 SWAP11 SWAP1 SWAP10 SWAP5 ADD SWAP8 POP SWAP2 SWAP6 POP SWAP2 DUP3 ADD SWAP4 POP SWAP2 POP DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1544 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1CBC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x20D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH1 0x4 CALLDATALOAD PUSH2 0x23CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x696 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2403 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6F8 PUSH2 0x24E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x734 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x71C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2553 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x271E SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x821 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2779 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x8DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x937 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x963 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x993 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x4 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP6 SWAP1 DUP2 LT PUSH2 0x9C6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xA45 SWAP1 DUP3 PUSH2 0x2C19 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x3 DUP3 ADD SLOAD DUP6 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP6 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP1 DUP3 MSTORE DUP4 DUP7 ADD DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 DUP3 AND ISZERO PUSH2 0x100 MUL SWAP9 SWAP1 SWAP9 ADD AND DUP8 SWAP1 DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE SWAP4 SWAP10 POP SWAP2 SWAP1 SWAP7 AND SWAP6 PUSH32 0x32C54F1E2EA75844DED7517E7DBCD3895DA7CD0C28F9AB9F9CF6ECF5F83762C6 SWAP6 SWAP3 SWAP5 DUP10 ADD SWAP4 PUSH1 0x4 DUP11 ADD SWAP3 PUSH1 0x5 DUP12 ADD SWAP3 SWAP2 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 PUSH1 0x80 DUP5 ADD SWAP1 PUSH1 0xC0 DUP6 ADD SWAP1 DUP12 SWAP1 DUP1 ISZERO PUSH2 0xB65 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB3A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB65 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB48 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP11 SWAP1 DUP1 ISZERO PUSH2 0xBF7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBCC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBF7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBDA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP9 SWAP1 DUP1 ISZERO PUSH2 0xC89 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC5E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC89 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC6C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP8 SWAP1 DUP1 ISZERO PUSH2 0xD1B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCF0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD1B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCFE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP3 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD6F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xD91 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD7D JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x3 DUP3 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xE28 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xE06 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xE28 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE14 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 SWAP3 DUP2 SWAP1 SUB DUP4 ADD SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP4 DUP5 SWAP1 MSTORE SWAP2 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND DUP2 SSTORE SWAP2 PUSH2 0xE9F SWAP1 DUP4 ADD DUP3 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEAD PUSH1 0x2 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH2 0xEE5 PUSH1 0x4 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEF3 PUSH1 0x5 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x102B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1060 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0xC3168FDC13112E44A031057DBF6C609B33353ADDB4D8037D24543E22CBFE2ACD SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x114C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1121 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x114C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x112F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1180 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1168 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11AD JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x5 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x11EA PUSH2 0x2D04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD PUSH1 0xC0 DUP2 ADD DUP6 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE DUP1 DUP4 ADD DUP1 SLOAD DUP6 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP7 DUP4 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE SWAP1 SWAP4 DUP6 DUP4 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x12CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x12A0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x12CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12AE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x2 DUP3 DUP2 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP4 SWAP1 DIV DUP4 MUL DUP6 ADD DUP4 ADD SWAP1 SWAP2 MSTORE DUP1 DUP5 MSTORE SWAP4 DUP2 ADD SWAP4 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x137B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1350 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x137B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x135E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0xFF AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 DUP7 AND ISZERO PUSH2 0x100 MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD DUP3 MSTORE DUP3 DUP2 MSTORE SWAP5 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x143A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x140F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x143A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x141D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14C1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14CF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0xA0 SWAP1 SWAP7 ADD MLOAD SWAP4 SWAP15 SWAP3 SWAP14 POP SWAP1 SWAP12 POP SWAP10 POP SWAP3 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP8 SWAP2 AND ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x15BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1628 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15EB JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1699 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1702 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x16C5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1773 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0x20 DUP1 DUP5 ADD DUP15 DUP2 MSTORE DUP5 DUP7 ADD DUP15 SWAP1 MSTORE PUSH1 0xFF DUP14 AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x80 DUP6 ADD DUP13 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD DUP12 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 DUP1 DUP4 MSTORE SWAP6 SWAP1 SWAP3 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE SWAP1 MLOAD DUP1 MLOAD SWAP4 SWAP5 SWAP3 SWAP4 PUSH2 0x1812 SWAP4 DUP6 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x182E SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x1882 SWAP2 PUSH1 0x4 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x189E SWAP2 PUSH1 0x5 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x8A35ACFBC15FF81A39AE7D344FD709F28E8600B4AA8C65C6B64BFE7FE36BD19B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND OR SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP9 MLOAD DUP12 SWAP2 PUSH1 0x2 SWAP2 DUP12 SWAP2 SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1966 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1929 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE POP POP DUP11 MLOAD DUP13 SWAP3 PUSH1 0x3 SWAP3 DUP14 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1A47 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1A0A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 SWAP1 SUB DUP3 ADD DUP6 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND OR SWAP1 SSTORE PUSH1 0xFF DUP14 AND SWAP1 DUP6 ADD MSTORE PUSH1 0xA0 DUP1 DUP6 MSTORE DUP15 MLOAD SWAP1 DUP6 ADD MSTORE DUP14 MLOAD SWAP5 DUP16 AND SWAP5 PUSH32 0xD8D928B0B50CA11D9DC273236B46F3526515B03602F71F3A6AF4F45BD9FA9144 SWAP5 DUP16 SWAP5 POP DUP15 SWAP4 POP DUP14 SWAP3 DUP14 SWAP3 DUP14 SWAP3 SWAP2 DUP3 SWAP2 DUP3 DUP3 ADD SWAP2 PUSH1 0x60 DUP5 ADD SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 PUSH1 0xC0 DUP7 ADD SWAP2 SWAP1 DUP13 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B4F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B37 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B7C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B97 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BDC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1BF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1C57 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C9C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1CE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1D16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D7F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1D42 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1DF0 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE DUP2 DUP5 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x4A6DBFC867B179991DEC22FF19960F0A94D8D9D891FC556F547764670340E8AE SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x1EDB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1EB0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EDB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1EBE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1EF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1F3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x3 DUP4 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1FAC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F8A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x1FAC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F98 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x3 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2036 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1FF9 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x1 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD DUP2 DUP5 ADD DUP1 SLOAD DUP7 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP8 DUP4 AND ISZERO SWAP8 SWAP1 SWAP8 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP6 SWAP1 SWAP6 DIV PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP5 SWAP2 SWAP4 SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x21AD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2182 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x21AD JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2190 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP6 SWAP1 SWAP6 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 SWAP6 SWAP5 POP SWAP1 SWAP3 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x225D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2232 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x225D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2240 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 PUSH1 0xFF SWAP1 SWAP5 AND SWAP6 SWAP4 SWAP5 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2316 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x22EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2316 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x22F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x5 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP5 SWAP6 SWAP5 SWAP4 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x23C4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2399 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x23C4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x23A7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP7 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x23DC JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x3 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 POP PUSH2 0x24CE SWAP2 POP DUP3 SWAP1 POP PUSH2 0x11D8 JUMP JUMPDEST SWAP5 SWAP14 SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2548 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x251D JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x25AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0x5B19F79AC4E8CFA820815502E11615F1A449E28155DC289EC5CAC1A11F908694 SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2699 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x266E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2699 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x267C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26CD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x26B5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x26FA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x4 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x279E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x27D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x283C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x27FF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x28AD SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x2 DUP1 DUP4 ADD DUP1 SLOAD SWAP6 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x53D878A6530E56C9BC96548FA0A8CAE4F1D1F49C86B0E934C086B992EBB6998F SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2997 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x296C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2997 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x297A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x29CB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x29B3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2A68 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x2A68 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A54 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x2 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2AF2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AB5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x2 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2C3D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x2C3D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x2D54 JUMP JUMPDEST POP POP POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x2C68 JUMPI POP PUSH2 0x2C16 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2C16 SWAP2 SWAP1 PUSH2 0x2D54 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2CC7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2CF4 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2CF4 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2CF4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2CD9 JUMP JUMPDEST POP PUSH2 0x2D00 SWAP3 SWAP2 POP PUSH2 0x2D54 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x2550 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2D00 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2D5A JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 LOG2 0xb0 ISZERO 0xe1 0xc6 0xa9 PUSH25 0x406B24E8687202CED017FE0B041C7B9B9D741EB9BCB14A014E STOP 0x29 ",
"sourceMap": "886:8364:1:-;;;282:5:0;:18;;-1:-1:-1;;;;;;282:18:0;290:10;282:18;;;886:8364:1;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
- "object": "0x6080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166313baf1e681146100ea5780632fbfeba91461011d5780633550b6d91461019f57806356318820146101f85780637abccac91461026c5780638da5cb5b14610484578063a880319d14610499578063c370c86d146105d0578063e486033914610644578063e5df8b8414610672578063e73fc0c31461068a578063ee8c24b8146106e3578063eef05f6514610748578063efa74f1f146107bc578063f036417f14610815578063f2fde38b14610889575b600080fd5b3480156100f657600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff600435166024356108b7565b005b34801561012957600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610efb9650505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ab57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610fb59650505050505050565b34801561020457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506110069650505050505050565b34801561027857600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166111d8565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610321578181015183820152602001610309565b50505050905090810190601f16801561034e5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015610381578181015183820152602001610369565b50505050905090810190601f1680156103ae5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b838110156103e15781810151838201526020016103c9565b50505050905090810190601f16801561040e5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015610441578181015183820152602001610429565b50505050905090810190601f16801561046e5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561049057600080fd5b50610176611528565b3480156104a557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff1695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b60ff8b35169b909a90999401975091955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506115449650505050505050565b3480156105dc57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff16953695604494919390910191908190840183828082843750949750611cbc9650505050505050565b34801561065057600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166120d9565b34801561067e57600080fd5b506101766004356123ce565b34801561069657600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a9436949293602493928401919081908401838280828437509497506124039650505050505050565b3480156106ef57600080fd5b506106f86124e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073457818101518382015260200161071c565b505050509050019250505060405180910390f35b34801561075457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506125539650505050505050565b3480156107c857600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a94369492936024939284019190819084018382808284375094975061271e9650505050505050565b34801561082157600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506127799650505050505050565b34801561089557600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff60043516612b95565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146108dc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561091157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660048481548110151561093757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161461096357600080fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061099357fe5b6000918252602090912001546004805473ffffffffffffffffffffffffffffffffffffffff90921691859081106109c657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610a459082612c19565b5073ffffffffffffffffffffffffffffffffffffffff80851660009081526001602081815260409283902080546003820154855160ff90911695810186905260a0808252838601805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9882161561010002989098011687900491830182905293995091909616957f32c54f1e2ea75844ded7517e7dbcd3895da7cd0c28f9ab9f9cf6ecf5f83762c695929489019360048a019260058b0192918291908201906060830190608084019060c08501908b908015610b655780601f10610b3a57610100808354040283529160200191610b65565b820191906000526020600020905b815481529060010190602001808311610b4857829003601f168201915b50508581038452895460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116048082526020909101908a908015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b50508581038352875460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019088908015610c895780601f10610c5e57610100808354040283529160200191610c89565b820191906000526020600020905b815481529060010190602001808311610c6c57829003601f168201915b50508581038252865460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019087908015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050995050505050505050505060405180910390a26002826002016040518082805460018160011615610100020316600290048015610d915780601f10610d6f576101008083540402835291820191610d91565b820191906000526020600020905b815481529060010190602001808311610d7d575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556003826001016040518082805460018160011615610100020316600290048015610e285780601f10610e06576101008083540402835291820191610e28565b820191906000526020600020905b815481529060010190602001808311610e14575b50509283525050604080516020928190038301902080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff871660009081526001938490529182208054909116815591610e9f90830182612c42565b610ead600283016000612c42565b6003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610ee5600483016000612c42565b610ef3600583016000612c42565b505050505050565b60006003826040518082805190602001908083835b60208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16949350505050565b600060028260405180828051906020019080838360208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461102b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561106057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600582018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507fc3168fdc13112e44a031057dbf6c609b33353addb4d8037d24543e22cbfe2acd93889282919082019060608301908690801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611180578181015183820152602001611168565b50505050905090810190601f1680156111ad5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060058401906020860190612c86565b5050505050565b600060608060006060806111ea612d04565b73ffffffffffffffffffffffffffffffffffffffff888116600090815260016020818152604092839020835160c0810185528154909516855280830180548551600261010096831615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911694909404601f8101849004840285018401909552848452909385830193928301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b5050509183525050600282810180546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931694909404601f8101839004830285018301909152808452938101939083018282801561137b5780601f106113505761010080835404028352916020019161137b565b820191906000526020600020905b81548152906001019060200180831161135e57829003601f168201915b5050509183525050600382015460ff1660208083019190915260048301805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600186161561010002019094169390930492830185900485028101850182528281529401939283018282801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050918352505060058201805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529382019392918301828280156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b5050509190925250508151602083015160408401516060850151608086015160a090960151939e929d50909b5099509297509550909350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461156857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600160205260409020548791161561159c57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff811615156115bf57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061162857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115eb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611699905057600080fd5b87600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831061170257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016116c5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611773905057600080fd5b6040805160c08101825273ffffffffffffffffffffffffffffffffffffffff8c811680835260208084018e81528486018e905260ff8d166060860152608085018c905260a085018b90526000928352600180835295909220845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783559051805193949293611812938501929190910190612c86565b506040820151805161182e916002840191602090910190612c86565b5060608201516003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560808201518051611882916004840191602090910190612c86565b5060a0820151805161189e916005840191602090910190612c86565b5050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d161790555060405188518b916002918b9190819060208401908083835b6020831061196657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611929565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250604051938490038101842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff969096169590951790945550508a518c926003928d9290918291908401908083835b60208310611a4757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611a0a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060408051948590038201852080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff97881617905560ff8d169085015260a08085528e51908501528d51948f16947fd8d928b0b50ca11d9dc273236b46f3526515b03602f71f3a6af4f45bd9fa9144948f94508e93508d928d928d92918291828201916060840191608085019160c0860191908c019080838360005b83811015611b4f578181015183820152602001611b37565b50505050905090810190601f168015611b7c5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015611baf578181015183820152602001611b97565b50505050905090810190601f168015611bdc5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b83811015611c0f578181015183820152602001611bf7565b50505050905090810190601f168015611c3c5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015611c6f578181015183820152602001611c57565b50505050905090810190601f168015611c9c5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a250505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314611ce157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160205260409020548491161515611d1657600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b60208310611d7f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611d42565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611df0905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481528184018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529097507f4a6dbfc867b179991dec22ff19960f0a94d8d9d891fc556f547764670340e8ae938992829190820190606083019086908015611edb5780601f10611eb057610100808354040283529160200191611edb565b820191906000526020600020905b815481529060010190602001808311611ebe57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611f0f578181015183820152602001611ef7565b50505050905090810190601f168015611f3c5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26003836001016040518082805460018160011615610100020316600290048015611fac5780601f10611f8a576101008083540402835291820191611fac565b820191906000526020600020905b815481529060010190602001808311611f98575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600392889282918401908083835b6020831061203657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611ff9565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506001860191870190612c86565b600160208181526000928352604092839020805481840180548651600261010097831615979097027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911695909504601f810185900485028601850190965285855273ffffffffffffffffffffffffffffffffffffffff909116949193929091908301828280156121ad5780601f10612182576101008083540402835291602001916121ad565b820191906000526020600020905b81548152906001019060200180831161219057829003601f168201915b50505060028085018054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169590950492830185900485028101850190915281815295969594509092509083018282801561225d5780601f106122325761010080835404028352916020019161225d565b820191906000526020600020905b81548152906001019060200180831161224057829003601f168201915b50505050600383015460048401805460408051602060026101006001861615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152959660ff90941695939450908301828280156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b5050505060058301805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529495949350908301828280156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b5050505050905086565b60048054829081106123dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000606080600060608060006003886040518082805190602001908083835b6020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff1692506124ce91508290506111d8565b949d939c50919a509850965090945092505050565b6060600480548060200260200160405190810160405280929190818152602001828054801561254857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161251d575b505050505090505b90565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461257857600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156125ad57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600482018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507f5b19f79ac4e8cfa820815502e11615f1a449e28155dc289ec5cac1a11f9086949388928291908201906060830190869080156126995780601f1061266e57610100808354040283529160200191612699565b820191906000526020600020905b81548152906001019060200180831161267c57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156126cd5781810151838201526020016126b5565b50505050905090810190601f1680156126fa5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060048401906020860190612c86565b6000606080600060608060006002886040518082805190602001908083836020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461279e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156127d357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061283c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016127ff565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff169290921491506128ad905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481526002808301805495861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909516049481018590529097507f53d878a6530e56c9bc96548fa0a8cae4f1d1f49c86b0e934c086b992ebb6998f9389928291908201906060830190869080156129975780601f1061296c57610100808354040283529160200191612997565b820191906000526020600020905b81548152906001019060200180831161297a57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156129cb5781810151838201526020016129b3565b50505050905090810190601f1680156129f85780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26002836002016040518082805460018160011615610100020316600290048015612a685780601f10612a46576101008083540402835291820191612a68565b820191906000526020600020905b815481529060010190602001808311612a54575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600292889282918401908083835b60208310612af257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ab5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506002860191870190612c86565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bb957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811615612c1657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115612c3d57600083815260209020612c3d918101908301612d54565b505050565b50805460018160011615610100020316600290046000825580601f10612c685750612c16565b601f016020900490600052602060002090810190612c169190612d54565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612cc757805160ff1916838001178555612cf4565b82800160010185558215612cf4579182015b82811115612cf4578251825591602001919060010190612cd9565b50612d00929150612d54565b5090565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160608152602001606081525090565b61255091905b80821115612d005760008155600101612d5a5600a165627a7a7230582084e95a0a2a2f6b98236222635755a082c937f66b7dd9529673a6c9fe221f8eb00029",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE5 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x13BAF1E6 DUP2 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x2FBFEBA9 EQ PUSH2 0x11D JUMPI DUP1 PUSH4 0x3550B6D9 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x56318820 EQ PUSH2 0x1F8 JUMPI DUP1 PUSH4 0x7ABCCAC9 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xA880319D EQ PUSH2 0x499 JUMPI DUP1 PUSH4 0xC370C86D EQ PUSH2 0x5D0 JUMPI DUP1 PUSH4 0xE4860339 EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0xE5DF8B84 EQ PUSH2 0x672 JUMPI DUP1 PUSH4 0xE73FC0C3 EQ PUSH2 0x68A JUMPI DUP1 PUSH4 0xEE8C24B8 EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0xEEF05F65 EQ PUSH2 0x748 JUMPI DUP1 PUSH4 0xEFA74F1F EQ PUSH2 0x7BC JUMPI DUP1 PUSH4 0xF036417F EQ PUSH2 0x815 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x889 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x8B7 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x129 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xEFB SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xFB5 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1006 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x11D8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x321 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x309 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x34E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x381 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x369 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3AE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x441 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x429 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x46E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x1528 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP2 DUP11 ADD CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD DUP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 PUSH1 0xFF DUP12 CALLDATALOAD AND SWAP12 SWAP1 SWAP11 SWAP1 SWAP10 SWAP5 ADD SWAP8 POP SWAP2 SWAP6 POP SWAP2 DUP3 ADD SWAP4 POP SWAP2 POP DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1544 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1CBC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x20D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH1 0x4 CALLDATALOAD PUSH2 0x23CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x696 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2403 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6F8 PUSH2 0x24E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x734 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x71C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2553 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x271E SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x821 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2779 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x8DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x937 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x963 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x993 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x4 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP6 SWAP1 DUP2 LT PUSH2 0x9C6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xA45 SWAP1 DUP3 PUSH2 0x2C19 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x3 DUP3 ADD SLOAD DUP6 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP6 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP1 DUP3 MSTORE DUP4 DUP7 ADD DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 DUP3 AND ISZERO PUSH2 0x100 MUL SWAP9 SWAP1 SWAP9 ADD AND DUP8 SWAP1 DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE SWAP4 SWAP10 POP SWAP2 SWAP1 SWAP7 AND SWAP6 PUSH32 0x32C54F1E2EA75844DED7517E7DBCD3895DA7CD0C28F9AB9F9CF6ECF5F83762C6 SWAP6 SWAP3 SWAP5 DUP10 ADD SWAP4 PUSH1 0x4 DUP11 ADD SWAP3 PUSH1 0x5 DUP12 ADD SWAP3 SWAP2 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 PUSH1 0x80 DUP5 ADD SWAP1 PUSH1 0xC0 DUP6 ADD SWAP1 DUP12 SWAP1 DUP1 ISZERO PUSH2 0xB65 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB3A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB65 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB48 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP11 SWAP1 DUP1 ISZERO PUSH2 0xBF7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBCC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBF7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBDA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP9 SWAP1 DUP1 ISZERO PUSH2 0xC89 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC5E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC89 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC6C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP8 SWAP1 DUP1 ISZERO PUSH2 0xD1B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCF0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD1B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCFE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP3 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD6F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xD91 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD7D JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x3 DUP3 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xE28 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xE06 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xE28 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE14 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 SWAP3 DUP2 SWAP1 SUB DUP4 ADD SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP4 DUP5 SWAP1 MSTORE SWAP2 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND DUP2 SSTORE SWAP2 PUSH2 0xE9F SWAP1 DUP4 ADD DUP3 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEAD PUSH1 0x2 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH2 0xEE5 PUSH1 0x4 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEF3 PUSH1 0x5 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x102B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1060 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0xC3168FDC13112E44A031057DBF6C609B33353ADDB4D8037D24543E22CBFE2ACD SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x114C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1121 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x114C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x112F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1180 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1168 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11AD JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x5 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x11EA PUSH2 0x2D04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD PUSH1 0xC0 DUP2 ADD DUP6 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE DUP1 DUP4 ADD DUP1 SLOAD DUP6 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP7 DUP4 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE SWAP1 SWAP4 DUP6 DUP4 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x12CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x12A0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x12CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12AE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x2 DUP3 DUP2 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP4 SWAP1 DIV DUP4 MUL DUP6 ADD DUP4 ADD SWAP1 SWAP2 MSTORE DUP1 DUP5 MSTORE SWAP4 DUP2 ADD SWAP4 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x137B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1350 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x137B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x135E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0xFF AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 DUP7 AND ISZERO PUSH2 0x100 MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD DUP3 MSTORE DUP3 DUP2 MSTORE SWAP5 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x143A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x140F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x143A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x141D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14C1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14CF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0xA0 SWAP1 SWAP7 ADD MLOAD SWAP4 SWAP15 SWAP3 SWAP14 POP SWAP1 SWAP12 POP SWAP10 POP SWAP3 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP8 SWAP2 AND ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x15BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1628 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15EB JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1699 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1702 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x16C5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1773 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0x20 DUP1 DUP5 ADD DUP15 DUP2 MSTORE DUP5 DUP7 ADD DUP15 SWAP1 MSTORE PUSH1 0xFF DUP14 AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x80 DUP6 ADD DUP13 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD DUP12 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 DUP1 DUP4 MSTORE SWAP6 SWAP1 SWAP3 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE SWAP1 MLOAD DUP1 MLOAD SWAP4 SWAP5 SWAP3 SWAP4 PUSH2 0x1812 SWAP4 DUP6 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x182E SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x1882 SWAP2 PUSH1 0x4 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x189E SWAP2 PUSH1 0x5 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x8A35ACFBC15FF81A39AE7D344FD709F28E8600B4AA8C65C6B64BFE7FE36BD19B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND OR SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP9 MLOAD DUP12 SWAP2 PUSH1 0x2 SWAP2 DUP12 SWAP2 SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1966 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1929 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE POP POP DUP11 MLOAD DUP13 SWAP3 PUSH1 0x3 SWAP3 DUP14 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1A47 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1A0A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 SWAP1 SUB DUP3 ADD DUP6 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND OR SWAP1 SSTORE PUSH1 0xFF DUP14 AND SWAP1 DUP6 ADD MSTORE PUSH1 0xA0 DUP1 DUP6 MSTORE DUP15 MLOAD SWAP1 DUP6 ADD MSTORE DUP14 MLOAD SWAP5 DUP16 AND SWAP5 PUSH32 0xD8D928B0B50CA11D9DC273236B46F3526515B03602F71F3A6AF4F45BD9FA9144 SWAP5 DUP16 SWAP5 POP DUP15 SWAP4 POP DUP14 SWAP3 DUP14 SWAP3 DUP14 SWAP3 SWAP2 DUP3 SWAP2 DUP3 DUP3 ADD SWAP2 PUSH1 0x60 DUP5 ADD SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 PUSH1 0xC0 DUP7 ADD SWAP2 SWAP1 DUP13 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B4F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B37 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B7C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B97 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BDC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1BF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1C57 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C9C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1CE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1D16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D7F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1D42 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1DF0 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE DUP2 DUP5 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x4A6DBFC867B179991DEC22FF19960F0A94D8D9D891FC556F547764670340E8AE SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x1EDB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1EB0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EDB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1EBE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1EF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1F3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x3 DUP4 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1FAC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F8A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x1FAC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F98 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x3 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2036 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1FF9 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x1 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD DUP2 DUP5 ADD DUP1 SLOAD DUP7 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP8 DUP4 AND ISZERO SWAP8 SWAP1 SWAP8 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP6 SWAP1 SWAP6 DIV PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP5 SWAP2 SWAP4 SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x21AD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2182 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x21AD JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2190 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP6 SWAP1 SWAP6 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 SWAP6 SWAP5 POP SWAP1 SWAP3 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x225D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2232 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x225D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2240 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 PUSH1 0xFF SWAP1 SWAP5 AND SWAP6 SWAP4 SWAP5 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2316 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x22EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2316 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x22F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x5 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP5 SWAP6 SWAP5 SWAP4 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x23C4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2399 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x23C4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x23A7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP7 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x23DC JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x3 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 POP PUSH2 0x24CE SWAP2 POP DUP3 SWAP1 POP PUSH2 0x11D8 JUMP JUMPDEST SWAP5 SWAP14 SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2548 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x251D JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x25AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0x5B19F79AC4E8CFA820815502E11615F1A449E28155DC289EC5CAC1A11F908694 SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2699 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x266E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2699 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x267C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26CD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x26B5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x26FA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x4 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x279E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x27D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x283C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x27FF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x28AD SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x2 DUP1 DUP4 ADD DUP1 SLOAD SWAP6 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x53D878A6530E56C9BC96548FA0A8CAE4F1D1F49C86B0E934C086B992EBB6998F SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2997 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x296C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2997 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x297A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x29CB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x29B3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2A68 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x2A68 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A54 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x2 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2AF2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AB5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x2 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2C3D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x2C3D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x2D54 JUMP JUMPDEST POP POP POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x2C68 JUMPI POP PUSH2 0x2C16 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2C16 SWAP2 SWAP1 PUSH2 0x2D54 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2CC7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2CF4 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2CF4 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2CF4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2CD9 JUMP JUMPDEST POP PUSH2 0x2D00 SWAP3 SWAP2 POP PUSH2 0x2D54 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x2550 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2D00 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2D5A JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP5 0xe9 GAS EXP 0x2a 0x2f PUSH12 0x98236222635755A082C937F6 PUSH12 0x7DD9529673A6C9FE221F8EB0 STOP 0x29 ",
+ "object": "0x6080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166313baf1e681146100ea5780632fbfeba91461011d5780633550b6d91461019f57806356318820146101f85780637abccac91461026c5780638da5cb5b14610484578063a880319d14610499578063c370c86d146105d0578063e486033914610644578063e5df8b8414610672578063e73fc0c31461068a578063ee8c24b8146106e3578063eef05f6514610748578063efa74f1f146107bc578063f036417f14610815578063f2fde38b14610889575b600080fd5b3480156100f657600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff600435166024356108b7565b005b34801561012957600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610efb9650505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ab57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610fb59650505050505050565b34801561020457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506110069650505050505050565b34801561027857600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166111d8565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610321578181015183820152602001610309565b50505050905090810190601f16801561034e5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015610381578181015183820152602001610369565b50505050905090810190601f1680156103ae5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b838110156103e15781810151838201526020016103c9565b50505050905090810190601f16801561040e5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015610441578181015183820152602001610429565b50505050905090810190601f16801561046e5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561049057600080fd5b50610176611528565b3480156104a557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff1695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b60ff8b35169b909a90999401975091955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506115449650505050505050565b3480156105dc57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff16953695604494919390910191908190840183828082843750949750611cbc9650505050505050565b34801561065057600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166120d9565b34801561067e57600080fd5b506101766004356123ce565b34801561069657600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a9436949293602493928401919081908401838280828437509497506124039650505050505050565b3480156106ef57600080fd5b506106f86124e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073457818101518382015260200161071c565b505050509050019250505060405180910390f35b34801561075457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506125539650505050505050565b3480156107c857600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a94369492936024939284019190819084018382808284375094975061271e9650505050505050565b34801561082157600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506127799650505050505050565b34801561089557600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff60043516612b95565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146108dc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561091157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660048481548110151561093757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161461096357600080fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061099357fe5b6000918252602090912001546004805473ffffffffffffffffffffffffffffffffffffffff90921691859081106109c657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610a459082612c19565b5073ffffffffffffffffffffffffffffffffffffffff80851660009081526001602081815260409283902080546003820154855160ff90911695810186905260a0808252838601805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9882161561010002989098011687900491830182905293995091909616957f32c54f1e2ea75844ded7517e7dbcd3895da7cd0c28f9ab9f9cf6ecf5f83762c695929489019360048a019260058b0192918291908201906060830190608084019060c08501908b908015610b655780601f10610b3a57610100808354040283529160200191610b65565b820191906000526020600020905b815481529060010190602001808311610b4857829003601f168201915b50508581038452895460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116048082526020909101908a908015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b50508581038352875460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019088908015610c895780601f10610c5e57610100808354040283529160200191610c89565b820191906000526020600020905b815481529060010190602001808311610c6c57829003601f168201915b50508581038252865460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019087908015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050995050505050505050505060405180910390a26002826002016040518082805460018160011615610100020316600290048015610d915780601f10610d6f576101008083540402835291820191610d91565b820191906000526020600020905b815481529060010190602001808311610d7d575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556003826001016040518082805460018160011615610100020316600290048015610e285780601f10610e06576101008083540402835291820191610e28565b820191906000526020600020905b815481529060010190602001808311610e14575b50509283525050604080516020928190038301902080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff871660009081526001938490529182208054909116815591610e9f90830182612c42565b610ead600283016000612c42565b6003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610ee5600483016000612c42565b610ef3600583016000612c42565b505050505050565b60006003826040518082805190602001908083835b60208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16949350505050565b600060028260405180828051906020019080838360208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461102b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561106057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600582018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507fc3168fdc13112e44a031057dbf6c609b33353addb4d8037d24543e22cbfe2acd93889282919082019060608301908690801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611180578181015183820152602001611168565b50505050905090810190601f1680156111ad5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060058401906020860190612c86565b5050505050565b600060608060006060806111ea612d04565b73ffffffffffffffffffffffffffffffffffffffff888116600090815260016020818152604092839020835160c0810185528154909516855280830180548551600261010096831615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911694909404601f8101849004840285018401909552848452909385830193928301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b5050509183525050600282810180546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931694909404601f8101839004830285018301909152808452938101939083018282801561137b5780601f106113505761010080835404028352916020019161137b565b820191906000526020600020905b81548152906001019060200180831161135e57829003601f168201915b5050509183525050600382015460ff1660208083019190915260048301805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600186161561010002019094169390930492830185900485028101850182528281529401939283018282801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050918352505060058201805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529382019392918301828280156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b5050509190925250508151602083015160408401516060850151608086015160a090960151939e929d50909b5099509297509550909350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461156857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600160205260409020548791161561159c57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff811615156115bf57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061162857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115eb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611699905057600080fd5b87600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831061170257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016116c5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611773905057600080fd5b6040805160c08101825273ffffffffffffffffffffffffffffffffffffffff8c811680835260208084018e81528486018e905260ff8d166060860152608085018c905260a085018b90526000928352600180835295909220845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783559051805193949293611812938501929190910190612c86565b506040820151805161182e916002840191602090910190612c86565b5060608201516003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560808201518051611882916004840191602090910190612c86565b5060a0820151805161189e916005840191602090910190612c86565b5050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d161790555060405188518b916002918b9190819060208401908083835b6020831061196657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611929565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250604051938490038101842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff969096169590951790945550508a518c926003928d9290918291908401908083835b60208310611a4757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611a0a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060408051948590038201852080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff97881617905560ff8d169085015260a08085528e51908501528d51948f16947fd8d928b0b50ca11d9dc273236b46f3526515b03602f71f3a6af4f45bd9fa9144948f94508e93508d928d928d92918291828201916060840191608085019160c0860191908c019080838360005b83811015611b4f578181015183820152602001611b37565b50505050905090810190601f168015611b7c5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015611baf578181015183820152602001611b97565b50505050905090810190601f168015611bdc5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b83811015611c0f578181015183820152602001611bf7565b50505050905090810190601f168015611c3c5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015611c6f578181015183820152602001611c57565b50505050905090810190601f168015611c9c5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a250505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314611ce157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160205260409020548491161515611d1657600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b60208310611d7f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611d42565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611df0905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481528184018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529097507f4a6dbfc867b179991dec22ff19960f0a94d8d9d891fc556f547764670340e8ae938992829190820190606083019086908015611edb5780601f10611eb057610100808354040283529160200191611edb565b820191906000526020600020905b815481529060010190602001808311611ebe57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611f0f578181015183820152602001611ef7565b50505050905090810190601f168015611f3c5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26003836001016040518082805460018160011615610100020316600290048015611fac5780601f10611f8a576101008083540402835291820191611fac565b820191906000526020600020905b815481529060010190602001808311611f98575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600392889282918401908083835b6020831061203657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611ff9565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506001860191870190612c86565b600160208181526000928352604092839020805481840180548651600261010097831615979097027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911695909504601f810185900485028601850190965285855273ffffffffffffffffffffffffffffffffffffffff909116949193929091908301828280156121ad5780601f10612182576101008083540402835291602001916121ad565b820191906000526020600020905b81548152906001019060200180831161219057829003601f168201915b50505060028085018054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169590950492830185900485028101850190915281815295969594509092509083018282801561225d5780601f106122325761010080835404028352916020019161225d565b820191906000526020600020905b81548152906001019060200180831161224057829003601f168201915b50505050600383015460048401805460408051602060026101006001861615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152959660ff90941695939450908301828280156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b5050505060058301805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529495949350908301828280156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b5050505050905086565b60048054829081106123dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000606080600060608060006003886040518082805190602001908083835b6020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff1692506124ce91508290506111d8565b949d939c50919a509850965090945092505050565b6060600480548060200260200160405190810160405280929190818152602001828054801561254857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161251d575b505050505090505b90565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461257857600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156125ad57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600482018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507f5b19f79ac4e8cfa820815502e11615f1a449e28155dc289ec5cac1a11f9086949388928291908201906060830190869080156126995780601f1061266e57610100808354040283529160200191612699565b820191906000526020600020905b81548152906001019060200180831161267c57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156126cd5781810151838201526020016126b5565b50505050905090810190601f1680156126fa5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060048401906020860190612c86565b6000606080600060608060006002886040518082805190602001908083836020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461279e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156127d357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061283c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016127ff565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff169290921491506128ad905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481526002808301805495861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909516049481018590529097507f53d878a6530e56c9bc96548fa0a8cae4f1d1f49c86b0e934c086b992ebb6998f9389928291908201906060830190869080156129975780601f1061296c57610100808354040283529160200191612997565b820191906000526020600020905b81548152906001019060200180831161297a57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156129cb5781810151838201526020016129b3565b50505050905090810190601f1680156129f85780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26002836002016040518082805460018160011615610100020316600290048015612a685780601f10612a46576101008083540402835291820191612a68565b820191906000526020600020905b815481529060010190602001808311612a54575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600292889282918401908083835b60208310612af257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ab5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506002860191870190612c86565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bb957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811615612c1657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115612c3d57600083815260209020612c3d918101908301612d54565b505050565b50805460018160011615610100020316600290046000825580601f10612c685750612c16565b601f016020900490600052602060002090810190612c169190612d54565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612cc757805160ff1916838001178555612cf4565b82800160010185558215612cf4579182015b82811115612cf4578251825591602001919060010190612cd9565b50612d00929150612d54565b5090565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160608152602001606081525090565b61255091905b80821115612d005760008155600101612d5a5600a165627a7a72305820a2b015e1c6a978406b24e8687202ced017fe0b041c7b9b9d741eb9bcb14a014e0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE5 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x13BAF1E6 DUP2 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x2FBFEBA9 EQ PUSH2 0x11D JUMPI DUP1 PUSH4 0x3550B6D9 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x56318820 EQ PUSH2 0x1F8 JUMPI DUP1 PUSH4 0x7ABCCAC9 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xA880319D EQ PUSH2 0x499 JUMPI DUP1 PUSH4 0xC370C86D EQ PUSH2 0x5D0 JUMPI DUP1 PUSH4 0xE4860339 EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0xE5DF8B84 EQ PUSH2 0x672 JUMPI DUP1 PUSH4 0xE73FC0C3 EQ PUSH2 0x68A JUMPI DUP1 PUSH4 0xEE8C24B8 EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0xEEF05F65 EQ PUSH2 0x748 JUMPI DUP1 PUSH4 0xEFA74F1F EQ PUSH2 0x7BC JUMPI DUP1 PUSH4 0xF036417F EQ PUSH2 0x815 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x889 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x8B7 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x129 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xEFB SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xFB5 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1006 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x11D8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x321 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x309 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x34E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x381 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x369 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3AE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x441 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x429 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x46E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x1528 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP2 DUP11 ADD CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD DUP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 PUSH1 0xFF DUP12 CALLDATALOAD AND SWAP12 SWAP1 SWAP11 SWAP1 SWAP10 SWAP5 ADD SWAP8 POP SWAP2 SWAP6 POP SWAP2 DUP3 ADD SWAP4 POP SWAP2 POP DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1544 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1CBC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x20D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH1 0x4 CALLDATALOAD PUSH2 0x23CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x696 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2403 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6F8 PUSH2 0x24E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x734 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x71C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2553 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x271E SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x821 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2779 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x8DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x937 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x963 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x993 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x4 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP6 SWAP1 DUP2 LT PUSH2 0x9C6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xA45 SWAP1 DUP3 PUSH2 0x2C19 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x3 DUP3 ADD SLOAD DUP6 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP6 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP1 DUP3 MSTORE DUP4 DUP7 ADD DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 DUP3 AND ISZERO PUSH2 0x100 MUL SWAP9 SWAP1 SWAP9 ADD AND DUP8 SWAP1 DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE SWAP4 SWAP10 POP SWAP2 SWAP1 SWAP7 AND SWAP6 PUSH32 0x32C54F1E2EA75844DED7517E7DBCD3895DA7CD0C28F9AB9F9CF6ECF5F83762C6 SWAP6 SWAP3 SWAP5 DUP10 ADD SWAP4 PUSH1 0x4 DUP11 ADD SWAP3 PUSH1 0x5 DUP12 ADD SWAP3 SWAP2 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 PUSH1 0x80 DUP5 ADD SWAP1 PUSH1 0xC0 DUP6 ADD SWAP1 DUP12 SWAP1 DUP1 ISZERO PUSH2 0xB65 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB3A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB65 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB48 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP11 SWAP1 DUP1 ISZERO PUSH2 0xBF7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBCC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBF7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBDA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP9 SWAP1 DUP1 ISZERO PUSH2 0xC89 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC5E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC89 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC6C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP8 SWAP1 DUP1 ISZERO PUSH2 0xD1B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCF0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD1B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCFE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP3 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD6F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xD91 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD7D JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x3 DUP3 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xE28 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xE06 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xE28 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE14 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 SWAP3 DUP2 SWAP1 SUB DUP4 ADD SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP4 DUP5 SWAP1 MSTORE SWAP2 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND DUP2 SSTORE SWAP2 PUSH2 0xE9F SWAP1 DUP4 ADD DUP3 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEAD PUSH1 0x2 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH2 0xEE5 PUSH1 0x4 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEF3 PUSH1 0x5 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x102B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1060 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0xC3168FDC13112E44A031057DBF6C609B33353ADDB4D8037D24543E22CBFE2ACD SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x114C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1121 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x114C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x112F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1180 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1168 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11AD JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x5 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x11EA PUSH2 0x2D04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD PUSH1 0xC0 DUP2 ADD DUP6 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE DUP1 DUP4 ADD DUP1 SLOAD DUP6 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP7 DUP4 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE SWAP1 SWAP4 DUP6 DUP4 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x12CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x12A0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x12CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12AE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x2 DUP3 DUP2 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP4 SWAP1 DIV DUP4 MUL DUP6 ADD DUP4 ADD SWAP1 SWAP2 MSTORE DUP1 DUP5 MSTORE SWAP4 DUP2 ADD SWAP4 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x137B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1350 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x137B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x135E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0xFF AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 DUP7 AND ISZERO PUSH2 0x100 MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD DUP3 MSTORE DUP3 DUP2 MSTORE SWAP5 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x143A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x140F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x143A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x141D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14C1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14CF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0xA0 SWAP1 SWAP7 ADD MLOAD SWAP4 SWAP15 SWAP3 SWAP14 POP SWAP1 SWAP12 POP SWAP10 POP SWAP3 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP8 SWAP2 AND ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x15BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1628 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15EB JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1699 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1702 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x16C5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1773 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0x20 DUP1 DUP5 ADD DUP15 DUP2 MSTORE DUP5 DUP7 ADD DUP15 SWAP1 MSTORE PUSH1 0xFF DUP14 AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x80 DUP6 ADD DUP13 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD DUP12 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 DUP1 DUP4 MSTORE SWAP6 SWAP1 SWAP3 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE SWAP1 MLOAD DUP1 MLOAD SWAP4 SWAP5 SWAP3 SWAP4 PUSH2 0x1812 SWAP4 DUP6 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x182E SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x1882 SWAP2 PUSH1 0x4 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x189E SWAP2 PUSH1 0x5 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x8A35ACFBC15FF81A39AE7D344FD709F28E8600B4AA8C65C6B64BFE7FE36BD19B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND OR SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP9 MLOAD DUP12 SWAP2 PUSH1 0x2 SWAP2 DUP12 SWAP2 SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1966 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1929 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE POP POP DUP11 MLOAD DUP13 SWAP3 PUSH1 0x3 SWAP3 DUP14 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1A47 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1A0A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 SWAP1 SUB DUP3 ADD DUP6 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND OR SWAP1 SSTORE PUSH1 0xFF DUP14 AND SWAP1 DUP6 ADD MSTORE PUSH1 0xA0 DUP1 DUP6 MSTORE DUP15 MLOAD SWAP1 DUP6 ADD MSTORE DUP14 MLOAD SWAP5 DUP16 AND SWAP5 PUSH32 0xD8D928B0B50CA11D9DC273236B46F3526515B03602F71F3A6AF4F45BD9FA9144 SWAP5 DUP16 SWAP5 POP DUP15 SWAP4 POP DUP14 SWAP3 DUP14 SWAP3 DUP14 SWAP3 SWAP2 DUP3 SWAP2 DUP3 DUP3 ADD SWAP2 PUSH1 0x60 DUP5 ADD SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 PUSH1 0xC0 DUP7 ADD SWAP2 SWAP1 DUP13 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B4F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B37 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B7C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B97 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BDC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1BF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1C57 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C9C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1CE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1D16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D7F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1D42 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1DF0 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE DUP2 DUP5 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x4A6DBFC867B179991DEC22FF19960F0A94D8D9D891FC556F547764670340E8AE SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x1EDB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1EB0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EDB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1EBE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1EF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1F3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x3 DUP4 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1FAC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F8A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x1FAC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F98 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x3 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2036 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1FF9 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x1 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD DUP2 DUP5 ADD DUP1 SLOAD DUP7 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP8 DUP4 AND ISZERO SWAP8 SWAP1 SWAP8 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP6 SWAP1 SWAP6 DIV PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP5 SWAP2 SWAP4 SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x21AD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2182 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x21AD JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2190 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP6 SWAP1 SWAP6 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 SWAP6 SWAP5 POP SWAP1 SWAP3 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x225D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2232 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x225D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2240 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 PUSH1 0xFF SWAP1 SWAP5 AND SWAP6 SWAP4 SWAP5 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2316 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x22EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2316 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x22F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x5 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP5 SWAP6 SWAP5 SWAP4 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x23C4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2399 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x23C4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x23A7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP7 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x23DC JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x3 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 POP PUSH2 0x24CE SWAP2 POP DUP3 SWAP1 POP PUSH2 0x11D8 JUMP JUMPDEST SWAP5 SWAP14 SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2548 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x251D JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x25AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0x5B19F79AC4E8CFA820815502E11615F1A449E28155DC289EC5CAC1A11F908694 SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2699 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x266E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2699 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x267C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26CD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x26B5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x26FA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x4 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x279E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x27D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x283C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x27FF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x28AD SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x2 DUP1 DUP4 ADD DUP1 SLOAD SWAP6 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x53D878A6530E56C9BC96548FA0A8CAE4F1D1F49C86B0E934C086B992EBB6998F SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2997 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x296C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2997 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x297A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x29CB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x29B3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2A68 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x2A68 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A54 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x2 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2AF2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AB5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x2 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2C3D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x2C3D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x2D54 JUMP JUMPDEST POP POP POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x2C68 JUMPI POP PUSH2 0x2C16 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2C16 SWAP2 SWAP1 PUSH2 0x2D54 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2CC7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2CF4 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2CF4 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2CF4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2CD9 JUMP JUMPDEST POP PUSH2 0x2D00 SWAP3 SWAP2 POP PUSH2 0x2D54 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x2550 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2D00 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2D5A JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 LOG2 0xb0 ISZERO 0xe1 0xc6 0xa9 PUSH25 0x406B24E8687202CED017FE0B041C7B9B9D741EB9BCB14A014E STOP 0x29 ",
"sourceMap": "886:8364:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3940:650;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3940:650:1;;;;;;;;;;;7067:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7067:114:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7067:114:1;;-1:-1:-1;7067:114:1;;-1:-1:-1;;;;;;;7067:114:1;;;;;;;;;;;;;;;;;;;;6781:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6781:122:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6781:122:1;;-1:-1:-1;6781:122:1;;-1:-1:-1;;;;;;;6781:122:1;6273:295;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6273:295:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6273:295:1;;-1:-1:-1;6273:295:1;;-1:-1:-1;;;;;;;6273:295:1;7345:550;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7345:550:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7345:550:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7345:550:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;223:20:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;223:20:0;;;;2960:852:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2960:852:1;;;;-1:-1:-1;2960:852:1;-1:-1:-1;2960:852:1;;-1:-1:-1;2960:852:1;;;;;;;;-1:-1:-1;;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2960:852:1;;-1:-1:-1;2960:852:1;;;;-1:-1:-1;2960:852:1;-1:-1:-1;2960:852:1;;;;;;;;;;-1:-1:-1;;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2960:852:1;;;;-1:-1:-1;2960:852:1;-1:-1:-1;2960:852:1;;-1:-1:-1;2960:852:1;;;;;;;;-1:-1:-1;2960:852:1;;-1:-1:-1;2960:852:1;;-1:-1:-1;;;;;;;2960:852:1;4738:370;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4738:370:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4738:370:1;;-1:-1:-1;4738:370:1;;-1:-1:-1;;;;;;;4738:370:1;1656:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1656:48:1;;;;;;;1803:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1803:31:1;;;;;8052:392;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8052:392:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8052:392:1;;-1:-1:-1;8052:392:1;;-1:-1:-1;;;;;;;8052:392:1;9117:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9117:131:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9117:131:1;;;;;;;;;;;;;;;;;5820:288;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5820:288:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5820:288:1;;-1:-1:-1;5820:288:1;;-1:-1:-1;;;;;;;5820:288:1;8607:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8607:400:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8607:400:1;;-1:-1:-1;8607:400:1;;-1:-1:-1;;;;;;;8607:400:1;5262:396;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5262:396:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5262:396:1;;-1:-1:-1;5262:396:1;;-1:-1:-1;;;;;;;5262:396:1;396:140:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;396:140:0;;;;;;;3940:650:1;4230:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;4043:6;;2070:20;:34;;2062:43;;;;;;4099:6;4073:32;;:14;4088:6;4073:22;;;;;;;;;;;;;;;;;;;;;;:32;4065:41;;;;;;4142:14;4157:21;;:25;;;;4142:41;;;;;;;;;;;;;;;;4117:14;:22;;4142:41;;;;;4132:6;;4117:22;;;;;;;;;;;;;;;:66;;;;;;;;;;;;;;;4193:14;:26;;;;;;;;;:::i;:::-;-1:-1:-1;4260:14:1;;;;;;;;:6;:14;;;;;;;;;4312:11;;4387:14;;;;4284:184;;4387:14;;;;4284:184;;;;;;;;;;4337:10;;;4284:184;;4361:12;4284:184;;;;;4312:11;4284:184;;;;;;;;;;;;;;;4260:14;;-1:-1:-1;4312:11:1;;;;;4284:184;;4337:10;;4361:12;;;4415:14;;;;4443:15;;;;4284:184;;;;;;;;;;;;;;;;;;;4337:10;;4284:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4284:184:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4284:184:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4284:184:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4485:13;4499:5;:12;;4485:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:34;;;;;;;;;;;4529:11;4541:5;:10;;4529:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4529:23:1;;;-1:-1:-1;;4529:23:1;;;;;;;;;;;;4522:30;;;;;;;;;;4569:14;;-1:-1:-1;4569:14:1;;;-1:-1:-1;4569:14:1;;;;;;;4562:21;;;;;;;4569:14;4562:21;;;;-1:-1:-1;4562:21:1;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;382:1:0;3940:650:1;;;:::o;7067:114::-;7130:7;7156:11;7168:5;7156:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;7156:18:1;;;;;-1:-1:-1;7156:18:1;;;;;;;;;;;;;;7067:114;-1:-1:-1;;;;7067:114:1:o;6781:122::-;6848:7;6874:13;6888:7;6874:22;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;6273:295:1;6409:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;6387:6;;2070:20;:34;;2062:43;;;;;;6439:14;;;;;;;:6;:14;;;;;;;;;6463:60;;;;;6495:15;;;6463:60;;;;;;;;;;;;;;;;;;;;;;6439:14;;-1:-1:-1;6463:60:1;;6512:10;;6463:60;;;;;;;;;;6495:15;;6463:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6463:60:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6463:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6533:28;;;;:15;;;;:28;;;;;:::i;:::-;;382:1:0;6273:295:1;;;:::o;7345:550::-;7449:7;7486:6;7515;7546:5;7579;7612;7658:26;;:::i;:::-;7687:14;;;;;;;;:6;:14;;;;;;;;;7658:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7687:14;;7658:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7658:43:1;;;-1:-1:-1;;7658:43:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7658:43:1;;;-1:-1:-1;;7658:43:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7658:43:1;;;-1:-1:-1;;7658:43:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7658:43:1;;;;-1:-1:-1;;7732:11:1;;7757:10;;;;7781:12;;;;7807:14;;;;7835;;;;7863:15;;;;;7732:11;;7757:10;;-1:-1:-1;7781:12:1;;-1:-1:-1;7807:14:1;-1:-1:-1;7835:14:1;;-1:-1:-1;7863:15:1;-1:-1:-1;7345:550:1;;-1:-1:-1;;;;7345:550:1:o;223:20:0:-;;;;;;:::o;2960:852:1:-;366:5:0;;;;352:10;:19;344:28;;;;;;2190:34:1;:14;;;2222:1;2190:14;;;:6;:14;;;;;:20;3184:6;;2190:20;:34;2182:43;;;;;;3215:6;2547:22;;;;;2539:31;;;;;;3250:7;2460:1;2426:36;;:13;2440:7;2426:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2426:22:1;;;;;-1:-1:-1;2426:22:1;;;;;;;;;;;;;:36;;;;;-1:-1:-1;2418:45:1;;-1:-1:-1;2418:45:1;;;;;3284:5;2337:1;2307:32;;:11;2319:5;2307:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2307:18:1;;;;;-1:-1:-1;2307:18:1;;;;;;;;;;;;;:32;;;;;-1:-1:-1;2299:41:1;;-1:-1:-1;2299:41:1;;;;;3322:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3305:14:1;;;:6;:14;;;;;;;:224;;;;;;;;;;;;;;;;;;3322:207;;3305:14;;:224;;;;;;;;;;;:::i;:::-;-1:-1:-1;3305:224:1;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3305:224:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3305:224:1;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;3539:14:1;27:10:-1;;39:1;23:18;;45:23;;-1:-1;3539:27:1;;;;;;;;;;;;;;;;-1:-1:-1;3576:22:1;;;;3539:27;;3576:13;;:22;;;;;3539:27;3576:22;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3576:22:1;;;;;-1:-1:-1;3576:22:1;;;;;;;;;;:31;;;;;;;;;;;;;;;;-1:-1:-1;;3617:18:1;;3638:6;;3617:11;;:18;;3576:22;;;;3617:18;;;;;3576:22;3617:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3617:18:1;;;;;-1:-1:-1;3617:18:1;;;;;;;;;;;:27;;;;;;;;;;;3654:151;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3718:7:1;;-1:-1:-1;3654:151:1;;3762:9;;3785:10;;3617:18;;;3654:151;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3654:151:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3654:151:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3654:151:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:1;2580;2235;382::0;2960:852:1;;;;;;:::o;4738:370::-;4897:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;4843:6;;2070:20;:34;;2062:43;;;;;;4876:5;2337:1;2307:32;;:11;2319:5;2307:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2307:18:1;;;;;-1:-1:-1;2307:18:1;;;;;;;;;;;;;:32;;;;;-1:-1:-1;2299:41:1;;-1:-1:-1;2299:41:1;;;;;4927:14;;;;;;;:6;:14;;;;;;;;;4951:45;;;;;4978:10;;;4951:45;;;;;;;;;;;;;;;;;;;;;;4927:14;;-1:-1:-1;4951:45:1;;4990:5;;4951:45;;;;;;;;;;4978:10;;4951:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4951:45:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4951:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5013:11;5025:5;:10;;5013:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5013:23:1;;;-1:-1:-1;;5013:23:1;;;;;;;;;;;;5006:30;;;;;;5046:18;;5067:6;;5046:11;;5058:5;;5013:23;;5046:18;;;;5013:23;5046:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5046:18:1;;;;;-1:-1:-1;5046:18:1;;;;;;;;;;;:27;;;;;;;;;;;;;;;;-1:-1:-1;5083:18:1;;;;-1:-1:-1;;5083:10:1;;;:18;;;;:::i;1656:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1656:48:1;;-1:-1:-1;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1803:31::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1803:31:1;:::o;8052:392::-;8152:7;8189:6;8218;8249:5;8282;8315;8361:14;8378:11;8390:5;8378:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;8378:18:1;;;;;-1:-1:-1;8378:18:1;;;;;;;;;;;;;;-1:-1:-1;8413:24:1;;-1:-1:-1;8378:18:1;;-1:-1:-1;8413:16:1;:24::i;:::-;8406:31;;;;-1:-1:-1;8406:31:1;;-1:-1:-1;8406:31:1;-1:-1:-1;8406:31:1;-1:-1:-1;8406:31:1;;-1:-1:-1;8052:392:1;-1:-1:-1;;;8052:392:1:o;9117:131::-;9195:9;9227:14;9220:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9117:131;;:::o;5820:288::-;5954:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;5932:6;;2070:20;:34;;2062:43;;;;;;5984:14;;;;;;;:6;:14;;;;;;;;;6008:57;;;;;6039:14;;;6008:57;;;;;;;;;;;;;;;;;;;;;;5984:14;;-1:-1:-1;6008:57:1;;6055:9;;6008:57;;;;;;;;;;6039:14;;6008:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6008:57:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6008:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6075:26;;;;:14;;;;:26;;;;;:::i;8607:400::-;8711:7;8748:6;8777;8808:5;8841;8874;8920:14;8937:13;8951:7;8937:22;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;5262:396:1;5429:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;5371:6;;2070:20;:34;;2062:43;;;;;;5406:7;2460:1;2426:36;;:13;2440:7;2426:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2426:22:1;;;;;-1:-1:-1;2426:22:1;;;;;;;;;;;;;:36;;;;;-1:-1:-1;2418:45:1;;-1:-1:-1;2418:45:1;;;;;5459:14;;;;;;;:6;:14;;;;;;;;;5483:51;;;;;5512:12;;;;5483:51;;;;;;;;;;;;;;;;;;;;5459:14;;-1:-1:-1;5483:51:1;;5526:7;;5483:51;;;;;;;;;;5512:12;;5483:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5483:51:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5483:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5551:13;5565:5;:12;;5551:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5551:27:1;;;-1:-1:-1;;5551:27:1;;;;;;;;;;;;5544:34;;;;;;5588:22;;5613:6;;5588:13;;5602:7;;5551:27;;5588:22;;;;5551:27;5588:22;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5588:22:1;;;;;-1:-1:-1;5588:22:1;;;;;;;;;;;:31;;;;;;;;;;;;;;;;-1:-1:-1;5629:22:1;;;;-1:-1:-1;5629:12:1;;;;:22;;;;:::i;396:140:0:-;366:5;;;;352:10;:19;344:28;;;;;;465:22;;;;461:69;;503:5;:16;;;;;;;;;;461:69;396:140;:::o;886:8364:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;886:8364:1;;;-1:-1:-1;886:8364:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"
}
}
},
"sources": {
- "previous/Ownable/Ownable_v1.sol": {
+ "1.0.0/Ownable/Ownable_v1.sol": {
"id": 0
},
- "previous/TokenRegistry/TokenRegistry.sol": {
+ "1.0.0/TokenRegistry/TokenRegistry.sol": {
"id": 1
}
},
"sourceCodes": {
- "previous/Ownable/Ownable_v1.sol": "pragma solidity ^0.4.11;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract Ownable_v1 {\n address public owner;\n\n function Ownable_v1() {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
- "previous/TokenRegistry/TokenRegistry.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.11;\n\nimport { Ownable_v1 as Ownable } from \"../Ownable/Ownable_v1.sol\";\n\n/// @title Token Registry - Stores metadata associated with ERC20 tokens. See ERC22 https://github.com/ethereum/EIPs/issues/22\n/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>\ncontract TokenRegistry is Ownable {\n\n event LogAddToken(\n address indexed token,\n string name,\n string symbol,\n uint8 decimals,\n bytes ipfsHash,\n bytes swarmHash\n );\n\n event LogRemoveToken(\n address indexed token,\n string name,\n string symbol,\n uint8 decimals,\n bytes ipfsHash,\n bytes swarmHash\n );\n\n event LogTokenNameChange(address indexed token, string oldName, string newName);\n event LogTokenSymbolChange(address indexed token, string oldSymbol, string newSymbol);\n event LogTokenIpfsHashChange(address indexed token, bytes oldIpfsHash, bytes newIpfsHash);\n event LogTokenSwarmHashChange(address indexed token, bytes oldSwarmHash, bytes newSwarmHash);\n\n mapping (address => TokenMetadata) public tokens;\n mapping (string => address) tokenBySymbol;\n mapping (string => address) tokenByName;\n\n address[] public tokenAddresses;\n\n struct TokenMetadata {\n address token;\n string name;\n string symbol;\n uint8 decimals;\n bytes ipfsHash;\n bytes swarmHash;\n }\n\n modifier tokenExists(address _token) {\n require(tokens[_token].token != address(0));\n _;\n }\n\n modifier tokenDoesNotExist(address _token) {\n require(tokens[_token].token == address(0));\n _;\n }\n\n modifier nameDoesNotExist(string _name) {\n require(tokenByName[_name] == address(0));\n _;\n }\n\n modifier symbolDoesNotExist(string _symbol) {\n require(tokenBySymbol[_symbol] == address(0));\n _;\n }\n\n modifier addressNotNull(address _address) {\n require(_address != address(0));\n _;\n }\n\n\n /// @dev Allows owner to add a new token to the registry.\n /// @param _token Address of new token.\n /// @param _name Name of new token.\n /// @param _symbol Symbol for new token.\n /// @param _decimals Number of decimals, divisibility of new token.\n /// @param _ipfsHash IPFS hash of token icon.\n /// @param _swarmHash Swarm hash of token icon.\n function addToken(\n address _token,\n string _name,\n string _symbol,\n uint8 _decimals,\n bytes _ipfsHash,\n bytes _swarmHash)\n public\n onlyOwner\n tokenDoesNotExist(_token)\n addressNotNull(_token)\n symbolDoesNotExist(_symbol)\n nameDoesNotExist(_name)\n {\n tokens[_token] = TokenMetadata({\n token: _token,\n name: _name,\n symbol: _symbol,\n decimals: _decimals,\n ipfsHash: _ipfsHash,\n swarmHash: _swarmHash\n });\n tokenAddresses.push(_token);\n tokenBySymbol[_symbol] = _token;\n tokenByName[_name] = _token;\n LogAddToken(\n _token,\n _name,\n _symbol,\n _decimals,\n _ipfsHash,\n _swarmHash\n );\n }\n\n /// @dev Allows owner to remove an existing token from the registry.\n /// @param _token Address of existing token.\n function removeToken(address _token, uint _index)\n public\n onlyOwner\n tokenExists(_token)\n {\n require(tokenAddresses[_index] == _token);\n\n tokenAddresses[_index] = tokenAddresses[tokenAddresses.length - 1];\n tokenAddresses.length -= 1;\n\n TokenMetadata storage token = tokens[_token];\n LogRemoveToken(\n token.token,\n token.name,\n token.symbol,\n token.decimals,\n token.ipfsHash,\n token.swarmHash\n );\n delete tokenBySymbol[token.symbol];\n delete tokenByName[token.name];\n delete tokens[_token];\n }\n\n /// @dev Allows owner to modify an existing token's name.\n /// @param _token Address of existing token.\n /// @param _name New name.\n function setTokenName(address _token, string _name)\n public\n onlyOwner\n tokenExists(_token)\n nameDoesNotExist(_name)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenNameChange(_token, token.name, _name);\n delete tokenByName[token.name];\n tokenByName[_name] = _token;\n token.name = _name;\n }\n\n /// @dev Allows owner to modify an existing token's symbol.\n /// @param _token Address of existing token.\n /// @param _symbol New symbol.\n function setTokenSymbol(address _token, string _symbol)\n public\n onlyOwner\n tokenExists(_token)\n symbolDoesNotExist(_symbol)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenSymbolChange(_token, token.symbol, _symbol);\n delete tokenBySymbol[token.symbol];\n tokenBySymbol[_symbol] = _token;\n token.symbol = _symbol;\n }\n\n /// @dev Allows owner to modify an existing token's IPFS hash.\n /// @param _token Address of existing token.\n /// @param _ipfsHash New IPFS hash.\n function setTokenIpfsHash(address _token, bytes _ipfsHash)\n public\n onlyOwner\n tokenExists(_token)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenIpfsHashChange(_token, token.ipfsHash, _ipfsHash);\n token.ipfsHash = _ipfsHash;\n }\n\n /// @dev Allows owner to modify an existing token's Swarm hash.\n /// @param _token Address of existing token.\n /// @param _swarmHash New Swarm hash.\n function setTokenSwarmHash(address _token, bytes _swarmHash)\n public\n onlyOwner\n tokenExists(_token)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenSwarmHashChange(_token, token.swarmHash, _swarmHash);\n token.swarmHash = _swarmHash;\n }\n\n /*\n * Web3 call functions\n */\n\n /// @dev Provides a registered token's address when given the token symbol.\n /// @param _symbol Symbol of registered token.\n /// @return Token's address.\n function getTokenAddressBySymbol(string _symbol) constant returns (address) {\n return tokenBySymbol[_symbol];\n }\n\n /// @dev Provides a registered token's address when given the token name.\n /// @param _name Name of registered token.\n /// @return Token's address.\n function getTokenAddressByName(string _name) constant returns (address) {\n return tokenByName[_name];\n }\n\n /// @dev Provides a registered token's metadata, looked up by address.\n /// @param _token Address of registered token.\n /// @return Token metadata.\n function getTokenMetaData(address _token)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n TokenMetadata memory token = tokens[_token];\n return (\n token.token,\n token.name,\n token.symbol,\n token.decimals,\n token.ipfsHash,\n token.swarmHash\n );\n }\n\n /// @dev Provides a registered token's metadata, looked up by name.\n /// @param _name Name of registered token.\n /// @return Token metadata.\n function getTokenByName(string _name)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n address _token = tokenByName[_name];\n return getTokenMetaData(_token);\n }\n\n /// @dev Provides a registered token's metadata, looked up by symbol.\n /// @param _symbol Symbol of registered token.\n /// @return Token metadata.\n function getTokenBySymbol(string _symbol)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n address _token = tokenBySymbol[_symbol];\n return getTokenMetaData(_token);\n }\n\n /// @dev Returns an array containing all token addresses.\n /// @return Array of token addresses.\n function getTokenAddresses()\n public\n constant\n returns (address[])\n {\n return tokenAddresses;\n }\n}\n"
+ "1.0.0/Ownable/Ownable_v1.sol": "pragma solidity ^0.4.11;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract Ownable_v1 {\n address public owner;\n\n function Ownable_v1() {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "1.0.0/TokenRegistry/TokenRegistry.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.11;\n\nimport { Ownable_v1 as Ownable } from \"../Ownable/Ownable_v1.sol\";\n\n/// @title Token Registry - Stores metadata associated with ERC20 tokens. See ERC22 https://github.com/ethereum/EIPs/issues/22\n/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>\ncontract TokenRegistry is Ownable {\n\n event LogAddToken(\n address indexed token,\n string name,\n string symbol,\n uint8 decimals,\n bytes ipfsHash,\n bytes swarmHash\n );\n\n event LogRemoveToken(\n address indexed token,\n string name,\n string symbol,\n uint8 decimals,\n bytes ipfsHash,\n bytes swarmHash\n );\n\n event LogTokenNameChange(address indexed token, string oldName, string newName);\n event LogTokenSymbolChange(address indexed token, string oldSymbol, string newSymbol);\n event LogTokenIpfsHashChange(address indexed token, bytes oldIpfsHash, bytes newIpfsHash);\n event LogTokenSwarmHashChange(address indexed token, bytes oldSwarmHash, bytes newSwarmHash);\n\n mapping (address => TokenMetadata) public tokens;\n mapping (string => address) tokenBySymbol;\n mapping (string => address) tokenByName;\n\n address[] public tokenAddresses;\n\n struct TokenMetadata {\n address token;\n string name;\n string symbol;\n uint8 decimals;\n bytes ipfsHash;\n bytes swarmHash;\n }\n\n modifier tokenExists(address _token) {\n require(tokens[_token].token != address(0));\n _;\n }\n\n modifier tokenDoesNotExist(address _token) {\n require(tokens[_token].token == address(0));\n _;\n }\n\n modifier nameDoesNotExist(string _name) {\n require(tokenByName[_name] == address(0));\n _;\n }\n\n modifier symbolDoesNotExist(string _symbol) {\n require(tokenBySymbol[_symbol] == address(0));\n _;\n }\n\n modifier addressNotNull(address _address) {\n require(_address != address(0));\n _;\n }\n\n\n /// @dev Allows owner to add a new token to the registry.\n /// @param _token Address of new token.\n /// @param _name Name of new token.\n /// @param _symbol Symbol for new token.\n /// @param _decimals Number of decimals, divisibility of new token.\n /// @param _ipfsHash IPFS hash of token icon.\n /// @param _swarmHash Swarm hash of token icon.\n function addToken(\n address _token,\n string _name,\n string _symbol,\n uint8 _decimals,\n bytes _ipfsHash,\n bytes _swarmHash)\n public\n onlyOwner\n tokenDoesNotExist(_token)\n addressNotNull(_token)\n symbolDoesNotExist(_symbol)\n nameDoesNotExist(_name)\n {\n tokens[_token] = TokenMetadata({\n token: _token,\n name: _name,\n symbol: _symbol,\n decimals: _decimals,\n ipfsHash: _ipfsHash,\n swarmHash: _swarmHash\n });\n tokenAddresses.push(_token);\n tokenBySymbol[_symbol] = _token;\n tokenByName[_name] = _token;\n LogAddToken(\n _token,\n _name,\n _symbol,\n _decimals,\n _ipfsHash,\n _swarmHash\n );\n }\n\n /// @dev Allows owner to remove an existing token from the registry.\n /// @param _token Address of existing token.\n function removeToken(address _token, uint _index)\n public\n onlyOwner\n tokenExists(_token)\n {\n require(tokenAddresses[_index] == _token);\n\n tokenAddresses[_index] = tokenAddresses[tokenAddresses.length - 1];\n tokenAddresses.length -= 1;\n\n TokenMetadata storage token = tokens[_token];\n LogRemoveToken(\n token.token,\n token.name,\n token.symbol,\n token.decimals,\n token.ipfsHash,\n token.swarmHash\n );\n delete tokenBySymbol[token.symbol];\n delete tokenByName[token.name];\n delete tokens[_token];\n }\n\n /// @dev Allows owner to modify an existing token's name.\n /// @param _token Address of existing token.\n /// @param _name New name.\n function setTokenName(address _token, string _name)\n public\n onlyOwner\n tokenExists(_token)\n nameDoesNotExist(_name)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenNameChange(_token, token.name, _name);\n delete tokenByName[token.name];\n tokenByName[_name] = _token;\n token.name = _name;\n }\n\n /// @dev Allows owner to modify an existing token's symbol.\n /// @param _token Address of existing token.\n /// @param _symbol New symbol.\n function setTokenSymbol(address _token, string _symbol)\n public\n onlyOwner\n tokenExists(_token)\n symbolDoesNotExist(_symbol)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenSymbolChange(_token, token.symbol, _symbol);\n delete tokenBySymbol[token.symbol];\n tokenBySymbol[_symbol] = _token;\n token.symbol = _symbol;\n }\n\n /// @dev Allows owner to modify an existing token's IPFS hash.\n /// @param _token Address of existing token.\n /// @param _ipfsHash New IPFS hash.\n function setTokenIpfsHash(address _token, bytes _ipfsHash)\n public\n onlyOwner\n tokenExists(_token)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenIpfsHashChange(_token, token.ipfsHash, _ipfsHash);\n token.ipfsHash = _ipfsHash;\n }\n\n /// @dev Allows owner to modify an existing token's Swarm hash.\n /// @param _token Address of existing token.\n /// @param _swarmHash New Swarm hash.\n function setTokenSwarmHash(address _token, bytes _swarmHash)\n public\n onlyOwner\n tokenExists(_token)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenSwarmHashChange(_token, token.swarmHash, _swarmHash);\n token.swarmHash = _swarmHash;\n }\n\n /*\n * Web3 call functions\n */\n\n /// @dev Provides a registered token's address when given the token symbol.\n /// @param _symbol Symbol of registered token.\n /// @return Token's address.\n function getTokenAddressBySymbol(string _symbol) constant returns (address) {\n return tokenBySymbol[_symbol];\n }\n\n /// @dev Provides a registered token's address when given the token name.\n /// @param _name Name of registered token.\n /// @return Token's address.\n function getTokenAddressByName(string _name) constant returns (address) {\n return tokenByName[_name];\n }\n\n /// @dev Provides a registered token's metadata, looked up by address.\n /// @param _token Address of registered token.\n /// @return Token metadata.\n function getTokenMetaData(address _token)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n TokenMetadata memory token = tokens[_token];\n return (\n token.token,\n token.name,\n token.symbol,\n token.decimals,\n token.ipfsHash,\n token.swarmHash\n );\n }\n\n /// @dev Provides a registered token's metadata, looked up by name.\n /// @param _name Name of registered token.\n /// @return Token metadata.\n function getTokenByName(string _name)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n address _token = tokenByName[_name];\n return getTokenMetaData(_token);\n }\n\n /// @dev Provides a registered token's metadata, looked up by symbol.\n /// @param _symbol Symbol of registered token.\n /// @return Token metadata.\n function getTokenBySymbol(string _symbol)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n address _token = tokenBySymbol[_symbol];\n return getTokenMetaData(_token);\n }\n\n /// @dev Returns an array containing all token addresses.\n /// @return Array of token addresses.\n function getTokenAddresses()\n public\n constant\n returns (address[])\n {\n return tokenAddresses;\n }\n}\n"
},
"sourceTreeHashHex": "0x63a45b019e6836d66dc6b82f872f30b7cb9375dca2fd0b2e5975a1ceb586a40f",
"compiler": {
diff --git a/packages/migrations/artifacts/2.0.0/Whitelist.json b/packages/migrations/artifacts/2.0.0/Whitelist.json
index e231a7266..2bffdcc7b 100644
--- a/packages/migrations/artifacts/2.0.0/Whitelist.json
+++ b/packages/migrations/artifacts/2.0.0/Whitelist.json
@@ -186,14 +186,14 @@
"evm": {
"bytecode": {
"linkReferences": {},
- "object": "0x60806040523480156200001157600080fd5b5060405160208062000f59833981018060405262000033919081019062000185565b6000805433600160a060020a03199182161790915560028054909116600160a060020a03831617905560408051306c01000000000000000000000000026020808301919091527f060000000000000000000000000000000000000000000000000000000000000060348301528251808303601501815260359092019092528051620000c3926003920190620000cb565b5050620001ba565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010e57805160ff19168380011785556200013e565b828001600101855582156200013e579182015b828111156200013e57825182559160200191906001019062000121565b506200014c92915062000150565b5090565b6200016d91905b808211156200014c576000815560010162000157565b90565b60006200017e8251620001ae565b9392505050565b6000602082840312156200019857600080fd5b6000620001a6848462000170565b949350505050565b600160a060020a031690565b610d8f80620001ca6000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c61009736600461082e565b610156565b005b3480156100aa57600080fd5b506100be6100b9366004610766565b6103ab565b6040516100cb9190610b88565b60405180910390f35b3480156100e057600080fd5b506100e96103c0565b6040516100cb9190610b74565b34801561010257600080fd5b506100be6101113660046107c6565b6103dc565b34801561012257600080fd5b5061009c61013136600461078c565b6103fd565b34801561014257600080fd5b5061009c610151366004610766565b6104a4565b33606032821461019b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bc6565b60405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1615156101fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bb6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610b96565b6040517fb4be83d5000000000000000000000000000000000000000000000000000000009061029590889088908790602401610bd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce9061037190879086908690600390600401610c08565b600060405180830381600087803b15801561038b57600080fd5b505af115801561039f573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff83163214949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461044e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff81161561055257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60006105618235610cd0565b9392505050565b60006105618235610ce9565b60006105618235610cee565b600080601f8301841361059257600080fd5b50813567ffffffffffffffff8111156105aa57600080fd5b6020830191508360018202830111156105c257600080fd5b9250929050565b6000601f820183136105da57600080fd5b81356105ed6105e882610c7a565b610c53565b9150808252602083016020830185838301111561060957600080fd5b610614838284610cf1565b50505092915050565b6000610180828403121561063057600080fd5b61063b610180610c53565b905060006106498484610555565b825250602061065a84848301610555565b602083015250604061066e84828501610555565b604083015250606061068284828501610555565b606083015250608061069684828501610574565b60808301525060a06106aa84828501610574565b60a08301525060c06106be84828501610574565b60c08301525060e06106d284828501610574565b60e0830152506101006106e784828501610574565b610100830152506101206106fd84828501610574565b6101208301525061014082013567ffffffffffffffff81111561071f57600080fd5b61072b848285016105c9565b6101408301525061016082013567ffffffffffffffff81111561074d57600080fd5b610759848285016105c9565b6101608301525092915050565b60006020828403121561077857600080fd5b60006107848484610555565b949350505050565b6000806040838503121561079f57600080fd5b60006107ab8585610555565b92505060206107bc85828601610568565b9150509250929050565b600080600080606085870312156107dc57600080fd5b60006107e88787610574565b94505060206107f987828801610555565b935050604085013567ffffffffffffffff81111561081657600080fd5b61082287828801610580565b95989497509550505050565b6000806000806080858703121561084457600080fd5b843567ffffffffffffffff81111561085b57600080fd5b6108678782880161061d565b945050602061087887828801610574565b935050604061088987828801610574565b925050606085013567ffffffffffffffff8111156108a657600080fd5b6108b2878288016105c9565b91505092959194509250565b6108c781610cd0565b82525050565b6108c781610ce9565b60006108e182610ccc565b8084526108f5816020860160208601610cfd565b6108fe81610d2d565b9093016020019392505050565b6000815460018116600081146109285760018114610964576109a0565b60028204607f1685527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660208601526040850192506109a0565b6002820480865260208601955061097a85610cc0565b60005b828110156109995781548882015260019091019060200161097d565b8701945050505b505092915050565b601581527f54414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601581527f4d414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b8051600090610180840190610a7d85826108be565b506020830151610a9060208601826108be565b506040830151610aa360408601826108be565b506060830151610ab660608601826108be565b506080830151610ac96080860182610b6b565b5060a0830151610adc60a0860182610b6b565b5060c0830151610aef60c0860182610b6b565b5060e0830151610b0260e0860182610b6b565b50610100830151610b17610100860182610b6b565b50610120830151610b2c610120860182610b6b565b50610140830151848203610140860152610b4682826108d6565b915050610160830151848203610160860152610b6282826108d6565b95945050505050565b6108c781610cee565b60208101610b8282846108be565b92915050565b60208101610b8282846108cd565b60208082528101610b82816109a8565b60208082528101610b82816109d8565b60208082528101610b8281610a08565b60208082528101610b8281610a38565b60608082528101610be78186610a68565b9050610bf66020830185610b6b565b8181036040830152610b6281846108d6565b60808101610c168287610b6b565b610c2360208301866108be565b8181036040830152610c3581856108d6565b90508181036060830152610c49818461090b565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610c7257600080fd5b604052919050565b600067ffffffffffffffff821115610c9157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60009081526020902090565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b82818337506000910152565b60005b83811015610d18578181015183820152602001610d00565b83811115610d27576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058209f0fbbe40031e551b93c923ce4f7df3eb82b39bb1db900fc2c3bf65b20106b9a6c6578706572696d656e74616cf50037",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH3 0xF59 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x33 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x185 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x600000000000000000000000000000000000000000000000000000000000000 PUSH1 0x34 DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB PUSH1 0x15 ADD DUP2 MSTORE PUSH1 0x35 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD PUSH3 0xC3 SWAP3 PUSH1 0x3 SWAP3 ADD SWAP1 PUSH3 0xCB JUMP JUMPDEST POP POP PUSH3 0x1BA JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x10E JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x13E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x13E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x13E JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x121 JUMP JUMPDEST POP PUSH3 0x14C SWAP3 SWAP2 POP PUSH3 0x150 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x16D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x14C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x157 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x17E DUP3 MLOAD PUSH3 0x1AE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x1A6 DUP5 DUP5 PUSH3 0x170 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xD8F DUP1 PUSH3 0x1CA PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x82E JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB74 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x3DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x78C JUMP JUMPDEST PUSH2 0x3FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x4A4 JUMP JUMPDEST CALLER PUSH1 0x60 ORIGIN DUP3 EQ PUSH2 0x19B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1FD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xB96 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x295 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x371 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xC08 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x39F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x44E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCD0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x5C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x5DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x5ED PUSH2 0x5E8 DUP3 PUSH2 0xC7A JUMP JUMPDEST PUSH2 0xC53 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x609 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x614 DUP4 DUP3 DUP5 PUSH2 0xCF1 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x630 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x63B PUSH2 0x180 PUSH2 0xC53 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x649 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x65A DUP5 DUP5 DUP4 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x66E DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x682 DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x696 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x6AA DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x6BE DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x6D2 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x6E7 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x6FD DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x71F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x72B DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x74D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x759 DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x784 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x79F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7AB DUP6 DUP6 PUSH2 0x555 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x7BC DUP6 DUP3 DUP7 ADD PUSH2 0x568 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7E8 DUP8 DUP8 PUSH2 0x574 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x7F9 DUP8 DUP3 DUP9 ADD PUSH2 0x555 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x822 DUP8 DUP3 DUP9 ADD PUSH2 0x580 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x844 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x85B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x867 DUP8 DUP3 DUP9 ADD PUSH2 0x61D JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x878 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x889 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B2 DUP8 DUP3 DUP9 ADD PUSH2 0x5C9 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCD0 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E1 DUP3 PUSH2 0xCCC JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x8F5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xCFD JUMP JUMPDEST PUSH2 0x8FE DUP2 PUSH2 0xD2D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x964 JUMPI PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x97A DUP6 PUSH2 0xCC0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x999 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x97D JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x54414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x4D414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0xA7D DUP6 DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xA90 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0xAA3 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xAB6 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0xAC9 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0xADC PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0xAEF PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xB02 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xB17 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xB2C PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xB46 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xB62 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8BE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9D8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA08 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA38 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBE7 DUP2 DUP7 PUSH2 0xA68 JUMP JUMPDEST SWAP1 POP PUSH2 0xBF6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xB6B JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB62 DUP2 DUP5 PUSH2 0x8D6 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xC16 DUP3 DUP8 PUSH2 0xB6B JUMP JUMPDEST PUSH2 0xC23 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x8BE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xC35 DUP2 DUP6 PUSH2 0x8D6 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xC49 DUP2 DUP5 PUSH2 0x90B JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xC72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xC91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD18 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD00 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD27 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SWAP16 0xf 0xbb 0xe4 STOP BALANCE 0xe5 MLOAD 0xb9 EXTCODECOPY SWAP3 EXTCODECOPY 0xe4 0xf7 0xdf RETURNDATACOPY 0xb8 0x2b CODECOPY 0xbb SAR 0xb9 STOP 0xfc 0x2c EXTCODESIZE 0xf6 JUMPDEST KECCAK256 LT PUSH12 0x9A6C6578706572696D656E74 PUSH2 0x6CF5 STOP CALLDATACOPY ",
+ "object": "0x60806040523480156200001157600080fd5b5060405160208062000f59833981018060405262000033919081019062000185565b6000805433600160a060020a03199182161790915560028054909116600160a060020a03831617905560408051306c01000000000000000000000000026020808301919091527f060000000000000000000000000000000000000000000000000000000000000060348301528251808303601501815260359092019092528051620000c3926003920190620000cb565b5050620001ba565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010e57805160ff19168380011785556200013e565b828001600101855582156200013e579182015b828111156200013e57825182559160200191906001019062000121565b506200014c92915062000150565b5090565b6200016d91905b808211156200014c576000815560010162000157565b90565b60006200017e8251620001ae565b9392505050565b6000602082840312156200019857600080fd5b6000620001a6848462000170565b949350505050565b600160a060020a031690565b610d8f80620001ca6000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c61009736600461082e565b610156565b005b3480156100aa57600080fd5b506100be6100b9366004610766565b6103ab565b6040516100cb9190610b88565b60405180910390f35b3480156100e057600080fd5b506100e96103c0565b6040516100cb9190610b74565b34801561010257600080fd5b506100be6101113660046107c6565b6103dc565b34801561012257600080fd5b5061009c61013136600461078c565b6103fd565b34801561014257600080fd5b5061009c610151366004610766565b6104a4565b33606032821461019b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bc6565b60405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1615156101fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bb6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610b96565b6040517fb4be83d5000000000000000000000000000000000000000000000000000000009061029590889088908790602401610bd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce9061037190879086908690600390600401610c08565b600060405180830381600087803b15801561038b57600080fd5b505af115801561039f573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff83163214949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461044e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff81161561055257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60006105618235610cd0565b9392505050565b60006105618235610ce9565b60006105618235610cee565b600080601f8301841361059257600080fd5b50813567ffffffffffffffff8111156105aa57600080fd5b6020830191508360018202830111156105c257600080fd5b9250929050565b6000601f820183136105da57600080fd5b81356105ed6105e882610c7a565b610c53565b9150808252602083016020830185838301111561060957600080fd5b610614838284610cf1565b50505092915050565b6000610180828403121561063057600080fd5b61063b610180610c53565b905060006106498484610555565b825250602061065a84848301610555565b602083015250604061066e84828501610555565b604083015250606061068284828501610555565b606083015250608061069684828501610574565b60808301525060a06106aa84828501610574565b60a08301525060c06106be84828501610574565b60c08301525060e06106d284828501610574565b60e0830152506101006106e784828501610574565b610100830152506101206106fd84828501610574565b6101208301525061014082013567ffffffffffffffff81111561071f57600080fd5b61072b848285016105c9565b6101408301525061016082013567ffffffffffffffff81111561074d57600080fd5b610759848285016105c9565b6101608301525092915050565b60006020828403121561077857600080fd5b60006107848484610555565b949350505050565b6000806040838503121561079f57600080fd5b60006107ab8585610555565b92505060206107bc85828601610568565b9150509250929050565b600080600080606085870312156107dc57600080fd5b60006107e88787610574565b94505060206107f987828801610555565b935050604085013567ffffffffffffffff81111561081657600080fd5b61082287828801610580565b95989497509550505050565b6000806000806080858703121561084457600080fd5b843567ffffffffffffffff81111561085b57600080fd5b6108678782880161061d565b945050602061087887828801610574565b935050604061088987828801610574565b925050606085013567ffffffffffffffff8111156108a657600080fd5b6108b2878288016105c9565b91505092959194509250565b6108c781610cd0565b82525050565b6108c781610ce9565b60006108e182610ccc565b8084526108f5816020860160208601610cfd565b6108fe81610d2d565b9093016020019392505050565b6000815460018116600081146109285760018114610964576109a0565b60028204607f1685527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660208601526040850192506109a0565b6002820480865260208601955061097a85610cc0565b60005b828110156109995781548882015260019091019060200161097d565b8701945050505b505092915050565b601581527f54414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601581527f4d414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b8051600090610180840190610a7d85826108be565b506020830151610a9060208601826108be565b506040830151610aa360408601826108be565b506060830151610ab660608601826108be565b506080830151610ac96080860182610b6b565b5060a0830151610adc60a0860182610b6b565b5060c0830151610aef60c0860182610b6b565b5060e0830151610b0260e0860182610b6b565b50610100830151610b17610100860182610b6b565b50610120830151610b2c610120860182610b6b565b50610140830151848203610140860152610b4682826108d6565b915050610160830151848203610160860152610b6282826108d6565b95945050505050565b6108c781610cee565b60208101610b8282846108be565b92915050565b60208101610b8282846108cd565b60208082528101610b82816109a8565b60208082528101610b82816109d8565b60208082528101610b8281610a08565b60208082528101610b8281610a38565b60608082528101610be78186610a68565b9050610bf66020830185610b6b565b8181036040830152610b6281846108d6565b60808101610c168287610b6b565b610c2360208301866108be565b8181036040830152610c3581856108d6565b90508181036060830152610c49818461090b565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610c7257600080fd5b604052919050565b600067ffffffffffffffff821115610c9157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60009081526020902090565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b82818337506000910152565b60005b83811015610d18578181015183820152602001610d00565b83811115610d27576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820cb3fe08c332d270734ea27fa5d37920f6e33fe97bb1de3b3aa49af1d1dce8e0e6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH3 0xF59 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x33 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x185 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x600000000000000000000000000000000000000000000000000000000000000 PUSH1 0x34 DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB PUSH1 0x15 ADD DUP2 MSTORE PUSH1 0x35 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD PUSH3 0xC3 SWAP3 PUSH1 0x3 SWAP3 ADD SWAP1 PUSH3 0xCB JUMP JUMPDEST POP POP PUSH3 0x1BA JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x10E JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x13E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x13E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x13E JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x121 JUMP JUMPDEST POP PUSH3 0x14C SWAP3 SWAP2 POP PUSH3 0x150 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x16D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x14C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x157 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x17E DUP3 MLOAD PUSH3 0x1AE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x1A6 DUP5 DUP5 PUSH3 0x170 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xD8F DUP1 PUSH3 0x1CA PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x82E JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB74 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x3DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x78C JUMP JUMPDEST PUSH2 0x3FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x4A4 JUMP JUMPDEST CALLER PUSH1 0x60 ORIGIN DUP3 EQ PUSH2 0x19B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1FD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xB96 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x295 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x371 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xC08 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x39F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x44E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCD0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x5C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x5DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x5ED PUSH2 0x5E8 DUP3 PUSH2 0xC7A JUMP JUMPDEST PUSH2 0xC53 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x609 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x614 DUP4 DUP3 DUP5 PUSH2 0xCF1 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x630 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x63B PUSH2 0x180 PUSH2 0xC53 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x649 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x65A DUP5 DUP5 DUP4 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x66E DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x682 DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x696 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x6AA DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x6BE DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x6D2 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x6E7 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x6FD DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x71F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x72B DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x74D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x759 DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x784 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x79F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7AB DUP6 DUP6 PUSH2 0x555 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x7BC DUP6 DUP3 DUP7 ADD PUSH2 0x568 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7E8 DUP8 DUP8 PUSH2 0x574 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x7F9 DUP8 DUP3 DUP9 ADD PUSH2 0x555 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x822 DUP8 DUP3 DUP9 ADD PUSH2 0x580 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x844 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x85B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x867 DUP8 DUP3 DUP9 ADD PUSH2 0x61D JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x878 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x889 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B2 DUP8 DUP3 DUP9 ADD PUSH2 0x5C9 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCD0 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E1 DUP3 PUSH2 0xCCC JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x8F5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xCFD JUMP JUMPDEST PUSH2 0x8FE DUP2 PUSH2 0xD2D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x964 JUMPI PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x97A DUP6 PUSH2 0xCC0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x999 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x97D JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x54414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x4D414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0xA7D DUP6 DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xA90 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0xAA3 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xAB6 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0xAC9 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0xADC PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0xAEF PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xB02 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xB17 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xB2C PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xB46 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xB62 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8BE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9D8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA08 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA38 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBE7 DUP2 DUP7 PUSH2 0xA68 JUMP JUMPDEST SWAP1 POP PUSH2 0xBF6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xB6B JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB62 DUP2 DUP5 PUSH2 0x8D6 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xC16 DUP3 DUP8 PUSH2 0xB6B JUMP JUMPDEST PUSH2 0xC23 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x8BE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xC35 DUP2 DUP6 PUSH2 0x8D6 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xC49 DUP2 DUP5 PUSH2 0x90B JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xC72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xC91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD18 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD00 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD27 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xcb 0x3f 0xe0 DUP13 CALLER 0x2d 0x27 SMOD CALLVALUE 0xea 0x27 STATICCALL 0x5d CALLDATACOPY SWAP3 0xf PUSH15 0x33FE97BB1DE3B3AA49AF1D1DCE8E0E PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
"sourceMap": "794:3556:10:-;;;1181:188;8:9:-1;5:2;;;30:1;27;20:12;5:2;1181:188:10;;;;;;;;;;;;;;;;;;;;;;329:5:12;:18;;337:10;-1:-1:-1;;;;;;329:18:12;;;;;;;1242:8:10;:31;;;;;-1:-1:-1;;;;;1242:31:10;;;;;1305:57;;;1330:4;1305:57;;;;;;;;;;1337:24;1305:57;;;;;;26:21:-1;;;22:32;;6:49;;1305:57:10;;;;;;;1283:79;;;;:19;;:79;;;:::i;:::-;;1181:188;794:3556;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;794:3556:10;;;-1:-1:-1;794:3556:10;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:263;;249:2;237:9;228:7;224:23;220:32;217:2;;;265:1;262;255:12;217:2;300:1;317:64;373:7;353:9;317:64;;;307:74;211:186;-1:-1;;;;211:186;404:128;-1:-1;;;;;473:54;;456:76;;794:3556:10;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
- "object": "0x6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c61009736600461082e565b610156565b005b3480156100aa57600080fd5b506100be6100b9366004610766565b6103ab565b6040516100cb9190610b88565b60405180910390f35b3480156100e057600080fd5b506100e96103c0565b6040516100cb9190610b74565b34801561010257600080fd5b506100be6101113660046107c6565b6103dc565b34801561012257600080fd5b5061009c61013136600461078c565b6103fd565b34801561014257600080fd5b5061009c610151366004610766565b6104a4565b33606032821461019b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bc6565b60405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1615156101fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bb6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610b96565b6040517fb4be83d5000000000000000000000000000000000000000000000000000000009061029590889088908790602401610bd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce9061037190879086908690600390600401610c08565b600060405180830381600087803b15801561038b57600080fd5b505af115801561039f573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff83163214949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461044e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff81161561055257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60006105618235610cd0565b9392505050565b60006105618235610ce9565b60006105618235610cee565b600080601f8301841361059257600080fd5b50813567ffffffffffffffff8111156105aa57600080fd5b6020830191508360018202830111156105c257600080fd5b9250929050565b6000601f820183136105da57600080fd5b81356105ed6105e882610c7a565b610c53565b9150808252602083016020830185838301111561060957600080fd5b610614838284610cf1565b50505092915050565b6000610180828403121561063057600080fd5b61063b610180610c53565b905060006106498484610555565b825250602061065a84848301610555565b602083015250604061066e84828501610555565b604083015250606061068284828501610555565b606083015250608061069684828501610574565b60808301525060a06106aa84828501610574565b60a08301525060c06106be84828501610574565b60c08301525060e06106d284828501610574565b60e0830152506101006106e784828501610574565b610100830152506101206106fd84828501610574565b6101208301525061014082013567ffffffffffffffff81111561071f57600080fd5b61072b848285016105c9565b6101408301525061016082013567ffffffffffffffff81111561074d57600080fd5b610759848285016105c9565b6101608301525092915050565b60006020828403121561077857600080fd5b60006107848484610555565b949350505050565b6000806040838503121561079f57600080fd5b60006107ab8585610555565b92505060206107bc85828601610568565b9150509250929050565b600080600080606085870312156107dc57600080fd5b60006107e88787610574565b94505060206107f987828801610555565b935050604085013567ffffffffffffffff81111561081657600080fd5b61082287828801610580565b95989497509550505050565b6000806000806080858703121561084457600080fd5b843567ffffffffffffffff81111561085b57600080fd5b6108678782880161061d565b945050602061087887828801610574565b935050604061088987828801610574565b925050606085013567ffffffffffffffff8111156108a657600080fd5b6108b2878288016105c9565b91505092959194509250565b6108c781610cd0565b82525050565b6108c781610ce9565b60006108e182610ccc565b8084526108f5816020860160208601610cfd565b6108fe81610d2d565b9093016020019392505050565b6000815460018116600081146109285760018114610964576109a0565b60028204607f1685527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660208601526040850192506109a0565b6002820480865260208601955061097a85610cc0565b60005b828110156109995781548882015260019091019060200161097d565b8701945050505b505092915050565b601581527f54414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601581527f4d414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b8051600090610180840190610a7d85826108be565b506020830151610a9060208601826108be565b506040830151610aa360408601826108be565b506060830151610ab660608601826108be565b506080830151610ac96080860182610b6b565b5060a0830151610adc60a0860182610b6b565b5060c0830151610aef60c0860182610b6b565b5060e0830151610b0260e0860182610b6b565b50610100830151610b17610100860182610b6b565b50610120830151610b2c610120860182610b6b565b50610140830151848203610140860152610b4682826108d6565b915050610160830151848203610160860152610b6282826108d6565b95945050505050565b6108c781610cee565b60208101610b8282846108be565b92915050565b60208101610b8282846108cd565b60208082528101610b82816109a8565b60208082528101610b82816109d8565b60208082528101610b8281610a08565b60208082528101610b8281610a38565b60608082528101610be78186610a68565b9050610bf66020830185610b6b565b8181036040830152610b6281846108d6565b60808101610c168287610b6b565b610c2360208301866108be565b8181036040830152610c3581856108d6565b90508181036060830152610c49818461090b565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610c7257600080fd5b604052919050565b600067ffffffffffffffff821115610c9157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60009081526020902090565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b82818337506000910152565b60005b83811015610d18578181015183820152602001610d00565b83811115610d27576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058209f0fbbe40031e551b93c923ce4f7df3eb82b39bb1db900fc2c3bf65b20106b9a6c6578706572696d656e74616cf50037",
- "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x82E JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB74 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x3DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x78C JUMP JUMPDEST PUSH2 0x3FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x4A4 JUMP JUMPDEST CALLER PUSH1 0x60 ORIGIN DUP3 EQ PUSH2 0x19B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1FD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xB96 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x295 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x371 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xC08 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x39F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x44E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCD0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x5C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x5DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x5ED PUSH2 0x5E8 DUP3 PUSH2 0xC7A JUMP JUMPDEST PUSH2 0xC53 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x609 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x614 DUP4 DUP3 DUP5 PUSH2 0xCF1 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x630 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x63B PUSH2 0x180 PUSH2 0xC53 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x649 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x65A DUP5 DUP5 DUP4 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x66E DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x682 DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x696 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x6AA DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x6BE DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x6D2 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x6E7 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x6FD DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x71F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x72B DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x74D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x759 DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x784 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x79F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7AB DUP6 DUP6 PUSH2 0x555 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x7BC DUP6 DUP3 DUP7 ADD PUSH2 0x568 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7E8 DUP8 DUP8 PUSH2 0x574 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x7F9 DUP8 DUP3 DUP9 ADD PUSH2 0x555 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x822 DUP8 DUP3 DUP9 ADD PUSH2 0x580 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x844 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x85B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x867 DUP8 DUP3 DUP9 ADD PUSH2 0x61D JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x878 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x889 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B2 DUP8 DUP3 DUP9 ADD PUSH2 0x5C9 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCD0 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E1 DUP3 PUSH2 0xCCC JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x8F5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xCFD JUMP JUMPDEST PUSH2 0x8FE DUP2 PUSH2 0xD2D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x964 JUMPI PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x97A DUP6 PUSH2 0xCC0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x999 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x97D JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x54414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x4D414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0xA7D DUP6 DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xA90 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0xAA3 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xAB6 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0xAC9 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0xADC PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0xAEF PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xB02 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xB17 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xB2C PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xB46 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xB62 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8BE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9D8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA08 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA38 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBE7 DUP2 DUP7 PUSH2 0xA68 JUMP JUMPDEST SWAP1 POP PUSH2 0xBF6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xB6B JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB62 DUP2 DUP5 PUSH2 0x8D6 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xC16 DUP3 DUP8 PUSH2 0xB6B JUMP JUMPDEST PUSH2 0xC23 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x8BE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xC35 DUP2 DUP6 PUSH2 0x8D6 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xC49 DUP2 DUP5 PUSH2 0x90B JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xC72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xC91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD18 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD00 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD27 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SWAP16 0xf 0xbb 0xe4 STOP BALANCE 0xe5 MLOAD 0xb9 EXTCODECOPY SWAP3 EXTCODECOPY 0xe4 0xf7 0xdf RETURNDATACOPY 0xb8 0x2b CODECOPY 0xbb SAR 0xb9 STOP 0xfc 0x2c EXTCODESIZE 0xf6 JUMPDEST KECCAK256 LT PUSH12 0x9A6C6578706572696D656E74 PUSH2 0x6CF5 STOP CALLDATACOPY ",
+ "object": "0x6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c61009736600461082e565b610156565b005b3480156100aa57600080fd5b506100be6100b9366004610766565b6103ab565b6040516100cb9190610b88565b60405180910390f35b3480156100e057600080fd5b506100e96103c0565b6040516100cb9190610b74565b34801561010257600080fd5b506100be6101113660046107c6565b6103dc565b34801561012257600080fd5b5061009c61013136600461078c565b6103fd565b34801561014257600080fd5b5061009c610151366004610766565b6104a4565b33606032821461019b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bc6565b60405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1615156101fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bb6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610b96565b6040517fb4be83d5000000000000000000000000000000000000000000000000000000009061029590889088908790602401610bd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce9061037190879086908690600390600401610c08565b600060405180830381600087803b15801561038b57600080fd5b505af115801561039f573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff83163214949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461044e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff81161561055257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60006105618235610cd0565b9392505050565b60006105618235610ce9565b60006105618235610cee565b600080601f8301841361059257600080fd5b50813567ffffffffffffffff8111156105aa57600080fd5b6020830191508360018202830111156105c257600080fd5b9250929050565b6000601f820183136105da57600080fd5b81356105ed6105e882610c7a565b610c53565b9150808252602083016020830185838301111561060957600080fd5b610614838284610cf1565b50505092915050565b6000610180828403121561063057600080fd5b61063b610180610c53565b905060006106498484610555565b825250602061065a84848301610555565b602083015250604061066e84828501610555565b604083015250606061068284828501610555565b606083015250608061069684828501610574565b60808301525060a06106aa84828501610574565b60a08301525060c06106be84828501610574565b60c08301525060e06106d284828501610574565b60e0830152506101006106e784828501610574565b610100830152506101206106fd84828501610574565b6101208301525061014082013567ffffffffffffffff81111561071f57600080fd5b61072b848285016105c9565b6101408301525061016082013567ffffffffffffffff81111561074d57600080fd5b610759848285016105c9565b6101608301525092915050565b60006020828403121561077857600080fd5b60006107848484610555565b949350505050565b6000806040838503121561079f57600080fd5b60006107ab8585610555565b92505060206107bc85828601610568565b9150509250929050565b600080600080606085870312156107dc57600080fd5b60006107e88787610574565b94505060206107f987828801610555565b935050604085013567ffffffffffffffff81111561081657600080fd5b61082287828801610580565b95989497509550505050565b6000806000806080858703121561084457600080fd5b843567ffffffffffffffff81111561085b57600080fd5b6108678782880161061d565b945050602061087887828801610574565b935050604061088987828801610574565b925050606085013567ffffffffffffffff8111156108a657600080fd5b6108b2878288016105c9565b91505092959194509250565b6108c781610cd0565b82525050565b6108c781610ce9565b60006108e182610ccc565b8084526108f5816020860160208601610cfd565b6108fe81610d2d565b9093016020019392505050565b6000815460018116600081146109285760018114610964576109a0565b60028204607f1685527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660208601526040850192506109a0565b6002820480865260208601955061097a85610cc0565b60005b828110156109995781548882015260019091019060200161097d565b8701945050505b505092915050565b601581527f54414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601581527f4d414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b8051600090610180840190610a7d85826108be565b506020830151610a9060208601826108be565b506040830151610aa360408601826108be565b506060830151610ab660608601826108be565b506080830151610ac96080860182610b6b565b5060a0830151610adc60a0860182610b6b565b5060c0830151610aef60c0860182610b6b565b5060e0830151610b0260e0860182610b6b565b50610100830151610b17610100860182610b6b565b50610120830151610b2c610120860182610b6b565b50610140830151848203610140860152610b4682826108d6565b915050610160830151848203610160860152610b6282826108d6565b95945050505050565b6108c781610cee565b60208101610b8282846108be565b92915050565b60208101610b8282846108cd565b60208082528101610b82816109a8565b60208082528101610b82816109d8565b60208082528101610b8281610a08565b60208082528101610b8281610a38565b60608082528101610be78186610a68565b9050610bf66020830185610b6b565b8181036040830152610b6281846108d6565b60808101610c168287610b6b565b610c2360208301866108be565b8181036040830152610c3581856108d6565b90508181036060830152610c49818461090b565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610c7257600080fd5b604052919050565b600067ffffffffffffffff821115610c9157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60009081526020902090565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b82818337506000910152565b60005b83811015610d18578181015183820152602001610d00565b83811115610d27576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820cb3fe08c332d270734ea27fa5d37920f6e33fe97bb1de3b3aa49af1d1dce8e0e6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x82E JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB74 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x3DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x78C JUMP JUMPDEST PUSH2 0x3FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x4A4 JUMP JUMPDEST CALLER PUSH1 0x60 ORIGIN DUP3 EQ PUSH2 0x19B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1FD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xB96 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x295 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x371 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xC08 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x39F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x44E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCD0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x5C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x5DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x5ED PUSH2 0x5E8 DUP3 PUSH2 0xC7A JUMP JUMPDEST PUSH2 0xC53 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x609 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x614 DUP4 DUP3 DUP5 PUSH2 0xCF1 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x630 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x63B PUSH2 0x180 PUSH2 0xC53 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x649 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x65A DUP5 DUP5 DUP4 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x66E DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x682 DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x696 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x6AA DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x6BE DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x6D2 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x6E7 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x6FD DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x71F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x72B DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x74D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x759 DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x784 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x79F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7AB DUP6 DUP6 PUSH2 0x555 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x7BC DUP6 DUP3 DUP7 ADD PUSH2 0x568 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7E8 DUP8 DUP8 PUSH2 0x574 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x7F9 DUP8 DUP3 DUP9 ADD PUSH2 0x555 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x822 DUP8 DUP3 DUP9 ADD PUSH2 0x580 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x844 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x85B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x867 DUP8 DUP3 DUP9 ADD PUSH2 0x61D JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x878 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x889 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B2 DUP8 DUP3 DUP9 ADD PUSH2 0x5C9 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCD0 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E1 DUP3 PUSH2 0xCCC JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x8F5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xCFD JUMP JUMPDEST PUSH2 0x8FE DUP2 PUSH2 0xD2D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x964 JUMPI PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x97A DUP6 PUSH2 0xCC0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x999 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x97D JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x54414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x4D414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0xA7D DUP6 DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xA90 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0xAA3 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xAB6 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0xAC9 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0xADC PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0xAEF PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xB02 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xB17 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xB2C PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xB46 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xB62 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8BE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9D8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA08 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA38 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBE7 DUP2 DUP7 PUSH2 0xA68 JUMP JUMPDEST SWAP1 POP PUSH2 0xBF6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xB6B JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB62 DUP2 DUP5 PUSH2 0x8D6 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xC16 DUP3 DUP8 PUSH2 0xB6B JUMP JUMPDEST PUSH2 0xC23 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x8BE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xC35 DUP2 DUP6 PUSH2 0x8D6 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xC49 DUP2 DUP5 PUSH2 0x90B JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xC72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xC91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD18 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD00 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD27 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xcb 0x3f 0xe0 DUP13 CALLER 0x2d 0x27 SMOD CALLVALUE 0xea 0x27 STATICCALL 0x5d CALLDATACOPY SWAP3 0xf PUSH15 0x33FE97BB1DE3B3AA49AF1D1DCE8E0E PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
"sourceMap": "794:3556:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:1204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3144:1204:10;;;;;;;;;;;882:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;882:46:10;;;;;;;;;;;;;;;;;;;;;;;;;258:20:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:12;;;;;;;;;;;;2217:278:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2217:278:10;;;;;;;;;1563:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1563:176:10;;;;;;;;;500:167:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:12;;;;;;;;;3144:1204:10;3368:10;3970:17;3553:9;3537:25;;3459:143;;;;;;;;;;;;;;;;;;;;;;3695:18;;3681:33;;;;;;:13;:33;;;;;;;;3660:101;;;;;;;;;;;;;;;;3840:27;;;;;;;:13;:27;;;;;;;;3819:95;;;;;;;;;;;;;;;;3990:154;;4026:27;;3990:154;;4067:5;;4086:20;;4120:14;;3990:154;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;3990:154:10;;;49:4:-1;25:18;;61:17;;3990:154:10;182:15:-1;3990:154:10;;;;179:29:-1;;;;160:49;;;4209:8:10;;:132;;;;;3990:154;;-1:-1:-1;4209:8:10;;;;;:27;;:132;;4250:4;;4268:12;;3990:154;;4312:19;;4209:132;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4209:132:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4209:132:10;;;;3144:1204;;;;;;:::o;882:46::-;;;;;;;;;;;;;;;:::o;258:20:12:-;;;;;;:::o;2217:278:10:-;2462:26;;;2479:9;2462:26;2217:278;;;;;;:::o;1563:176::-;426:5:12;;;;412:10;:19;391:85;;;;;;;;;;;;;;1698:21:10;;;;;;;;;:13;:21;;;;;:34;;;;;;;;;;;;;1563:176::o;500:167:12:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:112;;194:43;229:6;216:20;194:43;;249:118;;316:46;354:6;341:20;316:46;;388:335;;;495:4;483:17;;479:27;-1:-1;469:2;;520:1;517;510:12;469:2;-1:-1;540:20;;580:18;569:30;;566:2;;;612:1;609;602:12;566:2;646:4;638:6;634:17;622:29;;696:3;689;681:6;677:16;667:8;663:31;660:40;657:2;;;713:1;710;703:12;657:2;462:261;;;;;;732:432;;822:4;810:17;;806:27;-1:-1;796:2;;847:1;844;837:12;796:2;884:6;871:20;906:60;921:44;958:6;921:44;;;906:60;;;897:69;;986:6;979:5;972:21;1022:4;1014:6;1010:17;1055:4;1048:5;1044:16;1090:3;1081:6;1076:3;1072:16;1069:25;1066:2;;;1107:1;1104;1097:12;1066:2;1117:41;1151:6;1146:3;1141;1117:41;;;789:375;;;;;;;;1649:2208;;1760:5;1748:9;1743:3;1739:19;1735:31;1732:2;;;1779:1;1776;1769:12;1732:2;1797:21;1812:5;1797:21;;;1788:30;-1:-1;1876:1;1907:49;1952:3;1932:9;1907:49;;;1883:74;;-1:-1;2026:2;2059:49;2104:3;2080:22;;;2059:49;;;2052:4;2045:5;2041:16;2034:75;1978:142;2185:2;2218:49;2263:3;2254:6;2243:9;2239:22;2218:49;;;2211:4;2204:5;2200:16;2193:75;2130:149;2338:2;2371:49;2416:3;2407:6;2396:9;2392:22;2371:49;;;2364:4;2357:5;2353:16;2346:75;2289:143;2494:3;2528:49;2573:3;2564:6;2553:9;2549:22;2528:49;;;2521:4;2514:5;2510:16;2503:75;2442:147;2651:3;2685:49;2730:3;2721:6;2710:9;2706:22;2685:49;;;2678:4;2671:5;2667:16;2660:75;2599:147;2800:3;2834:49;2879:3;2870:6;2859:9;2855:22;2834:49;;;2827:4;2820:5;2816:16;2809:75;2756:139;2949:3;2983:49;3028:3;3019:6;3008:9;3004:22;2983:49;;;2976:4;2969:5;2965:16;2958:75;2905:139;3111:3;3146:49;3191:3;3182:6;3171:9;3167:22;3146:49;;;3138:5;3131;3127:17;3120:76;3054:153;3257:3;3292:49;3337:3;3328:6;3317:9;3313:22;3292:49;;;3284:5;3277;3273:17;3266:76;3217:136;3441:3;3430:9;3426:19;3413:33;3466:18;3458:6;3455:30;3452:2;;;3498:1;3495;3488:12;3452:2;3534:54;3584:3;3575:6;3564:9;3560:22;3534:54;;;3526:5;3519;3515:17;3508:81;3363:237;3688:3;3677:9;3673:19;3660:33;3713:18;3705:6;3702:30;3699:2;;;3745:1;3742;3735:12;3699:2;3781:54;3831:3;3822:6;3811:9;3807:22;3781:54;;;3773:5;3766;3762:17;3755:81;3610:237;1726:2131;;;;;3989:241;;4093:2;4081:9;4072:7;4068:23;4064:32;4061:2;;;4109:1;4106;4099:12;4061:2;4144:1;4161:53;4206:7;4186:9;4161:53;;;4151:63;4055:175;-1:-1;;;;4055:175;4237:360;;;4355:2;4343:9;4334:7;4330:23;4326:32;4323:2;;;4371:1;4368;4361:12;4323:2;4406:1;4423:53;4468:7;4448:9;4423:53;;;4413:63;;4385:97;4513:2;4531:50;4573:7;4564:6;4553:9;4549:22;4531:50;;;4521:60;;4492:95;4317:280;;;;;;4604:615;;;;;4761:2;4749:9;4740:7;4736:23;4732:32;4729:2;;;4777:1;4774;4767:12;4729:2;4812:1;4829:53;4874:7;4854:9;4829:53;;;4819:63;;4791:97;4919:2;4937:53;4982:7;4973:6;4962:9;4958:22;4937:53;;;4927:63;;4898:98;5055:2;5044:9;5040:18;5027:32;5079:18;5071:6;5068:30;5065:2;;;5111:1;5108;5101:12;5065:2;5139:64;5195:7;5186:6;5175:9;5171:22;5139:64;;;4723:496;;;;-1:-1;5121:82;-1:-1;;;;4723:496;5226:851;;;;;5412:3;5400:9;5391:7;5387:23;5383:33;5380:2;;;5429:1;5426;5419:12;5380:2;5464:31;;5515:18;5504:30;;5501:2;;;5547:1;5544;5537:12;5501:2;5567:75;5634:7;5625:6;5614:9;5610:22;5567:75;;;5557:85;;5443:205;5679:2;5697:53;5742:7;5733:6;5722:9;5718:22;5697:53;;;5687:63;;5658:98;5787:2;5805:53;5850:7;5841:6;5830:9;5826:22;5805:53;;;5795:63;;5766:98;5923:2;5912:9;5908:18;5895:32;5947:18;5939:6;5936:30;5933:2;;;5979:1;5976;5969:12;5933:2;5999:62;6053:7;6044:6;6033:9;6029:22;5999:62;;;5989:72;;5874:193;5374:703;;;;;;;;6084:110;6157:31;6182:5;6157:31;;;6152:3;6145:44;6139:55;;;6201:101;6268:28;6290:5;6268:28;;6309:297;;6409:38;6441:5;6409:38;;;6464:6;6459:3;6452:19;6476:63;6532:6;6525:4;6520:3;6516:14;6509:4;6502:5;6498:16;6476:63;;;6571:29;6593:6;6571:29;;;6551:50;;;6564:4;6551:50;;6389:217;-1:-1;;;6389:217;6932:731;;7039:5;7033:12;7073:1;7062:9;7058:17;7086:1;7081:200;;;;7292:1;7287:370;;;;7051:606;;7081:200;7155:1;7140:17;;7159:4;7136:28;7171:19;;7235:9;7220:25;;7213:4;7204:14;;7197:49;7269:4;7260:14;;;-1:-1;7081:200;;7287:370;7356:1;7345:9;7341:17;7377:6;7372:3;7365:19;7407:4;7402:3;7398:14;7391:21;;7434:37;7465:5;7434:37;;;7487:1;7495:130;7509:6;7506:1;7503:13;7495:130;;;7568:14;;7555:11;;;7548:35;7615:1;7602:15;;;;7531:4;7524:12;7495:130;;;7639:11;;;-1:-1;;;7051:606;;7009:654;;;;;;7672:296;7827:2;7815:15;;7864:66;7859:2;7850:12;;7843:88;7959:2;7950:12;;7808:160;7977:296;8132:2;8120:15;;8169:66;8164:2;8155:12;;8148:88;8264:2;8255:12;;8113:160;8282:296;8437:2;8425:15;;8474:66;8469:2;8460:12;;8453:88;8569:2;8560:12;;8418:160;8587:296;8742:2;8730:15;;8779:66;8774:2;8765:12;;8758:88;8874:2;8865:12;;8723:160;8944:2417;9157:22;;8944:2417;;9079:5;9070:15;;;9191:61;9074:3;9157:22;9191:61;;;9100:164;9348:4;9341:5;9337:16;9331:23;9366:62;9422:4;9417:3;9413:14;9400:11;9366:62;;;9274:166;9531:4;9524:5;9520:16;9514:23;9549:62;9605:4;9600:3;9596:14;9583:11;9549:62;;;9450:173;9708:4;9701:5;9697:16;9691:23;9726:62;9782:4;9777:3;9773:14;9760:11;9726:62;;;9633:167;9888:4;9881:5;9877:16;9871:23;9906:62;9962:4;9957:3;9953:14;9940:11;9906:62;;;9810:170;10068:4;10061:5;10057:16;10051:23;10086:62;10142:4;10137:3;10133:14;10120:11;10086:62;;;9990:170;10240:4;10233:5;10229:16;10223:23;10258:62;10314:4;10309:3;10305:14;10292:11;10258:62;;;10170:162;10412:4;10405:5;10401:16;10395:23;10430:62;10486:4;10481:3;10477:14;10464:11;10430:62;;;10342:162;10597:5;10590;10586:17;10580:24;10616:63;10672:5;10667:3;10663:15;10650:11;10616:63;;;10514:177;10767:5;10760;10756:17;10750:24;10786:63;10842:5;10837:3;10833:15;10820:11;10786:63;;;10701:160;10947:5;10940;10936:17;10930:24;11000:3;10994:4;10990:14;10982:5;10977:3;10973:15;10966:39;11020:66;11081:4;11068:11;11020:66;;;11012:74;;10871:227;11184:5;11177;11173:17;11167:24;11237:3;11231:4;11227:14;11219:5;11214:3;11210:15;11203:39;11257:66;11318:4;11305:11;11257:66;;;11249:74;9052:2309;-1:-1;;;;;9052:2309;11368:110;11441:31;11466:5;11441:31;;11485:193;11593:2;11578:18;;11607:61;11582:9;11641:6;11607:61;;;11564:114;;;;;11685:181;11787:2;11772:18;;11801:55;11776:9;11829:6;11801:55;;11873:387;12054:2;12068:47;;;12039:18;;12129:121;12039:18;12129:121;;12267:387;12448:2;12462:47;;;12433:18;;12523:121;12433:18;12523:121;;12661:387;12842:2;12856:47;;;12827:18;;12917:121;12827:18;12917:121;;13055:387;13236:2;13250:47;;;13221:18;;13311:121;13221:18;13311:121;;13449:615;13675:2;13689:47;;;13660:18;;13750:92;13660:18;13828:6;13750:92;;;13742:100;;13853:62;13911:2;13900:9;13896:18;13887:6;13853:62;;;13963:9;13957:4;13953:20;13948:2;13937:9;13933:18;13926:48;13988:66;14049:4;14040:6;13988:66;;14071:659;14296:3;14281:19;;14311:61;14285:9;14345:6;14311:61;;;14383:62;14441:2;14430:9;14426:18;14417:6;14383:62;;;14493:9;14487:4;14483:20;14478:2;14467:9;14463:18;14456:48;14518:66;14579:4;14570:6;14518:66;;;14510:74;;14632:9;14626:4;14622:20;14617:2;14606:9;14602:18;14595:48;14657:63;14715:4;14706:6;14657:63;;;14649:71;14267:463;-1:-1;;;;;;14267:463;14737:256;14799:2;14793:9;14825:17;;;14900:18;14885:34;;14921:22;;;14882:62;14879:2;;;14957:1;14954;14947:12;14879:2;14973;14966:22;14777:216;;-1:-1;14777:216;15000:254;;15139:18;15131:6;15128:30;15125:2;;;15171:1;15168;15161:12;15125:2;-1:-1;15244:4;15215;15192:17;;;;15211:9;15188:33;15234:15;;15062:192;15528:125;;15594:15;;;15641:4;15628:18;;;15586:67;15662:87;15732:12;;15716:33;15854:128;15934:42;15923:54;;15906:76;15989:92;16062:13;16055:21;;16038:43;16088:79;16157:5;16140:27;16581:145;16662:6;16657:3;16652;16639:30;-1:-1;16718:1;16700:16;;16693:27;16632:94;16735:268;16800:1;16807:101;16821:6;16818:1;16815:13;16807:101;;;16888:11;;;16882:18;16869:11;;;16862:39;16843:2;16836:10;16807:101;;;16923:6;16920:1;16917:13;16914:2;;;16988:1;16979:6;16974:3;16970:16;16963:27;16914:2;16784:219;;;;;17011:97;17099:2;17079:14;17095:7;17075:28;;17059:49"
}
}
@@ -249,7 +249,7 @@
"2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
"2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
"2.0.0/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
- "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n\n /// @dev Fetches information for all passed in orders\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory);\n}\n",
"2.0.0/protocol/Exchange/libs/LibEIP712.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 public constant EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encode(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n address(this)\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, hashStruct));\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibFillResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibOrder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // order.makerAddress,\n // order.takerAddress,\n // order.feeRecipientAddress,\n // order.senderAddress,\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Backup\n // solhint-disable-next-line space-after-comma\n let temp1 := mload(sub(order, 32))\n let temp2 := mload(add(order, 320))\n let temp3 := mload(add(order, 352))\n \n // Hash in place\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), schemaHash)\n mstore(add(order, 320), makerAssetDataHash)\n mstore(add(order, 352), takerAssetDataHash)\n result := keccak256(sub(order, 32), 416)\n \n // Restore\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), temp1)\n mstore(add(order, 320), temp2)\n mstore(add(order, 352), temp3)\n }\n return result;\n }\n}\n",
@@ -258,7 +258,7 @@
"2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
"2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_OVERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
},
- "sourceTreeHashHex": "0xf3ece3882b6c19757f5416b417f39b2bdede4202f113d2c98b3a48b9e2ec6286",
+ "sourceTreeHashHex": "0xb2984ae540f9604694e40d30bab3fd32c71a59c86ec359fde748f4c68ce2b4ad",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
diff --git a/packages/migrations/package.json b/packages/migrations/package.json
index d4aa73912..ac4d7e965 100644
--- a/packages/migrations/package.json
+++ b/packages/migrations/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/migrations",
- "version": "0.0.9",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -9,7 +9,8 @@
"types": "lib/index.d.ts",
"scripts": {
"watch_without_deps": "yarn pre_build && tsc -w",
- "build": "yarn pre_build && tsc",
+ "build": "yarn pre_build && tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js",
"pre_build": "run-s copy_artifacts generate_contract_wrappers",
"copy_artifacts": "copyfiles 'artifacts/**/*' ./lib",
"clean": "shx rm -rf lib src/contract_wrappers",
@@ -37,28 +38,30 @@
},
"license": "Apache-2.0",
"devDependencies": {
- "@0xproject/abi-gen": "^0.3.3",
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/tslint-config": "^0.4.21",
- "@0xproject/types": "^0.8.2",
+ "@0xproject/abi-gen": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
+ "@0xproject/types": "^1.0.0-rc.1",
"@types/yargs": "^10.0.0",
+ "copyfiles": "^1.2.0",
"yargs": "^10.0.3",
"make-promises-safe": "^1.1.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/base-contract": "^0.3.5",
- "@0xproject/order-utils": "^1.0.0",
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/subproviders": "^0.10.5",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "@0xproject/base-contract": "^1.0.0",
+ "@0xproject/order-utils": "^1.0.0-rc.1",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/subproviders": "^1.0.0",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"@ledgerhq/hw-app-eth": "^4.3.0",
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"ethers": "3.0.22",
"lodash": "^4.17.4"
},
diff --git a/packages/migrations/src/2.0.0/migration.ts b/packages/migrations/src/2.0.0/migration.ts
index 226bf0a68..f51c236de 100644
--- a/packages/migrations/src/2.0.0/migration.ts
+++ b/packages/migrations/src/2.0.0/migration.ts
@@ -1,4 +1,4 @@
-import { assetProxyUtils } from '@0xproject/order-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import { Provider, TxData } from 'ethereum-types';
@@ -53,7 +53,7 @@ export const runV2MigrationsAsync = async (provider: Provider, artifactsDir: str
artifacts.Exchange,
provider,
txDefaults,
- assetProxyUtils.encodeERC20AssetData(zrxToken.address),
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
);
artifactsWriter.saveArtifact(exchange);
@@ -137,8 +137,8 @@ export const runV2MigrationsAsync = async (provider: Provider, artifactsDir: str
exchange.address,
etherToken.address,
zrxToken.address,
- assetProxyUtils.encodeERC20AssetData(zrxToken.address),
- assetProxyUtils.encodeERC20AssetData(etherToken.address),
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ assetDataUtils.encodeERC20AssetData(etherToken.address),
);
artifactsWriter.saveArtifact(forwarder);
};
diff --git a/packages/migrations/src/monorepo_scripts/postpublish.ts b/packages/migrations/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/migrations/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/migrations/src/utils/artifact_writer.ts b/packages/migrations/src/utils/artifact_writer.ts
index 2da5a09dd..b7522df05 100644
--- a/packages/migrations/src/utils/artifact_writer.ts
+++ b/packages/migrations/src/utils/artifact_writer.ts
@@ -4,8 +4,8 @@ import * as fs from 'fs';
import * as path from 'path';
export class ArtifactWriter {
- private _artifactsDir: string;
- private _networkId: number;
+ private readonly _artifactsDir: string;
+ private readonly _networkId: number;
constructor(artifactsDir: string, networkId: number) {
this._artifactsDir = artifactsDir;
this._networkId = networkId;
diff --git a/packages/monorepo-scripts/CHANGELOG.json b/packages/monorepo-scripts/CHANGELOG.json
index 8cf8c60c6..cdac2d278 100644
--- a/packages/monorepo-scripts/CHANGELOG.json
+++ b/packages/monorepo-scripts/CHANGELOG.json
@@ -1,10 +1,14 @@
[
{
- "version": "0.2.3",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
"note": "Fix git remote tag removal step & add an additional sanity assertion",
"pr": 803
+ },
+ {
+ "note": "Make PR numbers links on Github releases"
}
]
},
diff --git a/packages/monorepo-scripts/package.json b/packages/monorepo-scripts/package.json
index 7ebe4fb84..e73a27aae 100644
--- a/packages/monorepo-scripts/package.json
+++ b/packages/monorepo-scripts/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/monorepo-scripts",
- "version": "0.2.2",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -33,13 +33,12 @@
"@types/node": "^8.0.53",
"@types/opn": "^5.1.0",
"@types/rimraf": "^2.0.2",
+ "@types/semver": "5.5.0",
"depcheck": "^0.6.9",
- "lerna-get-packages": "^1.0.0",
"make-promises-safe": "^1.1.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "@types/semver": "5.5.0",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
@@ -56,8 +55,8 @@
"prompt": "^1.0.0",
"publish-release": "0xproject/publish-release",
"rimraf": "^2.6.2",
- "semver-diff": "^2.1.0",
"semver": "5.5.0",
+ "semver-diff": "^2.1.0",
"semver-sort": "0.0.4"
},
"publishConfig": {
diff --git a/packages/monorepo-scripts/src/constants.ts b/packages/monorepo-scripts/src/constants.ts
index 3aaf881cb..f08313bd2 100644
--- a/packages/monorepo-scripts/src/constants.ts
+++ b/packages/monorepo-scripts/src/constants.ts
@@ -3,6 +3,6 @@ import * as path from 'path';
export const constants = {
monorepoRootPath: path.join(__dirname, '../../..'),
stagingWebsite: 'http://staging-0xproject.s3-website-us-east-1.amazonaws.com',
- lernaExecutable: path.join('node_modules', 'lerna', 'bin', 'lerna.js'),
+ lernaExecutable: path.join('node_modules', 'lerna', 'cli.js'),
githubPersonalAccessToken: process.env.GITHUB_PERSONAL_ACCESS_TOKEN_0X_JS,
};
diff --git a/packages/monorepo-scripts/src/find_unused_dependencies.ts b/packages/monorepo-scripts/src/find_unused_dependencies.ts
index 11e48ab13..4bb4b7dc5 100644
--- a/packages/monorepo-scripts/src/find_unused_dependencies.ts
+++ b/packages/monorepo-scripts/src/find_unused_dependencies.ts
@@ -1,7 +1,6 @@
#!/usr/bin/env node
import * as depcheckAsync from 'depcheck';
-import lernaGetPackages = require('lerna-get-packages');
import * as _ from 'lodash';
import { constants } from './constants';
@@ -13,15 +12,15 @@ const IGNORE_PACKAGES = ['@0xproject/sol-compiler'];
(async () => {
utils.log('*** NOTE: Not all deps listed here are actually not required. ***');
utils.log("*** `depcheck` isn't perfect so double check before actually removing any. ***\n");
- const lernaPackages = lernaGetPackages(constants.monorepoRootPath);
- for (const lernaPackage of lernaPackages) {
- if (_.includes(IGNORE_PACKAGES, lernaPackage.package.name)) {
+ const packages = utils.getPackages(constants.monorepoRootPath);
+ for (const pkg of packages) {
+ if (_.includes(IGNORE_PACKAGES, pkg.packageJson.name)) {
continue; // skip
}
- utils.log(`Checking ${lernaPackage.package.name} for unused deps. This might take a while...`);
+ utils.log(`Checking ${pkg.packageJson.name} for unused deps. This might take a while...`);
const configs = {};
- const { dependencies } = await depcheckAsync(lernaPackage.location, configs);
+ const { dependencies } = await depcheckAsync(pkg.location, configs);
if (!_.isEmpty(dependencies)) {
_.each(dependencies, dep => {
utils.log(dep);
diff --git a/packages/monorepo-scripts/src/globals.d.ts b/packages/monorepo-scripts/src/globals.d.ts
index 1693a6dbb..cb6a61b55 100644
--- a/packages/monorepo-scripts/src/globals.d.ts
+++ b/packages/monorepo-scripts/src/globals.d.ts
@@ -13,23 +13,4 @@ declare module 'semver-sort' {
const desc: (versions: string[]) => string[];
}
-declare interface LernaPackage {
- location: string;
- package: {
- private?: boolean;
- version: string;
- name: string;
- main?: string;
- scripts?: { [command: string]: string };
- config?: {
- additionalTsTypings?: string[];
- };
- };
-}
-declare function lernaGetPackages(path: string): LernaPackage[];
-// lerna-get-packages declarations
-declare module 'lerna-get-packages' {
- export = lernaGetPackages;
-}
-
declare module 'promisify-child-process';
diff --git a/packages/monorepo-scripts/src/postpublish_utils.ts b/packages/monorepo-scripts/src/postpublish_utils.ts
index b55a88539..3ecb7b7c5 100644
--- a/packages/monorepo-scripts/src/postpublish_utils.ts
+++ b/packages/monorepo-scripts/src/postpublish_utils.ts
@@ -51,8 +51,13 @@ export const postpublishUtils = {
return configs;
},
async runAsync(packageJSON: any, tsConfigJSON: any, cwd: string): Promise<void> {
- const configs = this.generateConfig(packageJSON, tsConfigJSON, cwd);
- await this.publishReleaseNotesAsync(configs.cwd, configs.packageName, configs.version, configs.assets);
+ const configs = postpublishUtils.generateConfig(packageJSON, tsConfigJSON, cwd);
+ await postpublishUtils.publishReleaseNotesAsync(
+ configs.cwd,
+ configs.packageName,
+ configs.version,
+ configs.assets,
+ );
if (
!_.isUndefined(configs.docPublishConfigs.s3BucketPath) ||
!_.isUndefined(configs.docPublishConfigs.s3StagingBucketPath)
@@ -69,7 +74,7 @@ export const postpublishUtils = {
}
},
async publishDocsToStagingAsync(packageJSON: any, tsConfigJSON: any, cwd: string): Promise<void> {
- const configs = this.generateConfig(packageJSON, tsConfigJSON, cwd);
+ const configs = postpublishUtils.generateConfig(packageJSON, tsConfigJSON, cwd);
if (_.isUndefined(configs.docPublishConfigs.s3StagingBucketPath)) {
utils.log('config.postpublish.docPublishConfigs.s3StagingBucketPath entry in package.json not found!');
return;
@@ -84,10 +89,10 @@ export const postpublishUtils = {
);
},
async publishReleaseNotesAsync(cwd: string, packageName: string, version: string, assets: string[]): Promise<void> {
- const notes = this.getReleaseNotes(packageName, version);
- const releaseName = this.getReleaseName(packageName, version);
- const tag = this.getTag(packageName, version);
- this.adjustAssetPaths(cwd, assets);
+ const notes = postpublishUtils.getReleaseNotes(packageName, version);
+ const releaseName = postpublishUtils.getReleaseName(packageName, version);
+ const tag = postpublishUtils.getTag(packageName, version);
+ postpublishUtils.adjustAssetPaths(cwd, assets);
utils.log('POSTPUBLISH: Releasing ', releaseName, '...');
await publishReleaseAsync({
token: constants.githubPersonalAccessToken,
@@ -123,7 +128,7 @@ export const postpublishUtils = {
_.each(latestLog.changes, change => {
notes += `* ${change.note}`;
if (change.pr) {
- notes += ` (${change.pr})`;
+ notes += ` (#${change.pr})`;
}
notes += `\n`;
});
@@ -165,7 +170,7 @@ export const postpublishUtils = {
version: string,
S3BucketPath: string,
): Promise<void> {
- const fileIncludesAdjusted = this.adjustFileIncludePaths(fileIncludes, cwd);
+ const fileIncludesAdjusted = postpublishUtils.adjustFileIncludePaths(fileIncludes, cwd);
const projectFiles = fileIncludesAdjusted.join(' ');
const jsonFilePath = `${cwd}/${generatedDocsDirectoryName}/index.json`;
const result = await execAsync(
diff --git a/packages/monorepo-scripts/src/prepublish_checks.ts b/packages/monorepo-scripts/src/prepublish_checks.ts
index 3b4ff9082..431e848ca 100644
--- a/packages/monorepo-scripts/src/prepublish_checks.ts
+++ b/packages/monorepo-scripts/src/prepublish_checks.ts
@@ -4,34 +4,33 @@ import semver = require('semver');
import semverSort = require('semver-sort');
import { constants } from './constants';
+import { Package } from './types';
import { changelogUtils } from './utils/changelog_utils';
import { npmUtils } from './utils/npm_utils';
import { utils } from './utils/utils';
async function prepublishChecksAsync(): Promise<void> {
const shouldIncludePrivate = false;
- const updatedPublicLernaPackages = await utils.getUpdatedLernaPackagesAsync(shouldIncludePrivate);
+ const updatedPublicPackages = await utils.getUpdatedPackagesAsync(shouldIncludePrivate);
- await checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(updatedPublicLernaPackages);
- await checkChangelogFormatAsync(updatedPublicLernaPackages);
- await checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicLernaPackages);
+ await checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(updatedPublicPackages);
+ await checkChangelogFormatAsync(updatedPublicPackages);
+ await checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicPackages);
await checkPublishRequiredSetupAsync();
}
-async function checkGitTagsForNextVersionAndDeleteIfExistAsync(
- updatedPublicLernaPackages: LernaPackage[],
-): Promise<void> {
- const packageNames = _.map(updatedPublicLernaPackages, lernaPackage => lernaPackage.package.name);
+async function checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicPackages: Package[]): Promise<void> {
+ const packageNames = _.map(updatedPublicPackages, pkg => pkg.packageJson.name);
const localGitTags = await utils.getLocalGitTagsAsync();
const localTagVersionsByPackageName = await utils.getGitTagsByPackageNameAsync(packageNames, localGitTags);
const remoteGitTags = await utils.getRemoteGitTagsAsync();
const remoteTagVersionsByPackageName = await utils.getGitTagsByPackageNameAsync(packageNames, remoteGitTags);
- for (const lernaPackage of updatedPublicLernaPackages) {
- const currentVersion = lernaPackage.package.version;
- const packageName = lernaPackage.package.name;
- const packageLocation = lernaPackage.location;
+ for (const pkg of updatedPublicPackages) {
+ const currentVersion = pkg.packageJson.version;
+ const packageName = pkg.packageJson.name;
+ const packageLocation = pkg.location;
const nextVersion = await utils.getNextPackageVersionAsync(currentVersion, packageName, packageLocation);
const remoteTagVersions = remoteTagVersionsByPackageName[packageName];
@@ -49,13 +48,13 @@ async function checkGitTagsForNextVersionAndDeleteIfExistAsync(
}
async function checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(
- updatedPublicLernaPackages: LernaPackage[],
+ updatedPublicPackages: Package[],
): Promise<void> {
utils.log('Check package versions against npmjs.org...');
const versionMismatches = [];
- for (const lernaPackage of updatedPublicLernaPackages) {
- const packageName = lernaPackage.package.name;
- const packageVersion = lernaPackage.package.version;
+ for (const pkg of updatedPublicPackages) {
+ const packageName = pkg.packageJson.name;
+ const packageVersion = pkg.packageJson.version;
const packageRegistryJsonIfExists = await npmUtils.getPackageRegistryJsonIfExistsAsync(packageName);
if (_.isUndefined(packageRegistryJsonIfExists)) {
continue; // noop for packages not yet published to NPM
@@ -84,14 +83,14 @@ async function checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(
}
}
-async function checkChangelogFormatAsync(updatedPublicLernaPackages: LernaPackage[]): Promise<void> {
+async function checkChangelogFormatAsync(updatedPublicPackages: Package[]): Promise<void> {
utils.log('Check CHANGELOGs for inconsistencies...');
const changeLogInconsistencies = [];
- for (const lernaPackage of updatedPublicLernaPackages) {
- const packageName = lernaPackage.package.name;
- const changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, lernaPackage.location);
+ for (const pkg of updatedPublicPackages) {
+ const packageName = pkg.packageJson.name;
+ const changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, pkg.location);
- const currentVersion = lernaPackage.package.version;
+ const currentVersion = pkg.packageJson.version;
if (!_.isEmpty(changelog)) {
const lastEntry = changelog[0];
const doesLastEntryHaveTimestamp = !_.isUndefined(lastEntry.timestamp);
@@ -105,7 +104,7 @@ async function checkChangelogFormatAsync(updatedPublicLernaPackages: LernaPackag
// Remove incorrectly added timestamp
delete changelog[0].timestamp;
// Save updated CHANGELOG.json
- await changelogUtils.writeChangelogJsonFileAsync(lernaPackage.location, changelog);
+ await changelogUtils.writeChangelogJsonFileAsync(pkg.location, changelog);
utils.log(`${packageName}: Removed timestamp from latest CHANGELOG.json entry.`);
}
}
diff --git a/packages/monorepo-scripts/src/publish.ts b/packages/monorepo-scripts/src/publish.ts
index 72c6c0a71..c44e1f85e 100644
--- a/packages/monorepo-scripts/src/publish.ts
+++ b/packages/monorepo-scripts/src/publish.ts
@@ -11,7 +11,7 @@ import semverDiff = require('semver-diff');
import semverSort = require('semver-sort');
import { constants } from './constants';
-import { PackageToVersionChange, SemVerIndex, VersionChangelog } from './types';
+import { Package, PackageToVersionChange, SemVerIndex, VersionChangelog } from './types';
import { changelogUtils } from './utils/changelog_utils';
import { utils } from './utils/utils';
@@ -34,19 +34,20 @@ const packageNameToWebsitePath: { [name: string]: string } = {
'sol-cov': 'sol-cov',
subproviders: 'subproviders',
'order-utils': 'order-utils',
+ 'ethereum-types': 'ethereum-types',
};
(async () => {
// Fetch public, updated Lerna packages
const shouldIncludePrivate = false;
- const updatedPublicLernaPackages = await utils.getUpdatedLernaPackagesAsync(shouldIncludePrivate);
+ const updatedPublicPackages = await utils.getUpdatedPackagesAsync(shouldIncludePrivate);
- await confirmDocPagesRenderAsync(updatedPublicLernaPackages);
+ await confirmDocPagesRenderAsync(updatedPublicPackages);
// Update CHANGELOGs
- const updatedPublicLernaPackageNames = _.map(updatedPublicLernaPackages, pkg => pkg.package.name);
- utils.log(`Will update CHANGELOGs and publish: \n${updatedPublicLernaPackageNames.join('\n')}\n`);
- const packageToVersionChange = await updateChangeLogsAsync(updatedPublicLernaPackages);
+ const updatedPublicPackageNames = _.map(updatedPublicPackages, pkg => pkg.packageJson.name);
+ utils.log(`Will update CHANGELOGs and publish: \n${updatedPublicPackageNames.join('\n')}\n`);
+ const packageToVersionChange = await updateChangeLogsAsync(updatedPublicPackages);
// Push changelog changes to Github
if (!IS_DRY_RUN) {
@@ -65,7 +66,7 @@ const packageNameToWebsitePath: { [name: string]: string } = {
process.exit(1);
});
-async function confirmDocPagesRenderAsync(packages: LernaPackage[]): Promise<void> {
+async function confirmDocPagesRenderAsync(packages: Package[]): Promise<void> {
// push docs to staging
utils.log("Upload all docJson's to S3 staging...");
await execAsync(`yarn stage_docs`, { cwd: constants.monorepoRootPath });
@@ -76,14 +77,14 @@ async function confirmDocPagesRenderAsync(packages: LernaPackage[]): Promise<voi
await execAsync(`yarn deploy_staging`, { cwd: pathToWebsite });
const packagesWithDocs = _.filter(packages, pkg => {
- const scriptsIfExists = pkg.package.scripts;
+ const scriptsIfExists = pkg.packageJson.scripts;
if (_.isUndefined(scriptsIfExists)) {
throw new Error('Found a public package without any scripts in package.json');
}
return !_.isUndefined(scriptsIfExists[DOC_GEN_COMMAND]);
});
_.each(packagesWithDocs, pkg => {
- const name = pkg.package.name;
+ const name = pkg.packageJson.name;
const nameWithoutPrefix = _.startsWith(name, NPM_NAMESPACE) ? name.split('@0xproject/')[1] : name;
const docSegmentIfExists = packageNameToWebsitePath[nameWithoutPrefix];
if (_.isUndefined(docSegmentIfExists)) {
@@ -114,15 +115,15 @@ async function pushChangelogsToGithubAsync(): Promise<void> {
utils.log(`Pushed CHANGELOG updates to Github`);
}
-async function updateChangeLogsAsync(updatedPublicLernaPackages: LernaPackage[]): Promise<PackageToVersionChange> {
+async function updateChangeLogsAsync(updatedPublicPackages: Package[]): Promise<PackageToVersionChange> {
const packageToVersionChange: PackageToVersionChange = {};
- for (const lernaPackage of updatedPublicLernaPackages) {
- const packageName = lernaPackage.package.name;
- let changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, lernaPackage.location);
+ for (const pkg of updatedPublicPackages) {
+ const packageName = pkg.packageJson.name;
+ let changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, pkg.location);
- const currentVersion = lernaPackage.package.version;
+ const currentVersion = pkg.packageJson.version;
const shouldAddNewEntry = changelogUtils.shouldAddNewChangelogEntry(
- lernaPackage.package.name,
+ pkg.packageJson.name,
currentVersion,
changelog,
);
@@ -157,11 +158,11 @@ async function updateChangeLogsAsync(updatedPublicLernaPackages: LernaPackage[])
}
// Save updated CHANGELOG.json
- await changelogUtils.writeChangelogJsonFileAsync(lernaPackage.location, changelog);
+ await changelogUtils.writeChangelogJsonFileAsync(pkg.location, changelog);
utils.log(`${packageName}: Updated CHANGELOG.json`);
// Generate updated CHANGELOG.md
const changelogMd = changelogUtils.generateChangelogMd(changelog);
- await changelogUtils.writeChangelogMdFileAsync(lernaPackage.location, changelogMd);
+ await changelogUtils.writeChangelogMdFileAsync(pkg.location, changelogMd);
utils.log(`${packageName}: Updated CHANGELOG.md`);
}
diff --git a/packages/monorepo-scripts/src/test_installation.ts b/packages/monorepo-scripts/src/test_installation.ts
index b67154667..668d4ef1d 100644
--- a/packages/monorepo-scripts/src/test_installation.ts
+++ b/packages/monorepo-scripts/src/test_installation.ts
@@ -1,7 +1,6 @@
#!/usr/bin/env node
import * as fs from 'fs';
-import lernaGetPackages = require('lerna-get-packages');
import * as _ from 'lodash';
import * as path from 'path';
import { exec as execAsync } from 'promisify-child-process';
@@ -11,17 +10,14 @@ import { utils } from './utils/utils';
(async () => {
const monorepoRootPath = path.join(__dirname, '../../..');
- const lernaPackages = lernaGetPackages(monorepoRootPath);
+ const packages = utils.getPackages(monorepoRootPath);
const installablePackages = _.filter(
- lernaPackages,
- lernaPackage =>
- !lernaPackage.package.private &&
- !_.isUndefined(lernaPackage.package.main) &&
- lernaPackage.package.main.endsWith('.js'),
+ packages,
+ pkg => !pkg.packageJson.private && !_.isUndefined(pkg.packageJson.main) && pkg.packageJson.main.endsWith('.js'),
);
- for (const installableLernaPackage of installablePackages) {
- const packagePath = installableLernaPackage.location;
- const packageName = installableLernaPackage.package.name;
+ for (const installablePackage of installablePackages) {
+ const packagePath = installablePackage.location;
+ const packageName = installablePackage.packageJson.name;
utils.log(`Testing ${packageName}`);
let result = await execAsync('npm pack', { cwd: packagePath });
const packedPackageFileName = result.stdout.trim();
diff --git a/packages/monorepo-scripts/src/types.ts b/packages/monorepo-scripts/src/types.ts
index 61bd75732..9f991c86c 100644
--- a/packages/monorepo-scripts/src/types.ts
+++ b/packages/monorepo-scripts/src/types.ts
@@ -40,3 +40,17 @@ export interface PackageRegistryJson {
export interface GitTagsByPackageName {
[packageName: string]: string[];
}
+
+export interface Package {
+ location: string;
+ packageJson: {
+ private?: boolean;
+ version: string;
+ name: string;
+ main?: string;
+ scripts?: { [command: string]: string };
+ config?: {
+ additionalTsTypings?: string[];
+ };
+ };
+}
diff --git a/packages/monorepo-scripts/src/utils/changelog_utils.ts b/packages/monorepo-scripts/src/utils/changelog_utils.ts
index dbafb6f16..4781b3b7d 100644
--- a/packages/monorepo-scripts/src/utils/changelog_utils.ts
+++ b/packages/monorepo-scripts/src/utils/changelog_utils.ts
@@ -10,7 +10,7 @@ import { Change, Changelog, VersionChangelog } from '../types';
const CHANGELOG_MD_HEADER = `
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
@@ -74,7 +74,7 @@ export const changelogUtils = {
},
getChangelogOrCreateIfMissing(packageName: string, packageLocation: string): Changelog {
const changelogJSONPath = path.join(packageLocation, 'CHANGELOG.json');
- let changelogJsonIfExists = this.getChangelogJSONIfExists(changelogJSONPath);
+ let changelogJsonIfExists = changelogUtils.getChangelogJSONIfExists(changelogJSONPath);
if (_.isUndefined(changelogJsonIfExists)) {
// If none exists, create new, empty one.
changelogJsonIfExists = '[]';
@@ -91,12 +91,12 @@ export const changelogUtils = {
async writeChangelogJsonFileAsync(packageLocation: string, changelog: Changelog): Promise<void> {
const changelogJSONPath = path.join(packageLocation, 'CHANGELOG.json');
fs.writeFileSync(changelogJSONPath, JSON.stringify(changelog, null, '\t'));
- await this.prettifyAsync(changelogJSONPath, constants.monorepoRootPath);
+ await changelogUtils.prettifyAsync(changelogJSONPath, constants.monorepoRootPath);
},
async writeChangelogMdFileAsync(packageLocation: string, changelogMdString: string): Promise<void> {
const changelogMarkdownPath = path.join(packageLocation, 'CHANGELOG.md');
fs.writeFileSync(changelogMarkdownPath, changelogMdString);
- await this.prettifyAsync(changelogMarkdownPath, constants.monorepoRootPath);
+ await changelogUtils.prettifyAsync(changelogMarkdownPath, constants.monorepoRootPath);
},
async prettifyAsync(filePath: string, cwd: string): Promise<void> {
await execAsync(`prettier --write ${filePath} --config .prettierrc`, {
diff --git a/packages/monorepo-scripts/src/utils/utils.ts b/packages/monorepo-scripts/src/utils/utils.ts
index f819ab6f1..8ba59c81d 100644
--- a/packages/monorepo-scripts/src/utils/utils.ts
+++ b/packages/monorepo-scripts/src/utils/utils.ts
@@ -1,10 +1,10 @@
-import lernaGetPackages = require('lerna-get-packages');
+import * as fs from 'fs';
import * as _ from 'lodash';
import { exec as execAsync } from 'promisify-child-process';
import semver = require('semver');
import { constants } from '../constants';
-import { GitTagsByPackageName, UpdatedPackage } from '../types';
+import { GitTagsByPackageName, Package, UpdatedPackage } from '../types';
import { changelogUtils } from './changelog_utils';
@@ -12,15 +12,47 @@ export const utils = {
log(...args: any[]): void {
console.log(...args); // tslint:disable-line:no-console
},
- async getUpdatedLernaPackagesAsync(shouldIncludePrivate: boolean): Promise<LernaPackage[]> {
- const updatedPublicPackages = await this.getLernaUpdatedPackagesAsync(shouldIncludePrivate);
+ getPackages(rootDir: string): Package[] {
+ const rootPackageJsonString = fs.readFileSync(`${rootDir}/package.json`, 'utf8');
+ const rootPackageJson = JSON.parse(rootPackageJsonString);
+ if (_.isUndefined(rootPackageJson.workspaces)) {
+ throw new Error(`Did not find 'workspaces' key in root package.json`);
+ }
+ const packages = [];
+ for (const workspace of rootPackageJson.workspaces) {
+ // HACK: Remove allowed wildcards from workspace entries.
+ // This might be entirely comprehensive.
+ const workspacePath = workspace.replace('*', '').replace('**/*', '');
+ const subpackageNames = fs.readdirSync(`${rootDir}/${workspacePath}`);
+ for (const subpackageName of subpackageNames) {
+ if (_.startsWith(subpackageName, '.')) {
+ continue;
+ }
+ const pathToPackageJson = `${rootDir}/${workspacePath}${subpackageName}`;
+ try {
+ const packageJsonString = fs.readFileSync(`${pathToPackageJson}/package.json`, 'utf8');
+ const packageJson = JSON.parse(packageJsonString);
+ const pkg = {
+ location: pathToPackageJson,
+ packageJson,
+ };
+ packages.push(pkg);
+ } catch (err) {
+ utils.log(`Couldn't find a 'package.json' for ${subpackageName}. Skipping.`);
+ }
+ }
+ }
+ return packages;
+ },
+ async getUpdatedPackagesAsync(shouldIncludePrivate: boolean): Promise<Package[]> {
+ const updatedPublicPackages = await utils.getLernaUpdatedPackagesAsync(shouldIncludePrivate);
const updatedPackageNames = _.map(updatedPublicPackages, pkg => pkg.name);
- const allLernaPackages = lernaGetPackages(constants.monorepoRootPath);
- const updatedPublicLernaPackages = _.filter(allLernaPackages, pkg => {
- return _.includes(updatedPackageNames, pkg.package.name);
+ const allPackages = utils.getPackages(constants.monorepoRootPath);
+ const updatedPackages = _.filter(allPackages, pkg => {
+ return _.includes(updatedPackageNames, pkg.packageJson.name);
});
- return updatedPublicLernaPackages;
+ return updatedPackages;
},
async getLernaUpdatedPackagesAsync(shouldIncludePrivate: boolean): Promise<UpdatedPackage[]> {
const result = await execAsync(`${constants.lernaExecutable} updated --json`, {
@@ -110,7 +142,7 @@ export const utils = {
} catch (err) {
throw new Error(`Failed to delete local git tag. Got err: ${err}`);
}
- this.log(`Removed local tag: ${tagName}`);
+ utils.log(`Removed local tag: ${tagName}`);
},
async removeRemoteTagAsync(tagName: string): Promise<void> {
try {
@@ -120,6 +152,6 @@ export const utils = {
} catch (err) {
throw new Error(`Failed to delete remote git tag. Got err: ${err}`);
}
- this.log(`Removed remote tag: ${tagName}`);
+ utils.log(`Removed remote tag: ${tagName}`);
},
};
diff --git a/packages/order-utils/CHANGELOG.json b/packages/order-utils/CHANGELOG.json
index 715d58a43..b1f962e9f 100644
--- a/packages/order-utils/CHANGELOG.json
+++ b/packages/order-utils/CHANGELOG.json
@@ -1,6 +1,16 @@
[
{
- "version": "1.0.0",
+ "version": "1.0.0-rc.2",
+ "changes": [
+ {
+ "note":
+ "Upgrade ethereumjs-abi dep including a fix so that addresses starting with 0 are properly decoded by `decodeERC20AssetData`"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
"changes": [
{
"note": "Refactor to work with V2 of 0x protocol",
@@ -9,6 +19,19 @@
{
"note": "Export parseECSignature method",
"pr": 684
+ },
+ {
+ "note": "Handle Typed Arrays when hashing data",
+ "pr": 894
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
}
]
},
diff --git a/packages/order-utils/CHANGELOG.md b/packages/order-utils/CHANGELOG.md
index 672affc19..17464a966 100644
--- a/packages/order-utils/CHANGELOG.md
+++ b/packages/order-utils/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.0.9 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.0.8 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/order-utils/package.json b/packages/order-utils/package.json
index 8f5041609..0df8a3f6c 100644
--- a/packages/order-utils/package.json
+++ b/packages/order-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/order-utils",
- "version": "1.0.0",
+ "version": "1.0.0-rc.1",
"engines": {
"node": ">=6.12"
},
@@ -51,10 +51,9 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/order-utils/README.md",
"devDependencies": {
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
- "@types/ethereumjs-abi": "^0.6.0",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/bn.js": "^4.11.0",
"@types/lodash": "4.14.104",
"chai": "^4.0.1",
@@ -67,23 +66,23 @@
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
"sinon": "^4.0.0",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/assert": "^0.3.0",
- "@0xproject/base-contract": "^0.3.5",
- "@0xproject/json-schemas": "1.0.0",
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/types": "^1.0.0",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "@0xproject/assert": "^1.0.0",
+ "@0xproject/base-contract": "^1.0.0",
+ "@0xproject/json-schemas": "^1.0.0-rc.1",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"@types/node": "^8.0.53",
"bn.js": "^4.11.8",
- "ethereum-types": "^0.0.2",
- "ethereumjs-abi": "^0.6.4",
+ "ethereum-types": "^1.0.0",
+ "ethereumjs-abi": "0.6.5",
"ethereumjs-util": "^5.1.1",
"ethers": "3.0.22",
"lodash": "^4.17.4"
diff --git a/packages/order-utils/src/abstract/abstract_order_filled_cancelled_lazy_store.ts b/packages/order-utils/src/abstract/abstract_order_filled_cancelled_lazy_store.ts
new file mode 100644
index 000000000..617bcb224
--- /dev/null
+++ b/packages/order-utils/src/abstract/abstract_order_filled_cancelled_lazy_store.ts
@@ -0,0 +1,12 @@
+import { BigNumber } from '@0xproject/utils';
+
+export abstract class AbstractOrderFilledCancelledLazyStore {
+ public abstract async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>;
+ public abstract async getIsCancelledAsync(orderHash: string): Promise<boolean>;
+ public abstract setFilledTakerAmount(orderHash: string, balance: BigNumber): void;
+ public abstract deleteFilledTakerAmount(orderHash: string): void;
+ public abstract setIsCancelled(orderHash: string, isCancelled: boolean): void;
+ public abstract deleteIsCancelled(orderHash: string): void;
+ public abstract deleteAll(): void;
+ public abstract getZRXAssetData(): string;
+}
diff --git a/packages/order-utils/src/asset_proxy_utils.ts b/packages/order-utils/src/asset_data_utils.ts
index 8140ad89d..a9601e9ea 100644
--- a/packages/order-utils/src/asset_proxy_utils.ts
+++ b/packages/order-utils/src/asset_data_utils.ts
@@ -1,64 +1,25 @@
import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
-import BN = require('bn.js');
+import ethAbi = require('ethereumjs-abi');
import ethUtil = require('ethereumjs-util');
import { constants } from './constants';
-// TODO: Push upstream to DefinitelyTyped
-interface EthAbi {
- simpleEncode(signature: string, ...args: any[]): Buffer;
- rawDecode(signature: string[], data: Buffer): any[];
-}
-// tslint:disable:no-var-requires
-const ethAbi = require('ethereumjs-abi') as EthAbi;
-
-export const assetProxyUtils = {
- encodeAssetProxyId(assetProxyId: AssetProxyId): Buffer {
- return ethUtil.toBuffer(assetProxyId);
- },
- decodeAssetProxyId(encodedAssetProxyId: Buffer): AssetProxyId {
- const hexString = ethUtil.bufferToHex(encodedAssetProxyId);
- if (hexString === AssetProxyId.ERC20) {
- return AssetProxyId.ERC20;
- }
- if (hexString === AssetProxyId.ERC721) {
- return AssetProxyId.ERC721;
- }
- throw new Error(`Invalid ProxyId: ${hexString}`);
- },
- encodeAddress(address: string): Buffer {
- if (!ethUtil.isValidAddress(address)) {
- throw new Error(`Invalid Address: ${address}`);
- }
- const encodedAddress = ethUtil.toBuffer(address);
- const padded = ethUtil.setLengthLeft(encodedAddress, constants.WORD_LENGTH);
- return padded;
- },
- decodeAddress(encodedAddress: Buffer): string {
- const unpadded = ethUtil.setLengthLeft(encodedAddress, constants.ADDRESS_LENGTH);
- const address = ethUtil.bufferToHex(unpadded);
- if (!ethUtil.isValidAddress(address)) {
- throw new Error(`Invalid Address: ${address}`);
- }
- return address;
- },
- encodeUint256(value: BigNumber): Buffer {
- const base = 10;
- const formattedValue = new BN(value.toString(base));
- const encodedValue = ethUtil.toBuffer(formattedValue);
- // tslint:disable-next-line:custom-no-magic-numbers
- const paddedValue = ethUtil.setLengthLeft(encodedValue, constants.WORD_LENGTH);
- return paddedValue;
- },
- decodeUint256(encodedValue: Buffer): BigNumber {
- const formattedValue = ethUtil.bufferToHex(encodedValue);
- const value = new BigNumber(formattedValue, constants.BASE_16);
- return value;
- },
+export const assetDataUtils = {
+ /**
+ * Encodes an ERC20 token address into a hex encoded assetData string, usable in the makerAssetData or
+ * takerAssetData fields in a 0x order.
+ * @param tokenAddress The ERC20 token address to encode
+ * @return The hex encoded assetData string
+ */
encodeERC20AssetData(tokenAddress: string): string {
return ethUtil.bufferToHex(ethAbi.simpleEncode('ERC20Token(address)', tokenAddress));
},
+ /**
+ * Decodes an ERC20 assetData hex string into it's corresponding ERC20 tokenAddress & assetProxyId
+ * @param assetData Hex encoded assetData string to decode
+ * @return An object containing the decoded tokenAddress & assetProxyId
+ */
decodeERC20AssetData(assetData: string): ERC20AssetData {
const data = ethUtil.toBuffer(assetData);
if (data.byteLength < constants.ERC20_ASSET_DATA_BYTE_LENGTH) {
@@ -82,6 +43,13 @@ export const assetProxyUtils = {
tokenAddress: ethUtil.addHexPrefix(tokenAddress),
};
},
+ /**
+ * Encodes an ERC721 token address into a hex encoded assetData string, usable in the makerAssetData or
+ * takerAssetData fields in a 0x order.
+ * @param tokenAddress The ERC721 token address to encode
+ * @param tokenId The ERC721 tokenId to encode
+ * @return The hex encoded assetData string
+ */
encodeERC721AssetData(tokenAddress: string, tokenId: BigNumber, receiverData?: string): string {
// TODO: Pass `tokendId` as a BigNumber.
return ethUtil.bufferToHex(
@@ -93,6 +61,11 @@ export const assetProxyUtils = {
),
);
},
+ /**
+ * Decodes an ERC721 assetData hex string into it's corresponding ERC721 tokenAddress, tokenId & assetProxyId
+ * @param assetData Hex encoded assetData string to decode
+ * @return An object containing the decoded tokenAddress, tokenId & assetProxyId
+ */
decodeERC721AssetData(assetData: string): ERC721AssetData {
const data = ethUtil.toBuffer(assetData);
if (data.byteLength < constants.ERC721_ASSET_DATA_MINIMUM_BYTE_LENGTH) {
@@ -121,30 +94,51 @@ export const assetProxyUtils = {
receiverData: ethUtil.bufferToHex(receiverData),
};
},
- decodeAssetDataId(assetData: string): AssetProxyId {
+ /**
+ * Decode and return the assetProxyId from the assetData
+ * @param assetData Hex encoded assetData string to decode
+ * @return The assetProxyId
+ */
+ decodeAssetProxyId(assetData: string): AssetProxyId {
const encodedAssetData = ethUtil.toBuffer(assetData);
if (encodedAssetData.byteLength < constants.SELECTOR_LENGTH) {
throw new Error(
- `Could not decode Proxy Data. Expected length of encoded data to be at least 4. Got ${
+ `Could not decode assetData. Expected length of encoded data to be at least 4. Got ${
encodedAssetData.byteLength
}`,
);
}
const encodedAssetProxyId = encodedAssetData.slice(0, constants.SELECTOR_LENGTH);
- const assetProxyId = assetProxyUtils.decodeAssetProxyId(encodedAssetProxyId);
+ const assetProxyId = decodeAssetProxyId(encodedAssetProxyId);
return assetProxyId;
},
- decodeAssetData(assetData: string): ERC20AssetData | ERC721AssetData {
- const assetProxyId = assetProxyUtils.decodeAssetDataId(assetData);
+ /**
+ * Decode any assetData into it's corresponding assetData object
+ * @param assetData Hex encoded assetData string to decode
+ * @return Either a ERC20 or ERC721 assetData object
+ */
+ decodeAssetDataOrThrow(assetData: string): ERC20AssetData | ERC721AssetData {
+ const assetProxyId = assetDataUtils.decodeAssetProxyId(assetData);
switch (assetProxyId) {
case AssetProxyId.ERC20:
- const erc20AssetData = assetProxyUtils.decodeERC20AssetData(assetData);
+ const erc20AssetData = assetDataUtils.decodeERC20AssetData(assetData);
return erc20AssetData;
case AssetProxyId.ERC721:
- const erc721AssetData = assetProxyUtils.decodeERC721AssetData(assetData);
+ const erc721AssetData = assetDataUtils.decodeERC721AssetData(assetData);
return erc721AssetData;
default:
throw new Error(`Unrecognized asset proxy id: ${assetProxyId}`);
}
},
};
+
+function decodeAssetProxyId(encodedAssetProxyId: Buffer): AssetProxyId {
+ const hexString = ethUtil.bufferToHex(encodedAssetProxyId);
+ if (hexString === AssetProxyId.ERC20) {
+ return AssetProxyId.ERC20;
+ }
+ if (hexString === AssetProxyId.ERC721) {
+ return AssetProxyId.ERC721;
+ }
+ throw new Error(`Invalid ProxyId: ${hexString}`);
+}
diff --git a/packages/order-utils/src/constants.ts b/packages/order-utils/src/constants.ts
index 383a657b8..bb7482184 100644
--- a/packages/order-utils/src/constants.ts
+++ b/packages/order-utils/src/constants.ts
@@ -6,7 +6,6 @@ export const constants = {
UNLIMITED_ALLOWANCE_IN_BASE_UNITS: new BigNumber(2).pow(256).minus(1),
TESTRPC_NETWORK_ID: 50,
ADDRESS_LENGTH: 20,
- WORD_LENGTH: 32,
ERC20_ASSET_DATA_BYTE_LENGTH: 36,
ERC721_ASSET_DATA_MINIMUM_BYTE_LENGTH: 53,
SELECTOR_LENGTH: 4,
diff --git a/packages/order-utils/src/crypto.ts b/packages/order-utils/src/crypto.ts
index 517ca2840..0f1504a72 100644
--- a/packages/order-utils/src/crypto.ts
+++ b/packages/order-utils/src/crypto.ts
@@ -32,7 +32,7 @@ export const crypto = {
argTypes.push('address');
} else if (_.isString(arg)) {
argTypes.push('string');
- } else if (_.isBuffer(arg)) {
+ } else if (_.isBuffer(arg) || _.isTypedArray(arg)) {
argTypes.push('bytes');
} else if (_.isBoolean(arg)) {
argTypes.push('bool');
diff --git a/packages/order-utils/src/exchange_transfer_simulator.ts b/packages/order-utils/src/exchange_transfer_simulator.ts
index 72ed85406..c3a4f9c2a 100644
--- a/packages/order-utils/src/exchange_transfer_simulator.ts
+++ b/packages/order-utils/src/exchange_transfer_simulator.ts
@@ -34,7 +34,7 @@ const ERR_MSG_MAPPING = {
};
export class ExchangeTransferSimulator {
- private _store: AbstractBalanceAndProxyAllowanceLazyStore;
+ private readonly _store: AbstractBalanceAndProxyAllowanceLazyStore;
private static _throwValidationError(
failureReason: FailureReason,
tradeSide: TradeSide,
diff --git a/packages/order-utils/src/index.ts b/packages/order-utils/src/index.ts
index b4a7a6b67..76be63bb8 100644
--- a/packages/order-utils/src/index.ts
+++ b/packages/order-utils/src/index.ts
@@ -17,9 +17,10 @@ export { OrderError, MessagePrefixType, MessagePrefixOpts, EIP712Parameter, EIP7
export { AbstractBalanceAndProxyAllowanceFetcher } from './abstract/abstract_balance_and_proxy_allowance_fetcher';
export { AbstractOrderFilledCancelledFetcher } from './abstract/abstract_order_filled_cancelled_fetcher';
export { BalanceAndProxyAllowanceLazyStore } from './store/balance_and_proxy_allowance_lazy_store';
+export { OrderFilledCancelledLazyStore } from './store/order_filled_cancelled_lazy_store';
export { RemainingFillableCalculator } from './remaining_fillable_calculator';
export { OrderStateUtils } from './order_state_utils';
-export { assetProxyUtils } from './asset_proxy_utils';
+export { assetDataUtils } from './asset_data_utils';
export { EIP712Utils } from './eip712_utils';
export { OrderValidationUtils } from './order_validation_utils';
export { ExchangeTransferSimulator } from './exchange_transfer_simulator';
diff --git a/packages/order-utils/src/order_state_utils.ts b/packages/order-utils/src/order_state_utils.ts
index dd45a1298..189bf4180 100644
--- a/packages/order-utils/src/order_state_utils.ts
+++ b/packages/order-utils/src/order_state_utils.ts
@@ -27,8 +27,8 @@ interface SidedOrderRelevantState {
const ACCEPTABLE_RELATIVE_ROUNDING_ERROR = 0.0001;
export class OrderStateUtils {
- private _balanceAndProxyAllowanceFetcher: AbstractBalanceAndProxyAllowanceFetcher;
- private _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
+ private readonly _balanceAndProxyAllowanceFetcher: AbstractBalanceAndProxyAllowanceFetcher;
+ private readonly _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
private static _validateIfOrderIsValid(
signedOrder: SignedOrder,
sidedOrderRelevantState: SidedOrderRelevantState,
diff --git a/packages/order-utils/src/order_validation_utils.ts b/packages/order-utils/src/order_validation_utils.ts
index 94df3ef82..67d747081 100644
--- a/packages/order-utils/src/order_validation_utils.ts
+++ b/packages/order-utils/src/order_validation_utils.ts
@@ -13,7 +13,7 @@ import { isValidSignatureAsync } from './signature_utils';
import { utils } from './utils';
export class OrderValidationUtils {
- private _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
+ private readonly _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
public static isRoundingError(numerator: BigNumber, denominator: BigNumber, target: BigNumber): boolean {
// Solidity's mulmod() in JS
// Source: https://solidity.readthedocs.io/en/latest/units-and-global-variables.html#mathematical-and-cryptographic-functions
diff --git a/packages/order-utils/src/remaining_fillable_calculator.ts b/packages/order-utils/src/remaining_fillable_calculator.ts
index 29e19e5ab..7022aa979 100644
--- a/packages/order-utils/src/remaining_fillable_calculator.ts
+++ b/packages/order-utils/src/remaining_fillable_calculator.ts
@@ -1,14 +1,14 @@
import { BigNumber } from '@0xproject/utils';
export class RemainingFillableCalculator {
- private _isTraderAssetZRX: boolean;
+ private readonly _isTraderAssetZRX: boolean;
// Transferrable Amount is the minimum of Approval and Balance
- private _transferrableAssetAmount: BigNumber;
- private _transferrableFeeAmount: BigNumber;
- private _remainingOrderAssetAmount: BigNumber;
- private _remainingOrderFeeAmount: BigNumber;
- private _orderFee: BigNumber;
- private _orderAssetAmount: BigNumber;
+ private readonly _transferrableAssetAmount: BigNumber;
+ private readonly _transferrableFeeAmount: BigNumber;
+ private readonly _remainingOrderAssetAmount: BigNumber;
+ private readonly _remainingOrderFeeAmount: BigNumber;
+ private readonly _orderFee: BigNumber;
+ private readonly _orderAssetAmount: BigNumber;
constructor(
orderFee: BigNumber,
orderAssetAmount: BigNumber,
diff --git a/packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts b/packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts
index e7352119d..5a2c1d7ff 100644
--- a/packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts
+++ b/packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts
@@ -1,14 +1,16 @@
+import { AssetProxyId } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as _ from 'lodash';
import { AbstractBalanceAndProxyAllowanceFetcher } from '../abstract/abstract_balance_and_proxy_allowance_fetcher';
import { AbstractBalanceAndProxyAllowanceLazyStore } from '../abstract/abstract_balance_and_proxy_allowance_lazy_store';
+import { assetDataUtils } from '../asset_data_utils';
/**
* Copy on read store for balances/proxyAllowances of tokens/accounts
*/
export class BalanceAndProxyAllowanceLazyStore implements AbstractBalanceAndProxyAllowanceLazyStore {
- private _balanceAndProxyAllowanceFetcher: AbstractBalanceAndProxyAllowanceFetcher;
+ private readonly _balanceAndProxyAllowanceFetcher: AbstractBalanceAndProxyAllowanceFetcher;
private _balance: {
[assetData: string]: {
[userAddress: string]: BigNumber;
@@ -74,6 +76,20 @@ export class BalanceAndProxyAllowanceLazyStore implements AbstractBalanceAndProx
}
}
}
+ public deleteAllERC721ProxyAllowance(tokenAddress: string, userAddress: string): void {
+ for (const assetData in this._proxyAllowance) {
+ if (this._proxyAllowance.hasOwnProperty(assetData)) {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ if (
+ decodedAssetData.assetProxyId === AssetProxyId.ERC721 &&
+ decodedAssetData.tokenAddress === tokenAddress &&
+ !_.isUndefined(this._proxyAllowance[assetData][userAddress])
+ ) {
+ delete this._proxyAllowance[assetData][userAddress];
+ }
+ }
+ }
+ }
public deleteAll(): void {
this._balance = {};
this._proxyAllowance = {};
diff --git a/packages/order-utils/src/store/order_filled_cancelled_lazy_store.ts b/packages/order-utils/src/store/order_filled_cancelled_lazy_store.ts
new file mode 100644
index 000000000..336c6d0ba
--- /dev/null
+++ b/packages/order-utils/src/store/order_filled_cancelled_lazy_store.ts
@@ -0,0 +1,65 @@
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { AbstractOrderFilledCancelledFetcher } from '../abstract/abstract_order_filled_cancelled_fetcher';
+import { AbstractOrderFilledCancelledLazyStore } from '../abstract/abstract_order_filled_cancelled_lazy_store';
+
+/**
+ * Copy on read store for balances/proxyAllowances of tokens/accounts
+ */
+export class OrderFilledCancelledLazyStore implements AbstractOrderFilledCancelledLazyStore {
+ private readonly _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
+ private _filledTakerAmount: {
+ [orderHash: string]: BigNumber;
+ };
+ private _isCancelled: {
+ [orderHash: string]: boolean;
+ };
+ constructor(orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher) {
+ this._orderFilledCancelledFetcher = orderFilledCancelledFetcher;
+ this._filledTakerAmount = {};
+ this._isCancelled = {};
+ }
+ public async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber> {
+ if (_.isUndefined(this._filledTakerAmount[orderHash])) {
+ const filledTakerAmount = await this._orderFilledCancelledFetcher.getFilledTakerAmountAsync(orderHash);
+ this.setFilledTakerAmount(orderHash, filledTakerAmount);
+ }
+ const cachedFilledTakerAmount = this._filledTakerAmount[orderHash];
+ return cachedFilledTakerAmount;
+ }
+ public setFilledTakerAmount(orderHash: string, filledTakerAmount: BigNumber): void {
+ this._filledTakerAmount[orderHash] = filledTakerAmount;
+ }
+ public deleteFilledTakerAmount(orderHash: string): void {
+ delete this._filledTakerAmount[orderHash];
+ }
+ public async getIsCancelledAsync(orderHash: string): Promise<boolean> {
+ if (_.isUndefined(this._isCancelled[orderHash])) {
+ const isCancelled = await this._orderFilledCancelledFetcher.isOrderCancelledAsync(orderHash);
+ this.setIsCancelled(orderHash, isCancelled);
+ }
+ const cachedIsCancelled = this._isCancelled[orderHash]; // tslint:disable-line:boolean-naming
+ return cachedIsCancelled;
+ }
+ public setIsCancelled(orderHash: string, isCancelled: boolean): void {
+ this._isCancelled[orderHash] = isCancelled;
+ }
+ public deleteIsCancelled(orderHash: string): void {
+ delete this._isCancelled[orderHash];
+ }
+ public deleteAll(): void {
+ this.deleteAllFilled();
+ this.deleteAllIsCancelled();
+ }
+ public deleteAllIsCancelled(): void {
+ this._isCancelled = {};
+ }
+ public deleteAllFilled(): void {
+ this._filledTakerAmount = {};
+ }
+ public getZRXAssetData(): string {
+ const zrxAssetData = this._orderFilledCancelledFetcher.getZRXAssetData();
+ return zrxAssetData;
+ }
+}
diff --git a/packages/order-utils/test/exchange_transfer_simulator_test.ts b/packages/order-utils/test/exchange_transfer_simulator_test.ts
index 37b2bd712..f5c18cdb9 100644
--- a/packages/order-utils/test/exchange_transfer_simulator_test.ts
+++ b/packages/order-utils/test/exchange_transfer_simulator_test.ts
@@ -4,7 +4,7 @@ import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
import { artifacts } from '../src/artifacts';
-import { assetProxyUtils } from '../src/asset_proxy_utils';
+import { assetDataUtils } from '../src/asset_data_utils';
import { constants } from '../src/constants';
import { ExchangeTransferSimulator } from '../src/exchange_transfer_simulator';
import { DummyERC20TokenContract } from '../src/generated_contract_wrappers/dummy_erc20_token';
@@ -34,7 +34,7 @@ describe('ExchangeTransferSimulator', async () => {
let erc20ProxyAddress: string;
before(async function(): Promise<void> {
const mochaTestTimeoutMs = 20000;
- this.timeout(mochaTestTimeoutMs);
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
userAddresses = await web3Wrapper.getAvailableAddressesAsync();
[coinbase, sender, recipient] = userAddresses;
@@ -66,7 +66,7 @@ describe('ExchangeTransferSimulator', async () => {
totalSupply,
);
- exampleAssetData = assetProxyUtils.encodeERC20AssetData(dummyERC20Token.address);
+ exampleAssetData = assetDataUtils.encodeERC20AssetData(dummyERC20Token.address);
});
beforeEach(async () => {
await blockchainLifecycle.startAsync();
@@ -77,8 +77,7 @@ describe('ExchangeTransferSimulator', async () => {
describe('#transferFromAsync', function(): void {
// HACK: For some reason these tests need a slightly longer timeout
const mochaTestTimeoutMs = 3000;
- this.timeout(mochaTestTimeoutMs);
-
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
beforeEach(() => {
const simpleERC20BalanceAndProxyAllowanceFetcher = new SimpleERC20BalanceAndProxyAllowanceFetcher(
(dummyERC20Token as any) as ERC20TokenContract,
diff --git a/packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts b/packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts
index 68f6a164c..279a5c0db 100644
--- a/packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts
+++ b/packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts
@@ -5,8 +5,8 @@ import { AbstractBalanceAndProxyAllowanceFetcher } from '../../src/abstract/abst
import { ERC20TokenContract } from '../../src/generated_contract_wrappers/erc20_token';
export class SimpleERC20BalanceAndProxyAllowanceFetcher implements AbstractBalanceAndProxyAllowanceFetcher {
- private _erc20TokenContract: ERC20TokenContract;
- private _erc20ProxyAddress: string;
+ private readonly _erc20TokenContract: ERC20TokenContract;
+ private readonly _erc20ProxyAddress: string;
constructor(erc20TokenWrapper: ERC20TokenContract, erc20ProxyAddress: string) {
this._erc20TokenContract = erc20TokenWrapper;
this._erc20ProxyAddress = erc20ProxyAddress;
diff --git a/packages/order-watcher/CHANGELOG.json b/packages/order-watcher/CHANGELOG.json
index a66db6eec..03b6f0da6 100644
--- a/packages/order-watcher/CHANGELOG.json
+++ b/packages/order-watcher/CHANGELOG.json
@@ -1,5 +1,24 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Add support for ERC721 event watching and Exchange V2 events",
+ "pr": 887
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"version": "0.0.7",
"changes": [
{
@@ -9,6 +28,14 @@
{
"note": "Do not stop subscription if error is encountered",
"pr": 825
+ },
+ {
+ "note": "Fixed a bug that caused the incorrect block to be fetched via JSON-RPC within Blockstream",
+ "pr": 875
+ },
+ {
+ "note": "Remove stateLayer config from OrderWatcher. It now always operates on the latest block",
+ "pr": 875
}
],
"timestamp": 1531149657
diff --git a/packages/order-watcher/CHANGELOG.md b/packages/order-watcher/CHANGELOG.md
index c14b66e39..cd00c5f14 100644
--- a/packages/order-watcher/CHANGELOG.md
+++ b/packages/order-watcher/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.0.8 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.0.7 - _July 9, 2018_
* Switch out simple getLogs polling with ethereumjs-blockstream (#825)
diff --git a/packages/order-watcher/package.json b/packages/order-watcher/package.json
index 27d64a371..2fc177db5 100644
--- a/packages/order-watcher/package.json
+++ b/packages/order-watcher/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/order-watcher",
- "version": "0.0.7",
+ "version": "1.0.0-rc.1",
"description": "An order watcher daemon that watches for order validity",
"keywords": [
"0x",
@@ -30,13 +30,7 @@
},
"config": {
"compact_artifacts": "Exchange DummyToken ZRXToken Token EtherToken TokenTransferProxy TokenRegistry",
- "contracts": "Exchange DummyToken ZRXToken Token WETH9 TokenTransferProxy_v1 MultiSigWallet MultiSigWalletWithTimeLock MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress MaliciousToken TokenRegistry Arbitrage EtherDelta AccountLevels",
- "postpublish": {
- "assets": [
- "packages/order-watcher/_bundles/index.js",
- "packages/order-watcher/_bundles/index.min.js"
- ]
- }
+ "contracts": "Exchange DummyToken ZRXToken Token WETH9 TokenTransferProxy_v1 MultiSigWallet MultiSigWalletWithTimeLock MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress MaliciousToken TokenRegistry Arbitrage EtherDelta AccountLevels"
},
"repository": {
"type": "git",
@@ -47,12 +41,12 @@
"node": ">=6.0.0"
},
"devDependencies": {
- "@0xproject/abi-gen": "^0.3.3",
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/migrations": "^0.0.9",
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/abi-gen": "^1.0.0",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/migrations": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/bintrees": "^1.0.2",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
@@ -73,22 +67,22 @@
"shx": "^0.2.2",
"sinon": "^4.0.0",
"source-map-support": "^0.5.0",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/assert": "0.2.13",
- "@0xproject/base-contract": "^0.3.5",
- "@0xproject/contract-wrappers": "0.0.5",
- "@0xproject/fill-scenarios": "^0.0.5",
- "@0xproject/json-schemas": "0.8.2",
- "@0xproject/order-utils": "^0.0.8",
- "@0xproject/types": "^0.8.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "@0xproject/assert": "^1.0.0",
+ "@0xproject/base-contract": "^1.0.0",
+ "@0xproject/contract-wrappers": "^1.0.0-rc.1",
+ "@0xproject/fill-scenarios": "^1.0.0-rc.1",
+ "@0xproject/json-schemas": "^1.0.0-rc.1",
+ "@0xproject/order-utils": "^1.0.0-rc.1",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"ethereumjs-blockstream": "5.0.0",
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"bintrees": "^1.0.2",
"ethers": "3.0.22",
"lodash": "^4.17.4"
diff --git a/packages/order-watcher/src/artifacts.ts b/packages/order-watcher/src/artifacts.ts
index 13587984c..4732fb2b5 100644
--- a/packages/order-watcher/src/artifacts.ts
+++ b/packages/order-watcher/src/artifacts.ts
@@ -1,18 +1,13 @@
import { Artifact } from '@0xproject/types';
-import * as DummyToken from './compact_artifacts/DummyToken.json';
-import * as EtherToken from './compact_artifacts/EtherToken.json';
+import * as ERC20Token from './compact_artifacts/ERC20Token.json';
+import * as ERC721Token from './compact_artifacts/ERC721Token.json';
import * as Exchange from './compact_artifacts/Exchange.json';
-import * as Token from './compact_artifacts/Token.json';
-import * as TokenRegistry from './compact_artifacts/TokenRegistry.json';
-import * as TokenTransferProxy from './compact_artifacts/TokenTransferProxy.json';
-import * as ZRX from './compact_artifacts/ZRX.json';
+import * as WETH9 from './compact_artifacts/WETH9.json';
+
export const artifacts = {
- ZRX: (ZRX as any) as Artifact,
- DummyToken: (DummyToken as any) as Artifact,
- Token: (Token as any) as Artifact,
+ ERC20Token: (ERC20Token as any) as Artifact,
+ ERC721Token: (ERC721Token as any) as Artifact,
Exchange: (Exchange as any) as Artifact,
- EtherToken: (EtherToken as any) as Artifact,
- TokenRegistry: (TokenRegistry as any) as Artifact,
- TokenTransferProxy: (TokenTransferProxy as any) as Artifact,
+ EtherToken: (WETH9 as any) as Artifact,
};
diff --git a/packages/order-watcher/src/compact_artifacts/DummyToken.json b/packages/order-watcher/src/compact_artifacts/DummyToken.json
deleted file mode 100644
index f64a8cd3d..000000000
--- a/packages/order-watcher/src/compact_artifacts/DummyToken.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "contract_name": "DummyToken",
- "abi": [
- {
- "constant": false,
- "inputs": [
- {
- "name": "_target",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "setBalance",
- "outputs": [],
- "payable": false,
- "type": "function"
- }
- ]
-}
diff --git a/packages/order-watcher/src/compact_artifacts/ERC20Token.json b/packages/order-watcher/src/compact_artifacts/ERC20Token.json
new file mode 100644
index 000000000..8d60fa324
--- /dev/null
+++ b/packages/order-watcher/src/compact_artifacts/ERC20Token.json
@@ -0,0 +1,49 @@
+{
+ "contract_name": "ERC20Token",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ]
+}
diff --git a/packages/order-watcher/src/compact_artifacts/ERC721Token.json b/packages/order-watcher/src/compact_artifacts/ERC721Token.json
new file mode 100644
index 000000000..5934376d3
--- /dev/null
+++ b/packages/order-watcher/src/compact_artifacts/ERC721Token.json
@@ -0,0 +1,71 @@
+{
+ "contract_name": "ERC721Token",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_approved",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ }
+ ]
+}
diff --git a/packages/order-watcher/src/compact_artifacts/EtherToken.json b/packages/order-watcher/src/compact_artifacts/EtherToken.json
deleted file mode 100644
index 26cca57cd..000000000
--- a/packages/order-watcher/src/compact_artifacts/EtherToken.json
+++ /dev/null
@@ -1,287 +0,0 @@
-{
- "contract_name": "EtherToken",
- "abi": [
- {
- "constant": true,
- "inputs": [],
- "name": "name",
- "outputs": [
- {
- "name": "",
- "type": "string"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_spender",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "approve",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "totalSupply",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_from",
- "type": "address"
- },
- {
- "name": "_to",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "transferFrom",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "amount",
- "type": "uint256"
- }
- ],
- "name": "withdraw",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "decimals",
- "outputs": [
- {
- "name": "",
- "type": "uint8"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_owner",
- "type": "address"
- }
- ],
- "name": "balanceOf",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "symbol",
- "outputs": [
- {
- "name": "",
- "type": "string"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_to",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "transfer",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [],
- "name": "deposit",
- "outputs": [],
- "payable": true,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_owner",
- "type": "address"
- },
- {
- "name": "_spender",
- "type": "address"
- }
- ],
- "name": "allowance",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "payable": true,
- "type": "fallback"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_from",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "_to",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Transfer",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_owner",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "_spender",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Approval",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_owner",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Deposit",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_owner",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Withdrawal",
- "type": "event"
- }
- ],
- "networks": {
- "1": {
- "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
- },
- "3": {
- "address": "0xc00fd9820cd2898cc4c054b7bf142de637ad129a"
- },
- "4": {
- "address": "0xc778417e063141139fce010982780140aa0cd5ab"
- },
- "42": {
- "address": "0x653e49e301e508a13237c0ddc98ae7d4cd2667a1"
- },
- "50": {
- "address": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"
- }
- }
-}
diff --git a/packages/order-watcher/src/compact_artifacts/Exchange.json b/packages/order-watcher/src/compact_artifacts/Exchange.json
index af8db7360..4e319f7cf 100644
--- a/packages/order-watcher/src/compact_artifacts/Exchange.json
+++ b/packages/order-watcher/src/compact_artifacts/Exchange.json
@@ -2,527 +2,65 @@
"contract_name": "Exchange",
"abi": [
{
- "constant": true,
- "inputs": [
- {
- "name": "numerator",
- "type": "uint256"
- },
- {
- "name": "denominator",
- "type": "uint256"
- },
- {
- "name": "target",
- "type": "uint256"
- }
- ],
- "name": "isRoundingError",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "filled",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "cancelled",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "orderAddresses",
- "type": "address[5][]"
- },
- {
- "name": "orderValues",
- "type": "uint256[6][]"
- },
- {
- "name": "fillTakerTokenAmount",
- "type": "uint256"
- },
- {
- "name": "shouldThrowOnInsufficientBalanceOrAllowance",
- "type": "bool"
- },
- {
- "name": "v",
- "type": "uint8[]"
- },
- {
- "name": "r",
- "type": "bytes32[]"
- },
- {
- "name": "s",
- "type": "bytes32[]"
- }
- ],
- "name": "fillOrdersUpTo",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "orderAddresses",
- "type": "address[5]"
- },
- {
- "name": "orderValues",
- "type": "uint256[6]"
- },
- {
- "name": "cancelTakerTokenAmount",
- "type": "uint256"
- }
- ],
- "name": "cancelOrder",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "ZRX_TOKEN_CONTRACT",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "orderAddresses",
- "type": "address[5][]"
- },
- {
- "name": "orderValues",
- "type": "uint256[6][]"
- },
- {
- "name": "fillTakerTokenAmounts",
- "type": "uint256[]"
- },
- {
- "name": "v",
- "type": "uint8[]"
- },
- {
- "name": "r",
- "type": "bytes32[]"
- },
- {
- "name": "s",
- "type": "bytes32[]"
- }
- ],
- "name": "batchFillOrKillOrders",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "orderAddresses",
- "type": "address[5]"
- },
- {
- "name": "orderValues",
- "type": "uint256[6]"
- },
- {
- "name": "fillTakerTokenAmount",
- "type": "uint256"
- },
- {
- "name": "v",
- "type": "uint8"
- },
- {
- "name": "r",
- "type": "bytes32"
- },
- {
- "name": "s",
- "type": "bytes32"
- }
- ],
- "name": "fillOrKillOrder",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "orderHash",
- "type": "bytes32"
- }
- ],
- "name": "getUnavailableTakerTokenAmount",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "signer",
- "type": "address"
- },
- {
- "name": "hash",
- "type": "bytes32"
- },
- {
- "name": "v",
- "type": "uint8"
- },
- {
- "name": "r",
- "type": "bytes32"
- },
- {
- "name": "s",
- "type": "bytes32"
- }
- ],
- "name": "isValidSignature",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "numerator",
- "type": "uint256"
- },
- {
- "name": "denominator",
- "type": "uint256"
- },
- {
- "name": "target",
- "type": "uint256"
- }
- ],
- "name": "getPartialAmount",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "TOKEN_TRANSFER_PROXY_CONTRACT",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "orderAddresses",
- "type": "address[5][]"
- },
- {
- "name": "orderValues",
- "type": "uint256[6][]"
- },
- {
- "name": "fillTakerTokenAmounts",
- "type": "uint256[]"
- },
- {
- "name": "shouldThrowOnInsufficientBalanceOrAllowance",
- "type": "bool"
- },
- {
- "name": "v",
- "type": "uint8[]"
- },
- {
- "name": "r",
- "type": "bytes32[]"
- },
- {
- "name": "s",
- "type": "bytes32[]"
- }
- ],
- "name": "batchFillOrders",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "orderAddresses",
- "type": "address[5][]"
- },
- {
- "name": "orderValues",
- "type": "uint256[6][]"
- },
- {
- "name": "cancelTakerTokenAmounts",
- "type": "uint256[]"
- }
- ],
- "name": "batchCancelOrders",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "orderAddresses",
- "type": "address[5]"
- },
- {
- "name": "orderValues",
- "type": "uint256[6]"
- },
- {
- "name": "fillTakerTokenAmount",
- "type": "uint256"
- },
- {
- "name": "shouldThrowOnInsufficientBalanceOrAllowance",
- "type": "bool"
- },
- {
- "name": "v",
- "type": "uint8"
- },
- {
- "name": "r",
- "type": "bytes32"
- },
- {
- "name": "s",
- "type": "bytes32"
- }
- ],
- "name": "fillOrder",
- "outputs": [
- {
- "name": "filledTakerTokenAmount",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "orderAddresses",
- "type": "address[5]"
- },
- {
- "name": "orderValues",
- "type": "uint256[6]"
- }
- ],
- "name": "getOrderHash",
- "outputs": [
- {
- "name": "",
- "type": "bytes32"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "EXTERNAL_QUERY_GAS_LIMIT",
- "outputs": [
- {
- "name": "",
- "type": "uint16"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "VERSION",
- "outputs": [
- {
- "name": "",
- "type": "string"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "inputs": [
- {
- "name": "_zrxToken",
- "type": "address"
- },
- {
- "name": "_tokenTransferProxy",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "constructor"
- },
- {
"anonymous": false,
"inputs": [
{
"indexed": true,
- "name": "maker",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "taker",
+ "name": "makerAddress",
"type": "address"
},
{
"indexed": true,
- "name": "feeRecipient",
+ "name": "feeRecipientAddress",
"type": "address"
},
{
"indexed": false,
- "name": "makerToken",
+ "name": "takerAddress",
"type": "address"
},
{
"indexed": false,
- "name": "takerToken",
+ "name": "senderAddress",
"type": "address"
},
{
"indexed": false,
- "name": "filledMakerTokenAmount",
+ "name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"indexed": false,
- "name": "filledTakerTokenAmount",
+ "name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"indexed": false,
- "name": "paidMakerFee",
+ "name": "makerFeePaid",
"type": "uint256"
},
{
"indexed": false,
- "name": "paidTakerFee",
+ "name": "takerFeePaid",
"type": "uint256"
},
{
"indexed": true,
- "name": "tokens",
+ "name": "orderHash",
"type": "bytes32"
},
{
"indexed": false,
- "name": "orderHash",
- "type": "bytes32"
+ "name": "makerAssetData",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "takerAssetData",
+ "type": "bytes"
}
],
- "name": "LogFill",
+ "name": "Fill",
"type": "event"
},
{
@@ -530,46 +68,36 @@
"inputs": [
{
"indexed": true,
- "name": "maker",
+ "name": "makerAddress",
"type": "address"
},
{
"indexed": true,
- "name": "feeRecipient",
+ "name": "feeRecipientAddress",
"type": "address"
},
{
"indexed": false,
- "name": "makerToken",
+ "name": "senderAddress",
"type": "address"
},
{
- "indexed": false,
- "name": "takerToken",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "cancelledMakerTokenAmount",
- "type": "uint256"
+ "indexed": true,
+ "name": "orderHash",
+ "type": "bytes32"
},
{
"indexed": false,
- "name": "cancelledTakerTokenAmount",
- "type": "uint256"
- },
- {
- "indexed": true,
- "name": "tokens",
- "type": "bytes32"
+ "name": "makerAssetData",
+ "type": "bytes"
},
{
"indexed": false,
- "name": "orderHash",
- "type": "bytes32"
+ "name": "takerAssetData",
+ "type": "bytes"
}
],
- "name": "LogCancel",
+ "name": "Cancel",
"type": "event"
},
{
@@ -577,16 +105,21 @@
"inputs": [
{
"indexed": true,
- "name": "errorId",
- "type": "uint8"
+ "name": "makerAddress",
+ "type": "address"
},
{
"indexed": true,
- "name": "orderHash",
- "type": "bytes32"
+ "name": "senderAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "orderEpoch",
+ "type": "uint256"
}
],
- "name": "LogError",
+ "name": "CancelUpTo",
"type": "event"
}
],
diff --git a/packages/order-watcher/src/compact_artifacts/Token.json b/packages/order-watcher/src/compact_artifacts/Token.json
deleted file mode 100644
index 3b5a86ae0..000000000
--- a/packages/order-watcher/src/compact_artifacts/Token.json
+++ /dev/null
@@ -1,172 +0,0 @@
-{
- "contract_name": "Token",
- "abi": [
- {
- "constant": false,
- "inputs": [
- {
- "name": "_spender",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "approve",
- "outputs": [
- {
- "name": "success",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "totalSupply",
- "outputs": [
- {
- "name": "supply",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_from",
- "type": "address"
- },
- {
- "name": "_to",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "transferFrom",
- "outputs": [
- {
- "name": "success",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_owner",
- "type": "address"
- }
- ],
- "name": "balanceOf",
- "outputs": [
- {
- "name": "balance",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_to",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "transfer",
- "outputs": [
- {
- "name": "success",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_owner",
- "type": "address"
- },
- {
- "name": "_spender",
- "type": "address"
- }
- ],
- "name": "allowance",
- "outputs": [
- {
- "name": "remaining",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_from",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "_to",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Transfer",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_owner",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "_spender",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Approval",
- "type": "event"
- }
- ]
-}
diff --git a/packages/order-watcher/src/compact_artifacts/TokenRegistry.json b/packages/order-watcher/src/compact_artifacts/TokenRegistry.json
deleted file mode 100644
index 0f583628c..000000000
--- a/packages/order-watcher/src/compact_artifacts/TokenRegistry.json
+++ /dev/null
@@ -1,547 +0,0 @@
-{
- "contract_name": "TokenRegistry",
- "abi": [
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_index",
- "type": "uint256"
- }
- ],
- "name": "removeToken",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_name",
- "type": "string"
- }
- ],
- "name": "getTokenAddressByName",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_symbol",
- "type": "string"
- }
- ],
- "name": "getTokenAddressBySymbol",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_swarmHash",
- "type": "bytes"
- }
- ],
- "name": "setTokenSwarmHash",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- }
- ],
- "name": "getTokenMetaData",
- "outputs": [
- {
- "name": "",
- "type": "address"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "uint8"
- },
- {
- "name": "",
- "type": "bytes"
- },
- {
- "name": "",
- "type": "bytes"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "owner",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_name",
- "type": "string"
- },
- {
- "name": "_symbol",
- "type": "string"
- },
- {
- "name": "_decimals",
- "type": "uint8"
- },
- {
- "name": "_ipfsHash",
- "type": "bytes"
- },
- {
- "name": "_swarmHash",
- "type": "bytes"
- }
- ],
- "name": "addToken",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_name",
- "type": "string"
- }
- ],
- "name": "setTokenName",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "name": "tokens",
- "outputs": [
- {
- "name": "token",
- "type": "address"
- },
- {
- "name": "name",
- "type": "string"
- },
- {
- "name": "symbol",
- "type": "string"
- },
- {
- "name": "decimals",
- "type": "uint8"
- },
- {
- "name": "ipfsHash",
- "type": "bytes"
- },
- {
- "name": "swarmHash",
- "type": "bytes"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "tokenAddresses",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_name",
- "type": "string"
- }
- ],
- "name": "getTokenByName",
- "outputs": [
- {
- "name": "",
- "type": "address"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "uint8"
- },
- {
- "name": "",
- "type": "bytes"
- },
- {
- "name": "",
- "type": "bytes"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "getTokenAddresses",
- "outputs": [
- {
- "name": "",
- "type": "address[]"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_ipfsHash",
- "type": "bytes"
- }
- ],
- "name": "setTokenIpfsHash",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_symbol",
- "type": "string"
- }
- ],
- "name": "getTokenBySymbol",
- "outputs": [
- {
- "name": "",
- "type": "address"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "uint8"
- },
- {
- "name": "",
- "type": "bytes"
- },
- {
- "name": "",
- "type": "bytes"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_symbol",
- "type": "string"
- }
- ],
- "name": "setTokenSymbol",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "newOwner",
- "type": "address"
- }
- ],
- "name": "transferOwnership",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "name",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "symbol",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "decimals",
- "type": "uint8"
- },
- {
- "indexed": false,
- "name": "ipfsHash",
- "type": "bytes"
- },
- {
- "indexed": false,
- "name": "swarmHash",
- "type": "bytes"
- }
- ],
- "name": "LogAddToken",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "name",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "symbol",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "decimals",
- "type": "uint8"
- },
- {
- "indexed": false,
- "name": "ipfsHash",
- "type": "bytes"
- },
- {
- "indexed": false,
- "name": "swarmHash",
- "type": "bytes"
- }
- ],
- "name": "LogRemoveToken",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "oldName",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "newName",
- "type": "string"
- }
- ],
- "name": "LogTokenNameChange",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "oldSymbol",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "newSymbol",
- "type": "string"
- }
- ],
- "name": "LogTokenSymbolChange",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "oldIpfsHash",
- "type": "bytes"
- },
- {
- "indexed": false,
- "name": "newIpfsHash",
- "type": "bytes"
- }
- ],
- "name": "LogTokenIpfsHashChange",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "oldSwarmHash",
- "type": "bytes"
- },
- {
- "indexed": false,
- "name": "newSwarmHash",
- "type": "bytes"
- }
- ],
- "name": "LogTokenSwarmHashChange",
- "type": "event"
- }
- ],
- "networks": {
- "1": {
- "address": "0x926a74c5c36adf004c87399e65f75628b0f98d2c"
- },
- "3": {
- "address": "0x6b1a50f0bb5a7995444bd3877b22dc89c62843ed"
- },
- "4": {
- "address": "0x4e9aad8184de8833365fea970cd9149372fdf1e6"
- },
- "42": {
- "address": "0xf18e504561f4347bea557f3d4558f559dddbae7f"
- },
- "50": {
- "address": "0x0b1ba0af832d7c05fd64161e0db78e85978e8082"
- }
- }
-}
diff --git a/packages/order-watcher/src/compact_artifacts/TokenTransferProxy.json b/packages/order-watcher/src/compact_artifacts/TokenTransferProxy.json
deleted file mode 100644
index 8cf551ddb..000000000
--- a/packages/order-watcher/src/compact_artifacts/TokenTransferProxy.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "contract_name": "TokenTransferProxy",
- "abi": [
- {
- "constant": false,
- "inputs": [
- {
- "name": "token",
- "type": "address"
- },
- {
- "name": "from",
- "type": "address"
- },
- {
- "name": "to",
- "type": "address"
- },
- {
- "name": "value",
- "type": "uint256"
- }
- ],
- "name": "transferFrom",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "target",
- "type": "address"
- }
- ],
- "name": "addAuthorizedAddress",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "authorities",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "target",
- "type": "address"
- }
- ],
- "name": "removeAuthorizedAddress",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "owner",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "name": "authorized",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "getAuthorizedAddresses",
- "outputs": [
- {
- "name": "",
- "type": "address[]"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "newOwner",
- "type": "address"
- }
- ],
- "name": "transferOwnership",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "target",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "caller",
- "type": "address"
- }
- ],
- "name": "LogAuthorizedAddressAdded",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "target",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "caller",
- "type": "address"
- }
- ],
- "name": "LogAuthorizedAddressRemoved",
- "type": "event"
- }
- ],
- "networks": {
- "1": {
- "address": "0x8da0d80f5007ef1e431dd2127178d224e32c2ef4"
- },
- "3": {
- "address": "0x4e9aad8184de8833365fea970cd9149372fdf1e6"
- },
- "4": {
- "address": "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d"
- },
- "42": {
- "address": "0x087eed4bc1ee3de49befbd66c662b434b15d49d4"
- },
- "50": {
- "address": "0x1dc4c1cefef38a777b15aa20260a54e584b16c48"
- }
- }
-}
diff --git a/packages/order-watcher/src/compact_artifacts/WETH9.json b/packages/order-watcher/src/compact_artifacts/WETH9.json
new file mode 100644
index 000000000..f635276a1
--- /dev/null
+++ b/packages/order-watcher/src/compact_artifacts/WETH9.json
@@ -0,0 +1,100 @@
+{
+ "contract_name": "WETH9",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawal",
+ "type": "event"
+ }
+ ],
+ "networks": {
+ "1": {
+ "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
+ },
+ "3": {
+ "address": "0xc00fd9820cd2898cc4c054b7bf142de637ad129a"
+ },
+ "4": {
+ "address": "0xc778417e063141139fce010982780140aa0cd5ab"
+ },
+ "42": {
+ "address": "0x653e49e301e508a13237c0ddc98ae7d4cd2667a1"
+ },
+ "50": {
+ "address": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"
+ }
+ }
+}
diff --git a/packages/order-watcher/src/compact_artifacts/ZRX.json b/packages/order-watcher/src/compact_artifacts/ZRX.json
deleted file mode 100644
index e40b8f268..000000000
--- a/packages/order-watcher/src/compact_artifacts/ZRX.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "contract_name": "ZRX",
- "networks": {
- "1": {
- "address": "0xe41d2489571d322189246dafa5ebde1f4699f498"
- },
- "3": {
- "address": "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d"
- },
- "4": {
- "address": "0x00f58d6d585f84b2d7267940cede30ce2fe6eae8"
- },
- "42": {
- "address": "0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570"
- },
- "50": {
- "address": "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401"
- }
- }
-}
diff --git a/packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts b/packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts
new file mode 100644
index 000000000..a1de22a5e
--- /dev/null
+++ b/packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts
@@ -0,0 +1,74 @@
+// tslint:disable:no-unnecessary-type-assertion
+import { BlockParamLiteral, ERC20TokenWrapper, ERC721TokenWrapper } from '@0xproject/contract-wrappers';
+import { AbstractBalanceAndProxyAllowanceFetcher, assetDataUtils } from '@0xproject/order-utils';
+import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+export class AssetBalanceAndProxyAllowanceFetcher implements AbstractBalanceAndProxyAllowanceFetcher {
+ private readonly _erc20Token: ERC20TokenWrapper;
+ private readonly _erc721Token: ERC721TokenWrapper;
+ private readonly _stateLayer: BlockParamLiteral;
+ constructor(erc20Token: ERC20TokenWrapper, erc721Token: ERC721TokenWrapper, stateLayer: BlockParamLiteral) {
+ this._erc20Token = erc20Token;
+ this._erc721Token = erc721Token;
+ this._stateLayer = stateLayer;
+ }
+ public async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber> {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ if (decodedAssetData.assetProxyId === AssetProxyId.ERC20) {
+ const decodedERC20AssetData = decodedAssetData as ERC20AssetData;
+ const balance = await this._erc20Token.getBalanceAsync(decodedERC20AssetData.tokenAddress, userAddress, {
+ defaultBlock: this._stateLayer,
+ });
+ return balance;
+ } else {
+ const decodedERC721AssetData = decodedAssetData as ERC721AssetData;
+ const tokenOwner = await this._erc721Token.getOwnerOfAsync(
+ decodedERC721AssetData.tokenAddress,
+ decodedERC721AssetData.tokenId,
+ {
+ defaultBlock: this._stateLayer,
+ },
+ );
+ const balance = tokenOwner === userAddress ? new BigNumber(1) : new BigNumber(0);
+ return balance;
+ }
+ }
+ public async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber> {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ if (decodedAssetData.assetProxyId === AssetProxyId.ERC20) {
+ const decodedERC20AssetData = decodedAssetData as ERC20AssetData;
+ const proxyAllowance = await this._erc20Token.getProxyAllowanceAsync(
+ decodedERC20AssetData.tokenAddress,
+ userAddress,
+ {
+ defaultBlock: this._stateLayer,
+ },
+ );
+ return proxyAllowance;
+ } else {
+ const decodedERC721AssetData = decodedAssetData as ERC721AssetData;
+
+ const isApprovedForAll = await this._erc721Token.isProxyApprovedForAllAsync(
+ decodedERC721AssetData.tokenAddress,
+ userAddress,
+ {
+ defaultBlock: this._stateLayer,
+ },
+ );
+ if (isApprovedForAll) {
+ return new BigNumber(this._erc20Token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
+ } else {
+ const isApproved = await this._erc721Token.isProxyApprovedAsync(
+ decodedERC721AssetData.tokenAddress,
+ decodedERC721AssetData.tokenId,
+ {
+ defaultBlock: this._stateLayer,
+ },
+ );
+ const proxyAllowance = isApproved ? new BigNumber(1) : new BigNumber(0);
+ return proxyAllowance;
+ }
+ }
+ }
+}
diff --git a/packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts b/packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts
new file mode 100644
index 000000000..bfad1a48c
--- /dev/null
+++ b/packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts
@@ -0,0 +1,27 @@
+// tslint:disable:no-unnecessary-type-assertion
+import { BlockParamLiteral, ExchangeWrapper } from '@0xproject/contract-wrappers';
+import { AbstractOrderFilledCancelledFetcher } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+
+export class OrderFilledCancelledFetcher implements AbstractOrderFilledCancelledFetcher {
+ private readonly _exchange: ExchangeWrapper;
+ private readonly _stateLayer: BlockParamLiteral;
+ constructor(exchange: ExchangeWrapper, stateLayer: BlockParamLiteral) {
+ this._exchange = exchange;
+ this._stateLayer = stateLayer;
+ }
+ public async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber> {
+ const filledTakerAmount = this._exchange.getFilledTakerAssetAmountAsync(orderHash, {
+ defaultBlock: this._stateLayer,
+ });
+ return filledTakerAmount;
+ }
+ public async isOrderCancelledAsync(orderHash: string): Promise<boolean> {
+ const isCancelled = await this._exchange.isCancelledAsync(orderHash);
+ return isCancelled;
+ }
+ public getZRXAssetData(): string {
+ const zrxAssetData = this._exchange.getZRXAssetData();
+ return zrxAssetData;
+ }
+}
diff --git a/packages/order-watcher/src/index.ts b/packages/order-watcher/src/index.ts
index 390003b1d..5f84554c8 100644
--- a/packages/order-watcher/src/index.ts
+++ b/packages/order-watcher/src/index.ts
@@ -4,4 +4,5 @@ export { OrderStateValid, OrderStateInvalid, OrderState } from '@0xproject/types
export { OnOrderStateChangeCallback, OrderWatcherConfig } from './types';
-export { BlockParamLiteral, BlockParam, Order, Provider, SignedOrder } from '@0xproject/types';
+export { Order, SignedOrder } from '@0xproject/types';
+export { BlockParamLiteral, BlockParam, Provider } from 'ethereum-types';
diff --git a/packages/order-watcher/src/order_watcher/collision_resistant_abi_decoder.ts b/packages/order-watcher/src/order_watcher/collision_resistant_abi_decoder.ts
new file mode 100644
index 000000000..e13663c7a
--- /dev/null
+++ b/packages/order-watcher/src/order_watcher/collision_resistant_abi_decoder.ts
@@ -0,0 +1,54 @@
+import { AbiDecoder } from '@0xproject/utils';
+import { ContractAbi, DecodedLogArgs, LogEntry, LogWithDecodedArgs, RawLog } from 'ethereum-types';
+
+const TOKEN_TYPE_COLLISION = `Token can't be marked as ERC20 and ERC721 at the same time`;
+
+/**
+ * ERC20 and ERC721 have some events with different args but colliding signature.
+ * For exmaple:
+ * Transfer(_from address, _to address, _value uint256)
+ * Transfer(_from address, _to address, _tokenId uint256)
+ * Both have the signature:
+ * Transfer(address,address,uint256)
+ *
+ * In order to correctly decode those events we need to know the token type by address in advance.
+ * You can pass it by calling `this.addERC20Token(address)` or `this.addERC721Token(address)`
+ */
+export class CollisionResistanceAbiDecoder {
+ private readonly _erc20AbiDecoder: AbiDecoder;
+ private readonly _erc721AbiDecoder: AbiDecoder;
+ private readonly _restAbiDecoder: AbiDecoder;
+ private readonly _knownERC20Tokens = new Set();
+ private readonly _knownERC721Tokens = new Set();
+ constructor(erc20Abi: ContractAbi, erc721Abi: ContractAbi, abis: ContractAbi[]) {
+ this._erc20AbiDecoder = new AbiDecoder([erc20Abi]);
+ this._erc721AbiDecoder = new AbiDecoder([erc721Abi]);
+ this._restAbiDecoder = new AbiDecoder(abis);
+ }
+ public tryToDecodeLogOrNoop<ArgsType extends DecodedLogArgs>(log: LogEntry): LogWithDecodedArgs<ArgsType> | RawLog {
+ if (this._knownERC20Tokens.has(log.address)) {
+ const maybeDecodedERC20Log = this._erc20AbiDecoder.tryToDecodeLogOrNoop(log);
+ return maybeDecodedERC20Log;
+ } else if (this._knownERC721Tokens.has(log.address)) {
+ const maybeDecodedERC721Log = this._erc721AbiDecoder.tryToDecodeLogOrNoop(log);
+ return maybeDecodedERC721Log;
+ } else {
+ const maybeDecodedLog = this._restAbiDecoder.tryToDecodeLogOrNoop(log);
+ return maybeDecodedLog;
+ }
+ }
+ // Hints the ABI decoder that a particular token address is ERC20 and events from it should be decoded as ERC20 events
+ public addERC20Token(address: string): void {
+ if (this._knownERC721Tokens.has(address)) {
+ throw new Error(TOKEN_TYPE_COLLISION);
+ }
+ this._knownERC20Tokens.add(address);
+ }
+ // Hints the ABI decoder that a particular token address is ERC721 and events from it should be decoded as ERC721 events
+ public addERC721Token(address: string): void {
+ if (this._knownERC20Tokens.has(address)) {
+ throw new Error(TOKEN_TYPE_COLLISION);
+ }
+ this._knownERC721Tokens.add(address);
+ }
+}
diff --git a/packages/order-watcher/src/order_watcher/dependent_order_hashes_tracker.ts b/packages/order-watcher/src/order_watcher/dependent_order_hashes_tracker.ts
new file mode 100644
index 000000000..cc70bd5d7
--- /dev/null
+++ b/packages/order-watcher/src/order_watcher/dependent_order_hashes_tracker.ts
@@ -0,0 +1,230 @@
+// tslint:disable:no-unnecessary-type-assertion
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { AssetProxyId, ERC20AssetData, ERC721AssetData, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+export interface OrderHashesByMakerAddress {
+ [makerAddress: string]: Set<string>;
+}
+
+export interface OrderHashesByERC20ByMakerAddress {
+ [makerAddress: string]: {
+ [erc20TokenAddress: string]: Set<string>;
+ };
+}
+
+export interface OrderHashesByERC721AddressByTokenIdByMakerAddress {
+ [makerAddress: string]: {
+ [erc721TokenAddress: string]: {
+ // Ideally erc721TokenId should be a BigNumber, but it's not a valid index type so we just convert it to a string before using it as an index
+ [erc721TokenId: string]: Set<string>;
+ };
+ };
+}
+
+/**
+ */
+export class DependentOrderHashesTracker {
+ private readonly _zrxTokenAddress: string;
+ // `_orderHashesByMakerAddress` is redundant and could be generated from
+ // `_orderHashesByERC20ByMakerAddress` and `_orderHashesByERC721AddressByTokenIdByMakerAddress`
+ // on the fly by merging all the entries together but it's more complex and computationally heavy.
+ // We might change that in future if we're move memory-constrained.
+ private readonly _orderHashesByMakerAddress: OrderHashesByMakerAddress = {};
+ private readonly _orderHashesByERC20ByMakerAddress: OrderHashesByERC20ByMakerAddress = {};
+ private readonly _orderHashesByERC721AddressByTokenIdByMakerAddress: OrderHashesByERC721AddressByTokenIdByMakerAddress = {};
+ constructor(zrxTokenAddress: string) {
+ this._zrxTokenAddress = zrxTokenAddress;
+ }
+ public getDependentOrderHashesByERC721ByMaker(makerAddress: string, tokenAddress: string): string[] {
+ const orderHashSets = _.values(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress][tokenAddress],
+ );
+ const orderHashList = _.reduce(
+ orderHashSets,
+ (accumulator, orderHashSet) => [...accumulator, ...orderHashSet],
+ [] as string[],
+ );
+ const uniqueOrderHashList = _.uniq(orderHashList);
+ return uniqueOrderHashList;
+ }
+ public getDependentOrderHashesByMaker(makerAddress: string): string[] {
+ const dependentOrderHashes = Array.from(this._orderHashesByMakerAddress[makerAddress]);
+ return dependentOrderHashes;
+ }
+ public getDependentOrderHashesByAssetDataByMaker(makerAddress: string, assetData: string): string[] {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ const dependentOrderHashes =
+ decodedAssetData.assetProxyId === AssetProxyId.ERC20
+ ? this._getDependentOrderHashesByERC20AssetData(makerAddress, assetData)
+ : this._getDependentOrderHashesByERC721AssetData(makerAddress, assetData);
+ return dependentOrderHashes;
+ }
+ public addToDependentOrderHashes(signedOrder: SignedOrder): void {
+ const decodedMakerAssetData = assetDataUtils.decodeAssetDataOrThrow(signedOrder.makerAssetData);
+ if (decodedMakerAssetData.assetProxyId === AssetProxyId.ERC20) {
+ this._addToERC20DependentOrderHashes(signedOrder, (decodedMakerAssetData as ERC20AssetData).tokenAddress);
+ } else {
+ this._addToERC721DependentOrderHashes(
+ signedOrder,
+ (decodedMakerAssetData as ERC721AssetData).tokenAddress,
+ (decodedMakerAssetData as ERC721AssetData).tokenId,
+ );
+ }
+ this._addToERC20DependentOrderHashes(signedOrder, this._zrxTokenAddress);
+ this._addToMakerDependentOrderHashes(signedOrder);
+ }
+ public removeFromDependentOrderHashes(signedOrder: SignedOrder): void {
+ const decodedMakerAssetData = assetDataUtils.decodeAssetDataOrThrow(signedOrder.makerAssetData);
+ if (decodedMakerAssetData.assetProxyId === AssetProxyId.ERC20) {
+ this._removeFromERC20DependentOrderhashes(
+ signedOrder,
+ (decodedMakerAssetData as ERC20AssetData).tokenAddress,
+ );
+ } else {
+ this._removeFromERC721DependentOrderhashes(
+ signedOrder,
+ (decodedMakerAssetData as ERC721AssetData).tokenAddress,
+ (decodedMakerAssetData as ERC721AssetData).tokenId,
+ );
+ }
+ this._removeFromERC20DependentOrderhashes(signedOrder, this._zrxTokenAddress);
+ this._removeFromMakerDependentOrderhashes(signedOrder);
+ }
+ private _getDependentOrderHashesByERC20AssetData(makerAddress: string, erc20AssetData: string): string[] {
+ const tokenAddress = assetDataUtils.decodeERC20AssetData(erc20AssetData).tokenAddress;
+ let dependentOrderHashes: string[] = [];
+ if (
+ !_.isUndefined(this._orderHashesByERC20ByMakerAddress[makerAddress]) &&
+ !_.isUndefined(this._orderHashesByERC20ByMakerAddress[makerAddress][tokenAddress])
+ ) {
+ dependentOrderHashes = Array.from(this._orderHashesByERC20ByMakerAddress[makerAddress][tokenAddress]);
+ }
+ return dependentOrderHashes;
+ }
+ private _getDependentOrderHashesByERC721AssetData(makerAddress: string, erc721AssetData: string): string[] {
+ const tokenAddress = assetDataUtils.decodeERC721AssetData(erc721AssetData).tokenAddress;
+ const tokenId = assetDataUtils.decodeERC721AssetData(erc721AssetData).tokenId;
+ let dependentOrderHashes: string[] = [];
+ if (
+ !_.isUndefined(this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress]) &&
+ !_.isUndefined(this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress][tokenAddress]) &&
+ !_.isUndefined(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress][tokenAddress][tokenId.toString()],
+ )
+ ) {
+ dependentOrderHashes = Array.from(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress][tokenAddress][tokenId.toString()],
+ );
+ }
+ return dependentOrderHashes;
+ }
+ private _addToERC20DependentOrderHashes(signedOrder: SignedOrder, erc20TokenAddress: string): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ if (_.isUndefined(this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress])) {
+ this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress] = {};
+ }
+ if (_.isUndefined(this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress])) {
+ this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress] = new Set();
+ }
+ this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress].add(orderHash);
+ }
+ private _addToERC721DependentOrderHashes(
+ signedOrder: SignedOrder,
+ erc721TokenAddress: string,
+ tokenId: BigNumber,
+ ): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ if (_.isUndefined(this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress])) {
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress] = {};
+ }
+
+ if (
+ _.isUndefined(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress],
+ )
+ ) {
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress] = {};
+ }
+
+ if (
+ _.isUndefined(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ],
+ )
+ ) {
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ] = new Set();
+ }
+
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ].add(orderHash);
+ }
+ private _addToMakerDependentOrderHashes(signedOrder: SignedOrder): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ if (_.isUndefined(this._orderHashesByMakerAddress[signedOrder.makerAddress])) {
+ this._orderHashesByMakerAddress[signedOrder.makerAddress] = new Set();
+ }
+ this._orderHashesByMakerAddress[signedOrder.makerAddress].add(orderHash);
+ }
+ private _removeFromERC20DependentOrderhashes(signedOrder: SignedOrder, erc20TokenAddress: string): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress].delete(orderHash);
+
+ if (_.isEmpty(this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress])) {
+ delete this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress];
+ }
+
+ if (_.isEmpty(this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress])) {
+ delete this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress];
+ }
+ }
+ private _removeFromERC721DependentOrderhashes(
+ signedOrder: SignedOrder,
+ erc721TokenAddress: string,
+ tokenId: BigNumber,
+ ): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ].delete(orderHash);
+
+ if (
+ _.isEmpty(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ],
+ )
+ ) {
+ delete this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][
+ erc721TokenAddress
+ ][tokenId.toString()];
+ }
+
+ if (
+ _.isEmpty(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress],
+ )
+ ) {
+ delete this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][
+ erc721TokenAddress
+ ];
+ }
+
+ if (_.isEmpty(this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress])) {
+ delete this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress];
+ }
+ }
+ private _removeFromMakerDependentOrderhashes(signedOrder: SignedOrder): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ this._orderHashesByMakerAddress[signedOrder.makerAddress].delete(orderHash);
+
+ if (_.isEmpty(this._orderHashesByMakerAddress[signedOrder.makerAddress])) {
+ delete this._orderHashesByMakerAddress[signedOrder.makerAddress];
+ }
+ }
+}
diff --git a/packages/order-watcher/src/order_watcher/event_watcher.ts b/packages/order-watcher/src/order_watcher/event_watcher.ts
index 08ecf81cb..9509c75de 100644
--- a/packages/order-watcher/src/order_watcher/event_watcher.ts
+++ b/packages/order-watcher/src/order_watcher/event_watcher.ts
@@ -1,6 +1,6 @@
-import { BlockParamLiteral, LogEntry } from '@0xproject/types';
import { intervalUtils, logUtils } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { BlockParamLiteral, LogEntry, Provider } from 'ethereum-types';
import { Block, BlockAndLogStreamer, Log } from 'ethereumjs-blockstream';
import * as _ from 'lodash';
@@ -19,22 +19,22 @@ enum LogEventState {
* depth.
*/
export class EventWatcher {
- private _web3Wrapper: Web3Wrapper;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _stateLayer: BlockParamLiteral;
+ private readonly _isVerbose: boolean;
private _blockAndLogStreamerIfExists: BlockAndLogStreamer<Block, Log> | undefined;
private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer;
private _onLogAddedSubscriptionToken: string | undefined;
private _onLogRemovedSubscriptionToken: string | undefined;
- private _pollingIntervalMs: number;
- private _stateLayer: BlockParamLiteral;
- private _isVerbose: boolean;
+ private readonly _pollingIntervalMs: number;
constructor(
- web3Wrapper: Web3Wrapper,
+ provider: Provider,
pollingIntervalIfExistsMs: undefined | number,
- stateLayer: BlockParamLiteral = BlockParamLiteral.Latest,
+ stateLayer: BlockParamLiteral,
isVerbose: boolean,
) {
this._isVerbose = isVerbose;
- this._web3Wrapper = web3Wrapper;
+ this._web3Wrapper = new Web3Wrapper(provider);
this._stateLayer = stateLayer;
this._pollingIntervalMs = _.isUndefined(pollingIntervalIfExistsMs)
? DEFAULT_EVENT_POLLING_INTERVAL_MS
@@ -61,13 +61,9 @@ export class EventWatcher {
if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
throw new Error(OrderWatcherError.SubscriptionAlreadyPresent);
}
- const eventFilter = {
- fromBlock: this._stateLayer,
- toBlock: this._stateLayer,
- };
this._blockAndLogStreamerIfExists = new BlockAndLogStreamer(
- this._web3Wrapper.getBlockAsync.bind(this._web3Wrapper, this._stateLayer),
- this._web3Wrapper.getLogsAsync.bind(this._web3Wrapper, eventFilter),
+ this._web3Wrapper.getBlockAsync.bind(this._web3Wrapper),
+ this._web3Wrapper.getLogsAsync.bind(this._web3Wrapper),
this._onBlockAndLogStreamerError.bind(this),
);
const catchAllLogFilter = {};
@@ -104,7 +100,7 @@ export class EventWatcher {
await this._emitDifferencesAsync(log, isRemoved ? LogEventState.Removed : LogEventState.Added, callback);
}
private async _reconcileBlockAsync(): Promise<void> {
- const latestBlock = await this._web3Wrapper.getBlockAsync(BlockParamLiteral.Latest);
+ const latestBlock = await this._web3Wrapper.getBlockAsync(this._stateLayer);
// We need to coerce to Block type cause Web3.Block includes types for mempool blocks
if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
// If we clear the interval while fetching the block - this._blockAndLogStreamer will be undefined
diff --git a/packages/order-watcher/src/order_watcher/expiration_watcher.ts b/packages/order-watcher/src/order_watcher/expiration_watcher.ts
index 31fda7dca..6eadf14c7 100644
--- a/packages/order-watcher/src/order_watcher/expiration_watcher.ts
+++ b/packages/order-watcher/src/order_watcher/expiration_watcher.ts
@@ -13,10 +13,10 @@ const DEFAULT_ORDER_EXPIRATION_CHECKING_INTERVAL_MS = 50;
* It stores them in a min heap by expiration time and checks for expired ones every `orderExpirationCheckingIntervalMs`
*/
export class ExpirationWatcher {
- private _orderHashByExpirationRBTree: RBTree<string>;
- private _expiration: { [orderHash: string]: BigNumber } = {};
- private _orderExpirationCheckingIntervalMs: number;
- private _expirationMarginMs: number;
+ private readonly _orderHashByExpirationRBTree: RBTree<string>;
+ private readonly _expiration: { [orderHash: string]: BigNumber } = {};
+ private readonly _orderExpirationCheckingIntervalMs: number;
+ private readonly _expirationMarginMs: number;
private _orderExpirationCheckingIntervalIdIfExists?: NodeJS.Timer;
constructor(expirationMarginIfExistsMs?: number, orderExpirationCheckingIntervalIfExistsMs?: number) {
this._orderExpirationCheckingIntervalMs =
@@ -44,7 +44,7 @@ export class ExpirationWatcher {
this._orderExpirationCheckingIntervalIdIfExists = intervalUtils.setInterval(
this._pruneExpiredOrders.bind(this, callback),
this._orderExpirationCheckingIntervalMs,
- _.noop, // _pruneExpiredOrders never throws
+ _.noop.bind(_), // _pruneExpiredOrders never throws
);
}
public unsubscribe(): void {
@@ -68,8 +68,8 @@ export class ExpirationWatcher {
private _pruneExpiredOrders(callback: (orderHash: string) => void): void {
const currentUnixTimestampMs = utils.getCurrentUnixTimestampMs();
while (true) {
- const hasTrakedOrders = this._orderHashByExpirationRBTree.size === 0;
- if (hasTrakedOrders) {
+ const hasNoTrackedOrders = this._orderHashByExpirationRBTree.size === 0;
+ if (hasNoTrackedOrders) {
break;
}
const nextOrderHashToExpire = this._orderHashByExpirationRBTree.min();
diff --git a/packages/order-watcher/src/order_watcher/order_watcher.ts b/packages/order-watcher/src/order_watcher/order_watcher.ts
index b09ba8d9d..2dfbd4230 100644
--- a/packages/order-watcher/src/order_watcher/order_watcher.ts
+++ b/packages/order-watcher/src/order_watcher/order_watcher.ts
@@ -1,55 +1,53 @@
+// tslint:disable:no-unnecessary-type-assertion
import {
- BalanceAndProxyAllowanceLazyStore,
ContractWrappers,
- OrderFilledCancelledLazyStore,
+ ERC20TokenApprovalEventArgs,
+ ERC20TokenEventArgs,
+ ERC20TokenEvents,
+ ERC20TokenTransferEventArgs,
+ ERC721TokenApprovalEventArgs,
+ ERC721TokenApprovalForAllEventArgs,
+ ERC721TokenEventArgs,
+ ERC721TokenEvents,
+ ERC721TokenTransferEventArgs,
+ ExchangeCancelEventArgs,
+ ExchangeCancelUpToEventArgs,
+ ExchangeEventArgs,
+ ExchangeEvents,
+ ExchangeFillEventArgs,
+ WETH9DepositEventArgs,
+ WETH9EventArgs,
+ WETH9Events,
+ WETH9WithdrawalEventArgs,
} from '@0xproject/contract-wrappers';
import { schemas } from '@0xproject/json-schemas';
-import { getOrderHashHex, OrderStateUtils } from '@0xproject/order-utils';
import {
- BlockParamLiteral,
- ExchangeContractErrs,
- LogEntryEvent,
- LogWithDecodedArgs,
- OrderState,
- Provider,
- SignedOrder,
-} from '@0xproject/types';
+ assetDataUtils,
+ BalanceAndProxyAllowanceLazyStore,
+ OrderFilledCancelledLazyStore,
+ orderHashUtils,
+ OrderStateUtils,
+} from '@0xproject/order-utils';
+import { AssetProxyId, ExchangeContractErrs, OrderState, SignedOrder } from '@0xproject/types';
import { errorUtils, intervalUtils } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { BlockParamLiteral, LogEntryEvent, LogWithDecodedArgs, Provider } from 'ethereum-types';
import * as _ from 'lodash';
import { artifacts } from '../artifacts';
-import {
- EtherTokenDepositEventArgs,
- EtherTokenEventArgs,
- EtherTokenEvents,
- EtherTokenWithdrawalEventArgs,
-} from '../generated_contract_wrappers/ether_token';
-import {
- ExchangeEventArgs,
- ExchangeEvents,
- ExchangeLogCancelEventArgs,
- ExchangeLogFillEventArgs,
-} from '../generated_contract_wrappers/exchange';
-import {
- TokenApprovalEventArgs,
- TokenEventArgs,
- TokenEvents,
- TokenTransferEventArgs,
-} from '../generated_contract_wrappers/token';
+import { AssetBalanceAndProxyAllowanceFetcher } from '../fetchers/asset_balance_and_proxy_allowance_fetcher';
+import { OrderFilledCancelledFetcher } from '../fetchers/order_filled_cancelled_fetcher';
+import { orderWatcherPartialConfigSchema } from '../schemas/order_watcher_partial_config_schema';
import { OnOrderStateChangeCallback, OrderWatcherConfig, OrderWatcherError } from '../types';
import { assert } from '../utils/assert';
+import { CollisionResistanceAbiDecoder } from './collision_resistant_abi_decoder';
+import { DependentOrderHashesTracker } from './dependent_order_hashes_tracker';
import { EventWatcher } from './event_watcher';
import { ExpirationWatcher } from './expiration_watcher';
-type ContractEventArgs = EtherTokenEventArgs | ExchangeEventArgs | TokenEventArgs;
+const MILLISECONDS_IN_A_SECOND = 1000;
-interface DependentOrderHashes {
- [makerAddress: string]: {
- [makerToken: string]: Set<string>;
- };
-}
+type ContractEventArgs = WETH9EventArgs | ExchangeEventArgs | ERC20TokenEventArgs | ERC721TokenEventArgs;
interface OrderByOrderHash {
[orderHash: string]: SignedOrder;
@@ -59,8 +57,15 @@ interface OrderStateByOrderHash {
[orderHash: string]: OrderState;
}
-// tslint:disable-next-line:custom-no-magic-numbers
-const DEFAULT_CLEANUP_JOB_INTERVAL_MS = 1000 * 60 * 60; // 1h
+const DEFAULT_ORDER_WATCHER_CONFIG: OrderWatcherConfig = {
+ orderExpirationCheckingIntervalMs: 50,
+ eventPollingIntervalMs: 200,
+ expirationMarginMs: 0,
+ // tslint:disable-next-line:custom-no-magic-numbers
+ cleanupJobIntervalMs: 1000 * 60 * 60, // 1h
+ isVerbose: true,
+};
+const STATE_LAYER = BlockParamLiteral.Latest;
/**
* This class includes all the functionality related to watching a set of orders
@@ -69,71 +74,86 @@ const DEFAULT_CLEANUP_JOB_INTERVAL_MS = 1000 * 60 * 60; // 1h
* the order should be deemed invalid.
*/
export class OrderWatcher {
- private _contractWrappers: ContractWrappers;
- private _orderStateByOrderHashCache: OrderStateByOrderHash = {};
- private _orderByOrderHash: OrderByOrderHash = {};
- private _dependentOrderHashes: DependentOrderHashes = {};
- private _callbackIfExists?: OnOrderStateChangeCallback;
- private _eventWatcher: EventWatcher;
- private _web3Wrapper: Web3Wrapper;
- private _expirationWatcher: ExpirationWatcher;
- private _orderStateUtils: OrderStateUtils;
- private _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
- private _balanceAndProxyAllowanceLazyStore: BalanceAndProxyAllowanceLazyStore;
- private _cleanupJobInterval: number;
+ private readonly _dependentOrderHashesTracker: DependentOrderHashesTracker;
+ private readonly _orderStateByOrderHashCache: OrderStateByOrderHash = {};
+ private readonly _orderByOrderHash: OrderByOrderHash = {};
+ private readonly _eventWatcher: EventWatcher;
+ private readonly _provider: Provider;
+ private readonly _collisionResistantAbiDecoder: CollisionResistanceAbiDecoder;
+ private readonly _expirationWatcher: ExpirationWatcher;
+ private readonly _orderStateUtils: OrderStateUtils;
+ private readonly _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
+ private readonly _balanceAndProxyAllowanceLazyStore: BalanceAndProxyAllowanceLazyStore;
+ private readonly _cleanupJobInterval: number;
private _cleanupJobIntervalIdIfExists?: NodeJS.Timer;
- constructor(provider: Provider, networkId: number, config?: OrderWatcherConfig) {
- this._web3Wrapper = new Web3Wrapper(provider);
- const artifactJSONs = _.values(artifacts);
- const abiArrays = _.map(artifactJSONs, artifact => artifact.abi);
- _.forEach(abiArrays, abi => {
- this._web3Wrapper.abiDecoder.addABI(abi);
- });
- this._contractWrappers = new ContractWrappers(provider, { networkId });
- const pollingIntervalIfExistsMs = _.isUndefined(config) ? undefined : config.eventPollingIntervalMs;
- const stateLayer =
- _.isUndefined(config) || _.isUndefined(config.stateLayer) ? BlockParamLiteral.Latest : config.stateLayer;
- const isVerbose = !_.isUndefined(config) && !_.isUndefined(config.isVerbose) ? config.isVerbose : false;
- this._eventWatcher = new EventWatcher(this._web3Wrapper, pollingIntervalIfExistsMs, stateLayer, isVerbose);
- this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
- this._contractWrappers.token,
- stateLayer,
+ private _callbackIfExists?: OnOrderStateChangeCallback;
+ constructor(
+ provider: Provider,
+ networkId: number,
+ partialConfig: Partial<OrderWatcherConfig> = DEFAULT_ORDER_WATCHER_CONFIG,
+ ) {
+ assert.isWeb3Provider('provider', provider);
+ assert.isNumber('networkId', networkId);
+ assert.doesConformToSchema('partialConfig', partialConfig, orderWatcherPartialConfigSchema);
+ const config = {
+ ...DEFAULT_ORDER_WATCHER_CONFIG,
+ ...partialConfig,
+ };
+
+ this._provider = provider;
+ this._collisionResistantAbiDecoder = new CollisionResistanceAbiDecoder(
+ artifacts.ERC20Token.abi,
+ artifacts.ERC721Token.abi,
+ [artifacts.EtherToken.abi, artifacts.Exchange.abi],
);
- this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(
- this._contractWrappers.exchange,
- stateLayer,
+ const contractWrappers = new ContractWrappers(provider, { networkId });
+ this._eventWatcher = new EventWatcher(provider, config.eventPollingIntervalMs, STATE_LAYER, config.isVerbose);
+ const balanceAndProxyAllowanceFetcher = new AssetBalanceAndProxyAllowanceFetcher(
+ contractWrappers.erc20Token,
+ contractWrappers.erc721Token,
+ STATE_LAYER,
);
- this._orderStateUtils = new OrderStateUtils(
- this._balanceAndProxyAllowanceLazyStore,
- this._orderFilledCancelledLazyStore,
+ this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
+ balanceAndProxyAllowanceFetcher,
);
- const orderExpirationCheckingIntervalMsIfExists = _.isUndefined(config)
- ? undefined
- : config.orderExpirationCheckingIntervalMs;
+ const orderFilledCancelledFetcher = new OrderFilledCancelledFetcher(contractWrappers.exchange, STATE_LAYER);
+ this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(orderFilledCancelledFetcher);
+ this._orderStateUtils = new OrderStateUtils(balanceAndProxyAllowanceFetcher, orderFilledCancelledFetcher);
const expirationMarginIfExistsMs = _.isUndefined(config) ? undefined : config.expirationMarginMs;
this._expirationWatcher = new ExpirationWatcher(
expirationMarginIfExistsMs,
- orderExpirationCheckingIntervalMsIfExists,
+ config.orderExpirationCheckingIntervalMs,
);
- this._cleanupJobInterval =
- _.isUndefined(config) || _.isUndefined(config.cleanupJobIntervalMs)
- ? DEFAULT_CLEANUP_JOB_INTERVAL_MS
- : config.cleanupJobIntervalMs;
+ this._cleanupJobInterval = config.cleanupJobIntervalMs;
+ const zrxTokenAddress = assetDataUtils.decodeERC20AssetData(orderFilledCancelledFetcher.getZRXAssetData())
+ .tokenAddress;
+ this._dependentOrderHashesTracker = new DependentOrderHashesTracker(zrxTokenAddress);
}
/**
* Add an order to the orderWatcher. Before the order is added, it's
* signature is verified.
* @param signedOrder The order you wish to start watching.
*/
- public addOrder(signedOrder: SignedOrder): void {
+ public async addOrderAsync(signedOrder: SignedOrder): Promise<void> {
assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
- const orderHash = getOrderHashHex(signedOrder);
- assert.isValidSignature(orderHash, signedOrder.ecSignature, signedOrder.maker);
- this._orderByOrderHash[orderHash] = signedOrder;
- this._addToDependentOrderHashes(signedOrder, orderHash);
- const milisecondsInASecond = 1000;
- const expirationUnixTimestampMs = signedOrder.expirationUnixTimestampSec.times(milisecondsInASecond);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await assert.isValidSignatureAsync(this._provider, orderHash, signedOrder.signature, signedOrder.makerAddress);
+
+ const expirationUnixTimestampMs = signedOrder.expirationTimeSeconds.times(MILLISECONDS_IN_A_SECOND);
this._expirationWatcher.addOrder(orderHash, expirationUnixTimestampMs);
+
+ this._orderByOrderHash[orderHash] = signedOrder;
+ this._dependentOrderHashesTracker.addToDependentOrderHashes(signedOrder);
+
+ const orderAssetDatas = [signedOrder.makerAssetData, signedOrder.takerAssetData];
+ _.each(orderAssetDatas, assetData => {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ if (decodedAssetData.assetProxyId === AssetProxyId.ERC20) {
+ this._collisionResistantAbiDecoder.addERC20Token(decodedAssetData.tokenAddress);
+ } else if (decodedAssetData.assetProxyId === AssetProxyId.ERC721) {
+ this._collisionResistantAbiDecoder.addERC721Token(decodedAssetData.tokenAddress);
+ }
+ });
}
/**
* Removes an order from the orderWatcher
@@ -145,16 +165,10 @@ export class OrderWatcher {
if (_.isUndefined(signedOrder)) {
return; // noop
}
+ this._dependentOrderHashesTracker.removeFromDependentOrderHashes(signedOrder);
delete this._orderByOrderHash[orderHash];
- delete this._orderStateByOrderHashCache[orderHash];
- const zrxTokenAddress = this._orderFilledCancelledLazyStore.getZRXTokenAddress();
-
- this._removeFromDependentOrderHashes(signedOrder.maker, zrxTokenAddress, orderHash);
- if (zrxTokenAddress !== signedOrder.makerTokenAddress) {
- this._removeFromDependentOrderHashes(signedOrder.maker, signedOrder.makerTokenAddress, orderHash);
- }
-
this._expirationWatcher.removeOrder(orderHash);
+ delete this._orderStateByOrderHashCache[orderHash];
}
/**
* Starts an orderWatcher subscription. The callback will be called every time a watched order's
@@ -203,21 +217,27 @@ export class OrderWatcher {
const signedOrder = this._orderByOrderHash[orderHash];
this._orderFilledCancelledLazyStore.deleteFilledTakerAmount(orderHash);
- this._orderFilledCancelledLazyStore.deleteCancelledTakerAmount(orderHash);
+ this._orderFilledCancelledLazyStore.deleteIsCancelled(orderHash);
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(signedOrder.makerTokenAddress, signedOrder.maker);
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(signedOrder.makerTokenAddress, signedOrder.maker);
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(signedOrder.takerTokenAddress, signedOrder.taker);
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(signedOrder.takerTokenAddress, signedOrder.taker);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(signedOrder.makerAssetData, signedOrder.makerAddress);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(
+ signedOrder.makerAssetData,
+ signedOrder.makerAddress,
+ );
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(signedOrder.takerAssetData, signedOrder.takerAddress);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(
+ signedOrder.takerAssetData,
+ signedOrder.takerAddress,
+ );
- const zrxTokenAddress = this._getZRXTokenAddress();
+ const zrxAssetData = this._orderFilledCancelledLazyStore.getZRXAssetData();
if (!signedOrder.makerFee.isZero()) {
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(zrxTokenAddress, signedOrder.maker);
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(zrxTokenAddress, signedOrder.maker);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(zrxAssetData, signedOrder.makerAddress);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(zrxAssetData, signedOrder.makerAddress);
}
if (!signedOrder.takerFee.isZero()) {
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(zrxTokenAddress, signedOrder.taker);
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(zrxTokenAddress, signedOrder.taker);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(zrxAssetData, signedOrder.takerAddress);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(zrxAssetData, signedOrder.takerAddress);
}
}
private _onOrderExpired(orderHash: string): void {
@@ -240,89 +260,122 @@ export class OrderWatcher {
}
return;
}
- const log = logIfExists as LogEntryEvent; // At this moment we are sure that no error occured and log is defined.
- const maybeDecodedLog = this._web3Wrapper.abiDecoder.tryToDecodeLogOrNoop<ContractEventArgs>(log);
+ const maybeDecodedLog = this._collisionResistantAbiDecoder.tryToDecodeLogOrNoop<ContractEventArgs>(
+ // At this moment we are sure that no error occured and log is defined.
+ logIfExists as LogEntryEvent,
+ );
const isLogDecoded = !_.isUndefined(((maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>).event);
if (!isLogDecoded) {
return; // noop
}
const decodedLog = (maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>;
- let makerToken: string;
- let makerAddress: string;
switch (decodedLog.event) {
- case TokenEvents.Approval: {
- // Invalidate cache
- // tslint:disable-next-line:no-unnecessary-type-assertion
- const args = decodedLog.args as TokenApprovalEventArgs;
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(decodedLog.address, args._owner);
- // Revalidate orders
- makerToken = decodedLog.address;
- makerAddress = args._owner;
- if (
- !_.isUndefined(this._dependentOrderHashes[makerAddress]) &&
- !_.isUndefined(this._dependentOrderHashes[makerAddress][makerToken])
- ) {
- const orderHashes = Array.from(this._dependentOrderHashes[makerAddress][makerToken]);
+ case ERC20TokenEvents.Approval:
+ case ERC721TokenEvents.Approval: {
+ // ERC20 and ERC721 Transfer events have the same name so we need to distinguish them by args
+ if (!_.isUndefined(decodedLog.args._value)) {
+ // ERC20
+ // Invalidate cache
+ const args = decodedLog.args as ERC20TokenApprovalEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC20AssetData(decodedLog.address);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(tokenAssetData, args._owner);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._owner,
+ tokenAssetData,
+ );
await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ } else {
+ // ERC721
+ // Invalidate cache
+ const args = decodedLog.args as ERC721TokenApprovalEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC721AssetData(decodedLog.address, args._tokenId);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(tokenAssetData, args._owner);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._owner,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
}
- break;
}
- case TokenEvents.Transfer: {
- // Invalidate cache
- // tslint:disable-next-line:no-unnecessary-type-assertion
- const args = decodedLog.args as TokenTransferEventArgs;
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._from);
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._to);
- // Revalidate orders
- makerToken = decodedLog.address;
- makerAddress = args._from;
- if (
- !_.isUndefined(this._dependentOrderHashes[makerAddress]) &&
- !_.isUndefined(this._dependentOrderHashes[makerAddress][makerToken])
- ) {
- const orderHashes = Array.from(this._dependentOrderHashes[makerAddress][makerToken]);
+ case ERC20TokenEvents.Transfer:
+ case ERC721TokenEvents.Transfer: {
+ // ERC20 and ERC721 Transfer events have the same name so we need to distinguish them by args
+ if (!_.isUndefined(decodedLog.args._value)) {
+ // ERC20
+ // Invalidate cache
+ const args = decodedLog.args as ERC20TokenTransferEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC20AssetData(decodedLog.address);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._from);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._to);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._from,
+ tokenAssetData,
+ );
await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ } else {
+ // ERC721
+ // Invalidate cache
+ const args = decodedLog.args as ERC721TokenTransferEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC721AssetData(decodedLog.address, args._tokenId);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._from);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._to);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._from,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
}
+ }
+ case ERC721TokenEvents.ApprovalForAll: {
+ // Invalidate cache
+ const args = decodedLog.args as ERC721TokenApprovalForAllEventArgs;
+ const tokenAddress = decodedLog.address;
+ this._balanceAndProxyAllowanceLazyStore.deleteAllERC721ProxyAllowance(tokenAddress, args._owner);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByERC721ByMaker(
+ args._owner,
+ tokenAddress,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
break;
}
- case EtherTokenEvents.Deposit: {
+ case WETH9Events.Deposit: {
// Invalidate cache
- // tslint:disable-next-line:no-unnecessary-type-assertion
- const args = decodedLog.args as EtherTokenDepositEventArgs;
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._owner);
+ const args = decodedLog.args as WETH9DepositEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC20AssetData(decodedLog.address);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._owner);
// Revalidate orders
- makerToken = decodedLog.address;
- makerAddress = args._owner;
- if (
- !_.isUndefined(this._dependentOrderHashes[makerAddress]) &&
- !_.isUndefined(this._dependentOrderHashes[makerAddress][makerToken])
- ) {
- const orderHashes = Array.from(this._dependentOrderHashes[makerAddress][makerToken]);
- await this._emitRevalidateOrdersAsync(orderHashes);
- }
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._owner,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
break;
}
- case EtherTokenEvents.Withdrawal: {
+ case WETH9Events.Withdrawal: {
// Invalidate cache
- // tslint:disable-next-line:no-unnecessary-type-assertion
- const args = decodedLog.args as EtherTokenWithdrawalEventArgs;
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._owner);
+ const args = decodedLog.args as WETH9WithdrawalEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC20AssetData(decodedLog.address);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._owner);
// Revalidate orders
- makerToken = decodedLog.address;
- makerAddress = args._owner;
- if (
- !_.isUndefined(this._dependentOrderHashes[makerAddress]) &&
- !_.isUndefined(this._dependentOrderHashes[makerAddress][makerToken])
- ) {
- const orderHashes = Array.from(this._dependentOrderHashes[makerAddress][makerToken]);
- await this._emitRevalidateOrdersAsync(orderHashes);
- }
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._owner,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
break;
}
- case ExchangeEvents.LogFill: {
+ case ExchangeEvents.Fill: {
// Invalidate cache
- // tslint:disable-next-line:no-unnecessary-type-assertion
- const args = decodedLog.args as ExchangeLogFillEventArgs;
+ const args = decodedLog.args as ExchangeFillEventArgs;
this._orderFilledCancelledLazyStore.deleteFilledTakerAmount(args.orderHash);
// Revalidate orders
const orderHash = args.orderHash;
@@ -332,11 +385,10 @@ export class OrderWatcher {
}
break;
}
- case ExchangeEvents.LogCancel: {
+ case ExchangeEvents.Cancel: {
// Invalidate cache
- // tslint:disable-next-line:no-unnecessary-type-assertion
- const args = decodedLog.args as ExchangeLogCancelEventArgs;
- this._orderFilledCancelledLazyStore.deleteCancelledTakerAmount(args.orderHash);
+ const args = decodedLog.args as ExchangeCancelEventArgs;
+ this._orderFilledCancelledLazyStore.deleteIsCancelled(args.orderHash);
// Revalidate orders
const orderHash = args.orderHash;
const isOrderWatched = !_.isUndefined(this._orderByOrderHash[orderHash]);
@@ -345,8 +397,16 @@ export class OrderWatcher {
}
break;
}
- case ExchangeEvents.LogError:
- return; // noop
+ case ExchangeEvents.CancelUpTo: {
+ // TODO(logvinov): Do it smarter and actually look at the salt and order epoch
+ // Invalidate cache
+ const args = decodedLog.args as ExchangeCancelUpToEventArgs;
+ this._orderFilledCancelledLazyStore.deleteAllIsCancelled();
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByMaker(args.makerAddress);
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ }
default:
throw errorUtils.spawnSwitchErr('decodedLog.event', decodedLog.event);
@@ -357,7 +417,7 @@ export class OrderWatcher {
const signedOrder = this._orderByOrderHash[orderHash];
// Most of these calls will never reach the network because the data is fetched from stores
// and only updated when cache is invalidated
- const orderState = await this._orderStateUtils.getOrderStateAsync(signedOrder);
+ const orderState = await this._orderStateUtils.getOpenOrderStateAsync(signedOrder);
if (_.isUndefined(this._callbackIfExists)) {
break; // Unsubscribe was called
}
@@ -370,31 +430,4 @@ export class OrderWatcher {
this._callbackIfExists(null, orderState);
}
}
- private _addToDependentOrderHashes(signedOrder: SignedOrder, orderHash: string): void {
- if (_.isUndefined(this._dependentOrderHashes[signedOrder.maker])) {
- this._dependentOrderHashes[signedOrder.maker] = {};
- }
- if (_.isUndefined(this._dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress])) {
- this._dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress] = new Set();
- }
- this._dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress].add(orderHash);
- const zrxTokenAddress = this._getZRXTokenAddress();
- if (_.isUndefined(this._dependentOrderHashes[signedOrder.maker][zrxTokenAddress])) {
- this._dependentOrderHashes[signedOrder.maker][zrxTokenAddress] = new Set();
- }
- this._dependentOrderHashes[signedOrder.maker][zrxTokenAddress].add(orderHash);
- }
- private _removeFromDependentOrderHashes(makerAddress: string, tokenAddress: string, orderHash: string): void {
- this._dependentOrderHashes[makerAddress][tokenAddress].delete(orderHash);
- if (this._dependentOrderHashes[makerAddress][tokenAddress].size === 0) {
- delete this._dependentOrderHashes[makerAddress][tokenAddress];
- }
- if (_.isEmpty(this._dependentOrderHashes[makerAddress])) {
- delete this._dependentOrderHashes[makerAddress];
- }
- }
- private _getZRXTokenAddress(): string {
- const zrxTokenAddress = this._orderFilledCancelledLazyStore.getZRXTokenAddress();
- return zrxTokenAddress;
- }
}
diff --git a/packages/order-watcher/src/schemas/order_watcher_partial_config_schema.ts b/packages/order-watcher/src/schemas/order_watcher_partial_config_schema.ts
new file mode 100644
index 000000000..bc7d40524
--- /dev/null
+++ b/packages/order-watcher/src/schemas/order_watcher_partial_config_schema.ts
@@ -0,0 +1,13 @@
+export const orderWatcherPartialConfigSchema = {
+ id: '/OrderWatcherPartialConfigSchema',
+ properties: {
+ stateLayer: { $ref: '/BlockParam' },
+ orderExpirationCheckingIntervalMs: { type: 'number' },
+ eventPollingIntervalMs: { type: 'number' },
+ expirationMarginMs: { type: 'number' },
+ cleanupJobIntervalMs: { type: 'number' },
+ isVerbose: { type: 'boolean' },
+ },
+ type: 'object',
+ required: [],
+};
diff --git a/packages/order-watcher/src/types.ts b/packages/order-watcher/src/types.ts
index 63e4e7848..27d892985 100644
--- a/packages/order-watcher/src/types.ts
+++ b/packages/order-watcher/src/types.ts
@@ -1,4 +1,5 @@
-import { BlockParamLiteral, LogEntryEvent, OrderState } from '@0xproject/types';
+import { OrderState } from '@0xproject/types';
+import { LogEntryEvent } from 'ethereum-types';
export enum OrderWatcherError {
SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT',
@@ -13,15 +14,14 @@ export type EventWatcherCallback = (err: null | Error, log?: LogEntryEvent) => v
* expirationMarginMs: Amount of time before order expiry that you'd like to be notified
* of an orders expiration. Default=0.
* cleanupJobIntervalMs: How often to run a cleanup job which revalidates all the orders. Default=1hr.
- * stateLayer: Optional blockchain state layer OrderWatcher will monitor for new events. Default=latest.
+ * isVerbose: Weather the order watcher should be verbose. Default=true.
*/
export interface OrderWatcherConfig {
- stateLayer: BlockParamLiteral;
- orderExpirationCheckingIntervalMs?: number;
- eventPollingIntervalMs?: number;
- expirationMarginMs?: number;
- cleanupJobIntervalMs?: number;
- isVerbose?: boolean;
+ orderExpirationCheckingIntervalMs: number;
+ eventPollingIntervalMs: number;
+ expirationMarginMs: number;
+ cleanupJobIntervalMs: number;
+ isVerbose: boolean;
}
export type OnOrderStateChangeCallback = (err: Error | null, orderState?: OrderState) => void;
diff --git a/packages/order-watcher/src/utils/assert.ts b/packages/order-watcher/src/utils/assert.ts
index 9c992d9b4..a891a60d2 100644
--- a/packages/order-watcher/src/utils/assert.ts
+++ b/packages/order-watcher/src/utils/assert.ts
@@ -5,13 +5,19 @@ import { Schema } from '@0xproject/json-schemas';
import { ECSignature } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
// tslint:enable:no-unused-variable
+import { Provider } from 'ethereum-types';
-import { isValidSignature } from '@0xproject/order-utils';
+import { isValidSignatureAsync } from '@0xproject/order-utils';
export const assert = {
...sharedAssert,
- isValidSignature(orderHash: string, ecSignature: ECSignature, signerAddress: string): void {
- const isValid = isValidSignature(orderHash, ecSignature, signerAddress);
- this.assert(isValid, `Expected order with hash '${orderHash}' to have a valid signature`);
+ async isValidSignatureAsync(
+ provider: Provider,
+ orderHash: string,
+ signature: string,
+ signerAddress: string,
+ ): Promise<void> {
+ const isValid = await isValidSignatureAsync(provider, orderHash, signature, signerAddress);
+ assert.assert(isValid, `Expected order with hash '${orderHash}' to have a valid signature`);
},
};
diff --git a/packages/order-watcher/test/expiration_watcher_test.ts b/packages/order-watcher/test/expiration_watcher_test.ts
index dfd3556bc..ea9923487 100644
--- a/packages/order-watcher/test/expiration_watcher_test.ts
+++ b/packages/order-watcher/test/expiration_watcher_test.ts
@@ -1,8 +1,9 @@
import { ContractWrappers } from '@0xproject/contract-wrappers';
+import { tokenUtils } from '@0xproject/contract-wrappers/lib/test/utils/token_utils';
import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
import { FillScenarios } from '@0xproject/fill-scenarios';
-import { getOrderHashHex } from '@0xproject/order-utils';
-import { DoneCallback, Token } from '@0xproject/types';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { DoneCallback } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
import * as _ from 'lodash';
@@ -14,7 +15,6 @@ import { utils } from '../src/utils/utils';
import { chaiSetup } from './utils/chai_setup';
import { constants } from './utils/constants';
-import { TokenUtils } from './utils/token_utils';
import { provider, web3Wrapper } from './utils/web3_wrapper';
chaiSetup.configure();
@@ -23,15 +23,16 @@ const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
const MILISECONDS_IN_SECOND = 1000;
describe('ExpirationWatcher', () => {
- let contractWrappers: ContractWrappers;
- let tokenUtils: TokenUtils;
- let tokens: Token[];
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ const contractWrappers = new ContractWrappers(provider, config);
let userAddresses: string[];
let zrxTokenAddress: string;
let fillScenarios: FillScenarios;
- let exchangeContractAddress: string;
- let makerTokenAddress: string;
- let takerTokenAddress: string;
+ const exchangeContractAddress = contractWrappers.exchange.getContractAddress();
+ let makerAssetData: string;
+ let takerAssetData: string;
let coinbase: string;
let makerAddress: string;
let takerAddress: string;
@@ -41,21 +42,26 @@ describe('ExpirationWatcher', () => {
let timer: Sinon.SinonFakeTimers;
let expirationWatcher: ExpirationWatcher;
before(async () => {
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- contractWrappers = new ContractWrappers(provider, config);
- exchangeContractAddress = contractWrappers.exchange.getContractAddress();
+ await blockchainLifecycle.startAsync();
userAddresses = await web3Wrapper.getAvailableAddressesAsync();
- tokens = await contractWrappers.tokenRegistry.getTokensAsync();
- tokenUtils = new TokenUtils(tokens);
- zrxTokenAddress = tokenUtils.getProtocolTokenOrThrow().address;
- fillScenarios = new FillScenarios(provider, userAddresses, tokens, zrxTokenAddress, exchangeContractAddress);
+ zrxTokenAddress = tokenUtils.getProtocolTokenAddress();
+ fillScenarios = new FillScenarios(
+ provider,
+ userAddresses,
+ zrxTokenAddress,
+ exchangeContractAddress,
+ contractWrappers.erc20Proxy.getContractAddress(),
+ contractWrappers.erc721Proxy.getContractAddress(),
+ );
[coinbase, makerAddress, takerAddress, feeRecipient] = userAddresses;
- tokens = await contractWrappers.tokenRegistry.getTokensAsync();
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
+ const [makerTokenAddress, takerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses();
+ [makerAssetData, takerAssetData] = [
+ assetDataUtils.encodeERC20AssetData(makerTokenAddress),
+ assetDataUtils.encodeERC20AssetData(takerTokenAddress),
+ ];
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
});
beforeEach(async () => {
await blockchainLifecycle.startAsync();
@@ -75,15 +81,15 @@ describe('ExpirationWatcher', () => {
const orderLifetimeSec = 60;
const expirationUnixTimestampSec = currentUnixTimestampSec.plus(orderLifetimeSec);
const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
+ makerAssetData,
+ takerAssetData,
makerAddress,
takerAddress,
fillableAmount,
expirationUnixTimestampSec,
);
- const orderHash = getOrderHashHex(signedOrder);
- expirationWatcher.addOrder(orderHash, signedOrder.expirationUnixTimestampSec.times(MILISECONDS_IN_SECOND));
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ expirationWatcher.addOrder(orderHash, signedOrder.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
const callbackAsync = callbackErrorReporter.reportNoErrorCallbackErrors(done)((hash: string) => {
expect(hash).to.be.equal(orderHash);
expect(utils.getCurrentUnixTimestampSec()).to.be.bignumber.gte(expirationUnixTimestampSec);
@@ -97,15 +103,15 @@ describe('ExpirationWatcher', () => {
const orderLifetimeSec = 60;
const expirationUnixTimestampSec = currentUnixTimestampSec.plus(orderLifetimeSec);
const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
+ makerAssetData,
+ takerAssetData,
makerAddress,
takerAddress,
fillableAmount,
expirationUnixTimestampSec,
);
- const orderHash = getOrderHashHex(signedOrder);
- expirationWatcher.addOrder(orderHash, signedOrder.expirationUnixTimestampSec.times(MILISECONDS_IN_SECOND));
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ expirationWatcher.addOrder(orderHash, signedOrder.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
const callbackAsync = callbackErrorReporter.reportNoErrorCallbackErrors(done)(async (_hash: string) => {
done(new Error('Emitted expiration went before the order actually expired'));
});
@@ -122,31 +128,25 @@ describe('ExpirationWatcher', () => {
const order1ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order1Lifetime);
const order2ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order2Lifetime);
const signedOrder1 = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
+ makerAssetData,
+ takerAssetData,
makerAddress,
takerAddress,
fillableAmount,
order1ExpirationUnixTimestampSec,
);
const signedOrder2 = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
+ makerAssetData,
+ takerAssetData,
makerAddress,
takerAddress,
fillableAmount,
order2ExpirationUnixTimestampSec,
);
- const orderHash1 = getOrderHashHex(signedOrder1);
- const orderHash2 = getOrderHashHex(signedOrder2);
- expirationWatcher.addOrder(
- orderHash2,
- signedOrder2.expirationUnixTimestampSec.times(MILISECONDS_IN_SECOND),
- );
- expirationWatcher.addOrder(
- orderHash1,
- signedOrder1.expirationUnixTimestampSec.times(MILISECONDS_IN_SECOND),
- );
+ const orderHash1 = orderHashUtils.getOrderHashHex(signedOrder1);
+ const orderHash2 = orderHashUtils.getOrderHashHex(signedOrder2);
+ expirationWatcher.addOrder(orderHash2, signedOrder2.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
+ expirationWatcher.addOrder(orderHash1, signedOrder1.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
const expirationOrder = [orderHash1, orderHash2];
const expectToBeCalledOnce = false;
const callbackAsync = callbackErrorReporter.reportNoErrorCallbackErrors(done, expectToBeCalledOnce)(
@@ -169,31 +169,25 @@ describe('ExpirationWatcher', () => {
const order1ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order1Lifetime);
const order2ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order2Lifetime);
const signedOrder1 = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
+ makerAssetData,
+ takerAssetData,
makerAddress,
takerAddress,
fillableAmount,
order1ExpirationUnixTimestampSec,
);
const signedOrder2 = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
+ makerAssetData,
+ takerAssetData,
makerAddress,
takerAddress,
fillableAmount,
order2ExpirationUnixTimestampSec,
);
- const orderHash1 = getOrderHashHex(signedOrder1);
- const orderHash2 = getOrderHashHex(signedOrder2);
- expirationWatcher.addOrder(
- orderHash1,
- signedOrder1.expirationUnixTimestampSec.times(MILISECONDS_IN_SECOND),
- );
- expirationWatcher.addOrder(
- orderHash2,
- signedOrder2.expirationUnixTimestampSec.times(MILISECONDS_IN_SECOND),
- );
+ const orderHash1 = orderHashUtils.getOrderHashHex(signedOrder1);
+ const orderHash2 = orderHashUtils.getOrderHashHex(signedOrder2);
+ expirationWatcher.addOrder(orderHash1, signedOrder1.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
+ expirationWatcher.addOrder(orderHash2, signedOrder2.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
const expirationOrder = orderHash1 < orderHash2 ? [orderHash1, orderHash2] : [orderHash2, orderHash1];
const expectToBeCalledOnce = false;
const callbackAsync = callbackErrorReporter.reportNoErrorCallbackErrors(done, expectToBeCalledOnce)(
diff --git a/packages/order-watcher/test/global_hooks.ts b/packages/order-watcher/test/global_hooks.ts
index 30b0cd697..f64f1df78 100644
--- a/packages/order-watcher/test/global_hooks.ts
+++ b/packages/order-watcher/test/global_hooks.ts
@@ -1,5 +1,5 @@
import { devConstants } from '@0xproject/dev-utils';
-import { runV1MigrationsAsync } from '@0xproject/migrations';
+import { runV2MigrationsAsync } from '@0xproject/migrations';
import { provider } from './utils/web3_wrapper';
@@ -7,11 +7,11 @@ before('migrate contracts', async function(): Promise<void> {
// HACK: Since the migrations take longer then our global mocha timeout limit
// we manually increase it for this before hook.
const mochaTestTimeoutMs = 25000;
- this.timeout(mochaTestTimeoutMs);
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
const txDefaults = {
gas: devConstants.GAS_LIMIT,
from: devConstants.TESTRPC_FIRST_ADDRESS,
};
- const artifactsDir = `../migrations/artifacts/1.0.0`;
- await runV1MigrationsAsync(provider, artifactsDir, txDefaults);
+ const artifactsDir = `../migrations/artifacts/2.0.0`;
+ await runV2MigrationsAsync(provider, artifactsDir, txDefaults);
});
diff --git a/packages/order-watcher/test/order_watcher_test.ts b/packages/order-watcher/test/order_watcher_test.ts
index 2889051bc..00962bed0 100644
--- a/packages/order-watcher/test/order_watcher_test.ts
+++ b/packages/order-watcher/test/order_watcher_test.ts
@@ -1,8 +1,9 @@
// tslint:disable:no-unnecessary-type-assertion
import { ContractWrappers } from '@0xproject/contract-wrappers';
+import { tokenUtils } from '@0xproject/contract-wrappers/lib/test/utils/token_utils';
import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
import { FillScenarios } from '@0xproject/fill-scenarios';
-import { getOrderHashHex } from '@0xproject/order-utils';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
import {
DoneCallback,
ExchangeContractErrs,
@@ -10,7 +11,6 @@ import {
OrderStateInvalid,
OrderStateValid,
SignedOrder,
- Token,
} from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
@@ -18,12 +18,15 @@ import * as chai from 'chai';
import * as _ from 'lodash';
import 'mocha';
+import {
+ DependentOrderHashesTracker,
+ OrderHashesByERC20ByMakerAddress,
+} from '../src/order_watcher/dependent_order_hashes_tracker';
import { OrderWatcher } from '../src/order_watcher/order_watcher';
import { OrderWatcherError } from '../src/types';
import { chaiSetup } from './utils/chai_setup';
import { constants } from './utils/constants';
-import { TokenUtils } from './utils/token_utils';
import { provider, web3Wrapper } from './utils/web3_wrapper';
const TIMEOUT_MS = 150;
@@ -33,37 +36,49 @@ const expect = chai.expect;
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
describe('OrderWatcher', () => {
- let contractWrappers: ContractWrappers;
- let tokens: Token[];
- let tokenUtils: TokenUtils;
+ const networkId = constants.TESTRPC_NETWORK_ID;
+ const config = { networkId };
+ const contractWrappers = new ContractWrappers(provider, config);
let fillScenarios: FillScenarios;
let userAddresses: string[];
let zrxTokenAddress: string;
let exchangeContractAddress: string;
- let makerToken: Token;
- let takerToken: Token;
- let maker: string;
- let taker: string;
+ let makerAssetData: string;
+ let takerAssetData: string;
+ let makerTokenAddress: string;
+ let takerTokenAddress: string;
+ let makerAddress: string;
+ let takerAddress: string;
+ let coinbase: string;
+ let feeRecipient: string;
let signedOrder: SignedOrder;
let orderWatcher: OrderWatcher;
const decimals = constants.ZRX_DECIMALS;
const fillableAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(5), decimals);
before(async () => {
- const networkId = await web3Wrapper.getNetworkIdAsync();
- const config = {
- networkId,
- };
- contractWrappers = new ContractWrappers(provider, config);
- orderWatcher = new OrderWatcher(provider, networkId);
- exchangeContractAddress = contractWrappers.exchange.getContractAddress();
+ await blockchainLifecycle.startAsync();
userAddresses = await web3Wrapper.getAvailableAddressesAsync();
- [, maker, taker] = userAddresses;
- tokens = await contractWrappers.tokenRegistry.getTokensAsync();
- tokenUtils = new TokenUtils(tokens);
- zrxTokenAddress = tokenUtils.getProtocolTokenOrThrow().address;
- fillScenarios = new FillScenarios(provider, userAddresses, tokens, zrxTokenAddress, exchangeContractAddress);
- await fillScenarios.initTokenBalancesAsync();
- [makerToken, takerToken] = tokenUtils.getDummyTokens();
+ zrxTokenAddress = tokenUtils.getProtocolTokenAddress();
+ exchangeContractAddress = contractWrappers.exchange.getContractAddress();
+ fillScenarios = new FillScenarios(
+ provider,
+ userAddresses,
+ zrxTokenAddress,
+ exchangeContractAddress,
+ contractWrappers.erc20Proxy.getContractAddress(),
+ contractWrappers.erc721Proxy.getContractAddress(),
+ );
+ [coinbase, makerAddress, takerAddress, feeRecipient] = userAddresses;
+ [makerTokenAddress, takerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses();
+ [makerAssetData, takerAssetData] = [
+ assetDataUtils.encodeERC20AssetData(makerTokenAddress),
+ assetDataUtils.encodeERC20AssetData(takerTokenAddress),
+ ];
+ const orderWatcherConfig = {};
+ orderWatcher = new OrderWatcher(provider, networkId, orderWatcherConfig);
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
});
beforeEach(async () => {
await blockchainLifecycle.startAsync();
@@ -74,35 +89,40 @@ describe('OrderWatcher', () => {
describe('#removeOrder', async () => {
it('should successfully remove existing order', async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
expect((orderWatcher as any)._orderByOrderHash).to.include({
[orderHash]: signedOrder,
});
- let dependentOrderHashes = (orderWatcher as any)._dependentOrderHashes;
- expect(dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress]).to.have.keys(orderHash);
+ const dependentOrderHashesTracker = (orderWatcher as any)
+ ._dependentOrderHashesTracker as DependentOrderHashesTracker;
+ let orderHashesByERC20ByMakerAddress: OrderHashesByERC20ByMakerAddress = (dependentOrderHashesTracker as any)
+ ._orderHashesByERC20ByMakerAddress;
+ expect(orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][makerTokenAddress]).to.have.keys(
+ orderHash,
+ );
orderWatcher.removeOrder(orderHash);
expect((orderWatcher as any)._orderByOrderHash).to.not.include({
[orderHash]: signedOrder,
});
- dependentOrderHashes = (orderWatcher as any)._dependentOrderHashes;
- expect(dependentOrderHashes[signedOrder.maker]).to.be.undefined();
+ orderHashesByERC20ByMakerAddress = (dependentOrderHashesTracker as any)._orderHashesByERC20ByMakerAddress;
+ expect(orderHashesByERC20ByMakerAddress[signedOrder.makerAddress]).to.be.undefined();
});
it('should no-op when removing a non-existing order', async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const orderHash = getOrderHashHex(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
const nonExistentOrderHash = `0x${orderHash
.substr(2)
.split('')
@@ -116,27 +136,27 @@ describe('OrderWatcher', () => {
orderWatcher.unsubscribe();
});
it('should fail when trying to subscribe twice', async () => {
- orderWatcher.subscribe(_.noop);
- expect(() => orderWatcher.subscribe(_.noop)).to.throw(OrderWatcherError.SubscriptionAlreadyPresent);
+ orderWatcher.subscribe(_.noop.bind(_));
+ expect(() => orderWatcher.subscribe(_.noop.bind(_))).to.throw(OrderWatcherError.SubscriptionAlreadyPresent);
});
});
describe('tests with cleanup', async () => {
afterEach(async () => {
orderWatcher.unsubscribe();
- const orderHash = getOrderHashHex(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
orderWatcher.removeOrder(orderHash);
});
- it('should emit orderStateInvalid when maker allowance set to 0 for watched order', (done: DoneCallback) => {
+ it('should emit orderStateInvalid when makerAddress allowance set to 0 for watched order', (done: DoneCallback) => {
(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
const invalidOrderState = orderState as OrderStateInvalid;
@@ -144,28 +164,32 @@ describe('OrderWatcher', () => {
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
});
orderWatcher.subscribe(callback);
- await contractWrappers.token.setProxyAllowanceAsync(makerToken.address, maker, new BigNumber(0));
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ makerTokenAddress,
+ makerAddress,
+ new BigNumber(0),
+ );
})().catch(done);
});
it('should not emit an orderState event when irrelevant Transfer event received', (done: DoneCallback) => {
(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- orderWatcher.addOrder(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((_orderState: OrderState) => {
throw new Error('OrderState callback fired for irrelevant order');
});
orderWatcher.subscribe(callback);
const notTheMaker = userAddresses[0];
- const anyRecipient = taker;
+ const anyRecipient = takerAddress;
const transferAmount = new BigNumber(2);
- await contractWrappers.token.transferAsync(
- makerToken.address,
+ await contractWrappers.erc20Token.transferAsync(
+ makerTokenAddress,
notTheMaker,
anyRecipient,
transferAmount,
@@ -175,17 +199,17 @@ describe('OrderWatcher', () => {
}, TIMEOUT_MS);
})().catch(done);
});
- it('should emit orderStateInvalid when maker moves balance backing watched order', (done: DoneCallback) => {
+ it('should emit orderStateInvalid when makerAddress moves balance backing watched order', (done: DoneCallback) => {
(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
const invalidOrderState = orderState as OrderStateInvalid;
@@ -193,22 +217,27 @@ describe('OrderWatcher', () => {
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
});
orderWatcher.subscribe(callback);
- const anyRecipient = taker;
- const makerBalance = await contractWrappers.token.getBalanceAsync(makerToken.address, maker);
- await contractWrappers.token.transferAsync(makerToken.address, maker, anyRecipient, makerBalance);
+ const anyRecipient = takerAddress;
+ const makerBalance = await contractWrappers.erc20Token.getBalanceAsync(makerTokenAddress, makerAddress);
+ await contractWrappers.erc20Token.transferAsync(
+ makerTokenAddress,
+ makerAddress,
+ anyRecipient,
+ makerBalance,
+ );
})().catch(done);
});
it('should emit orderStateInvalid when watched order fully filled', (done: DoneCallback) => {
(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
@@ -218,29 +247,23 @@ describe('OrderWatcher', () => {
});
orderWatcher.subscribe(callback);
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- await contractWrappers.exchange.fillOrderAsync(
- signedOrder,
- fillableAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- taker,
- );
+ await contractWrappers.exchange.fillOrderAsync(signedOrder, fillableAmount, takerAddress);
})().catch(done);
});
it('should emit orderStateValid when watched order partially filled', (done: DoneCallback) => {
(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const makerBalance = await contractWrappers.token.getBalanceAsync(makerToken.address, maker);
+ const makerBalance = await contractWrappers.erc20Token.getBalanceAsync(makerTokenAddress, makerAddress);
const fillAmountInBaseUnits = new BigNumber(2);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.true();
@@ -249,22 +272,16 @@ describe('OrderWatcher', () => {
const orderRelevantState = validOrderState.orderRelevantState;
const remainingMakerBalance = makerBalance.sub(fillAmountInBaseUnits);
const remainingFillable = fillableAmount.minus(fillAmountInBaseUnits);
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
remainingFillable,
);
- expect(orderRelevantState.remainingFillableTakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableTakerAssetAmount).to.be.bignumber.equal(
remainingFillable,
);
expect(orderRelevantState.makerBalance).to.be.bignumber.equal(remainingMakerBalance);
});
orderWatcher.subscribe(callback);
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- await contractWrappers.exchange.fillOrderAsync(
- signedOrder,
- fillAmountInBaseUnits,
- shouldThrowOnInsufficientBalanceOrAllowance,
- taker,
- );
+ await contractWrappers.exchange.fillOrderAsync(signedOrder, fillAmountInBaseUnits, takerAddress);
})().catch(done);
});
it('should trigger the callback when orders backing ZRX allowance changes', (done: DoneCallback) => {
@@ -272,19 +289,23 @@ describe('OrderWatcher', () => {
const makerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
const takerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(0), decimals);
signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerToken.address,
- takerToken.address,
+ makerAssetData,
+ takerAssetData,
makerFee,
takerFee,
- maker,
- taker,
+ makerAddress,
+ takerAddress,
fillableAmount,
- taker,
+ takerAddress,
);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)();
- orderWatcher.addOrder(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
orderWatcher.subscribe(callback);
- await contractWrappers.token.setProxyAllowanceAsync(zrxTokenAddress, maker, new BigNumber(0));
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ zrxTokenAddress,
+ makerAddress,
+ new BigNumber(0),
+ );
})().catch(done);
});
describe('remainingFillable(M|T)akerTokenAmount', () => {
@@ -293,65 +314,59 @@ describe('OrderWatcher', () => {
const takerFillableAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(10), decimals);
const makerFillableAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(20), decimals);
signedOrder = await fillScenarios.createAsymmetricFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
makerFillableAmount,
takerFillableAmount,
);
const fillAmountInBaseUnits = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.true();
const validOrderState = orderState as OrderStateValid;
expect(validOrderState.orderHash).to.be.equal(orderHash);
const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
Web3Wrapper.toBaseUnitAmount(new BigNumber(16), decimals),
);
- expect(orderRelevantState.remainingFillableTakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableTakerAssetAmount).to.be.bignumber.equal(
Web3Wrapper.toBaseUnitAmount(new BigNumber(8), decimals),
);
});
orderWatcher.subscribe(callback);
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- await contractWrappers.exchange.fillOrderAsync(
- signedOrder,
- fillAmountInBaseUnits,
- shouldThrowOnInsufficientBalanceOrAllowance,
- taker,
- );
+ await contractWrappers.exchange.fillOrderAsync(signedOrder, fillAmountInBaseUnits, takerAddress);
})().catch(done);
});
it('should equal approved amount when approved amount is lowest', (done: DoneCallback) => {
(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
const changedMakerApprovalAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(3), decimals);
- orderWatcher.addOrder(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
changedMakerApprovalAmount,
);
- expect(orderRelevantState.remainingFillableTakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableTakerAssetAmount).to.be.bignumber.equal(
changedMakerApprovalAmount,
);
});
orderWatcher.subscribe(callback);
- await contractWrappers.token.setProxyAllowanceAsync(
- makerToken.address,
- maker,
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ makerTokenAddress,
+ makerAddress,
changedMakerApprovalAmount,
);
})().catch(done);
@@ -359,83 +374,53 @@ describe('OrderWatcher', () => {
it('should equal balance amount when balance amount is lowest', (done: DoneCallback) => {
(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const makerBalance = await contractWrappers.token.getBalanceAsync(makerToken.address, maker);
+ const makerBalance = await contractWrappers.erc20Token.getBalanceAsync(
+ makerTokenAddress,
+ makerAddress,
+ );
const remainingAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(1), decimals);
const transferAmount = makerBalance.sub(remainingAmount);
- orderWatcher.addOrder(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.true();
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
remainingAmount,
);
- expect(orderRelevantState.remainingFillableTakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableTakerAssetAmount).to.be.bignumber.equal(
remainingAmount,
);
});
orderWatcher.subscribe(callback);
- await contractWrappers.token.transferAsync(
- makerToken.address,
- maker,
+ await contractWrappers.erc20Token.transferAsync(
+ makerTokenAddress,
+ makerAddress,
constants.NULL_ADDRESS,
transferAmount,
);
})().catch(done);
});
- it('should equal remaining amount when partially cancelled and order has fees', (done: DoneCallback) => {
- (async () => {
- const takerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(0), decimals);
- const makerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(5), decimals);
- const feeRecipient = taker;
- signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerToken.address,
- takerToken.address,
- makerFee,
- takerFee,
- maker,
- taker,
- fillableAmount,
- feeRecipient,
- );
-
- const remainingTokenAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(4), decimals);
- const transferTokenAmount = makerFee.sub(remainingTokenAmount);
- orderWatcher.addOrder(signedOrder);
-
- const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.true();
- const validOrderState = orderState as OrderStateValid;
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
- remainingTokenAmount,
- );
- });
- orderWatcher.subscribe(callback);
- await contractWrappers.exchange.cancelOrderAsync(signedOrder, transferTokenAmount);
- })().catch(done);
- });
it('should equal ratio amount when fee balance is lowered', (done: DoneCallback) => {
(async () => {
const takerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(0), decimals);
const makerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(5), decimals);
- const feeRecipient = taker;
signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerToken.address,
- takerToken.address,
+ makerAssetData,
+ takerAssetData,
makerFee,
takerFee,
- maker,
- taker,
+ makerAddress,
+ takerAddress,
fillableAmount,
feeRecipient,
);
@@ -444,20 +429,24 @@ describe('OrderWatcher', () => {
const remainingTokenAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(4), decimals);
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
- orderWatcher.addOrder(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
remainingFeeAmount,
);
});
orderWatcher.subscribe(callback);
- await contractWrappers.token.setProxyAllowanceAsync(zrxTokenAddress, maker, remainingFeeAmount);
- await contractWrappers.token.transferAsync(
- makerToken.address,
- maker,
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ zrxTokenAddress,
+ makerAddress,
+ remainingFeeAmount,
+ );
+ await contractWrappers.erc20Token.transferAsync(
+ makerTokenAddress,
+ makerAddress,
constants.NULL_ADDRESS,
transferTokenAmount,
);
@@ -467,31 +456,30 @@ describe('OrderWatcher', () => {
(async () => {
const takerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(0), decimals);
const makerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
- const feeRecipient = taker;
signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerToken.address,
- takerToken.address,
+ makerAssetData,
+ takerAssetData,
makerFee,
takerFee,
- maker,
- taker,
+ makerAddress,
+ takerAddress,
fillableAmount,
feeRecipient,
);
- orderWatcher.addOrder(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
fillableAmount,
);
});
orderWatcher.subscribe(callback);
- await contractWrappers.token.setProxyAllowanceAsync(
- makerToken.address,
- maker,
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ makerTokenAddress,
+ makerAddress,
Web3Wrapper.toBaseUnitAmount(new BigNumber(100), decimals),
);
})().catch(done);
@@ -500,38 +488,37 @@ describe('OrderWatcher', () => {
it('should emit orderStateInvalid when watched order cancelled', (done: DoneCallback) => {
(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
const invalidOrderState = orderState as OrderStateInvalid;
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
- expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
});
orderWatcher.subscribe(callback);
-
- await contractWrappers.exchange.cancelOrderAsync(signedOrder, fillableAmount);
+ await contractWrappers.exchange.cancelOrderAsync(signedOrder);
})().catch(done);
});
it('should emit orderStateInvalid when within rounding error range', (done: DoneCallback) => {
(async () => {
const remainingFillableAmountInBaseUnits = new BigNumber(100);
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
fillableAmount,
);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
@@ -540,36 +527,108 @@ describe('OrderWatcher', () => {
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
});
orderWatcher.subscribe(callback);
- await contractWrappers.exchange.cancelOrderAsync(
+ await contractWrappers.exchange.fillOrderAsync(
signedOrder,
fillableAmount.minus(remainingFillableAmountInBaseUnits),
+ takerAddress,
);
})().catch(done);
});
- it('should emit orderStateValid when watched order partially cancelled', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
-
- const cancelAmountInBaseUnits = new BigNumber(2);
- const orderHash = getOrderHashHex(signedOrder);
- orderWatcher.addOrder(signedOrder);
-
- const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.true();
- const validOrderState = orderState as OrderStateValid;
- expect(validOrderState.orderHash).to.be.equal(orderHash);
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.cancelledTakerTokenAmount).to.be.bignumber.equal(cancelAmountInBaseUnits);
- });
- orderWatcher.subscribe(callback);
- await contractWrappers.exchange.cancelOrderAsync(signedOrder, cancelAmountInBaseUnits);
- })().catch(done);
+ describe('erc721', () => {
+ let makerErc721AssetData: string;
+ let makerErc721TokenAddress: string;
+ const tokenId = new BigNumber(42);
+ [makerErc721TokenAddress] = tokenUtils.getDummyERC721TokenAddresses();
+ makerErc721AssetData = assetDataUtils.encodeERC721AssetData(makerErc721TokenAddress, tokenId);
+ const fillableErc721Amount = new BigNumber(1);
+ it('should emit orderStateInvalid when maker allowance set to 0 for watched order', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerErc721AssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableErc721Amount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc721Token.setApprovalAsync(
+ makerErc721TokenAddress,
+ constants.NULL_ADDRESS,
+ tokenId,
+ );
+ })().catch(done);
+ });
+ it('should emit orderStateInvalid when maker allowance for all set to 0 for watched order', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerErc721AssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableErc721Amount,
+ );
+ await contractWrappers.erc721Token.setApprovalAsync(
+ makerErc721TokenAddress,
+ constants.NULL_ADDRESS,
+ tokenId,
+ );
+ let isApproved = true;
+ await contractWrappers.erc721Token.setProxyApprovalForAllAsync(
+ makerErc721TokenAddress,
+ makerAddress,
+ isApproved,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
+ });
+ orderWatcher.subscribe(callback);
+ isApproved = false;
+ await contractWrappers.erc721Token.setProxyApprovalForAllAsync(
+ makerErc721TokenAddress,
+ makerAddress,
+ isApproved,
+ );
+ })().catch(done);
+ });
+ it('should emit orderStateInvalid when maker moves NFT backing watched order', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerErc721AssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableErc721Amount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc721Token.transferFromAsync(
+ makerErc721TokenAddress,
+ coinbase,
+ makerAddress,
+ tokenId,
+ );
+ })().catch(done);
+ });
});
});
}); // tslint:disable:max-file-line-count
diff --git a/packages/order-watcher/test/utils/token_utils.ts b/packages/order-watcher/test/utils/token_utils.ts
index e1191b5bb..f91b3797f 100644
--- a/packages/order-watcher/test/utils/token_utils.ts
+++ b/packages/order-watcher/test/utils/token_utils.ts
@@ -7,7 +7,7 @@ const PROTOCOL_TOKEN_SYMBOL = 'ZRX';
const WETH_TOKEN_SYMBOL = 'WETH';
export class TokenUtils {
- private _tokens: Token[];
+ private readonly _tokens: Token[];
constructor(tokens: Token[]) {
this._tokens = tokens;
}
diff --git a/packages/order-watcher/test/utils/web3_wrapper.ts b/packages/order-watcher/test/utils/web3_wrapper.ts
index f7d11f138..ab801fa7f 100644
--- a/packages/order-watcher/test/utils/web3_wrapper.ts
+++ b/packages/order-watcher/test/utils/web3_wrapper.ts
@@ -1,6 +1,6 @@
import { web3Factory } from '@0xproject/dev-utils';
-import { Provider } from '@0xproject/types';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
const provider: Provider = web3Factory.getRpcProvider({ shouldUseInProcessGanache: true });
const web3Wrapper = new Web3Wrapper(provider);
diff --git a/packages/order-watcher/tslint.json b/packages/order-watcher/tslint.json
index ffaefe83a..059573ce7 100644
--- a/packages/order-watcher/tslint.json
+++ b/packages/order-watcher/tslint.json
@@ -1,3 +1,6 @@
{
+ "rules": {
+ "prefer-readonly": true
+ },
"extends": ["@0xproject/tslint-config"]
}
diff --git a/packages/react-docs-example/package.json b/packages/react-docs-example/package.json
index 6fd9aca22..f71b718de 100644
--- a/packages/react-docs-example/package.json
+++ b/packages/react-docs-example/package.json
@@ -1,7 +1,7 @@
{
"private": true,
"name": "@0xproject/react-docs-example",
- "version": "0.0.14",
+ "version": "0.0.15",
"engines": {
"node": ">=6.12"
},
@@ -26,7 +26,7 @@
"url": "https://github.com/0xProject/0x-monorepo.git"
},
"devDependencies": {
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"@types/material-ui": "0.18.0",
"@types/node": "^8.0.53",
@@ -50,7 +50,7 @@
"webpack-dev-server": "^2.11.1"
},
"dependencies": {
- "@0xproject/react-docs": "^0.0.15",
+ "@0xproject/react-docs": "^1.0.0",
"basscss": "^8.0.3",
"lodash": "^4.17.4",
"material-ui": "^0.17.1",
diff --git a/packages/react-docs-example/ts/docs.tsx b/packages/react-docs-example/ts/docs.tsx
index b70de1257..bb605806f 100644
--- a/packages/react-docs-example/ts/docs.tsx
+++ b/packages/react-docs-example/ts/docs.tsx
@@ -14,7 +14,7 @@ import * as v0TypeDocJson from './json/0.1.12.json';
import * as v2TypeDocJson from './json/0.2.0.json';
// tslint:disable-next-line:no-implicit-dependencies no-var-requires
-const IntroMarkdown = require('md/introduction');
+const IntroMarkdownV1 = require('md/introduction');
const docSections = {
introduction: 'introduction',
@@ -32,8 +32,10 @@ const docsInfoConfig: DocsInfoConfig = {
web3Wrapper: [docSections.web3Wrapper],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ },
},
sectionNameToModulePath: {
[docSections.web3Wrapper]: ['"web3-wrapper/src/index"'],
diff --git a/packages/react-docs/CHANGELOG.json b/packages/react-docs/CHANGELOG.json
index c6ee9510c..1bb2da328 100644
--- a/packages/react-docs/CHANGELOG.json
+++ b/packages/react-docs/CHANGELOG.json
@@ -1,5 +1,32 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.0.17",
+ "changes": [
+ {
+ "note": "Nest MD files under versions so that you can update them for future versions",
+ "pr": 844
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.16",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.0.15",
"changes": [
diff --git a/packages/react-docs/CHANGELOG.md b/packages/react-docs/CHANGELOG.md
index c438a535a..3215c9fb7 100644
--- a/packages/react-docs/CHANGELOG.md
+++ b/packages/react-docs/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.0.16 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.0.15 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/react-docs/package.json b/packages/react-docs/package.json
index 5fe493457..c3853e6ba 100644
--- a/packages/react-docs/package.json
+++ b/packages/react-docs/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/react-docs",
- "version": "0.0.15",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -25,9 +25,9 @@
"url": "https://github.com/0xProject/0x-monorepo.git"
},
"devDependencies": {
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/compare-versions": "^3.0.0",
"copyfiles": "^1.2.0",
"make-promises-safe": "^1.1.0",
@@ -36,8 +36,8 @@
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/react-shared": "^0.2.2",
- "@0xproject/utils": "^0.7.2",
+ "@0xproject/react-shared": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"@types/lodash": "4.14.104",
"@types/material-ui": "0.18.0",
"@types/node": "^8.0.53",
@@ -52,7 +52,8 @@
"react-dom": "15.6.1",
"react-markdown": "^3.2.2",
"react-scroll": "^1.5.2",
- "react-tooltip": "^3.2.7"
+ "react-tooltip": "^3.2.7",
+ "semver": "5.5.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/react-docs/src/components/documentation.tsx b/packages/react-docs/src/components/documentation.tsx
index a4e6f4f6e..ff33220d2 100644
--- a/packages/react-docs/src/components/documentation.tsx
+++ b/packages/react-docs/src/components/documentation.tsx
@@ -12,6 +12,7 @@ import {
import * as _ from 'lodash';
import CircularProgress from 'material-ui/CircularProgress';
import * as React from 'react';
+import * as semver from 'semver';
import { DocsInfo } from '../docs_info';
import {
@@ -180,7 +181,20 @@ export class Documentation extends React.Component<DocumentationProps, Documenta
return renderedSections;
}
private _renderSection(typeDefinitionByName: TypeDefinitionByName, sectionName: string): React.ReactNode {
- const markdownFileIfExists = this.props.docsInfo.sectionNameToMarkdown[sectionName];
+ const markdownVersions = _.keys(this.props.docsInfo.sectionNameToMarkdownByVersion);
+ const eligibleVersions = _.filter(markdownVersions, mdVersion => {
+ return semver.lte(mdVersion, this.props.selectedVersion);
+ });
+ if (_.isEmpty(eligibleVersions)) {
+ throw new Error(
+ `No eligible markdown sections found for ${this.props.docsInfo.displayName} version ${
+ this.props.selectedVersion
+ }.`,
+ );
+ }
+ const sortedEligibleVersions = eligibleVersions.sort(semver.rcompare.bind(semver));
+ const closestVersion = sortedEligibleVersions[0];
+ const markdownFileIfExists = this.props.docsInfo.sectionNameToMarkdownByVersion[closestVersion][sectionName];
if (!_.isUndefined(markdownFileIfExists)) {
return (
<MarkdownSection
diff --git a/packages/react-docs/src/docs_info.ts b/packages/react-docs/src/docs_info.ts
index 6f4f39f00..b37942da6 100644
--- a/packages/react-docs/src/docs_info.ts
+++ b/packages/react-docs/src/docs_info.ts
@@ -9,6 +9,7 @@ import {
DocsInfoTypeConfigs,
DocsMenu,
DoxityDocObj,
+ SectionNameToMarkdownByVersion,
SectionsMap,
SupportedDocJson,
TypeDefinitionByName,
@@ -24,17 +25,17 @@ export class DocsInfo {
public packageUrl: string;
public menu: DocsMenu;
public sections: SectionsMap;
- public sectionNameToMarkdown: { [sectionName: string]: string };
+ public sectionNameToMarkdownByVersion: SectionNameToMarkdownByVersion;
public contractsByVersionByNetworkId?: ContractsByVersionByNetworkId;
public typeConfigs: DocsInfoTypeConfigs;
- private _docsInfo: DocsInfoConfig;
+ private readonly _docsInfo: DocsInfoConfig;
constructor(config: DocsInfoConfig) {
this.id = config.id;
this.type = config.type;
this.displayName = config.displayName;
this.packageUrl = config.packageUrl;
this.sections = config.sections;
- this.sectionNameToMarkdown = config.sectionNameToMarkdown;
+ this.sectionNameToMarkdownByVersion = config.sectionNameToMarkdownByVersion;
this.contractsByVersionByNetworkId = config.contractsByVersionByNetworkId;
this.typeConfigs = config.typeConfigs;
this._docsInfo = config;
diff --git a/packages/react-docs/src/types.ts b/packages/react-docs/src/types.ts
index f4e61edc9..cbc774c2e 100644
--- a/packages/react-docs/src/types.ts
+++ b/packages/react-docs/src/types.ts
@@ -1,3 +1,7 @@
+export interface SectionNameToMarkdownByVersion {
+ [version: string]: { [sectionName: string]: string };
+}
+
export interface DocsInfoConfig {
id: string;
type: SupportedDocJson;
@@ -5,7 +9,7 @@ export interface DocsInfoConfig {
packageUrl: string;
menu: DocsMenu;
sections: SectionsMap;
- sectionNameToMarkdown: { [sectionName: string]: string };
+ sectionNameToMarkdownByVersion: SectionNameToMarkdownByVersion;
visibleConstructors: string[];
sectionNameToModulePath?: { [sectionName: string]: string[] };
menuSubsectionToVersionWhenIntroduced?: { [sectionName: string]: string };
diff --git a/packages/react-docs/src/utils/doxity_utils.ts b/packages/react-docs/src/utils/doxity_utils.ts
index 374ee07dd..6815daa0c 100644
--- a/packages/react-docs/src/utils/doxity_utils.ts
+++ b/packages/react-docs/src/utils/doxity_utils.ts
@@ -31,8 +31,8 @@ export const doxityUtils = {
comment: doxityConstructor.details,
returnComment: doxityConstructor.return,
callPath: '',
- parameters: this._convertParameters(doxityConstructor.inputs),
- returnType: this._convertType(doxityContractObj.name),
+ parameters: doxityUtils._convertParameters(doxityConstructor.inputs),
+ returnType: doxityUtils._convertType(doxityContractObj.name),
};
constructors.push(constructor);
}
@@ -40,7 +40,7 @@ export const doxityUtils = {
const doxityMethods: DoxityAbiDoc[] = _.filter<DoxityAbiDoc>(
doxityContractObj.abiDocs,
(abiDoc: DoxityAbiDoc) => {
- return this._isMethod(abiDoc);
+ return doxityUtils._isMethod(abiDoc);
},
);
const methods: SolidityMethod[] = _.map<DoxityAbiDoc, SolidityMethod>(
@@ -52,10 +52,10 @@ export const doxityUtils = {
// no-op. It's already undefined
} else if (outputs.length === 1) {
const outputsType = outputs[0].type;
- returnTypeIfExists = this._convertType(outputsType);
+ returnTypeIfExists = doxityUtils._convertType(outputsType);
} else {
const outputsType = `[${_.map(outputs, output => output.type).join(', ')}]`;
- returnTypeIfExists = this._convertType(outputsType);
+ returnTypeIfExists = doxityUtils._convertType(outputsType);
}
// For ZRXToken, we want to convert it to zrxToken, rather then simply zRXToken
const callPath =
@@ -70,7 +70,7 @@ export const doxityUtils = {
comment: doxityMethod.details,
returnComment: doxityMethod.return,
callPath,
- parameters: this._convertParameters(doxityMethod.inputs),
+ parameters: doxityUtils._convertParameters(doxityMethod.inputs),
returnType: returnTypeIfExists,
};
return method;
@@ -80,7 +80,7 @@ export const doxityUtils = {
const doxityProperties: DoxityAbiDoc[] = _.filter<DoxityAbiDoc>(
doxityContractObj.abiDocs,
(abiDoc: DoxityAbiDoc) => {
- return this._isProperty(abiDoc);
+ return doxityUtils._isProperty(abiDoc);
},
);
const properties = _.map<DoxityAbiDoc, Property>(doxityProperties, (doxityProperty: DoxityAbiDoc) => {
@@ -92,7 +92,7 @@ export const doxityUtils = {
}
const property = {
name: doxityProperty.name,
- type: this._convertType(typeName),
+ type: doxityUtils._convertType(typeName),
comment: doxityProperty.details,
};
return property;
@@ -105,7 +105,7 @@ export const doxityUtils = {
const events = _.map(doxityEvents, doxityEvent => {
const event = {
name: doxityEvent.name,
- eventArgs: this._convertEventArgs(doxityEvent.inputs),
+ eventArgs: doxityUtils._convertEventArgs(doxityEvent.inputs),
};
return event;
});
@@ -129,7 +129,7 @@ export const doxityUtils = {
name: input.name,
comment: input.description,
isOptional: false,
- type: this._convertType(input.type),
+ type: doxityUtils._convertType(input.type),
};
return parameter;
});
@@ -167,7 +167,7 @@ export const doxityUtils = {
const eventArg = {
isIndexed: input.indexed,
name: input.name,
- type: this._convertType(input.type),
+ type: doxityUtils._convertType(input.type),
};
return eventArg;
});
diff --git a/packages/react-docs/src/utils/typedoc_utils.ts b/packages/react-docs/src/utils/typedoc_utils.ts
index 5633d9040..a6d938e94 100644
--- a/packages/react-docs/src/utils/typedoc_utils.ts
+++ b/packages/react-docs/src/utils/typedoc_utils.ts
@@ -235,7 +235,7 @@ export const typeDocUtils = {
childTypeIfExists = {
name: child.name,
typeDocType: TypeDocTypes.Reflection,
- method: this._convertMethod(child, isConstructor, sections, sectionName, docId),
+ method: typeDocUtils._convertMethod(child, isConstructor, sections, sectionName, docId),
};
}
const c: CustomTypeChild = {
diff --git a/packages/react-shared/CHANGELOG.json b/packages/react-shared/CHANGELOG.json
index f05207c0c..a1fc76193 100644
--- a/packages/react-shared/CHANGELOG.json
+++ b/packages/react-shared/CHANGELOG.json
@@ -1,5 +1,23 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.2.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.2.2",
"changes": [
diff --git a/packages/react-shared/CHANGELOG.md b/packages/react-shared/CHANGELOG.md
index 5b3b16f37..ceeb7a2e6 100644
--- a/packages/react-shared/CHANGELOG.md
+++ b/packages/react-shared/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.2.3 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.2.2 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/react-shared/package.json b/packages/react-shared/package.json
index 52c37d924..008972da9 100644
--- a/packages/react-shared/package.json
+++ b/packages/react-shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/react-shared",
- "version": "0.2.2",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -25,9 +25,9 @@
"url": "https://github.com/0xProject/0x-monorepo.git"
},
"devDependencies": {
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"copyfiles": "^1.2.0",
"make-promises-safe": "^1.1.0",
"shx": "^0.2.2",
diff --git a/packages/react-shared/src/components/nested_sidebar_menu.tsx b/packages/react-shared/src/components/nested_sidebar_menu.tsx
index 9b08e3c53..aa00d5985 100644
--- a/packages/react-shared/src/components/nested_sidebar_menu.tsx
+++ b/packages/react-shared/src/components/nested_sidebar_menu.tsx
@@ -41,7 +41,7 @@ const styles: Styles = {
export class NestedSidebarMenu extends React.Component<NestedSidebarMenuProps, NestedSidebarMenuState> {
public static defaultProps: Partial<NestedSidebarMenuProps> = {
shouldDisplaySectionHeaders: true,
- onMenuItemClick: _.noop,
+ onMenuItemClick: _.noop.bind(_),
};
public render(): React.ReactNode {
const navigation = _.map(this.props.topLevelMenu, (menuItems: string[], sectionName: string) => {
diff --git a/packages/sol-compiler/CHANGELOG.json b/packages/sol-compiler/CHANGELOG.json
index c96efcd89..762a26a90 100644
--- a/packages/sol-compiler/CHANGELOG.json
+++ b/packages/sol-compiler/CHANGELOG.json
@@ -1,5 +1,23 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.5.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.5.3",
"changes": [
diff --git a/packages/sol-compiler/CHANGELOG.md b/packages/sol-compiler/CHANGELOG.md
index 1a69a1c8e..2ee2931a6 100644
--- a/packages/sol-compiler/CHANGELOG.md
+++ b/packages/sol-compiler/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.5.4 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.5.3 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/sol-compiler/package.json b/packages/sol-compiler/package.json
index 8460420ad..99a49e1f2 100644
--- a/packages/sol-compiler/package.json
+++ b/packages/sol-compiler/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/sol-compiler",
- "version": "0.5.3",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -53,9 +53,9 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/sol-compiler/README.md",
"devDependencies": {
- "@0xproject/dev-utils": "^0.4.5",
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/dev-utils": "^1.0.0",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/mkdirp": "^0.5.2",
"@types/require-from-string": "^1.2.0",
"@types/semver": "^5.5.0",
@@ -68,7 +68,7 @@
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
"types-bn": "^0.0.1",
"typescript": "2.7.1",
@@ -76,21 +76,21 @@
"zeppelin-solidity": "1.8.0"
},
"dependencies": {
- "@0xproject/assert": "0.2.13",
- "@0xproject/json-schemas": "0.8.2",
- "@0xproject/sol-resolver": "^0.0.8",
- "@0xproject/types": "^0.8.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "@0xproject/assert": "^1.0.0",
+ "@0xproject/json-schemas": "^1.0.0-rc.1",
+ "@0xproject/sol-resolver": "^1.0.0",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"@types/yargs": "^11.0.0",
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"chalk": "^2.3.0",
"ethereumjs-util": "^5.1.1",
"lodash": "^4.17.4",
"mkdirp": "^0.5.1",
"require-from-string": "^2.0.1",
- "semver": "^5.5.0",
+ "semver": "5.5.0",
"solc": "^0.4.23",
"web3-eth-abi": "^1.0.0-beta.24",
"yargs": "^10.0.3"
diff --git a/packages/sol-compiler/src/compiler.ts b/packages/sol-compiler/src/compiler.ts
index e61c606be..3620a3ec1 100644
--- a/packages/sol-compiler/src/compiler.ts
+++ b/packages/sol-compiler/src/compiler.ts
@@ -58,13 +58,13 @@ const CONFIG_FILE = 'compiler.json';
* to artifact files.
*/
export class Compiler {
- private _resolver: Resolver;
- private _nameResolver: NameResolver;
- private _contractsDir: string;
- private _compilerSettings: solc.CompilerSettings;
- private _artifactsDir: string;
- private _solcVersionIfExists: string | undefined;
- private _specifiedContracts: string[] | TYPE_ALL_FILES_IDENTIFIER;
+ private readonly _resolver: Resolver;
+ private readonly _nameResolver: NameResolver;
+ private readonly _contractsDir: string;
+ private readonly _compilerSettings: solc.CompilerSettings;
+ private readonly _artifactsDir: string;
+ private readonly _solcVersionIfExists: string | undefined;
+ private readonly _specifiedContracts: string[] | TYPE_ALL_FILES_IDENTIFIER;
/**
* Instantiates a new instance of the Compiler class.
* @return An instance of the Compiler class.
diff --git a/packages/sol-compiler/test/compiler_test.ts b/packages/sol-compiler/test/compiler_test.ts
index ce359dceb..c9e141ee9 100644
--- a/packages/sol-compiler/test/compiler_test.ts
+++ b/packages/sol-compiler/test/compiler_test.ts
@@ -12,7 +12,7 @@ import { constants } from './util/constants';
const expect = chai.expect;
describe('#Compiler', function(): void {
- this.timeout(constants.timeoutMs);
+ this.timeout(constants.timeoutMs); // tslint:disable-line:no-invalid-this
const artifactsDir = `${__dirname}/fixtures/artifacts`;
const contractsDir = `${__dirname}/fixtures/contracts`;
const exchangeArtifactPath = `${artifactsDir}/Exchange.json`;
diff --git a/packages/sol-cov/CHANGELOG.json b/packages/sol-cov/CHANGELOG.json
index 8a622162f..6b7cdf6e9 100644
--- a/packages/sol-cov/CHANGELOG.json
+++ b/packages/sol-cov/CHANGELOG.json
@@ -1,13 +1,15 @@
[
{
- "version": "0.2.0",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
- "note": "Add artifact adapter as a parameter for CoverageSubprovider. Export AbstractArtifactAdapter",
+ "note":
+ "Add artifact adapter as a parameter for `CoverageSubprovider`. Export `AbstractArtifactAdapter`",
"pr": 589
},
{
- "note": "Implement SolCompilerArtifactAdapter and TruffleArtifactAdapter",
+ "note": "Implement `SolCompilerArtifactAdapter` and `TruffleArtifactAdapter`",
"pr": 589
},
{
@@ -19,7 +21,7 @@
"pr": 589
},
{
- "note": "Fixed a bug causing RegExp to crash if contract code is longer that 32767 characters",
+ "note": "Fixed a bug causing `RegExp` to crash if contract code is longer that 32767 characters",
"pr": 675
},
{
@@ -55,11 +57,12 @@
"pr": 675
},
{
- "note": "Fix solcVersion regex in parameter validation",
+ "note": "Fix `solcVersion` regex in parameter validation",
"pr": 690
},
{
- "note": "Fix a bug when in TruffleArtifactsAdapter causing it to throw if compiler.json is not there",
+ "note":
+ "Fix a bug when in `TruffleArtifactsAdapter` causing it to throw if `compiler.json` is not there",
"pr": 690
},
{
@@ -67,7 +70,7 @@
"pr": 690
},
{
- "note": "Create `RevertTraceSubprovider` which prints a stack trace when a REVERT is detected",
+ "note": "Create `RevertTraceSubprovider` which prints a stack trace when a `REVERT` is detected",
"pr": 705
},
{
@@ -77,6 +80,15 @@
]
},
{
+ "timestamp": 1531919263,
+ "version": "0.1.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.1.2",
"changes": [
diff --git a/packages/sol-cov/CHANGELOG.md b/packages/sol-cov/CHANGELOG.md
index 0ed77253e..d7621c23d 100644
--- a/packages/sol-cov/CHANGELOG.md
+++ b/packages/sol-cov/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.1.3 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.1.2 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/sol-cov/package.json b/packages/sol-cov/package.json
index 8553da7a4..86808bfc1 100644
--- a/packages/sol-cov/package.json
+++ b/packages/sol-cov/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/sol-cov",
- "version": "0.1.2",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -50,13 +50,13 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/sol-cov/README.md",
"dependencies": {
- "@0xproject/sol-compiler": "^0.5.3",
- "@0xproject/subproviders": "^0.10.5",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
- "@0xproject/dev-utils": "^0.4.5",
- "ethereum-types": "^0.0.2",
+ "@0xproject/sol-compiler": "^1.0.0",
+ "@0xproject/subproviders": "^1.0.0",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
+ "@0xproject/dev-utils": "^1.0.0",
+ "ethereum-types": "^1.0.0",
"ethereumjs-util": "^5.1.1",
"glob": "^7.1.2",
"istanbul": "^0.4.5",
@@ -68,8 +68,8 @@
"solidity-parser-antlr": "^0.2.12"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.1",
- "@0xproject/tslint-config": "^0.4.20",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/istanbul": "^0.4.30",
"@types/loglevel": "^1.5.3",
"@types/mkdirp": "^0.5.1",
@@ -86,7 +86,7 @@
"nyc": "^11.0.1",
"shx": "^0.2.2",
"sinon": "^4.0.0",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
"typescript": "2.7.1"
},
diff --git a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts
index 220a9f98c..8e03bf7fd 100644
--- a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts
+++ b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts
@@ -12,8 +12,8 @@ import { AbstractArtifactAdapter } from './abstract_artifact_adapter';
const CONFIG_FILE = 'compiler.json';
export class SolCompilerArtifactAdapter extends AbstractArtifactAdapter {
- private _artifactsPath: string;
- private _sourcesPath: string;
+ private readonly _artifactsPath: string;
+ private readonly _sourcesPath: string;
constructor(artifactsPath?: string, sourcesPath?: string) {
super();
const config: CompilerOptions = fs.existsSync(CONFIG_FILE)
diff --git a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts
index 53449e5e1..53b77aed5 100644
--- a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts
+++ b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts
@@ -7,8 +7,8 @@ import { AbstractArtifactAdapter } from './abstract_artifact_adapter';
import { SolCompilerArtifactAdapter } from './sol_compiler_artifact_adapter';
export class TruffleArtifactAdapter extends AbstractArtifactAdapter {
- private _solcVersion: string;
- private _sourcesPath: string;
+ private readonly _solcVersion: string;
+ private readonly _sourcesPath: string;
constructor(sourcesPath: string, solcVersion: string) {
super();
this._solcVersion = solcVersion;
diff --git a/packages/sol-cov/src/ast_visitor.ts b/packages/sol-cov/src/ast_visitor.ts
index a6bca4704..e55cdf6ec 100644
--- a/packages/sol-cov/src/ast_visitor.ts
+++ b/packages/sol-cov/src/ast_visitor.ts
@@ -18,15 +18,15 @@ enum BranchType {
export class ASTVisitor {
private _entryId = 0;
- private _fnMap: FnMap = {};
- private _branchMap: BranchMap = {};
- private _modifiersStatementIds: number[] = [];
- private _statementMap: StatementMap = {};
- private _locationByOffset: LocationByOffset;
- private _ignoreRangesBeginningAt: number[];
+ private readonly _fnMap: FnMap = {};
+ private readonly _branchMap: BranchMap = {};
+ private readonly _modifiersStatementIds: number[] = [];
+ private readonly _statementMap: StatementMap = {};
+ private readonly _locationByOffset: LocationByOffset;
+ private readonly _ignoreRangesBeginningAt: number[];
// keep track of contract/function ranges that are to be ignored
// so we can also ignore any children nodes within the contract/function
- private _ignoreRangesWithin: Array<[number, number]> = [];
+ private readonly _ignoreRangesWithin: Array<[number, number]> = [];
constructor(locationByOffset: LocationByOffset, ignoreRangesBeginningAt: number[] = []) {
this._locationByOffset = locationByOffset;
this._ignoreRangesBeginningAt = ignoreRangesBeginningAt;
diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts
index 45843bc96..9667e891c 100644
--- a/packages/sol-cov/src/coverage_subprovider.ts
+++ b/packages/sol-cov/src/coverage_subprovider.ts
@@ -23,7 +23,7 @@ import { utils } from './utils';
* It's used to compute your code coverage while running solidity tests.
*/
export class CoverageSubprovider extends TraceInfoSubprovider {
- private _coverageCollector: TraceCollector;
+ private readonly _coverageCollector: TraceCollector;
/**
* Instantiates a CoverageSubprovider instance
* @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.)
diff --git a/packages/sol-cov/src/get_source_range_snippet.ts b/packages/sol-cov/src/get_source_range_snippet.ts
index 30d6ec802..bea17beae 100644
--- a/packages/sol-cov/src/get_source_range_snippet.ts
+++ b/packages/sol-cov/src/get_source_range_snippet.ts
@@ -38,7 +38,7 @@ export function getSourceRangeSnippet(sourceRange: SourceRange, sourceCode: stri
// A visitor which collects ASTInfo for most nodes in the AST.
class ASTInfoVisitor {
- private _astInfos: ASTInfo[] = [];
+ private readonly _astInfos: ASTInfo[] = [];
public getASTInfoForRange(sourceRange: SourceRange): ASTInfo | null {
// HACK(albrow): Sometimes the source range doesn't exactly match that
// of astInfo. To work around that we try with a +/-1 offset on
diff --git a/packages/sol-cov/src/profiler_subprovider.ts b/packages/sol-cov/src/profiler_subprovider.ts
index 9f98da524..ae9351f17 100644
--- a/packages/sol-cov/src/profiler_subprovider.ts
+++ b/packages/sol-cov/src/profiler_subprovider.ts
@@ -12,7 +12,7 @@ import { utils } from './utils';
* ProfilerSubprovider is used to profile Solidity code while running tests.
*/
export class ProfilerSubprovider extends TraceInfoSubprovider {
- private _profilerCollector: TraceCollector;
+ private readonly _profilerCollector: TraceCollector;
/**
* Instantiates a ProfilerSubprovider instance
* @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.)
diff --git a/packages/sol-cov/src/revert_trace_subprovider.ts b/packages/sol-cov/src/revert_trace_subprovider.ts
index fed305bd3..6ccf59653 100644
--- a/packages/sol-cov/src/revert_trace_subprovider.ts
+++ b/packages/sol-cov/src/revert_trace_subprovider.ts
@@ -18,8 +18,8 @@ import { utils } from './utils';
export class RevertTraceSubprovider extends TraceCollectionSubprovider {
// Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise
private _contractsData!: ContractData[];
- private _artifactAdapter: AbstractArtifactAdapter;
- private _logger: Logger;
+ private readonly _artifactAdapter: AbstractArtifactAdapter;
+ private readonly _logger: Logger;
/**
* Instantiates a RevertTraceSubprovider instance
diff --git a/packages/sol-cov/src/trace_collection_subprovider.ts b/packages/sol-cov/src/trace_collection_subprovider.ts
index 9866472b9..b530b59db 100644
--- a/packages/sol-cov/src/trace_collection_subprovider.ts
+++ b/packages/sol-cov/src/trace_collection_subprovider.ts
@@ -32,10 +32,10 @@ export interface TraceCollectionSubproviderConfig {
export abstract class TraceCollectionSubprovider extends Subprovider {
protected _web3Wrapper!: Web3Wrapper;
// Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise
- private _lock = new Lock();
- private _defaultFromAddress: string;
+ private readonly _lock = new Lock();
+ private readonly _defaultFromAddress: string;
private _isEnabled = true;
- private _config: TraceCollectionSubproviderConfig;
+ private readonly _config: TraceCollectionSubproviderConfig;
/**
* Instantiates a TraceCollectionSubprovider instance
* @param defaultFromAddress default from address to use when sending transactions
diff --git a/packages/sol-cov/src/trace_collector.ts b/packages/sol-cov/src/trace_collector.ts
index 1b458edec..3e2ae3516 100644
--- a/packages/sol-cov/src/trace_collector.ts
+++ b/packages/sol-cov/src/trace_collector.ts
@@ -33,11 +33,11 @@ export type SingleFileSubtraceHandler = (
* TraceCollector is used by CoverageSubprovider to compute code coverage based on collected trace data.
*/
export class TraceCollector {
- private _artifactAdapter: AbstractArtifactAdapter;
- private _logger: Logger;
+ private readonly _artifactAdapter: AbstractArtifactAdapter;
+ private readonly _logger: Logger;
private _contractsData!: ContractData[];
- private _collector = new Collector();
- private _singleFileSubtraceHandler: SingleFileSubtraceHandler;
+ private readonly _collector = new Collector();
+ private readonly _singleFileSubtraceHandler: SingleFileSubtraceHandler;
/**
* Instantiates a TraceCollector instance
diff --git a/packages/sol-resolver/CHANGELOG.json b/packages/sol-resolver/CHANGELOG.json
index 1e39c1b39..0be30856e 100644
--- a/packages/sol-resolver/CHANGELOG.json
+++ b/packages/sol-resolver/CHANGELOG.json
@@ -1,6 +1,7 @@
[
{
- "version": "0.0.9",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
"note": "Fix a bug in FsResolver where it tries to read directories as files",
diff --git a/packages/sol-resolver/package.json b/packages/sol-resolver/package.json
index 715b19d0e..48721b612 100644
--- a/packages/sol-resolver/package.json
+++ b/packages/sol-resolver/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/sol-resolver",
- "version": "0.0.8",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -9,7 +9,7 @@
"types": "lib/index.d.ts",
"scripts": {
"watch_without_deps": "tsc -w",
- "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib scripts",
"lint": "tslint --project .",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
@@ -24,17 +24,17 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/resolver/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"copyfiles": "^1.2.0",
"make-promises-safe": "^1.1.0",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/types": "^0.8.2",
- "@0xproject/typescript-typings": "^0.0.3",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
"lodash": "^4.17.4"
},
"publishConfig": {
diff --git a/packages/sol-resolver/src/globals.d.ts b/packages/sol-resolver/src/globals.d.ts
new file mode 100644
index 000000000..e799b3529
--- /dev/null
+++ b/packages/sol-resolver/src/globals.d.ts
@@ -0,0 +1,7 @@
+// tslint:disable:completed-docs
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/sol-resolver/src/monorepo_scripts/postpublish.ts b/packages/sol-resolver/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/sol-resolver/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/sol-resolver/src/resolvers/fallthrough_resolver.ts b/packages/sol-resolver/src/resolvers/fallthrough_resolver.ts
index 8f6af9be0..338f334f4 100644
--- a/packages/sol-resolver/src/resolvers/fallthrough_resolver.ts
+++ b/packages/sol-resolver/src/resolvers/fallthrough_resolver.ts
@@ -5,7 +5,7 @@ import { ContractSource } from '../types';
import { Resolver } from './resolver';
export class FallthroughResolver extends Resolver {
- private _resolvers: Resolver[] = [];
+ private readonly _resolvers: Resolver[] = [];
public appendResolver(resolver: Resolver): void {
this._resolvers.push(resolver);
}
diff --git a/packages/sol-resolver/src/resolvers/name_resolver.ts b/packages/sol-resolver/src/resolvers/name_resolver.ts
index bcd98615f..d6ac6a499 100644
--- a/packages/sol-resolver/src/resolvers/name_resolver.ts
+++ b/packages/sol-resolver/src/resolvers/name_resolver.ts
@@ -8,7 +8,7 @@ import { EnumerableResolver } from './enumerable_resolver';
const SOLIDITY_FILE_EXTENSION = '.sol';
export class NameResolver extends EnumerableResolver {
- private _contractsDir: string;
+ private readonly _contractsDir: string;
constructor(contractsDir: string) {
super();
this._contractsDir = contractsDir;
diff --git a/packages/sol-resolver/src/resolvers/npm_resolver.ts b/packages/sol-resolver/src/resolvers/npm_resolver.ts
index 2c0a44aad..9f8617145 100644
--- a/packages/sol-resolver/src/resolvers/npm_resolver.ts
+++ b/packages/sol-resolver/src/resolvers/npm_resolver.ts
@@ -6,7 +6,7 @@ import { ContractSource } from '../types';
import { Resolver } from './resolver';
export class NPMResolver extends Resolver {
- private _packagePath: string;
+ private readonly _packagePath: string;
constructor(packagePath: string) {
super();
this._packagePath = packagePath;
diff --git a/packages/sol-resolver/src/resolvers/relative_fs_resolver.ts b/packages/sol-resolver/src/resolvers/relative_fs_resolver.ts
index 2317ede83..77103b8c1 100644
--- a/packages/sol-resolver/src/resolvers/relative_fs_resolver.ts
+++ b/packages/sol-resolver/src/resolvers/relative_fs_resolver.ts
@@ -6,7 +6,7 @@ import { ContractSource } from '../types';
import { Resolver } from './resolver';
export class RelativeFSResolver extends Resolver {
- private _contractsDir: string;
+ private readonly _contractsDir: string;
constructor(contractsDir: string) {
super();
this._contractsDir = contractsDir;
diff --git a/packages/sra-report/CHANGELOG.json b/packages/sra-report/CHANGELOG.json
index 1a90331c7..0867f0723 100644
--- a/packages/sra-report/CHANGELOG.json
+++ b/packages/sra-report/CHANGELOG.json
@@ -1,5 +1,23 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.1.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.1.5",
"changes": [
diff --git a/packages/sra-report/CHANGELOG.md b/packages/sra-report/CHANGELOG.md
index 8831789ac..5a7b20b43 100644
--- a/packages/sra-report/CHANGELOG.md
+++ b/packages/sra-report/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.1.6 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.1.5 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/sra-report/package.json b/packages/sra-report/package.json
index 29a2dcfcb..4c62627cb 100644
--- a/packages/sra-report/package.json
+++ b/packages/sra-report/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/sra-report",
- "version": "0.1.5",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -35,21 +35,21 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/sra-report/README.md",
"dependencies": {
- "@0xproject/assert": "^0.3.0",
+ "@0xproject/assert": "^1.0.0",
"@0xproject/types": "^0.8.2",
- "@0xproject/order-utils": "^0.0.8",
- "@0xproject/connect": "0.6.16",
- "@0xproject/json-schemas": "0.8.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
+ "@0xproject/order-utils": "^0.0.9",
+ "@0xproject/connect": "^1.0.0",
+ "@0xproject/json-schemas": "^0.8.3",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"chalk": "^2.3.0",
"lodash": "^4.17.4",
"newman": "^3.9.3",
"yargs": "^10.0.3"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.48",
"@types/nock": "^9.1.2",
@@ -65,7 +65,7 @@
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"publishConfig": {
diff --git a/packages/subproviders/CHANGELOG.json b/packages/subproviders/CHANGELOG.json
index 7a3f29fe0..c91358aad 100644
--- a/packages/subproviders/CHANGELOG.json
+++ b/packages/subproviders/CHANGELOG.json
@@ -1,12 +1,26 @@
[
{
- "version": "0.11.0",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
- "note": "Add `EthLightwalletSubprovider`"
+ "note": "Add `RpcSubprovider` with timeout",
+ "pr": 874
+ },
+ {
+ "note": "Add `EthLightwalletSubprovider`",
+ "pr": 775
}
- ],
- "timestamp": 1531149657
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.10.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
},
{
"timestamp": 1529397769,
diff --git a/packages/subproviders/CHANGELOG.md b/packages/subproviders/CHANGELOG.md
index 6fab0a4c4..c433721eb 100644
--- a/packages/subproviders/CHANGELOG.md
+++ b/packages/subproviders/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.10.6 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.10.5 - _July 9, 2018_
* Update web3-provider-engine to v14.0.6 including the leaked global.XMLHttpRequest bug fix
diff --git a/packages/subproviders/package.json b/packages/subproviders/package.json
index 796d87cf4..1aa5514a7 100644
--- a/packages/subproviders/package.json
+++ b/packages/subproviders/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/subproviders",
- "version": "0.10.5",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -40,14 +40,14 @@
}
},
"dependencies": {
- "@0xproject/assert": "^0.3.0",
- "@0xproject/types": "^1.0.0",
- "@0xproject/web3-wrapper": "^0.7.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
+ "@0xproject/assert": "^1.0.0",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/web3-wrapper": "^1.0.0",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"@ledgerhq/hw-app-eth": "^4.3.0",
"@ledgerhq/hw-transport-u2f": "^4.3.0",
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"bip39": "^2.5.0",
"bn.js": "^4.11.8",
"eth-lightwallet": "^3.0.1",
@@ -61,9 +61,9 @@
"web3-provider-engine": "14.0.6"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
- "@0xproject/utils": "^0.7.2",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"@types/bip39": "^2.4.0",
"@types/bn.js": "^4.11.0",
"@types/hdkey": "^0.7.0",
@@ -82,7 +82,7 @@
"nyc": "^11.0.1",
"shx": "^0.2.2",
"sinon": "^4.0.0",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
"typescript": "2.7.1",
"webpack": "^3.1.0"
diff --git a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts
index a9ebbb790..454dae58e 100644
--- a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts
+++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts
@@ -12,8 +12,8 @@ import { PrivateKeyWalletSubprovider } from './private_key_wallet';
* Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js
*/
export class EthLightwalletSubprovider extends BaseWalletSubprovider {
- private _keystore: lightwallet.keystore;
- private _pwDerivedKey: Uint8Array;
+ private readonly _keystore: lightwallet.keystore;
+ private readonly _pwDerivedKey: Uint8Array;
constructor(keystore: lightwallet.keystore, pwDerivedKey: Uint8Array) {
super();
this._keystore = keystore;
diff --git a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts
index d750505e7..bc1b34aba 100644
--- a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts
+++ b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts
@@ -14,7 +14,7 @@ import { Subprovider } from './subprovider';
* It intercepts the `eth_estimateGas` JSON RPC call and always returns a constant gas amount when queried.
*/
export class FakeGasEstimateSubprovider extends Subprovider {
- private _constantGasAmount: number;
+ private readonly _constantGasAmount: number;
/**
* Instantiates an instance of the FakeGasEstimateSubprovider
* @param constantGasAmount The constant gas amount you want returned
diff --git a/packages/subproviders/src/subproviders/ganache.ts b/packages/subproviders/src/subproviders/ganache.ts
index 79c43bc68..986094dba 100644
--- a/packages/subproviders/src/subproviders/ganache.ts
+++ b/packages/subproviders/src/subproviders/ganache.ts
@@ -10,7 +10,7 @@ import { Subprovider } from './subprovider';
* It intercepts all JSON RPC requests and relays them to an in-process ganache instance.
*/
export class GanacheSubprovider extends Subprovider {
- private _ganacheProvider: Provider;
+ private readonly _ganacheProvider: Provider;
/**
* Instantiates a GanacheSubprovider
* @param opts The desired opts with which to instantiate the Ganache provider
diff --git a/packages/subproviders/src/subproviders/ledger.ts b/packages/subproviders/src/subproviders/ledger.ts
index 8345be33c..6ad5de2e2 100644
--- a/packages/subproviders/src/subproviders/ledger.ts
+++ b/packages/subproviders/src/subproviders/ledger.ts
@@ -32,14 +32,14 @@ const DEFAULT_ADDRESS_SEARCH_LIMIT = 1000;
*/
export class LedgerSubprovider extends BaseWalletSubprovider {
// tslint:disable-next-line:no-unused-variable
- private _nonceLock = new Lock();
- private _connectionLock = new Lock();
- private _networkId: number;
+ private readonly _nonceLock = new Lock();
+ private readonly _connectionLock = new Lock();
+ private readonly _networkId: number;
private _baseDerivationPath: string;
- private _ledgerEthereumClientFactoryAsync: LedgerEthereumClientFactoryAsync;
+ private readonly _ledgerEthereumClientFactoryAsync: LedgerEthereumClientFactoryAsync;
private _ledgerClientIfExists?: LedgerEthereumClient;
- private _shouldAlwaysAskForConfirmation: boolean;
- private _addressSearchLimit: number;
+ private readonly _shouldAlwaysAskForConfirmation: boolean;
+ private readonly _addressSearchLimit: number;
/**
* Instantiates a LedgerSubprovider. Defaults to derivationPath set to `44'/60'/0'`.
* TestRPC/Ganache defaults to `m/44'/60'/0'/0`, so set this in the configs if desired.
diff --git a/packages/subproviders/src/subproviders/mnemonic_wallet.ts b/packages/subproviders/src/subproviders/mnemonic_wallet.ts
index 596300425..1495112b6 100644
--- a/packages/subproviders/src/subproviders/mnemonic_wallet.ts
+++ b/packages/subproviders/src/subproviders/mnemonic_wallet.ts
@@ -20,10 +20,10 @@ const DEFAULT_ADDRESS_SEARCH_LIMIT = 1000;
* all requests with accounts derived from the supplied mnemonic.
*/
export class MnemonicWalletSubprovider extends BaseWalletSubprovider {
- private _addressSearchLimit: number;
+ private readonly _addressSearchLimit: number;
private _baseDerivationPath: string;
private _derivedKeyInfo: DerivedHDKeyInfo;
- private _mnemonic: string;
+ private readonly _mnemonic: string;
/**
* Instantiates a MnemonicWalletSubprovider. Defaults to baseDerivationPath set to `44'/60'/0'/0`.
diff --git a/packages/subproviders/src/subproviders/nonce_tracker.ts b/packages/subproviders/src/subproviders/nonce_tracker.ts
index dcc421574..eea722aee 100644
--- a/packages/subproviders/src/subproviders/nonce_tracker.ts
+++ b/packages/subproviders/src/subproviders/nonce_tracker.ts
@@ -17,7 +17,7 @@ const NONCE_TOO_LOW_ERROR_MESSAGE = 'Transaction nonce is too low';
* We added the additional feature of clearing the cached nonce value when a `nonce value too low` error occurs.
*/
export class NonceTrackerSubprovider extends Subprovider {
- private _nonceCache: { [address: string]: string } = {};
+ private readonly _nonceCache: { [address: string]: string } = {};
private static _reconstructTransaction(payload: JSONRPCRequestPayload): EthereumTx {
const raw = payload.params[0];
if (_.isUndefined(raw)) {
diff --git a/packages/subproviders/src/subproviders/private_key_wallet.ts b/packages/subproviders/src/subproviders/private_key_wallet.ts
index b3f48fd90..9d6fc487e 100644
--- a/packages/subproviders/src/subproviders/private_key_wallet.ts
+++ b/packages/subproviders/src/subproviders/private_key_wallet.ts
@@ -13,8 +13,8 @@ import { BaseWalletSubprovider } from './base_wallet_subprovider';
* all requests with the supplied Ethereum private key.
*/
export class PrivateKeyWalletSubprovider extends BaseWalletSubprovider {
- private _address: string;
- private _privateKeyBuffer: Buffer;
+ private readonly _address: string;
+ private readonly _privateKeyBuffer: Buffer;
/**
* Instantiates a PrivateKeyWalletSubprovider.
* @param privateKey The corresponding private key to an Ethereum address
diff --git a/packages/subproviders/src/subproviders/redundant_subprovider.ts b/packages/subproviders/src/subproviders/redundant_subprovider.ts
index a60d6706e..7aa6226d5 100644
--- a/packages/subproviders/src/subproviders/redundant_subprovider.ts
+++ b/packages/subproviders/src/subproviders/redundant_subprovider.ts
@@ -12,7 +12,7 @@ import { Subprovider } from './subprovider';
* set of JSON RPC endpoints.
*/
export class RedundantSubprovider extends Subprovider {
- private _subproviders: Subprovider[];
+ private readonly _subproviders: Subprovider[];
private static async _firstSuccessAsync(
subproviders: Subprovider[],
payload: JSONRPCRequestPayload,
diff --git a/packages/subproviders/src/subproviders/rpc_subprovider.ts b/packages/subproviders/src/subproviders/rpc_subprovider.ts
index 3ad0e5325..d874c6f05 100644
--- a/packages/subproviders/src/subproviders/rpc_subprovider.ts
+++ b/packages/subproviders/src/subproviders/rpc_subprovider.ts
@@ -13,8 +13,8 @@ import { Subprovider } from './subprovider';
* It forwards on JSON RPC requests to the supplied `rpcUrl` endpoint
*/
export class RPCSubprovider extends Subprovider {
- private _rpcUrl: string;
- private _requestTimeoutMs: number;
+ private readonly _rpcUrl: string;
+ private readonly _requestTimeoutMs: number;
constructor(rpcUrl: string, requestTimeoutMs: number = 20000) {
super();
assert.isString('rpcUrl', rpcUrl);
diff --git a/packages/subproviders/src/subproviders/signer.ts b/packages/subproviders/src/subproviders/signer.ts
index f7329e00c..d5fd86897 100644
--- a/packages/subproviders/src/subproviders/signer.ts
+++ b/packages/subproviders/src/subproviders/signer.ts
@@ -12,7 +12,7 @@ import { Subprovider } from './subprovider';
* are passed onwards for subsequent subproviders to handle.
*/
export class SignerSubprovider extends Subprovider {
- private _web3Wrapper: Web3Wrapper;
+ private readonly _web3Wrapper: Web3Wrapper;
/**
* Instantiates a new SignerSubprovider
* @param provider Web3 provider that should handle all user account related requests
diff --git a/packages/subproviders/src/utils/wallet_utils.ts b/packages/subproviders/src/utils/wallet_utils.ts
index 3748077ef..4c233645b 100644
--- a/packages/subproviders/src/utils/wallet_utils.ts
+++ b/packages/subproviders/src/utils/wallet_utils.ts
@@ -6,8 +6,8 @@ import { DerivedHDKeyInfo } from '../types';
const DEFAULT_ADDRESS_SEARCH_LIMIT = 1000;
class DerivedHDKeyInfoIterator implements IterableIterator<DerivedHDKeyInfo> {
- private _parentDerivedKeyInfo: DerivedHDKeyInfo;
- private _searchLimit: number;
+ private readonly _parentDerivedKeyInfo: DerivedHDKeyInfo;
+ private readonly _searchLimit: number;
private _index: number;
constructor(initialDerivedKey: DerivedHDKeyInfo, searchLimit: number = DEFAULT_ADDRESS_SEARCH_LIMIT) {
diff --git a/packages/subproviders/test/integration/ledger_subprovider_test.ts b/packages/subproviders/test/integration/ledger_subprovider_test.ts
index 103e8f952..527ee5b22 100644
--- a/packages/subproviders/test/integration/ledger_subprovider_test.ts
+++ b/packages/subproviders/test/integration/ledger_subprovider_test.ts
@@ -176,7 +176,7 @@ describe('LedgerSubprovider', () => {
params: [tx],
id: 1,
};
- await promisify(defaultProvider.sendAsync, defaultProvider)(payload);
+ await promisify(defaultProvider.sendAsync.bind(defaultProvider))(payload);
// Send transaction from Ledger
tx = {
diff --git a/packages/subproviders/test/unit/ledger_subprovider_test.ts b/packages/subproviders/test/unit/ledger_subprovider_test.ts
index edff5144e..a1d146dbc 100644
--- a/packages/subproviders/test/unit/ledger_subprovider_test.ts
+++ b/packages/subproviders/test/unit/ledger_subprovider_test.ts
@@ -55,7 +55,7 @@ describe('LedgerSubprovider', () => {
return ecSignature;
},
transport: {
- close: _.noop,
+ close: _.noop.bind(_),
} as LedgerCommunicationClient,
};
// tslint:enable:no-object-literal-type-assertion
diff --git a/packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts b/packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts
index c437d0815..05f213cf5 100644
--- a/packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts
+++ b/packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts
@@ -60,9 +60,9 @@ describe('NonceTrackerSubprovider', () => {
const payload = { ...getTransactionCountPayload, params: ['0x0', 'pending'] };
- const response = await promisify<any>(provider.sendAsync, provider)(payload);
+ const response = await promisify<any>(provider.sendAsync.bind(provider))(payload);
expect(response.result).to.be.eq('0x00');
- const secondResponse = await promisify<any>(provider.sendAsync, provider)(payload);
+ const secondResponse = await promisify<any>(provider.sendAsync.bind(provider))(payload);
expect(secondResponse.result).to.be.eq('0x00');
});
it('does not cache the result for latest transaction count', async () => {
@@ -74,9 +74,9 @@ describe('NonceTrackerSubprovider', () => {
const payload = { ...getTransactionCountPayload, params: ['0x0', 'latest'] };
- const response = await promisify<any>(provider.sendAsync, provider)(payload);
+ const response = await promisify<any>(provider.sendAsync.bind(provider))(payload);
expect(response.result).to.be.eq('0x00');
- const secondResponse = await promisify<any>(provider.sendAsync, provider)(payload);
+ const secondResponse = await promisify<any>(provider.sendAsync.bind(provider))(payload);
expect(secondResponse.result).to.be.eq('0x99');
});
it('clears the cache on a Nonce Too Low Error', async () => {
@@ -103,14 +103,14 @@ describe('NonceTrackerSubprovider', () => {
params: [transaction.serialize()],
};
- const response = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const response = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(response.result).to.be.eq('0x00');
- const secondResponse = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const secondResponse = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(secondResponse.result).to.be.eq('0x00');
try {
- await promisify(provider.sendAsync, provider)(txPayload);
+ await promisify(provider.sendAsync.bind(provider))(txPayload);
} catch (err) {
- const thirdResponse = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const thirdResponse = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(thirdResponse.result).to.be.eq('0x99');
}
});
@@ -138,12 +138,12 @@ describe('NonceTrackerSubprovider', () => {
params: [transaction.serialize()],
};
- const response = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const response = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(response.result).to.be.eq('0x00');
- const secondResponse = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const secondResponse = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(secondResponse.result).to.be.eq('0x00');
- await promisify(provider.sendAsync, provider)(txPayload);
- const thirdResponse = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ await promisify(provider.sendAsync.bind(provider))(txPayload);
+ const thirdResponse = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(thirdResponse.result).to.be.eq('0x01');
});
});
diff --git a/packages/subproviders/tsconfig.json b/packages/subproviders/tsconfig.json
index 72dfee80b..e35816553 100644
--- a/packages/subproviders/tsconfig.json
+++ b/packages/subproviders/tsconfig.json
@@ -1,8 +1,7 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
- "outDir": "lib",
- "downlevelIteration": true
+ "outDir": "lib"
},
"include": ["./src/**/*", "./test/**/*"]
}
diff --git a/packages/testnet-faucets/package.json b/packages/testnet-faucets/package.json
index 442f488c9..7c3ae70cd 100644
--- a/packages/testnet-faucets/package.json
+++ b/packages/testnet-faucets/package.json
@@ -1,7 +1,7 @@
{
"private": true,
"name": "@0xproject/testnet-faucets",
- "version": "1.0.35",
+ "version": "1.0.36",
"engines": {
"node": ">=6.12"
},
@@ -18,11 +18,11 @@
"author": "Fabio Berger",
"license": "Apache-2.0",
"dependencies": {
- "0x.js": "0.38.4",
- "@0xproject/subproviders": "^0.10.5",
- "@0xproject/web3-wrapper": "^0.7.2",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
+ "0x.js": "0.38.5",
+ "@0xproject/subproviders": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
"body-parser": "^1.17.1",
"ethereumjs-tx": "^1.3.5",
"ethereumjs-util": "^5.1.1",
@@ -31,18 +31,18 @@
"rollbar": "^0.6.5"
},
"devDependencies": {
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/body-parser": "^1.16.1",
"@types/express": "^4.0.35",
"@types/lodash": "4.14.104",
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"awesome-typescript-loader": "^3.1.3",
"gulp": "^3.9.1",
"make-promises-safe": "^1.1.0",
"nodemon": "^1.11.0",
"shx": "^0.2.2",
"source-map-loader": "^0.1.6",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1",
"webpack": "^3.1.0",
"webpack-node-externals": "^1.6.0"
diff --git a/packages/testnet-faucets/src/ts/dispatch_queue.ts b/packages/testnet-faucets/src/ts/dispatch_queue.ts
index b1996a0c2..0a13df7c9 100644
--- a/packages/testnet-faucets/src/ts/dispatch_queue.ts
+++ b/packages/testnet-faucets/src/ts/dispatch_queue.ts
@@ -7,8 +7,8 @@ const MAX_QUEUE_SIZE = 500;
const DEFAULT_QUEUE_INTERVAL_MS = 1000;
export class DispatchQueue {
- private _queueIntervalMs: number;
- private _queue: Array<() => Promise<void>>;
+ private readonly _queueIntervalMs: number;
+ private readonly _queue: Array<() => Promise<void>>;
private _queueIntervalIdIfExists?: NodeJS.Timer;
constructor() {
this._queueIntervalMs = DEFAULT_QUEUE_INTERVAL_MS;
diff --git a/packages/testnet-faucets/src/ts/error_reporter.ts b/packages/testnet-faucets/src/ts/error_reporter.ts
index a0abcc07b..49c37b6eb 100644
--- a/packages/testnet-faucets/src/ts/error_reporter.ts
+++ b/packages/testnet-faucets/src/ts/error_reporter.ts
@@ -12,7 +12,7 @@ export const errorReporter = {
rollbar.handleUncaughtExceptions(configs.ROLLBAR_ACCESS_KEY);
process.on('unhandledRejection', async (err: Error) => {
logUtils.log(`Uncaught exception ${err}. Stack: ${err.stack}`);
- await this.reportAsync(err);
+ await errorReporter.reportAsync(err);
process.exit(1);
});
},
@@ -20,7 +20,7 @@ export const errorReporter = {
if (configs.ENVIRONMENT === 'development') {
return; // Do not log development environment errors
}
- return new Promise((resolve, reject) => {
+ return new Promise<any>((resolve, reject) => {
rollbar.handleError(err, req, (rollbarErr: Error) => {
if (rollbarErr) {
logUtils.log(`Error reporting to rollbar, ignoring: ${rollbarErr}`);
diff --git a/packages/testnet-faucets/src/ts/handler.ts b/packages/testnet-faucets/src/ts/handler.ts
index 0f61159fa..3749bc70b 100644
--- a/packages/testnet-faucets/src/ts/handler.ts
+++ b/packages/testnet-faucets/src/ts/handler.ts
@@ -37,7 +37,7 @@ enum RequestedAssetType {
const FIVE_DAYS_IN_MS = 4.32e8; // TODO: make this configurable
export class Handler {
- private _networkConfigByNetworkId: ItemByNetworkId<NetworkConfig> = {};
+ private readonly _networkConfigByNetworkId: ItemByNetworkId<NetworkConfig> = {};
private static _createProviderEngine(rpcUrl: string): Provider {
if (_.isUndefined(configs.DISPENSER_PRIVATE_KEY)) {
throw new Error('Dispenser Private key not found');
diff --git a/packages/testnet-faucets/src/ts/server.ts b/packages/testnet-faucets/src/ts/server.ts
index 5416cdcc3..f00562000 100644
--- a/packages/testnet-faucets/src/ts/server.ts
+++ b/packages/testnet-faucets/src/ts/server.ts
@@ -24,10 +24,26 @@ app.get('/ping', (req: express.Request, res: express.Response) => {
res.status(constants.SUCCESS_STATUS).send('pong');
});
app.get('/info', handler.getQueueInfo.bind(handler));
-app.get('/ether/:recipient', parameterTransformer.transform, handler.dispenseEther.bind(handler));
-app.get('/zrx/:recipient', parameterTransformer.transform, handler.dispenseZRX.bind(handler));
-app.get('/order/weth/:recipient', parameterTransformer.transform, handler.dispenseWETHOrderAsync.bind(handler));
-app.get('/order/zrx/:recipient', parameterTransformer.transform, handler.dispenseZRXOrderAsync.bind(handler));
+app.get(
+ '/ether/:recipient',
+ parameterTransformer.transform.bind(parameterTransformer),
+ handler.dispenseEther.bind(handler),
+);
+app.get(
+ '/zrx/:recipient',
+ parameterTransformer.transform.bind(parameterTransformer),
+ handler.dispenseZRX.bind(handler),
+);
+app.get(
+ '/order/weth/:recipient',
+ parameterTransformer.transform.bind(parameterTransformer),
+ handler.dispenseWETHOrderAsync.bind(handler),
+);
+app.get(
+ '/order/zrx/:recipient',
+ parameterTransformer.transform.bind(parameterTransformer),
+ handler.dispenseZRXOrderAsync.bind(handler),
+);
// Log to rollbar any errors unhandled by handlers
app.use(errorReporter.errorHandler());
diff --git a/packages/tslint-config/CHANGELOG.json b/packages/tslint-config/CHANGELOG.json
index f2a3456f4..fb879f169 100644
--- a/packages/tslint-config/CHANGELOG.json
+++ b/packages/tslint-config/CHANGELOG.json
@@ -1,5 +1,15 @@
[
{
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Added a bunch of rules",
+ "pr": 883
+ }
+ ]
+ },
+ {
"timestamp": 1531149657,
"version": "0.4.21",
"changes": [
diff --git a/packages/tslint-config/package.json b/packages/tslint-config/package.json
index 356499f6b..92c134f4b 100644
--- a/packages/tslint-config/package.json
+++ b/packages/tslint-config/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/tslint-config",
- "version": "0.4.21",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -34,7 +34,7 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/tslint-config/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
+ "@0xproject/monorepo-scripts": "^1.0.0",
"@types/lodash": "4.14.104",
"copyfiles": "^1.2.0",
"make-promises-safe": "^1.1.0",
@@ -43,7 +43,7 @@
},
"dependencies": {
"lodash": "^4.17.4",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"tslint-eslint-rules": "^4.1.1",
"tslint-react": "^3.2.0",
"tsutils": "2.22.2"
diff --git a/packages/tslint-config/rules/customNoMagicNumbersRule.ts b/packages/tslint-config/rules/customNoMagicNumbersRule.ts
index 0a565b2e6..cb124f738 100644
--- a/packages/tslint-config/rules/customNoMagicNumbersRule.ts
+++ b/packages/tslint-config/rules/customNoMagicNumbersRule.ts
@@ -29,6 +29,7 @@ export class Rule extends Lint.Rules.AbstractRule {
public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
const allowedNumbers = this.ruleArguments.length > 0 ? this.ruleArguments : Rule.DEFAULT_ALLOWED;
return this.applyWithWalker(
+ // tslint:disable-next-line:no-inferred-empty-object-type
new CustomNoMagicNumbersWalker(sourceFile, this.ruleName, new Set(allowedNumbers.map(String))),
);
}
diff --git a/packages/tslint-config/tslint.json b/packages/tslint-config/tslint.json
index 05efd158a..93403d36b 100644
--- a/packages/tslint-config/tslint.json
+++ b/packages/tslint-config/tslint.json
@@ -5,54 +5,82 @@
"arrow-parens": [true, "ban-single-arg-parens"],
"arrow-return-shorthand": true,
"async-suffix": true,
- "boolean-naming": true,
- "no-switch-case-fall-through": true,
- "switch-default": true,
"await-promise": true,
- "custom-no-magic-numbers": [true, 0, 1, 2, 3, -1],
"binary-expression-operand-order": true,
+ "boolean-naming": true,
"callable-types": true,
"class-name": true,
"completed-docs": [
true,
{
- "functions": { "visibilities": ["exported"] },
- "methods": { "locations": "instance", "privacies": ["public", "protected"] }
+ "functions": {
+ "visibilities": ["exported"]
+ },
+ "methods": {
+ "locations": "instance",
+ "privacies": ["public", "protected"]
+ }
}
],
"curly": true,
- "eofline": true,
- "typedef": [true, "call-signature", "parameter", "property-declaration"],
+ "custom-no-magic-numbers": [true, 0, 1, 2, 3, -1],
"encoding": true,
+ "eofline": true,
"import-spacing": true,
"indent": [true, "spaces", 4],
"interface-name": false,
"interface-over-type-literal": true,
+ "jsx-alignment": true,
+ "jsx-boolean-value": true,
+ "jsx-curly-spacing": [true, "never"],
+ "jsx-no-bind": false,
+ "jsx-no-lambda": true,
+ "jsx-no-multiline-js": false,
+ "jsx-no-string-ref": true,
+ "jsx-self-close": true,
+ "jsx-wrap-multiline": false,
"linebreak-style": [true, "LF"],
"max-classes-per-file": [true, 1],
- "max-line-length": false,
"max-file-line-count": [true, 500],
+ "max-line-length": false,
"member-access": true,
"member-ordering": [true, "public-before-private", "static-before-instance", "variables-before-functions"],
- "newline-before-return": false,
"new-parens": true,
+ "newline-before-return": false,
"no-angle-bracket-type-assertion": true,
"no-boolean-literal-compare": true,
+ "no-debugger": true,
"no-default-export": true,
+ "no-duplicate-super": true,
+ "no-duplicate-switch-case": true,
+ "no-duplicate-variable": true,
"no-empty-interface": false,
+ "no-eval": true,
"no-floating-promises": true,
+ "no-implicit-dependencies": [true, "dev"],
+ "no-inferred-empty-object-type": true,
+ "no-invalid-template-strings": true,
+ "no-invalid-this": true,
+ "no-misused-new": true,
"no-non-null-assertion": true,
"no-parameter-reassignment": true,
"no-redundant-jsdoc": true,
"no-return-await": true,
- "no-unused-variable": [true, "check-parameters"],
+ "no-shadowed-variable": true,
+ "no-sparse-arrays": true,
+ "no-string-literal": true,
"no-string-throw": true,
"no-submodule-imports": false,
+ "no-switch-case-fall-through": true,
+ "no-this-assignment": false,
+ "no-unbound-method": true,
+ "no-unnecessary-class": true,
"no-unnecessary-type-assertion": true,
- "no-implicit-dependencies": [true, "dev"],
+ "no-unsafe-finally": true,
+ "no-unused-variable": [true, "check-parameters"],
"number-literal-format": true,
- "object-literal-sort-keys": false,
"object-literal-key-quotes": false,
+ "object-literal-sort-keys": false,
"ordered-imports": [
true,
{
@@ -62,6 +90,8 @@
"prefer-const": true,
"prefer-for-of": true,
"prefer-function-over-method": true,
+ "prefer-object-spread": true,
+ "prefer-readonly": true,
"promise-function-async": true,
"quotemark": [true, "single", "avoid-escape", "jsx-double"],
"restrict-plus-operands": true,
@@ -70,14 +100,16 @@
true,
{
"anonymous": "never",
- "named": "never",
- "method": "never",
+ "asyncArrow": "always",
"constructor": "never",
- "asyncArrow": "always"
+ "method": "never",
+ "named": "never"
}
],
"space-within-parens": false,
+ "switch-default": true,
"type-literal-delimiter": true,
+ "typedef": [true, "call-signature", "parameter", "property-declaration"],
"underscore-private-and-protected": true,
"variable-name": [true, "ban-keywords", "allow-pascal-case"],
"whitespace": [
@@ -90,16 +122,7 @@
"check-type",
"check-typecast",
"check-preblock"
- ],
- "jsx-alignment": true,
- "jsx-boolean-value": true,
- "jsx-curly-spacing": [true, "never"],
- "jsx-no-lambda": true,
- "jsx-no-multiline-js": false,
- "jsx-no-string-ref": true,
- "jsx-self-close": true,
- "jsx-wrap-multiline": false,
- "jsx-no-bind": false
+ ]
},
"rulesDirectory": "lib/rules"
}
diff --git a/packages/types/CHANGELOG.json b/packages/types/CHANGELOG.json
index ea3b49c8a..6189acbbc 100644
--- a/packages/types/CHANGELOG.json
+++ b/packages/types/CHANGELOG.json
@@ -1,9 +1,10 @@
[
{
- "version": "1.0.0",
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
"changes": [
{
- "notes": "Updated types for V2 of 0x protocol"
+ "note": "Updated types for V2 of 0x protocol"
},
{
"note": "Add `ECSignatureBuffer`"
diff --git a/packages/types/package.json b/packages/types/package.json
index b5e09d42e..bd3417c44 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/types",
- "version": "1.0.0",
+ "version": "1.0.0-rc.1",
"engines": {
"node": ">=6.12"
},
@@ -24,18 +24,18 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/types/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"copyfiles": "^1.2.0",
"make-promises-safe": "^1.1.0",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
"@types/node": "^8.0.53",
"bignumber.js": "~4.1.0",
- "ethereum-types": "^0.0.2"
+ "ethereum-types": "^1.0.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/typescript-typings/CHANGELOG.json b/packages/typescript-typings/CHANGELOG.json
index 813da155e..5a64d0490 100644
--- a/packages/typescript-typings/CHANGELOG.json
+++ b/packages/typescript-typings/CHANGELOG.json
@@ -1,6 +1,7 @@
[
{
- "version": "0.4.2",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
"note": "Add types for `eth-lightwallet`",
@@ -21,14 +22,23 @@
]
},
{
+ "version": "0.4.3",
+ "changes": [
+ {
+ "note": "Add back ethers-contracts types for Aquaduct which relies on it",
+ "pr": 885
+ }
+ ],
+ "timestamp": 1531919263
+ },
+ {
"timestamp": 1529397769,
"version": "0.4.1",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "timestamp": 1531149657
+ ]
},
{
"timestamp": 1529397769,
diff --git a/packages/typescript-typings/CHANGELOG.md b/packages/typescript-typings/CHANGELOG.md
index 26d54716c..75ac8a531 100644
--- a/packages/typescript-typings/CHANGELOG.md
+++ b/packages/typescript-typings/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.4.3 - _July 18, 2018_
+
+ * Add back ethers-contracts types for Aquaduct which relies on it (#885)
+
## v0.4.2 - _July 9, 2018_
* Improve 'web3-provider-engine' typings (#768)
diff --git a/packages/typescript-typings/package.json b/packages/typescript-typings/package.json
index 6bd533676..8b7a640c9 100644
--- a/packages/typescript-typings/package.json
+++ b/packages/typescript-typings/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/typescript-typings",
- "version": "0.4.2",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -25,11 +25,11 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/typescript-typings#readme",
"dependencies": {
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"bignumber.js": "~4.1.0"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
+ "@0xproject/monorepo-scripts": "^1.0.0",
"copyfiles": "^1.2.0",
"shx": "^0.2.2"
},
diff --git a/packages/typescript-typings/types/ethereumjs-abi/index.d.ts b/packages/typescript-typings/types/ethereumjs-abi/index.d.ts
new file mode 100644
index 000000000..2d9fc9fcd
--- /dev/null
+++ b/packages/typescript-typings/types/ethereumjs-abi/index.d.ts
@@ -0,0 +1,7 @@
+declare module 'ethereumjs-abi' {
+ export function soliditySHA3(argTypes: string[], args: any[]): Buffer;
+ export function soliditySHA256(argTypes: string[], args: any[]): Buffer;
+ export function methodID(name: string, types: string[]): Buffer;
+ export function simpleEncode(signature: string, ...args: any[]): Buffer;
+ export function rawDecode(signature: string[], data: Buffer): any[];
+}
diff --git a/packages/typescript-typings/types/lerna-get-packages/index.d.ts b/packages/typescript-typings/types/lerna-get-packages/index.d.ts
deleted file mode 100644
index 0650a542c..000000000
--- a/packages/typescript-typings/types/lerna-get-packages/index.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-declare interface LernaPackage {
- location: string;
- package: {
- private?: boolean;
- version: string;
- name: string;
- main?: string;
- config?: {
- additionalTsTypings?: string[];
- };
- };
-}
-declare function lernaGetPackages(path: string): LernaPackage[];
-declare module 'lerna-get-packages' {
- export = lernaGetPackages;
-}
diff --git a/packages/utils/CHANGELOG.json b/packages/utils/CHANGELOG.json
index 0ac49952b..92149a7d4 100644
--- a/packages/utils/CHANGELOG.json
+++ b/packages/utils/CHANGELOG.json
@@ -1,5 +1,33 @@
[
{
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Add `AbortController` polyfill to `fetchAsync`",
+ "pr": 903
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Add `fetchAsync` which adds a default timeout to all requests",
+ "pr": 874
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.7.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"version": "0.7.2",
"changes": [
{
diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md
index e2464232c..d42979434 100644
--- a/packages/utils/CHANGELOG.md
+++ b/packages/utils/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.7.3 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.7.2 - _July 9, 2018_
* Added errorUtils.spawnSwitchErr
diff --git a/packages/utils/package.json b/packages/utils/package.json
index a454b35ee..382604fdd 100644
--- a/packages/utils/package.json
+++ b/packages/utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/utils",
- "version": "0.7.2",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -24,23 +24,24 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/utils/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"copyfiles": "^1.2.0",
"make-promises-safe": "^1.1.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/types": "^1.0.0",
- "@0xproject/typescript-typings": "^0.4.2",
+ "@0xproject/types": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
"@types/node": "^8.0.53",
+ "abortcontroller-polyfill": "^1.1.9",
"bignumber.js": "~4.1.0",
"detect-node": "2.0.3",
- "ethereum-types": "^0.0.2",
+ "ethereum-types": "^1.0.0",
"ethereumjs-util": "^5.1.1",
"ethers": "3.0.22",
"isomorphic-fetch": "^2.2.1",
diff --git a/packages/utils/src/abi_decoder.ts b/packages/utils/src/abi_decoder.ts
index b75387e3e..7f93e746e 100644
--- a/packages/utils/src/abi_decoder.ts
+++ b/packages/utils/src/abi_decoder.ts
@@ -16,7 +16,7 @@ import { addressUtils } from './address_utils';
import { BigNumber } from './configured_bignumber';
export class AbiDecoder {
- private _methodIds: { [signatureHash: string]: EventAbi } = {};
+ private readonly _methodIds: { [signatureHash: string]: EventAbi } = {};
constructor(abiArrays: AbiDefinition[][]) {
_.forEach(abiArrays, this.addABI.bind(this));
}
diff --git a/packages/utils/src/abi_utils.ts b/packages/utils/src/abi_utils.ts
index 413c2f481..421dd405c 100644
--- a/packages/utils/src/abi_utils.ts
+++ b/packages/utils/src/abi_utils.ts
@@ -6,7 +6,7 @@ export const abiUtils = {
if (param.type === 'tuple') {
// Parse out tuple types into {type_1, type_2, ..., type_N}
const tupleComponents = param.components;
- const paramString = _.map(tupleComponents, component => this.parseFunctionParam(component));
+ const paramString = _.map(tupleComponents, component => abiUtils.parseFunctionParam(component));
const tupleParamString = `{${paramString}}`;
return tupleParamString;
}
@@ -14,7 +14,7 @@ export const abiUtils = {
},
getFunctionSignature(methodAbi: MethodAbi): string {
const functionName = methodAbi.name;
- const parameterTypeList = _.map(methodAbi.inputs, (param: DataItem) => this.parseFunctionParam(param));
+ const parameterTypeList = _.map(methodAbi.inputs, (param: DataItem) => abiUtils.parseFunctionParam(param));
const functionSignature = `${functionName}(${parameterTypeList})`;
return functionSignature;
},
@@ -37,7 +37,7 @@ export const abiUtils = {
// Sort method Abis into alphabetical order, by function signature
const methodAbisOrdered = _.sortBy(methodAbis, [
(methodAbi: MethodAbi) => {
- const functionSignature = this.getFunctionSignature(methodAbi);
+ const functionSignature = abiUtils.getFunctionSignature(methodAbi);
return functionSignature;
},
]);
diff --git a/packages/utils/src/fetchAsync.ts b/packages/utils/src/fetchAsync.ts
index c02e5baba..b4c85718d 100644
--- a/packages/utils/src/fetchAsync.ts
+++ b/packages/utils/src/fetchAsync.ts
@@ -1,5 +1,8 @@
import isNode = require('detect-node');
import 'isomorphic-fetch';
+// WARNING: This needs to be imported after isomorphic-fetch: https://github.com/mo/abortcontroller-polyfill#using-it-on-browsers-without-fetch
+// tslint:disable-next-line:ordered-imports
+import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
export const fetchAsync = async (
endpoint: string,
diff --git a/packages/web3-wrapper/CHANGELOG.json b/packages/web3-wrapper/CHANGELOG.json
index 0b83ad13d..200836a82 100644
--- a/packages/web3-wrapper/CHANGELOG.json
+++ b/packages/web3-wrapper/CHANGELOG.json
@@ -1,6 +1,7 @@
[
{
- "version": "0.7.3",
+ "timestamp": 1532043000,
+ "version": "1.0.0",
"changes": [
{
"note": "Export `marshaller` utility file.",
@@ -9,6 +10,19 @@
{
"note": "Add `getNodeTypeAsync` method",
"pr": 812
+ },
+ {
+ "note": "Stop exporting uniqueVersionIds object",
+ "pr": 897
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.7.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
}
]
},
diff --git a/packages/web3-wrapper/CHANGELOG.md b/packages/web3-wrapper/CHANGELOG.md
index f6795100e..324e60643 100644
--- a/packages/web3-wrapper/CHANGELOG.md
+++ b/packages/web3-wrapper/CHANGELOG.md
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v0.7.3 - _July 18, 2018_
+
+ * Dependencies updated
+
## v0.7.2 - _July 9, 2018_
* Dependencies updated
diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json
index 9716be5bf..d9c577ea9 100644
--- a/packages/web3-wrapper/package.json
+++ b/packages/web3-wrapper/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/web3-wrapper",
- "version": "0.7.2",
+ "version": "1.0.0",
"engines": {
"node": ">=6.12"
},
@@ -45,8 +45,8 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/web3-wrapper/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.2.2",
- "@0xproject/tslint-config": "^0.4.21",
+ "@0xproject/monorepo-scripts": "^1.0.0",
+ "@0xproject/tslint-config": "^1.0.0",
"@types/lodash": "4.14.104",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
@@ -59,16 +59,16 @@
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
"typescript": "2.7.1"
},
"dependencies": {
- "@0xproject/assert": "0.3.0",
- "@0xproject/json-schemas": "^1.0.0",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "ethereum-types": "^0.0.2",
+ "@0xproject/assert": "^1.0.0",
+ "@0xproject/json-schemas": "^1.0.0-rc.1",
+ "@0xproject/typescript-typings": "^1.0.0",
+ "@0xproject/utils": "^1.0.0",
+ "ethereum-types": "^1.0.0",
"ethereumjs-util": "^5.1.1",
"ethers": "3.0.22",
"lodash": "^4.17.4"
diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts
index 19fe0836c..4433b4b54 100644
--- a/packages/web3-wrapper/src/index.ts
+++ b/packages/web3-wrapper/src/index.ts
@@ -1,3 +1,3 @@
-export { Web3Wrapper, uniqueVersionIds, NodeType } from './web3_wrapper';
-export { Web3WrapperErrors } from './types';
+export { Web3Wrapper } from './web3_wrapper';
+export { Web3WrapperErrors, NodeType } from './types';
export { marshaller } from './marshaller';
diff --git a/packages/web3-wrapper/src/marshaller.ts b/packages/web3-wrapper/src/marshaller.ts
index 15384417e..fed197822 100644
--- a/packages/web3-wrapper/src/marshaller.ts
+++ b/packages/web3-wrapper/src/marshaller.ts
@@ -54,7 +54,7 @@ export const marshaller = {
transactions: [] as Transaction[],
};
block.transactions = _.map(blockWithHexValues.transactions, (tx: TransactionRPC) => {
- const transaction = this.unmarshalTransaction(tx);
+ const transaction = marshaller.unmarshalTransaction(tx);
return transaction;
});
return block;
@@ -94,10 +94,10 @@ export const marshaller = {
...txData,
};
delete callTxDataBase.from;
- const callTxDataBaseRPC = this._marshalCallTxDataBase(callTxDataBase);
+ const callTxDataBaseRPC = marshaller._marshalCallTxDataBase(callTxDataBase);
const txDataRPC = {
...callTxDataBaseRPC,
- from: this.marshalAddress(txData.from),
+ from: marshaller.marshalAddress(txData.from),
};
const prunableIfUndefined = ['gasPrice', 'gas', 'value', 'nonce'];
_.each(txDataRPC, (value: any, key: string) => {
@@ -112,10 +112,10 @@ export const marshaller = {
...callData,
};
delete callTxDataBase.from;
- const callTxDataBaseRPC = this._marshalCallTxDataBase(callTxDataBase);
+ const callTxDataBaseRPC = marshaller._marshalCallTxDataBase(callTxDataBase);
const callDataRPC = {
...callTxDataBaseRPC,
- from: _.isUndefined(callData.from) ? undefined : this.marshalAddress(callData.from),
+ from: _.isUndefined(callData.from) ? undefined : marshaller.marshalAddress(callData.from),
};
return callDataRPC;
},
@@ -144,7 +144,7 @@ export const marshaller = {
_marshalCallTxDataBase(callTxDataBase: Partial<CallTxDataBase>): Partial<CallTxDataBaseRPC> {
const callTxDataBaseRPC = {
...callTxDataBase,
- to: _.isUndefined(callTxDataBase.to) ? undefined : this.marshalAddress(callTxDataBase.to),
+ to: _.isUndefined(callTxDataBase.to) ? undefined : marshaller.marshalAddress(callTxDataBase.to),
gasPrice: _.isUndefined(callTxDataBase.gasPrice)
? undefined
: utils.encodeAmountAsHexString(callTxDataBase.gasPrice),
diff --git a/packages/web3-wrapper/src/types.ts b/packages/web3-wrapper/src/types.ts
index b7b6bd68a..e81039186 100644
--- a/packages/web3-wrapper/src/types.ts
+++ b/packages/web3-wrapper/src/types.ts
@@ -57,3 +57,9 @@ export interface TxDataRPC extends CallTxDataBaseRPC {
export interface CallDataRPC extends CallTxDataBaseRPC {
from?: string;
}
+
+// NodeType represents the type of the backing Ethereum node.
+export enum NodeType {
+ Geth = 'GETH',
+ Ganache = 'GANACHE',
+}
diff --git a/packages/web3-wrapper/src/utils.ts b/packages/web3-wrapper/src/utils.ts
index d13eb9404..01605dc9a 100644
--- a/packages/web3-wrapper/src/utils.ts
+++ b/packages/web3-wrapper/src/utils.ts
@@ -15,7 +15,7 @@ export const utils = {
if (_.isNull(hex)) {
return null;
}
- const decimal = this.convertHexToNumber(hex);
+ const decimal = utils.convertHexToNumber(hex);
return decimal;
},
convertAmountToBigNumber(value: string | number | BigNumber): BigNumber {
@@ -40,7 +40,7 @@ export const utils = {
return valueBigNumber.lessThan(0) ? '-0x' + valueHex.substr(1) : '0x' + valueHex;
},
numberToHex(value: number): string {
- if (!isFinite(value) && !this.isHexStrict(value)) {
+ if (!isFinite(value) && !utils.isHexStrict(value)) {
throw new Error(`Given input ${value} is not a number.`);
}
diff --git a/packages/web3-wrapper/src/web3_wrapper.ts b/packages/web3-wrapper/src/web3_wrapper.ts
index 495523e44..883a99bb4 100644
--- a/packages/web3-wrapper/src/web3_wrapper.ts
+++ b/packages/web3-wrapper/src/web3_wrapper.ts
@@ -22,24 +22,18 @@ import {
import * as _ from 'lodash';
import { marshaller } from './marshaller';
-import { BlockWithoutTransactionDataRPC, BlockWithTransactionDataRPC, Web3WrapperErrors } from './types';
+import { BlockWithoutTransactionDataRPC, BlockWithTransactionDataRPC, NodeType, Web3WrapperErrors } from './types';
import { utils } from './utils';
const BASE_TEN = 10;
// These are unique identifiers contained in the response of the
// web3_clientVersion call.
-export const uniqueVersionIds = {
+const uniqueVersionIds = {
geth: 'Geth',
ganache: 'EthereumJS TestRPC',
};
-// NodeType represents the type of the backing Ethereum node.
-export enum NodeType {
- Geth = 'GETH',
- Ganache = 'GANACHE',
-}
-
/**
* An alternative to the Web3.js library that provides a consistent, clean, promise-based interface.
*/
@@ -50,7 +44,7 @@ export class Web3Wrapper {
public isZeroExWeb3Wrapper = true;
public abiDecoder: AbiDecoder;
private _provider: Provider;
- private _txDefaults: Partial<TxData>;
+ private readonly _txDefaults: Partial<TxData>;
private _jsonRpcRequestId: number;
/**
* Check if an address is a valid Ethereum address
@@ -298,7 +292,6 @@ export class Web3Wrapper {
*/
public async signMessageAsync(address: string, message: string): Promise<string> {
assert.isETHAddressHex('address', address);
- assert.isETHAddressHex('address', address);
assert.isString('message', message); // TODO: Should this be stricter? Hex string?
const signData = await this._sendRawPayloadAsync<string>({
method: 'eth_sign',
diff --git a/packages/website/md/docs/0xjs/async.md b/packages/website/md/docs/0xjs/1.0.0/async.md
index 8abaef331..8abaef331 100644
--- a/packages/website/md/docs/0xjs/async.md
+++ b/packages/website/md/docs/0xjs/1.0.0/async.md
diff --git a/packages/website/md/docs/0xjs/errors.md b/packages/website/md/docs/0xjs/1.0.0/errors.md
index e97973ccf..e97973ccf 100644
--- a/packages/website/md/docs/0xjs/errors.md
+++ b/packages/website/md/docs/0xjs/1.0.0/errors.md
diff --git a/packages/website/md/docs/0xjs/installation.md b/packages/website/md/docs/0xjs/1.0.0/installation.md
index ac0a47699..ac0a47699 100644
--- a/packages/website/md/docs/0xjs/installation.md
+++ b/packages/website/md/docs/0xjs/1.0.0/installation.md
diff --git a/packages/website/md/docs/0xjs/introduction.md b/packages/website/md/docs/0xjs/1.0.0/introduction.md
index 008376d33..008376d33 100644
--- a/packages/website/md/docs/0xjs/introduction.md
+++ b/packages/website/md/docs/0xjs/1.0.0/introduction.md
diff --git a/packages/website/md/docs/0xjs/versioning.md b/packages/website/md/docs/0xjs/1.0.0/versioning.md
index 6bcaa5b4d..6bcaa5b4d 100644
--- a/packages/website/md/docs/0xjs/versioning.md
+++ b/packages/website/md/docs/0xjs/1.0.0/versioning.md
diff --git a/packages/website/md/docs/0xjs/2.0.0/introduction.md b/packages/website/md/docs/0xjs/2.0.0/introduction.md
new file mode 100644
index 000000000..b98aeef38
--- /dev/null
+++ b/packages/website/md/docs/0xjs/2.0.0/introduction.md
@@ -0,0 +1,3 @@
+<b>**NOTE:** Release candidate versions are meant to work with V2 of 0x protocol. To interact with V1, select a 0.X version.</b>
+
+Welcome to the [0x.js](https://github.com/0xProject/0x-monorepo) documentation! 0x.js is a Javascript library for interacting with the 0x protocol. With it, you can easily make calls to the 0x smart contracts as well as any token adhering to the token standards supported by the protocol (currently ERC20 & ERC721). Functionality includes generating, signing, filling and cancelling orders, verifying an orders signature, setting or checking a users ERC20/ERC721 token balance/allowance and much more.
diff --git a/packages/website/md/docs/0xjs/2.0.0/versioning.md b/packages/website/md/docs/0xjs/2.0.0/versioning.md
new file mode 100644
index 000000000..7f2b6fee9
--- /dev/null
+++ b/packages/website/md/docs/0xjs/2.0.0/versioning.md
@@ -0,0 +1 @@
+Since v1.0.0, this package adheres to the [Semantic Versioning 2.0.0](http://semver.org/) specification. The library's public interface includes all the methods, properties and types included in the documentation. We will publish with a major version bump for any breaking change to the public interface, use a minor version bump when introducing new features in a backwards-compatible way, and patch versions when introducing backwards-compatible bug fixes. Because of this, we recommend you import `0x.js` with a caret `^2.0.0` to take advantage of non-breaking bug fixes.
diff --git a/packages/website/md/docs/connect/installation.md b/packages/website/md/docs/connect/1.0.0/installation.md
index 950bf92ca..950bf92ca 100644
--- a/packages/website/md/docs/connect/installation.md
+++ b/packages/website/md/docs/connect/1.0.0/installation.md
diff --git a/packages/website/md/docs/connect/introduction.md b/packages/website/md/docs/connect/1.0.0/introduction.md
index 4e3039442..4e3039442 100644
--- a/packages/website/md/docs/connect/introduction.md
+++ b/packages/website/md/docs/connect/1.0.0/introduction.md
diff --git a/packages/website/md/docs/json_schemas/installation.md b/packages/website/md/docs/json_schemas/1.0.0/installation.md
index 50a37bae1..50a37bae1 100644
--- a/packages/website/md/docs/json_schemas/installation.md
+++ b/packages/website/md/docs/json_schemas/1.0.0/installation.md
diff --git a/packages/website/md/docs/json_schemas/introduction.md b/packages/website/md/docs/json_schemas/1.0.0/introduction.md
index a27f4b521..cc777b1a8 100644
--- a/packages/website/md/docs/json_schemas/introduction.md
+++ b/packages/website/md/docs/json_schemas/1.0.0/introduction.md
@@ -1,3 +1,5 @@
+<b>**NOTE:** Release candidate versions are meant to work with V2 of 0x protocol. To interact with V1, select a 0.X version.</b>
+
Welcome to the [@0xproject/json-schemas](https://github.com/0xProject/0x-monorepo/tree/development/packages/json-schemas) documentation! This package provides JSON schemas for validating 0x Protocol & Standard Relayer API data structures. It provides both the raw JSON schemas and a schema validator class to interact with them from a JS project.
If you are not using a Javascript-based language for your project, you can copy-paste the JSON schemas within this package and use them together with a [JSON Schema](http://json-schema.org/) implementation in your [language of choice](http://json-schema.org/implementations.html) (e.g Python, Haskell, Go, C, C++, Rust, Ruby, Scala, etc...).
diff --git a/packages/website/md/docs/json_schemas/schemas.md b/packages/website/md/docs/json_schemas/1.0.0/schemas.md
index fcf5d8df6..fcf5d8df6 100644
--- a/packages/website/md/docs/json_schemas/schemas.md
+++ b/packages/website/md/docs/json_schemas/1.0.0/schemas.md
diff --git a/packages/website/md/docs/json_schemas/usage.md b/packages/website/md/docs/json_schemas/1.0.0/usage.md
index 68b801153..68b801153 100644
--- a/packages/website/md/docs/json_schemas/usage.md
+++ b/packages/website/md/docs/json_schemas/1.0.0/usage.md
diff --git a/packages/website/md/docs/order_utils/installation.md b/packages/website/md/docs/order_utils/1.0.0/installation.md
index 68a7cf960..68a7cf960 100644
--- a/packages/website/md/docs/order_utils/installation.md
+++ b/packages/website/md/docs/order_utils/1.0.0/installation.md
diff --git a/packages/website/md/docs/order_utils/introduction.md b/packages/website/md/docs/order_utils/1.0.0/introduction.md
index d5f3f2925..d5f3f2925 100644
--- a/packages/website/md/docs/order_utils/introduction.md
+++ b/packages/website/md/docs/order_utils/1.0.0/introduction.md
diff --git a/packages/website/md/docs/smart_contracts/introduction.md b/packages/website/md/docs/smart_contracts/1.0.0/introduction.md
index 566a573b6..566a573b6 100644
--- a/packages/website/md/docs/smart_contracts/introduction.md
+++ b/packages/website/md/docs/smart_contracts/1.0.0/introduction.md
diff --git a/packages/website/md/docs/sol_cov/usage.md b/packages/website/md/docs/sol_cov/usage.md
index 433cfad96..c747005fb 100644
--- a/packages/website/md/docs/sol_cov/usage.md
+++ b/packages/website/md/docs/sol_cov/usage.md
@@ -8,7 +8,7 @@ In order to use `CoverageSubprovider` with your favorite framework you need to p
### Sol-compiler
-If you are generating your artifacts with [@0xproject/sol-compiler](LINK) you can use the `SolCompilerArtifactsAdapter` we've implemented for you.
+If you are generating your artifacts with [@0xproject/sol-compiler](https://0xproject.com/docs/sol-compiler) you can use the `SolCompilerArtifactsAdapter` we've implemented for you.
```typescript
import { SolCompilerArtifactsAdapter } from '@0xproject/sol-cov';
@@ -19,7 +19,7 @@ const artifactsAdapter = new SolCompilerArtifactsAdapter(artifactsPath, contract
### Truffle
-If your project is using [Truffle](LINK), we've written a `TruffleArtifactsAdapter`for you.
+If your project is using [Truffle](https://truffleframework.com/), we've written a `TruffleArtifactsAdapter`for you.
```typescript
import { TruffleArtifactAdapter } from '@0xproject/sol-cov';
diff --git a/packages/website/package.json b/packages/website/package.json
index ef314ba2d..99fd7cff3 100644
--- a/packages/website/package.json
+++ b/packages/website/package.json
@@ -1,13 +1,13 @@
{
"name": "@0xproject/website",
- "version": "0.0.38",
+ "version": "0.0.39",
"engines": {
"node": ">=6.12"
},
"private": true,
"description": "Website and 0x portal dapp",
"scripts": {
- "build": "NODE_ENV=production webpack; exit 0;",
+ "build": "NODE_ENV=production node --max_old_space_size=8192 ../../node_modules/.bin/webpack; exit 0;",
"clean": "shx rm -f public/bundle*",
"lint": "tslint --project . 'ts/**/*.ts' 'ts/**/*.tsx'",
"watch_without_deps": "webpack-dev-server --content-base public --https",
@@ -22,14 +22,14 @@
"license": "Apache-2.0",
"dependencies": {
"@0xproject/contract-wrappers": "^0.0.5",
- "@0xproject/order-utils": "^0.0.8",
- "@0xproject/react-docs": "^0.0.15",
- "@0xproject/react-shared": "^0.2.2",
- "@0xproject/subproviders": "^0.10.5",
+ "@0xproject/order-utils": "^0.0.9",
+ "@0xproject/react-docs": "^1.0.0",
+ "@0xproject/react-shared": "^0.2.3",
+ "@0xproject/subproviders": "^1.0.0",
"@0xproject/types": "^0.8.1",
- "@0xproject/typescript-typings": "^0.4.2",
- "@0xproject/utils": "^0.7.2",
- "@0xproject/web3-wrapper": "^0.7.2",
+ "@0xproject/typescript-typings": "^0.4.3",
+ "@0xproject/utils": "^1.0.0",
+ "@0xproject/web3-wrapper": "^1.0.0",
"accounting": "^0.4.1",
"basscss": "^8.0.3",
"blockies": "^0.0.2",
@@ -97,7 +97,7 @@
"shx": "^0.2.2",
"source-map-loader": "^0.1.6",
"style-loader": "0.13.x",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"tslint-config-0xproject": "^0.0.2",
"typescript": "2.7.1",
"uglifyjs-webpack-plugin": "^1.2.5",
diff --git a/packages/website/ts/blockchain.ts b/packages/website/ts/blockchain.ts
index e8168d975..45994be5f 100644
--- a/packages/website/ts/blockchain.ts
+++ b/packages/website/ts/blockchain.ts
@@ -35,7 +35,7 @@ import * as moment from 'moment';
import * as React from 'react';
import contract = require('truffle-contract');
import { BlockchainWatcher } from 'ts/blockchain_watcher';
-import { TokenSendCompleted } from 'ts/components/flash_messages/token_send_completed';
+import { AssetSendCompleted } from 'ts/components/flash_messages/asset_send_completed';
import { TransactionSubmitted } from 'ts/components/flash_messages/transaction_submitted';
import { trackedTokenStorage } from 'ts/local_storage/tracked_token_storage';
import { tradeHistoryStorage } from 'ts/local_storage/trade_history_storage';
@@ -83,11 +83,11 @@ export class Blockchain {
public networkId: number;
public nodeVersion: string;
private _contractWrappers: ContractWrappers;
- private _dispatcher: Dispatcher;
+ private readonly _dispatcher: Dispatcher;
private _web3Wrapper?: Web3Wrapper;
private _blockchainWatcher?: BlockchainWatcher;
private _injectedProviderObservable?: InjectedProviderObservable;
- private _injectedProviderUpdateHandler: (update: InjectedProviderUpdate) => Promise<void>;
+ private readonly _injectedProviderUpdateHandler: (update: InjectedProviderUpdate) => Promise<void>;
private _userAddressIfExists: string;
private _ledgerSubprovider: LedgerSubprovider;
private _defaultGasPrice: BigNumber;
@@ -125,7 +125,11 @@ export class Blockchain {
let networkIdIfExists: number;
if (!_.isUndefined(injectedWeb3IfExists)) {
try {
- networkIdIfExists = _.parseInt(await promisify<string>(injectedWeb3IfExists.version.getNetwork)());
+ networkIdIfExists = _.parseInt(
+ await promisify<string>(
+ injectedWeb3IfExists.version.getNetwork.bind(injectedWeb3IfExists.version),
+ )(),
+ );
} catch (err) {
// Ignore error and proceed with networkId undefined
}
@@ -272,6 +276,32 @@ export class Blockchain {
);
await this._showEtherScanLinkAndAwaitTransactionMinedAsync(txHash);
}
+ public async sendAsync(toAddress: string, amountInBaseUnits: BigNumber): Promise<void> {
+ utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
+ const transaction = {
+ from: this._userAddressIfExists,
+ to: toAddress,
+ value: amountInBaseUnits,
+ gasPrice: this._defaultGasPrice,
+ };
+ this._showFlashMessageIfLedger();
+ const txHash = await this._web3Wrapper.sendTransactionAsync(transaction);
+ await this._showEtherScanLinkAndAwaitTransactionMinedAsync(txHash);
+ const etherScanLinkIfExists = sharedUtils.getEtherScanLinkIfExists(
+ txHash,
+ this.networkId,
+ EtherscanLinkSuffixes.Tx,
+ );
+ this._dispatcher.showFlashMessage(
+ React.createElement(AssetSendCompleted, {
+ etherScanLinkIfExists,
+ toAddress,
+ amountInBaseUnits,
+ decimals: constants.DECIMAL_PLACES_ETH,
+ symbol: constants.ETHER_SYMBOL,
+ }),
+ );
+ }
public async transferAsync(token: Token, toAddress: string, amountInBaseUnits: BigNumber): Promise<void> {
utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
@@ -293,11 +323,12 @@ export class Blockchain {
EtherscanLinkSuffixes.Tx,
);
this._dispatcher.showFlashMessage(
- React.createElement(TokenSendCompleted, {
+ React.createElement(AssetSendCompleted, {
etherScanLinkIfExists,
- token,
toAddress,
amountInBaseUnits,
+ decimals: token.decimals,
+ symbol: token.symbol,
}),
);
}
diff --git a/packages/website/ts/blockchain_watcher.ts b/packages/website/ts/blockchain_watcher.ts
index 4b23aa98a..39ed8b08b 100644
--- a/packages/website/ts/blockchain_watcher.ts
+++ b/packages/website/ts/blockchain_watcher.ts
@@ -4,9 +4,9 @@ import * as _ from 'lodash';
import { Dispatcher } from 'ts/redux/dispatcher';
export class BlockchainWatcher {
- private _dispatcher: Dispatcher;
- private _web3Wrapper: Web3Wrapper;
- private _shouldPollUserAddress: boolean;
+ private readonly _dispatcher: Dispatcher;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _shouldPollUserAddress: boolean;
private _watchBalanceIntervalId: NodeJS.Timer;
private _prevUserEtherBalanceInWei?: BigNumber;
private _prevUserAddressIfExists: string;
diff --git a/packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx b/packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx
index 7b09cc92c..5f4bf8519 100644
--- a/packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx
+++ b/packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx
@@ -1,15 +1,13 @@
import { colors } from '@0xproject/react-shared';
import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import Dialog from 'material-ui/Dialog';
import FlatButton from 'material-ui/FlatButton';
import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
-import { EthAmountInput } from 'ts/components/inputs/eth_amount_input';
import { TokenAmountInput } from 'ts/components/inputs/token_amount_input';
+import { EthAmountInput } from 'ts/containers/inputs/eth_amount_input';
import { Side, Token } from 'ts/types';
-import { constants } from 'ts/utils/constants';
interface EthWethConversionDialogProps {
blockchain: Blockchain;
@@ -78,7 +76,6 @@ export class EthWethConversionDialog extends React.Component<
? 'Convert your Ether into a tokenized, tradable form.'
: "Convert your Wrapped Ether back into it's native form.";
const isWrappedVersion = this.props.direction === Side.Receive;
- const etherBalanceInEth = Web3Wrapper.toUnitAmount(this.props.etherBalanceInWei, constants.DECIMAL_PLACES_ETH);
return (
<div>
<div className="pb2">{explanation}</div>
@@ -106,7 +103,6 @@ export class EthWethConversionDialog extends React.Component<
/>
) : (
<EthAmountInput
- balance={etherBalanceInEth}
amount={this.state.value}
onChange={this._onValueChange.bind(this)}
shouldCheckBalance={true}
diff --git a/packages/website/ts/components/dialogs/send_dialog.tsx b/packages/website/ts/components/dialogs/send_dialog.tsx
index 8a98fdf69..c1179dbd0 100644
--- a/packages/website/ts/components/dialogs/send_dialog.tsx
+++ b/packages/website/ts/components/dialogs/send_dialog.tsx
@@ -6,6 +6,7 @@ import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
import { AddressInput } from 'ts/components/inputs/address_input';
import { TokenAmountInput } from 'ts/components/inputs/token_amount_input';
+import { EthAmountInput } from 'ts/containers/inputs/eth_amount_input';
import { Token } from 'ts/types';
interface SendDialogProps {
@@ -15,7 +16,7 @@ interface SendDialogProps {
onComplete: (recipient: string, value: BigNumber) => void;
onCancelled: () => void;
isOpen: boolean;
- token: Token;
+ asset: Token | 'ETH';
lastForceTokenStateRefetch: number;
}
@@ -58,23 +59,23 @@ export class SendDialog extends React.Component<SendDialogProps, SendDialogState
);
}
private _renderSendDialogBody(): React.ReactNode {
- return (
- <div className="mx-auto" style={{ maxWidth: 300 }}>
- <div style={{ height: 80 }}>
- <AddressInput
- initialAddress={this.state.recipient}
- updateAddress={this._onRecipientChange.bind(this)}
- isRequired={true}
- label={'Recipient address'}
- hintText={'Address'}
- />
- </div>
+ const input =
+ this.props.asset === 'ETH' ? (
+ <EthAmountInput
+ label="Amount to send"
+ shouldShowIncompleteErrs={this.state.shouldShowIncompleteErrs}
+ shouldCheckBalance={true}
+ shouldShowErrs={true}
+ onChange={this._onValueChange.bind(this)}
+ amount={this.state.value}
+ />
+ ) : (
<TokenAmountInput
blockchain={this.props.blockchain}
userAddress={this.props.userAddress}
networkId={this.props.networkId}
label="Amount to send"
- token={this.props.token}
+ token={this.props.asset}
shouldShowIncompleteErrs={this.state.shouldShowIncompleteErrs}
shouldCheckBalance={true}
shouldCheckAllowance={false}
@@ -82,6 +83,19 @@ export class SendDialog extends React.Component<SendDialogProps, SendDialogState
amount={this.state.value}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
/>
+ );
+ return (
+ <div className="mx-auto" style={{ maxWidth: 300 }}>
+ <div style={{ height: 80 }}>
+ <AddressInput
+ initialAddress={this.state.recipient}
+ updateAddress={this._onRecipientChange.bind(this)}
+ isRequired={true}
+ label="Recipient address'"
+ hintText="Address"
+ />
+ </div>
+ {input}
</div>
);
}
diff --git a/packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx b/packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx
index ce86df856..3ebab03ef 100644
--- a/packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx
+++ b/packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx
@@ -14,9 +14,9 @@ export const U2fNotSupportedDialog = (props: U2fNotSupportedDialogProps) => {
<Dialog
title="U2F Not Supported"
titleStyle={{ fontWeight: 100 }}
- actions={[<FlatButton key="u2fNo" label="Ok" onTouchTap={props.onToggleDialog.bind(this)} />]}
+ actions={[<FlatButton key="u2fNo" label="Ok" onTouchTap={props.onToggleDialog} />]}
open={props.isOpen}
- onRequestClose={props.onToggleDialog.bind(this)}
+ onRequestClose={props.onToggleDialog}
autoScrollBodyContent={true}
>
<div className="pt2" style={{ color: colors.grey700 }}>
diff --git a/packages/website/ts/components/eth_weth_conversion_button.tsx b/packages/website/ts/components/eth_weth_conversion_button.tsx
index d547a4e6a..b0091a1c1 100644
--- a/packages/website/ts/components/eth_weth_conversion_button.tsx
+++ b/packages/website/ts/components/eth_weth_conversion_button.tsx
@@ -37,7 +37,7 @@ export class EthWethConversionButton extends React.Component<
> {
public static defaultProps: Partial<EthWethConversionButtonProps> = {
isDisabled: false,
- onConversionSuccessful: _.noop,
+ onConversionSuccessful: _.noop.bind(_),
};
public constructor(props: EthWethConversionButtonProps) {
super(props);
diff --git a/packages/website/ts/components/fill_warning_dialog.tsx b/packages/website/ts/components/fill_warning_dialog.tsx
index 83095b1d3..45c492221 100644
--- a/packages/website/ts/components/fill_warning_dialog.tsx
+++ b/packages/website/ts/components/fill_warning_dialog.tsx
@@ -18,16 +18,16 @@ export const FillWarningDialog = (props: FillWarningDialogProps) => {
<FlatButton
key="fillWarningCancel"
label="Cancel"
- onTouchTap={props.onToggleDialog.bind(this, didCancel)}
+ onTouchTap={() => props.onToggleDialog(didCancel)} // tslint:disable-line:jsx-no-lambda
/>,
<FlatButton
key="fillWarningContinue"
label="Fill Order"
- onTouchTap={props.onToggleDialog.bind(this, !didCancel)}
+ onTouchTap={() => props.onToggleDialog(!didCancel)} // tslint:disable-line:jsx-no-lambda
/>,
]}
open={props.isOpen}
- onRequestClose={props.onToggleDialog.bind(this)}
+ onRequestClose={() => props.onToggleDialog(didCancel)} // tslint:disable-line:jsx-no-lambda
autoScrollBodyContent={true}
modal={true}
>
diff --git a/packages/website/ts/components/flash_messages/token_send_completed.tsx b/packages/website/ts/components/flash_messages/asset_send_completed.tsx
index f3f1ea2fc..f76e05fe1 100644
--- a/packages/website/ts/components/flash_messages/token_send_completed.tsx
+++ b/packages/website/ts/components/flash_messages/asset_send_completed.tsx
@@ -3,30 +3,30 @@ import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import * as React from 'react';
-import { Token } from 'ts/types';
import { utils } from 'ts/utils/utils';
-interface TokenSendCompletedProps {
+interface AssetSendCompletedProps {
etherScanLinkIfExists?: string;
- token: Token;
toAddress: string;
amountInBaseUnits: BigNumber;
+ decimals: number;
+ symbol: string;
}
-interface TokenSendCompletedState {}
+interface AssetSendCompletedState {}
-export class TokenSendCompleted extends React.Component<TokenSendCompletedProps, TokenSendCompletedState> {
+export class AssetSendCompleted extends React.Component<AssetSendCompletedProps, AssetSendCompletedState> {
public render(): React.ReactNode {
const etherScanLink = !_.isUndefined(this.props.etherScanLinkIfExists) && (
<a style={{ color: colors.white }} href={`${this.props.etherScanLinkIfExists}`} target="_blank">
Verify on Etherscan
</a>
);
- const amountInUnits = Web3Wrapper.toUnitAmount(this.props.amountInBaseUnits, this.props.token.decimals);
+ const amountInUnits = Web3Wrapper.toUnitAmount(this.props.amountInBaseUnits, this.props.decimals);
const truncatedAddress = utils.getAddressBeginAndEnd(this.props.toAddress);
return (
<div>
- {`Sent ${amountInUnits} ${this.props.token.symbol} to ${truncatedAddress}: `}
+ {`Sent ${amountInUnits} ${this.props.symbol} to ${truncatedAddress}: `}
{etherScanLink}
</div>
);
diff --git a/packages/website/ts/components/generate_order/asset_picker.tsx b/packages/website/ts/components/generate_order/asset_picker.tsx
index 5eada37b6..2dca3483f 100644
--- a/packages/website/ts/components/generate_order/asset_picker.tsx
+++ b/packages/website/ts/components/generate_order/asset_picker.tsx
@@ -46,7 +46,7 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
public static defaultProps: Partial<AssetPickerProps> = {
tokenVisibility: TokenVisibility.ALL,
};
- private _dialogConfigsByAssetView: { [assetView: string]: DialogConfigs };
+ private readonly _dialogConfigsByAssetView: { [assetView: string]: DialogConfigs };
constructor(props: AssetPickerProps) {
super(props);
this.state = {
diff --git a/packages/website/ts/components/inputs/allowance_toggle.tsx b/packages/website/ts/components/inputs/allowance_toggle.tsx
index 297617bef..05dce134a 100644
--- a/packages/website/ts/components/inputs/allowance_toggle.tsx
+++ b/packages/website/ts/components/inputs/allowance_toggle.tsx
@@ -57,7 +57,7 @@ const styles: Styles = {
export class AllowanceToggle extends React.Component<AllowanceToggleProps, AllowanceToggleState> {
public static defaultProps = {
- onErrorOccurred: _.noop,
+ onErrorOccurred: _.noop.bind(_),
isDisabled: false,
};
constructor(props: AllowanceToggleProps) {
diff --git a/packages/website/ts/components/inputs/balance_bounded_input.tsx b/packages/website/ts/components/inputs/balance_bounded_input.tsx
index f23beb436..eb01e3ea6 100644
--- a/packages/website/ts/components/inputs/balance_bounded_input.tsx
+++ b/packages/website/ts/components/inputs/balance_bounded_input.tsx
@@ -35,7 +35,7 @@ export class BalanceBoundedInput extends React.Component<BalanceBoundedInputProp
isDisabled: false,
shouldShowErrs: true,
hintText: 'amount',
- onErrorMsgChange: _.noop,
+ onErrorMsgChange: _.noop.bind(_),
shouldShowUnderline: true,
};
constructor(props: BalanceBoundedInputProps) {
@@ -125,7 +125,7 @@ export class BalanceBoundedInput extends React.Component<BalanceBoundedInputProp
const errMsg = _.isUndefined(this.props.validate) ? undefined : this.props.validate(amount);
return errMsg;
}
- private _setAmountState(amount: string, balance: BigNumber, callback: () => void = _.noop): void {
+ private _setAmountState(amount: string, balance: BigNumber, callback: () => void = _.noop.bind(_)): void {
const errorMsg = this._validate(amount, balance);
this.props.onErrorMsgChange(errorMsg);
this.setState(
diff --git a/packages/website/ts/components/inputs/eth_amount_input.tsx b/packages/website/ts/components/inputs/eth_amount_input.tsx
index 552d4277a..3a7905442 100644
--- a/packages/website/ts/components/inputs/eth_amount_input.tsx
+++ b/packages/website/ts/components/inputs/eth_amount_input.tsx
@@ -28,14 +28,13 @@ export class EthAmountInput extends React.Component<EthAmountInputProps, EthAmou
public static defaultProps: Partial<EthAmountInputProps> = {
shouldShowErrs: true,
shouldShowUnderline: true,
- style: { height: 63 },
};
public render(): React.ReactNode {
const amount = this.props.amount
? Web3Wrapper.toUnitAmount(this.props.amount, constants.DECIMAL_PLACES_ETH)
: undefined;
return (
- <div className="flex overflow-hidden" style={this.props.style}>
+ <div className="flex" style={this.props.style}>
<BalanceBoundedInput
label={this.props.label}
balance={this.props.balance}
diff --git a/packages/website/ts/components/inputs/expiration_input.tsx b/packages/website/ts/components/inputs/expiration_input.tsx
index 79dd2f568..5417ce715 100644
--- a/packages/website/ts/components/inputs/expiration_input.tsx
+++ b/packages/website/ts/components/inputs/expiration_input.tsx
@@ -17,7 +17,7 @@ interface ExpirationInputState {
}
export class ExpirationInput extends React.Component<ExpirationInputProps, ExpirationInputState> {
- private _earliestPickableMoment: moment.Moment;
+ private readonly _earliestPickableMoment: moment.Moment;
constructor(props: ExpirationInputProps) {
super(props);
// Set the earliest pickable date to today at 00:00, so users can only pick the current or later dates
diff --git a/packages/website/ts/components/order_json.tsx b/packages/website/ts/components/order_json.tsx
index c2606bd56..cf06f10c8 100644
--- a/packages/website/ts/components/order_json.tsx
+++ b/packages/website/ts/components/order_json.tsx
@@ -127,7 +127,7 @@ export class OrderJSON extends React.Component<OrderJSONProps, OrderJSONState> {
href: this.state.shareLink,
method: 'share',
},
- _.noop,
+ _.noop.bind(_),
);
}
private _shareViaEmailAsync(): void {
diff --git a/packages/website/ts/components/portal/portal.tsx b/packages/website/ts/components/portal/portal.tsx
index ea821d038..1790a9678 100644
--- a/packages/website/ts/components/portal/portal.tsx
+++ b/packages/website/ts/components/portal/portal.tsx
@@ -110,8 +110,8 @@ const SIDE_PADDING = 20;
export class Portal extends React.Component<PortalProps, PortalState> {
private _blockchain: Blockchain;
- private _sharedOrderIfExists: Order;
- private _throttledScreenWidthUpdate: () => void;
+ private readonly _sharedOrderIfExists: Order;
+ private readonly _throttledScreenWidthUpdate: () => void;
constructor(props: PortalProps) {
super(props);
this._sharedOrderIfExists = orderParser.parse(window.location.search);
diff --git a/packages/website/ts/components/send_button.tsx b/packages/website/ts/components/send_button.tsx
index ac55d430b..107983dee 100644
--- a/packages/website/ts/components/send_button.tsx
+++ b/packages/website/ts/components/send_button.tsx
@@ -12,7 +12,7 @@ import { utils } from 'ts/utils/utils';
interface SendButtonProps {
userAddress: string;
networkId: number;
- token: Token;
+ asset: Token | 'ETH';
dispatcher: Dispatcher;
blockchain: Blockchain;
onError: () => void;
@@ -51,7 +51,7 @@ export class SendButton extends React.Component<SendButtonProps, SendButtonState
isOpen={this.state.isSendDialogVisible}
onComplete={this._onSendAmountSelectedAsync.bind(this)}
onCancelled={this._toggleSendDialog.bind(this)}
- token={this.props.token}
+ asset={this.props.asset}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
/>
</div>
@@ -67,10 +67,14 @@ export class SendButton extends React.Component<SendButtonProps, SendButtonState
isSending: true,
});
this._toggleSendDialog();
- const token = this.props.token;
try {
- await this.props.blockchain.transferAsync(token, recipient, value);
- await this.props.refetchTokenStateAsync(token.address);
+ if (this.props.asset === 'ETH') {
+ await this.props.blockchain.sendAsync(recipient, value);
+ } else {
+ const token = this.props.asset;
+ await this.props.blockchain.transferAsync(token, recipient, value);
+ await this.props.refetchTokenStateAsync(token.address);
+ }
} catch (err) {
const errMsg = `${err}`;
if (_.includes(errMsg, BlockchainCallErrs.UserHasNoAssociatedAddresses)) {
diff --git a/packages/website/ts/components/token_balances.tsx b/packages/website/ts/components/token_balances.tsx
index c8d80702b..550438e76 100644
--- a/packages/website/ts/components/token_balances.tsx
+++ b/packages/website/ts/components/token_balances.tsx
@@ -204,11 +204,8 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
<TableHeaderColumn>Currency</TableHeaderColumn>
<TableHeaderColumn>Balance</TableHeaderColumn>
<TableRowColumn className="sm-hide xs-hide" style={stubColumnStyle} />
- {isTestNetwork && (
- <TableHeaderColumn style={{ paddingLeft: 3 }}>
- {isSmallScreen ? 'Faucet' : 'Request from faucet'}
- </TableHeaderColumn>
- )}
+ {isTestNetwork && <TableHeaderColumn style={{ paddingLeft: 3 }}>Action</TableHeaderColumn>}
+ <TableHeaderColumn>Send</TableHeaderColumn>
</TableRow>
</TableHeader>
<TableBody displayRowCheckbox={false}>
@@ -235,6 +232,20 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
/>
</TableRowColumn>
)}
+ <TableRowColumn>
+ <SendButton
+ userAddress={this.props.userAddress}
+ networkId={this.props.networkId}
+ blockchain={this.props.blockchain}
+ dispatcher={this.props.dispatcher}
+ asset="ETH"
+ onError={this._onSendFailed.bind(this)}
+ lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
+ // This is not necessary for ETH.
+ // tslint:disable:jsx-no-lambda
+ refetchTokenStateAsync={() => undefined}
+ />
+ </TableRowColumn>
</TableRow>
</TableBody>
</Table>
@@ -402,7 +413,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
networkId={this.props.networkId}
blockchain={this.props.blockchain}
dispatcher={this.props.dispatcher}
- token={token}
+ asset={token}
onError={this._onSendFailed.bind(this)}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
refetchTokenStateAsync={this._refetchTokenStateAsync.bind(this, token.address)}
diff --git a/packages/website/ts/components/ui/menu_item.tsx b/packages/website/ts/components/ui/menu_item.tsx
index 64c0dc49d..0cb4b387c 100644
--- a/packages/website/ts/components/ui/menu_item.tsx
+++ b/packages/website/ts/components/ui/menu_item.tsx
@@ -15,7 +15,7 @@ interface MenuItemState {
export class MenuItem extends React.Component<MenuItemProps, MenuItemState> {
public static defaultProps: Partial<MenuItemProps> = {
- onClick: _.noop,
+ onClick: _.noop.bind(_),
className: '',
};
public constructor(props: MenuItemProps) {
diff --git a/packages/website/ts/components/ui/overlay.tsx b/packages/website/ts/components/ui/overlay.tsx
index da26317de..fc7507475 100644
--- a/packages/website/ts/components/ui/overlay.tsx
+++ b/packages/website/ts/components/ui/overlay.tsx
@@ -26,7 +26,7 @@ export const Overlay: React.StatelessComponent<OverlayProps> = props => (
Overlay.defaultProps = {
style: {},
- onClick: _.noop,
+ onClick: _.noop.bind(_),
};
Overlay.displayName = 'Overlay';
diff --git a/packages/website/ts/components/ui/simple_menu.tsx b/packages/website/ts/components/ui/simple_menu.tsx
index dcbc6946b..8a9349c6d 100644
--- a/packages/website/ts/components/ui/simple_menu.tsx
+++ b/packages/website/ts/components/ui/simple_menu.tsx
@@ -41,7 +41,7 @@ export const SimpleMenuItem: React.StatelessComponent<SimpleMenuItemProps> = ({
<Text
fontSize="14px"
fontColor={colors.darkGrey}
- onClick={onClick || _.noop}
+ onClick={onClick || _.noop.bind(_)}
hoverColor={colors.mediumBlue}
>
{displayText}
diff --git a/packages/website/ts/components/wallet/wallet.tsx b/packages/website/ts/components/wallet/wallet.tsx
index e462ab3e0..40a8a23ea 100644
--- a/packages/website/ts/components/wallet/wallet.tsx
+++ b/packages/website/ts/components/wallet/wallet.tsx
@@ -204,7 +204,7 @@ export class Wallet extends React.Component<WalletProps, WalletState> {
<AccountConnection accountState={accountState} injectedProviderName={this.props.injectedProviderName} />
</div>
);
- const onClick = _.noop;
+ const onClick = _.noop.bind(_);
const accessory = (
<DropDown
activeNode={
diff --git a/packages/website/ts/components/wallet/wrap_ether_item.tsx b/packages/website/ts/components/wallet/wrap_ether_item.tsx
index fcab5d1dd..54ace7ae2 100644
--- a/packages/website/ts/components/wallet/wrap_ether_item.tsx
+++ b/packages/website/ts/components/wallet/wrap_ether_item.tsx
@@ -6,9 +6,9 @@ import FlatButton from 'material-ui/FlatButton';
import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
-import { EthAmountInput } from 'ts/components/inputs/eth_amount_input';
import { TokenAmountInput } from 'ts/components/inputs/token_amount_input';
import { Container } from 'ts/components/ui/container';
+import { EthAmountInput } from 'ts/containers/inputs/eth_amount_input';
import { Dispatcher } from 'ts/redux/dispatcher';
import { colors } from 'ts/style/colors';
import { BlockchainCallErrs, Side, Token } from 'ts/types';
@@ -87,13 +87,8 @@ export class WrapEtherItem extends React.Component<WrapEtherItemProps, WrapEther
};
}
public render(): React.ReactNode {
- const etherBalanceInEth = Web3Wrapper.toUnitAmount(
- this.props.userEtherBalanceInWei,
- constants.DECIMAL_PLACES_ETH,
- );
const isWrappingEth = this.props.direction === Side.Deposit;
const topLabelText = isWrappingEth ? 'Convert ETH into WETH 1:1' : 'Convert WETH into ETH 1:1';
-
return (
<Container className="flex" backgroundColor={colors.walletFocusedItemBackground} paddingTop="25px">
<div>{this._renderIsEthConversionHappeningSpinner()} </div>
@@ -103,7 +98,6 @@ export class WrapEtherItem extends React.Component<WrapEtherItemProps, WrapEther
<div style={styles.inputContainer}>
{isWrappingEth ? (
<EthAmountInput
- balance={etherBalanceInEth}
amount={this.state.currentInputAmount}
hintText="0.00"
onChange={this._onValueChange.bind(this)}
diff --git a/packages/website/ts/containers/connect_documentation.ts b/packages/website/ts/containers/connect_documentation.ts
index f939ef0df..abf419347 100644
--- a/packages/website/ts/containers/connect_documentation.ts
+++ b/packages/website/ts/containers/connect_documentation.ts
@@ -10,8 +10,8 @@ import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/connect/introduction');
-const InstallationMarkdown = require('md/docs/connect/installation');
+const IntroMarkdownV1 = require('md/docs/connect/1.0.0/introduction');
+const InstallationMarkdownV1 = require('md/docs/connect/1.0.0/installation');
/* tslint:enable:no-var-requires */
const connectDocSections = {
@@ -34,9 +34,11 @@ const docsInfoConfig: DocsInfoConfig = {
webSocketOrderbookChannel: [connectDocSections.webSocketOrderbookChannel],
types: [connectDocSections.types],
},
- sectionNameToMarkdown: {
- [connectDocSections.introduction]: IntroMarkdown,
- [connectDocSections.installation]: InstallationMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [connectDocSections.introduction]: IntroMarkdownV1,
+ [connectDocSections.installation]: InstallationMarkdownV1,
+ },
},
sectionNameToModulePath: {
[connectDocSections.httpClient]: ['"src/http_client"'],
diff --git a/packages/website/ts/containers/ethereum_types_documentation.ts b/packages/website/ts/containers/ethereum_types_documentation.ts
index 285438835..0be8dd3bc 100644
--- a/packages/website/ts/containers/ethereum_types_documentation.ts
+++ b/packages/website/ts/containers/ethereum_types_documentation.ts
@@ -30,9 +30,11 @@ const docsInfoConfig: DocsInfoConfig = {
install: [docSections.installation],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdown,
+ [docSections.installation]: InstallationMarkdown,
+ },
},
sectionNameToModulePath: {
[docSections.types]: ['"index"'],
diff --git a/packages/website/ts/containers/inputs/eth_amount_input.ts b/packages/website/ts/containers/inputs/eth_amount_input.ts
new file mode 100644
index 000000000..9ef903b55
--- /dev/null
+++ b/packages/website/ts/containers/inputs/eth_amount_input.ts
@@ -0,0 +1,36 @@
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { State } from 'ts/redux/reducer';
+import { ValidatedBigNumberCallback } from 'ts/types';
+import { constants } from 'ts/utils/constants';
+
+import { EthAmountInput as EthAmountInputComponent } from 'ts/components/inputs/eth_amount_input';
+
+interface EthAmountInputProps {
+ label?: string;
+ amount?: BigNumber;
+ hintText?: string;
+ onChange: ValidatedBigNumberCallback;
+ onErrorMsgChange?: (errorMsg: React.ReactNode) => void;
+ shouldShowIncompleteErrs: boolean;
+ shouldCheckBalance: boolean;
+ shouldShowErrs?: boolean;
+ shouldShowUnderline?: boolean;
+ style?: React.CSSProperties;
+ labelStyle?: React.CSSProperties;
+ inputHintStyle?: React.CSSProperties;
+}
+
+interface ConnectedState {
+ balance: BigNumber;
+}
+
+const mapStateToProps = (state: State, _ownProps: EthAmountInputProps): ConnectedState => ({
+ balance: Web3Wrapper.toUnitAmount(state.userEtherBalanceInWei, constants.DECIMAL_PLACES_ETH),
+});
+
+export const EthAmountInput: React.ComponentClass<EthAmountInputProps> = connect(mapStateToProps)(
+ EthAmountInputComponent,
+);
diff --git a/packages/website/ts/containers/json_schemas_documentation.ts b/packages/website/ts/containers/json_schemas_documentation.ts
index 67740d4c6..523777114 100644
--- a/packages/website/ts/containers/json_schemas_documentation.ts
+++ b/packages/website/ts/containers/json_schemas_documentation.ts
@@ -9,10 +9,10 @@ import { DocPackages } from 'ts/types';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/json_schemas/introduction');
-const InstallationMarkdown = require('md/docs/json_schemas/installation');
-const UsageMarkdown = require('md/docs/json_schemas/usage');
-const SchemasMarkdown = require('md/docs/json_schemas/schemas');
+const IntroMarkdownV1 = require('md/docs/json_schemas/1.0.0/introduction');
+const InstallationMarkdownV1 = require('md/docs/json_schemas/1.0.0/installation');
+const UsageMarkdownV1 = require('md/docs/json_schemas/1.0.0/usage');
+const SchemasMarkdownV1 = require('md/docs/json_schemas/1.0.0/schemas');
/* tslint:enable:no-var-requires */
const docSections = {
@@ -35,11 +35,13 @@ const docsInfoConfig: DocsInfoConfig = {
schemaValidator: [docSections.schemaValidator],
schemas: [docSections.schemas],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
- [docSections.schemas]: SchemasMarkdown,
- [docSections.usage]: UsageMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ [docSections.schemas]: SchemasMarkdownV1,
+ [docSections.usage]: UsageMarkdownV1,
+ },
},
sectionNameToModulePath: {
[docSections.schemaValidator]: ['"json-schemas/src/schema_validator"'],
diff --git a/packages/website/ts/containers/order_utils_documentation.ts b/packages/website/ts/containers/order_utils_documentation.ts
index 37b7f2273..c6570f514 100644
--- a/packages/website/ts/containers/order_utils_documentation.ts
+++ b/packages/website/ts/containers/order_utils_documentation.ts
@@ -10,8 +10,8 @@ import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/order_utils/introduction');
-const InstallationMarkdown = require('md/docs/order_utils/installation');
+const IntroMarkdownV1 = require('md/docs/order_utils/1.0.0/introduction');
+const InstallationMarkdownV1 = require('md/docs/order_utils/1.0.0/installation');
/* tslint:enable:no-var-requires */
const docSections = {
@@ -32,9 +32,11 @@ const docsInfoConfig: DocsInfoConfig = {
usage: [docSections.usage],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ },
},
sectionNameToModulePath: {
[docSections.usage]: [
diff --git a/packages/website/ts/containers/smart_contracts_documentation.ts b/packages/website/ts/containers/smart_contracts_documentation.ts
index c88c3b365..b0a712477 100644
--- a/packages/website/ts/containers/smart_contracts_documentation.ts
+++ b/packages/website/ts/containers/smart_contracts_documentation.ts
@@ -10,7 +10,7 @@ import { DocPackages, SmartContractDocSections as Sections } from 'ts/types';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/smart_contracts/introduction');
+const IntroMarkdownV1 = require('md/docs/smart_contracts/1.0.0/introduction');
/* tslint:enable:no-var-requires */
const docsInfoConfig: DocsInfoConfig = {
@@ -22,8 +22,10 @@ const docsInfoConfig: DocsInfoConfig = {
introduction: [Sections.Introduction],
contracts: [Sections.Exchange, Sections.TokenRegistry, Sections.ZRXToken, Sections.TokenTransferProxy],
},
- sectionNameToMarkdown: {
- [Sections.Introduction]: IntroMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [Sections.Introduction]: IntroMarkdownV1,
+ },
},
sections: {
Introduction: Sections.Introduction,
diff --git a/packages/website/ts/containers/sol_compiler_documentation.ts b/packages/website/ts/containers/sol_compiler_documentation.ts
index 8720e2c1d..b289c8f34 100644
--- a/packages/website/ts/containers/sol_compiler_documentation.ts
+++ b/packages/website/ts/containers/sol_compiler_documentation.ts
@@ -9,8 +9,8 @@ import { DocPackages } from 'ts/types';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/sol-compiler/introduction');
-const InstallationMarkdown = require('md/docs/sol-compiler/installation');
+const IntroMarkdownV1 = require('md/docs/sol-compiler/introduction');
+const InstallationMarkdownV1 = require('md/docs/sol-compiler/installation');
const UsageMarkdown = require('md/docs/sol-compiler/usage');
/* tslint:enable:no-var-requires */
@@ -34,10 +34,12 @@ const docsInfoConfig: DocsInfoConfig = {
compiler: [docSections.compiler],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
- [docSections.usage]: UsageMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ [docSections.usage]: UsageMarkdown,
+ },
},
sectionNameToModulePath: {
[docSections.compiler]: ['"sol-compiler/src/compiler"'],
diff --git a/packages/website/ts/containers/sol_cov_documentation.ts b/packages/website/ts/containers/sol_cov_documentation.ts
index a8009071f..d78c450ed 100644
--- a/packages/website/ts/containers/sol_cov_documentation.ts
+++ b/packages/website/ts/containers/sol_cov_documentation.ts
@@ -9,8 +9,8 @@ import { DocPackages } from 'ts/types';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/sol_cov/introduction');
-const InstallationMarkdown = require('md/docs/sol_cov/installation');
+const IntroMarkdownV1 = require('md/docs/sol_cov/introduction');
+const InstallationMarkdownV1 = require('md/docs/sol_cov/installation');
const UsageMarkdown = require('md/docs/sol_cov/usage');
/* tslint:enable:no-var-requires */
@@ -40,10 +40,12 @@ const docsInfoConfig: DocsInfoConfig = {
'truffle-artifact-adapter': [docSections.truffleArtifactAdapter],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
- [docSections.usage]: UsageMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ [docSections.usage]: UsageMarkdown,
+ },
},
sectionNameToModulePath: {
[docSections.coverageSubprovider]: ['"sol-cov/src/coverage_subprovider"'],
diff --git a/packages/website/ts/containers/subproviders_documentation.ts b/packages/website/ts/containers/subproviders_documentation.ts
index 567f6a37e..0e9150d7b 100644
--- a/packages/website/ts/containers/subproviders_documentation.ts
+++ b/packages/website/ts/containers/subproviders_documentation.ts
@@ -10,8 +10,8 @@ import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/subproviders/introduction');
-const InstallationMarkdown = require('md/docs/subproviders/installation');
+const IntroMarkdownV1 = require('md/docs/subproviders/introduction');
+const InstallationMarkdownV1 = require('md/docs/subproviders/installation');
const LedgerNodeHidMarkdown = require('md/docs/subproviders/ledger_node_hid');
/* tslint:enable:no-var-requires */
@@ -57,10 +57,12 @@ const docsInfoConfig: DocsInfoConfig = {
['nonceTracker-subprovider']: [docSections.nonceTrackerSubprovider],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
- [docSections.ledgerNodeHid]: LedgerNodeHidMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ [docSections.ledgerNodeHid]: LedgerNodeHidMarkdown,
+ },
},
sectionNameToModulePath: {
[docSections.subprovider]: ['"subproviders/src/subproviders/subprovider"'],
diff --git a/packages/website/ts/containers/web3_wrapper_documentation.ts b/packages/website/ts/containers/web3_wrapper_documentation.ts
index b04a83ac4..8d98d9476 100644
--- a/packages/website/ts/containers/web3_wrapper_documentation.ts
+++ b/packages/website/ts/containers/web3_wrapper_documentation.ts
@@ -10,8 +10,8 @@ import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/web3_wrapper/introduction');
-const InstallationMarkdown = require('md/docs/web3_wrapper/installation');
+const IntroMarkdownV1 = require('md/docs/web3_wrapper/introduction');
+const InstallationMarkdownV1 = require('md/docs/web3_wrapper/installation');
/* tslint:enable:no-var-requires */
const docSections = {
@@ -32,9 +32,11 @@ const docsInfoConfig: DocsInfoConfig = {
web3Wrapper: [docSections.web3Wrapper],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ },
},
sectionNameToModulePath: {
[docSections.web3Wrapper]: ['"web3-wrapper/src/web3_wrapper"'],
diff --git a/packages/website/ts/containers/zero_ex_js_documentation.ts b/packages/website/ts/containers/zero_ex_js_documentation.ts
index bd0d1732a..6be54595d 100644
--- a/packages/website/ts/containers/zero_ex_js_documentation.ts
+++ b/packages/website/ts/containers/zero_ex_js_documentation.ts
@@ -10,11 +10,14 @@ import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/0xjs/introduction');
-const InstallationMarkdown = require('md/docs/0xjs/installation');
-const AsyncMarkdown = require('md/docs/0xjs/async');
-const ErrorsMarkdown = require('md/docs/0xjs/errors');
-const versioningMarkdown = require('md/docs/0xjs/versioning');
+const IntroMarkdownV1 = require('md/docs/0xjs/1.0.0/introduction');
+const InstallationMarkdownV1 = require('md/docs/0xjs/1.0.0/installation');
+const AsyncMarkdownV1 = require('md/docs/0xjs/1.0.0/async');
+const ErrorsMarkdownV1 = require('md/docs/0xjs/1.0.0/errors');
+const versioningMarkdownV1 = require('md/docs/0xjs/1.0.0/versioning');
+
+const IntroMarkdownV2 = require('md/docs/0xjs/2.0.0/introduction');
+const versioningMarkdownV2 = require('md/docs/0xjs/2.0.0/versioning');
/* tslint:enable:no-var-requires */
const zeroExJsDocSections = {
@@ -54,12 +57,22 @@ const docsInfoConfig: DocsInfoConfig = {
orderWatcher: [zeroExJsDocSections.orderWatcher],
types: [zeroExJsDocSections.types],
},
- sectionNameToMarkdown: {
- [zeroExJsDocSections.introduction]: IntroMarkdown,
- [zeroExJsDocSections.installation]: InstallationMarkdown,
- [zeroExJsDocSections.async]: AsyncMarkdown,
- [zeroExJsDocSections.errors]: ErrorsMarkdown,
- [zeroExJsDocSections.versioning]: versioningMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [zeroExJsDocSections.introduction]: IntroMarkdownV1,
+ [zeroExJsDocSections.installation]: InstallationMarkdownV1,
+ [zeroExJsDocSections.async]: AsyncMarkdownV1,
+ [zeroExJsDocSections.errors]: ErrorsMarkdownV1,
+ [zeroExJsDocSections.versioning]: versioningMarkdownV1,
+ },
+ '1.0.0-rc.1': {
+ [zeroExJsDocSections.introduction]: IntroMarkdownV2,
+ [zeroExJsDocSections.versioning]: versioningMarkdownV2,
+ // These are the same as for V1
+ [zeroExJsDocSections.installation]: InstallationMarkdownV1,
+ [zeroExJsDocSections.async]: AsyncMarkdownV1,
+ [zeroExJsDocSections.errors]: ErrorsMarkdownV1,
+ },
},
sectionNameToModulePath: {
[zeroExJsDocSections.zeroEx]: ['"0x.js/src/0x"', '"src/0x"'],
@@ -181,6 +194,32 @@ const docsInfoConfig: DocsInfoConfig = {
'JSONRPCErrorCallback',
'LogEntryEvent',
'LogEntry',
+ 'ERC20AssetData',
+ 'ERC721AssetData',
+ 'AssetProxyId',
+ 'WETH9Events',
+ 'WETH9WithdrawalEventArgs',
+ 'WETH9ApprovalEventArgs',
+ 'WETH9EventArgs',
+ 'WETH9DepositEventArgs',
+ 'WETH9TransferEventArgs',
+ 'ERC20TokenTransferEventArgs',
+ 'ERC20TokenApprovalEventArgs',
+ 'ERC20TokenEvents',
+ 'ERC20TokenEventArgs',
+ 'ERC721TokenApprovalEventArgs',
+ 'ERC721TokenApprovalForAllEventArgs',
+ 'ERC721TokenTransferEventArgs',
+ 'ERC721TokenEvents',
+ 'ExchangeCancelUpToEventArgs',
+ 'ExchangeAssetProxyRegisteredEventArgs',
+ 'ExchangeFillEventArgs',
+ 'ExchangeCancelEventArgs',
+ 'ExchangeEventArgs',
+ 'ContractWrappersConfig',
+ 'MessagePrefixType',
+ 'MessagePrefixOpts',
+ 'OrderInfo',
],
typeNameToPrefix: {},
typeNameToExternalLink: {
diff --git a/packages/website/ts/local_storage/local_storage.ts b/packages/website/ts/local_storage/local_storage.ts
index 1e3258ce0..13d9ca401 100644
--- a/packages/website/ts/local_storage/local_storage.ts
+++ b/packages/website/ts/local_storage/local_storage.ts
@@ -5,7 +5,7 @@ export const localStorage = {
return !!window.localStorage;
},
getItemIfExists(key: string): string {
- if (!this.doesExist) {
+ if (!localStorage.doesExist) {
return undefined;
}
const item = window.localStorage.getItem(key);
@@ -15,13 +15,13 @@ export const localStorage = {
return item;
},
setItem(key: string, value: string): void {
- if (!this.doesExist || _.isUndefined(value)) {
+ if (!localStorage.doesExist || _.isUndefined(value)) {
return;
}
window.localStorage.setItem(key, value);
},
removeItem(key: string): void {
- if (!this.doesExist) {
+ if (!localStorage.doesExist) {
return;
}
window.localStorage.removeItem(key);
@@ -37,7 +37,7 @@ export const localStorage = {
localStorage.setItem(key, JSON.stringify(value));
},
getAllKeys(): string[] {
- if (!this.doesExist) {
+ if (!localStorage.doesExist) {
return [];
}
return _.keys(window.localStorage);
diff --git a/packages/website/ts/local_storage/tracked_token_storage.ts b/packages/website/ts/local_storage/tracked_token_storage.ts
index f865f8109..b1b579aef 100644
--- a/packages/website/ts/local_storage/tracked_token_storage.ts
+++ b/packages/website/ts/local_storage/tracked_token_storage.ts
@@ -17,7 +17,7 @@ export const trackedTokenStorage = {
localStorage.setItem(TRACKED_TOKENS_CLEAR_KEY, configs.LAST_LOCAL_STORAGE_TRACKED_TOKEN_CLEARANCE_DATE);
},
addTrackedTokenToUser(userAddress: string, networkId: number, token: Token): void {
- const trackedTokensByUserAddress = this.getTrackedTokensByUserAddress();
+ const trackedTokensByUserAddress = trackedTokenStorage.getTrackedTokensByUserAddress();
let trackedTokensByNetworkId = trackedTokensByUserAddress[userAddress];
if (_.isUndefined(trackedTokensByNetworkId)) {
trackedTokensByNetworkId = {};
@@ -57,7 +57,7 @@ export const trackedTokenStorage = {
return trackedTokensByAddress;
},
removeTrackedToken(userAddress: string, networkId: number, tokenAddress: string): void {
- const trackedTokensByUserAddress = this.getTrackedTokensByUserAddress();
+ const trackedTokensByUserAddress = trackedTokenStorage.getTrackedTokensByUserAddress();
const trackedTokensByNetworkId = trackedTokensByUserAddress[userAddress];
const trackedTokens = trackedTokensByNetworkId[networkId];
const remainingTrackedTokens = _.filter(trackedTokens, (token: Token) => {
diff --git a/packages/website/ts/local_storage/trade_history_storage.tsx b/packages/website/ts/local_storage/trade_history_storage.tsx
index 2e2f4e64e..a9b042820 100644
--- a/packages/website/ts/local_storage/trade_history_storage.tsx
+++ b/packages/website/ts/local_storage/trade_history_storage.tsx
@@ -27,31 +27,31 @@ export const tradeHistoryStorage = {
localStorage.setItem(FILL_CLEAR_KEY, configs.LAST_LOCAL_STORAGE_FILL_CLEARANCE_DATE);
},
addFillToUser(userAddress: string, networkId: number, fill: Fill): void {
- const fillsByHash = this.getUserFillsByHash(userAddress, networkId);
- const fillHash = this._getFillHash(fill);
+ const fillsByHash = tradeHistoryStorage.getUserFillsByHash(userAddress, networkId);
+ const fillHash = tradeHistoryStorage._getFillHash(fill);
const doesFillExist = !_.isUndefined(fillsByHash[fillHash]);
if (doesFillExist) {
return; // noop
}
fillsByHash[fillHash] = fill;
const userFillsJSONString = JSON.stringify(fillsByHash);
- const userFillsKey = this._getUserFillsKey(userAddress, networkId);
+ const userFillsKey = tradeHistoryStorage._getUserFillsKey(userAddress, networkId);
localStorage.setItem(userFillsKey, userFillsJSONString);
},
removeFillFromUser(userAddress: string, networkId: number, fill: Fill): void {
- const fillsByHash = this.getUserFillsByHash(userAddress, networkId);
- const fillHash = this._getFillHash(fill);
+ const fillsByHash = tradeHistoryStorage.getUserFillsByHash(userAddress, networkId);
+ const fillHash = tradeHistoryStorage._getFillHash(fill);
const doesFillExist = !_.isUndefined(fillsByHash[fillHash]);
if (!doesFillExist) {
return; // noop
}
delete fillsByHash[fillHash];
const userFillsJSONString = JSON.stringify(fillsByHash);
- const userFillsKey = this._getUserFillsKey(userAddress, networkId);
+ const userFillsKey = tradeHistoryStorage._getUserFillsKey(userAddress, networkId);
localStorage.setItem(userFillsKey, userFillsJSONString);
},
getUserFillsByHash(userAddress: string, networkId: number): { [fillHash: string]: Fill } {
- const userFillsKey = this._getUserFillsKey(userAddress, networkId);
+ const userFillsKey = tradeHistoryStorage._getUserFillsKey(userAddress, networkId);
const userFillsJSONString = localStorage.getItemIfExists(userFillsKey);
if (_.isEmpty(userFillsJSONString)) {
return {};
@@ -66,7 +66,7 @@ export const tradeHistoryStorage = {
return userFillsByHash;
},
getFillsLatestBlock(userAddress: string, networkId: number): number {
- const userFillsLatestBlockKey = this._getFillsLatestBlockKey(userAddress, networkId);
+ const userFillsLatestBlockKey = tradeHistoryStorage._getFillsLatestBlockKey(userAddress, networkId);
const blockNumberStr = localStorage.getItemIfExists(userFillsLatestBlockKey);
if (_.isEmpty(blockNumberStr)) {
return constants.GENESIS_ORDER_BLOCK_BY_NETWORK_ID[networkId];
@@ -75,7 +75,7 @@ export const tradeHistoryStorage = {
return blockNumber;
},
setFillsLatestBlock(userAddress: string, networkId: number, blockNumber: number): void {
- const userFillsLatestBlockKey = this._getFillsLatestBlockKey(userAddress, networkId);
+ const userFillsLatestBlockKey = tradeHistoryStorage._getFillsLatestBlockKey(userAddress, networkId);
localStorage.setItem(userFillsLatestBlockKey, `${blockNumber}`);
},
_getUserFillsKey(userAddress: string, networkId: number): string {
diff --git a/packages/website/ts/pages/about/about.tsx b/packages/website/ts/pages/about/about.tsx
index be4a67cb3..33581c938 100644
--- a/packages/website/ts/pages/about/about.tsx
+++ b/packages/website/ts/pages/about/about.tsx
@@ -181,14 +181,14 @@ const teamRow6: ProfileInfo[] = [
image: 'images/team/peter.jpg',
linkedIn: 'https://www.linkedin.com/in/peter-z-7b9595163/',
},
- // {
- // name: 'Chris Kalani',
- // title: 'Director of Design',
- // description: `Previously founded Wake (acquired by InVision). Early Facebook product designer.`,
- // image: 'images/team/chris.png',
- // linkedIn: 'https://www.linkedin.com/in/chriskalani/',
- // github: 'https://github.com/chriskalani',
- // },
+ {
+ name: 'Chris Kalani',
+ title: 'Director of Design',
+ description: `Previously founded Wake (acquired by InVision). Early Facebook product designer.`,
+ image: 'images/team/chris.png',
+ linkedIn: 'https://www.linkedin.com/in/chriskalani/',
+ github: 'https://github.com/chriskalani',
+ },
];
const advisors: ProfileInfo[] = [
diff --git a/packages/website/ts/pages/jobs/jobs.tsx b/packages/website/ts/pages/jobs/jobs.tsx
index 314669ee9..38cefa832 100644
--- a/packages/website/ts/pages/jobs/jobs.tsx
+++ b/packages/website/ts/pages/jobs/jobs.tsx
@@ -33,7 +33,7 @@ export interface JobsState {}
export class Jobs extends React.Component<JobsProps, JobsState> {
// TODO: consolidate this small screen scaffolding into one place (its being used in portal and docs as well)
- private _throttledScreenWidthUpdate: () => void;
+ private readonly _throttledScreenWidthUpdate: () => void;
public constructor(props: JobsProps) {
super(props);
this._throttledScreenWidthUpdate = _.throttle(this._updateScreenWidth.bind(this), THROTTLE_TIMEOUT);
diff --git a/packages/website/ts/pages/landing/landing.tsx b/packages/website/ts/pages/landing/landing.tsx
index b2cf4d979..2a51ee3c0 100644
--- a/packages/website/ts/pages/landing/landing.tsx
+++ b/packages/website/ts/pages/landing/landing.tsx
@@ -171,7 +171,7 @@ interface LandingState {
}
export class Landing extends React.Component<LandingProps, LandingState> {
- private _throttledScreenWidthUpdate: () => void;
+ private readonly _throttledScreenWidthUpdate: () => void;
constructor(props: LandingProps) {
super(props);
this.state = {
diff --git a/packages/website/ts/redux/dispatcher.ts b/packages/website/ts/redux/dispatcher.ts
index e0ce43ae5..db008d319 100644
--- a/packages/website/ts/redux/dispatcher.ts
+++ b/packages/website/ts/redux/dispatcher.ts
@@ -17,7 +17,7 @@ import {
} from 'ts/types';
export class Dispatcher {
- private _dispatch: Dispatch<State>;
+ private readonly _dispatch: Dispatch<State>;
constructor(dispatch: Dispatch<State>) {
this._dispatch = dispatch;
}
diff --git a/packages/website/ts/utils/constants.ts b/packages/website/ts/utils/constants.ts
index e43f541bf..20441cd75 100644
--- a/packages/website/ts/utils/constants.ts
+++ b/packages/website/ts/utils/constants.ts
@@ -58,7 +58,7 @@ export const constants = {
PROJECT_URL_MAKER: 'https://makerdao.com',
PROJECT_URL_ARAGON: 'https://aragon.one',
PROJECT_URL_BLOCKNET: 'https://blocknet.co',
- PROJECT_URL_0CEAN: 'http://the0cean.com',
+ PROJECT_URL_0CEAN: 'https://theocean.trade',
PROJECT_URL_IMTOKEN: 'https://tokenlon.token.im/',
PROJECT_URL_AUGUR: 'https://augur.net',
PROJECT_URL_AUCTUS: 'https://auctus.org',
diff --git a/packages/website/ts/utils/doc_utils.ts b/packages/website/ts/utils/doc_utils.ts
index 1627b9b0c..b9084bba7 100644
--- a/packages/website/ts/utils/doc_utils.ts
+++ b/packages/website/ts/utils/doc_utils.ts
@@ -1,6 +1,5 @@
import { DoxityDocObj, TypeDocNode } from '@0xproject/react-docs';
import { fetchAsync, logUtils } from '@0xproject/utils';
-import findVersions = require('find-versions');
import * as _ from 'lodash';
import { S3FileObject, VersionToFilePath } from 'ts/types';
import convert = require('xml-js');
@@ -10,7 +9,7 @@ export const docUtils = {
const versionFilePaths = await docUtils.getVersionFileNamesAsync(s3DocJsonRoot, folderName);
const versionToFilePath: VersionToFilePath = {};
_.each(versionFilePaths, filePath => {
- const [version] = findVersions(filePath);
+ const version = filePath.split('/v')[1].replace('.json', '');
versionToFilePath[version] = filePath;
});
return versionToFilePath;
diff --git a/packages/website/ts/utils/utils.ts b/packages/website/ts/utils/utils.ts
index 739bb7b66..439af5e4b 100644
--- a/packages/website/ts/utils/utils.ts
+++ b/packages/website/ts/utils/utils.ts
@@ -59,7 +59,7 @@ export const utils = {
return moment.unix(unixTimestampSec.toNumber());
},
convertToReadableDateTimeFromUnixTimestamp(unixTimestampSec: BigNumber): string {
- const m = this.convertToMomentFromUnixTimestamp(unixTimestampSec);
+ const m = utils.convertToMomentFromUnixTimestamp(unixTimestampSec);
const formattedDate: string = m.format('h:MMa MMMM D YYYY');
return formattedDate;
},
@@ -299,12 +299,12 @@ export const utils = {
const baseUrl = `https://${window.location.hostname}${hasPort ? `:${port}` : ''}`;
return baseUrl;
},
- onPageLoadPromise: new Promise((resolve, _reject) => {
+ onPageLoadPromise: new Promise<void>((resolve, _reject) => {
if (document.readyState === 'complete') {
resolve();
return;
}
- window.onload = resolve;
+ window.onload = () => resolve();
}),
getProviderType(provider: Provider): Providers | string {
const constructorName = provider.constructor.name;
@@ -334,7 +334,7 @@ export const utils = {
return utils.isDogfood() ? configs.BACKEND_BASE_STAGING_URL : configs.BACKEND_BASE_PROD_URL;
},
isDevelopment(): boolean {
- return _.includes(configs.DOMAINS_DEVELOPMENT, window.location.origin);
+ return _.includes(configs.DOMAINS_DEVELOPMENT, window.location.host);
},
isStaging(): boolean {
return _.includes(window.location.href, configs.DOMAIN_STAGING);
@@ -364,7 +364,7 @@ export const utils = {
return Environments.UNKNOWN;
},
shouldShowJobsPage(): boolean {
- return this.isDevelopment() || this.isStaging() || this.isDogfood();
+ return utils.isDevelopment() || utils.isStaging() || utils.isDogfood();
},
getEthToken(tokenByAddress: TokenByAddress): Token {
return utils.getTokenBySymbol(constants.ETHER_TOKEN_SYMBOL, tokenByAddress);
@@ -379,7 +379,7 @@ export const utils = {
},
getTrackedTokens(tokenByAddress: TokenByAddress): Token[] {
const allTokens = _.values(tokenByAddress);
- const trackedTokens = _.filter(allTokens, t => this.isTokenTracked(t));
+ const trackedTokens = _.filter(allTokens, t => utils.isTokenTracked(t));
return trackedTokens;
},
getFormattedAmountFromToken(token: Token, tokenState: TokenState): string {
diff --git a/tsconfig.json b/tsconfig.json
index 5ca0267e4..588285140 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,6 +6,7 @@
"sourceMap": true,
"declaration": true,
"experimentalDecorators": true,
+ "downlevelIteration": true,
"noImplicitReturns": true,
"pretty": true,
"skipLibCheck": true,
diff --git a/yarn.lock b/yarn.lock
index 7bf50ee53..c026a52c3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,20 +2,20 @@
# yarn lockfile v1
-"0x.js@0.38.4":
- version "0.38.4"
- resolved "https://registry.yarnpkg.com/0x.js/-/0x.js-0.38.4.tgz#735c12d3b8d68945caab87990e6cdd24bf5bc070"
+"0x.js@0.38.5":
+ version "0.38.5"
+ resolved "https://registry.yarnpkg.com/0x.js/-/0x.js-0.38.5.tgz#da4724e81e648279ea288cbac4b1a950a7cd7707"
dependencies:
- "@0xproject/assert" "^0.2.12"
- "@0xproject/base-contract" "^0.3.4"
- "@0xproject/contract-wrappers" "^0.0.5"
- "@0xproject/order-utils" "^0.0.7"
- "@0xproject/order-watcher" "^0.0.6"
- "@0xproject/sol-compiler" "^0.5.2"
- "@0xproject/types" "^0.8.1"
- "@0xproject/typescript-typings" "^0.4.1"
- "@0xproject/utils" "^0.7.1"
- "@0xproject/web3-wrapper" "^0.7.1"
+ "@0xproject/assert" "^0.2.13"
+ "@0xproject/base-contract" "^0.3.5"
+ "@0xproject/contract-wrappers" "^0.1.0"
+ "@0xproject/order-utils" "^0.0.8"
+ "@0xproject/order-watcher" "^0.0.7"
+ "@0xproject/sol-compiler" "^0.5.3"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.2"
+ "@0xproject/utils" "^0.7.2"
+ "@0xproject/web3-wrapper" "^0.7.2"
ethers "3.0.22"
lodash "4.17.10"
@@ -23,7 +23,17 @@
version "0.3.9"
resolved "https://registry.yarnpkg.com/8fold-marked/-/8fold-marked-0.3.9.tgz#bb89c645612f8ccfaffac1ca6e3c11f168c9cf59"
-"@0xproject/assert@0.2.13", "@0xproject/assert@^0.2.13":
+"@0xproject/assert@^0.2.12", "@0xproject/assert@^0.2.14":
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/@0xproject/assert/-/assert-0.2.14.tgz#7d5a373fedc8eb482716b730f4dddf3ef33bfa29"
+ dependencies:
+ "@0xproject/json-schemas" "^0.8.3"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ lodash "4.17.10"
+ valid-url "1.0.9"
+
+"@0xproject/assert@^0.2.13":
version "0.2.13"
resolved "https://registry.yarnpkg.com/@0xproject/assert/-/assert-0.2.13.tgz#8eb0e16cd6d802eae1b0ab86d344360ea0038331"
dependencies:
@@ -33,17 +43,18 @@
lodash "4.17.10"
valid-url "1.0.9"
-"@0xproject/assert@^0.2.12":
- version "0.2.12"
- resolved "https://registry.yarnpkg.com/@0xproject/assert/-/assert-0.2.12.tgz#0e53de4eb598ecc6138aec82d4609c0e46f433b3"
+"@0xproject/base-contract@^0.3.4", "@0xproject/base-contract@^0.3.5", "@0xproject/base-contract@^0.3.6":
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/@0xproject/base-contract/-/base-contract-0.3.6.tgz#c6d742ce2904bdd9e77524d99ba2438d3aae8a40"
dependencies:
- "@0xproject/json-schemas" "^0.8.1"
- "@0xproject/typescript-typings" "^0.4.1"
- "@0xproject/utils" "^0.7.1"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ ethers "3.0.22"
lodash "4.17.10"
- valid-url "1.0.9"
-"@0xproject/contract-wrappers@0.0.5", "@0xproject/contract-wrappers@^0.0.5":
+"@0xproject/contract-wrappers@^0.0.5":
version "0.0.5"
resolved "https://registry.yarnpkg.com/@0xproject/contract-wrappers/-/contract-wrappers-0.0.5.tgz#36f91afb7de51478f9d2e4e0a3c4e685b3d18f28"
dependencies:
@@ -63,6 +74,27 @@
lodash "4.17.10"
uuid "3.2.1"
+"@0xproject/contract-wrappers@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@0xproject/contract-wrappers/-/contract-wrappers-0.1.1.tgz#8108d7ec051f202ef0cfa77c91c4ef994bf89881"
+ dependencies:
+ "@0xproject/assert" "^0.2.14"
+ "@0xproject/base-contract" "^0.3.6"
+ "@0xproject/fill-scenarios" "^0.0.6"
+ "@0xproject/json-schemas" "^0.8.3"
+ "@0xproject/order-utils" "^0.0.9"
+ "@0xproject/sol-compiler" "^0.5.4"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ ethereumjs-blockstream "5.0.0"
+ ethereumjs-util "5.1.5"
+ ethers "3.0.22"
+ js-sha3 "0.7.0"
+ lodash "4.17.10"
+ uuid "3.2.1"
+
"@0xproject/fill-scenarios@^0.0.4":
version "0.0.4"
resolved "https://registry.yarnpkg.com/@0xproject/fill-scenarios/-/fill-scenarios-0.0.4.tgz#4d23c75abda7e9f117b698c0b8b142af07e0c69e"
@@ -89,20 +121,33 @@
ethers "3.0.22"
lodash "4.17.10"
-"@0xproject/json-schemas@0.8.2", "@0xproject/json-schemas@^0.8.2":
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.2.tgz#9d3f446e546ce0c959cf7beb45d41ac60476a78c"
+"@0xproject/fill-scenarios@^0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@0xproject/fill-scenarios/-/fill-scenarios-0.0.6.tgz#969a2c49122650af5a1bf7fe7c6d286a0e6f2de2"
dependencies:
- "@0xproject/typescript-typings" "^0.4.2"
+ "@0xproject/base-contract" "^0.3.6"
+ "@0xproject/order-utils" "^0.0.9"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ ethers "3.0.22"
+ lodash "4.17.10"
+
+"@0xproject/json-schemas@^0.8.1", "@0xproject/json-schemas@^0.8.3":
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.3.tgz#455e6219a6bd05e990392165192a983a9ab89f26"
+ dependencies:
+ "@0xproject/typescript-typings" "^0.4.3"
"@types/node" "9.6.0"
jsonschema "1.2.2"
lodash.values "4.3.0"
-"@0xproject/json-schemas@^0.8.1":
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.1.tgz#2613fd9405728bc65f2eb78e86258d44b4925ab0"
+"@0xproject/json-schemas@^0.8.2":
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.2.tgz#9d3f446e546ce0c959cf7beb45d41ac60476a78c"
dependencies:
- "@0xproject/typescript-typings" "^0.4.1"
+ "@0xproject/typescript-typings" "^0.4.2"
"@types/node" "9.6.0"
jsonschema "1.2.2"
lodash.values "4.3.0"
@@ -139,38 +184,101 @@
ethereumjs-util "5.1.5"
lodash "4.17.10"
-"@0xproject/order-watcher@^0.0.6":
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/@0xproject/order-watcher/-/order-watcher-0.0.6.tgz#85a8fb21e5755bb555f427b12d64d10b89b332e6"
+"@0xproject/order-utils@^0.0.9":
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/@0xproject/order-utils/-/order-utils-0.0.9.tgz#75225dfbd87335d18810abf995d8e077b9a84868"
dependencies:
- "@0xproject/assert" "^0.2.12"
- "@0xproject/base-contract" "^0.3.4"
- "@0xproject/contract-wrappers" "^0.0.5"
- "@0xproject/fill-scenarios" "^0.0.4"
- "@0xproject/json-schemas" "^0.8.1"
- "@0xproject/order-utils" "^0.0.7"
- "@0xproject/types" "^0.8.1"
- "@0xproject/typescript-typings" "^0.4.1"
- "@0xproject/utils" "^0.7.1"
- "@0xproject/web3-wrapper" "^0.7.1"
+ "@0xproject/assert" "^0.2.14"
+ "@0xproject/json-schemas" "^0.8.3"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ "@types/node" "9.6.0"
+ bn.js "4.11.7"
+ ethereumjs-abi "0.6.5"
+ ethereumjs-util "5.1.5"
+ lodash "4.17.10"
+
+"@0xproject/order-watcher@^0.0.7":
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/@0xproject/order-watcher/-/order-watcher-0.0.7.tgz#fbe019aa33447781096b5d562e7a3a4ec91a1da2"
+ dependencies:
+ "@0xproject/assert" "^0.2.13"
+ "@0xproject/base-contract" "^0.3.5"
+ "@0xproject/contract-wrappers" "^0.1.0"
+ "@0xproject/fill-scenarios" "^0.0.5"
+ "@0xproject/json-schemas" "^0.8.2"
+ "@0xproject/order-utils" "^0.0.8"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.2"
+ "@0xproject/utils" "^0.7.2"
+ "@0xproject/web3-wrapper" "^0.7.2"
bintrees "1.0.2"
+ ethereum-types "^0.0.2"
+ ethereumjs-blockstream "5.0.0"
ethers "3.0.22"
lodash "4.17.10"
+"@0xproject/react-shared@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/react-shared/-/react-shared-0.2.3.tgz#f0403b9b7f1cfbe2853b53cc983ebb13ee8753a5"
+ dependencies:
+ "@types/lodash" "4.14.104"
+ "@types/material-ui" "0.18.0"
+ "@types/node" "9.6.0"
+ "@types/react" "16.3.13"
+ "@types/react-dom" "16.0.4"
+ "@types/react-scroll" "0.0.31"
+ basscss "8.0.4"
+ is-mobile "0.2.2"
+ lodash "4.17.10"
+ material-ui "0.17.4"
+ react "15.6.1"
+ react-dom "15.6.1"
+ react-highlight "0xproject/react-highlight"
+ react-markdown "3.2.2"
+ react-scroll "1.7.7"
+ react-tap-event-plugin "2.0.1"
+
+"@0xproject/sol-compiler@^0.5.3", "@0xproject/sol-compiler@^0.5.4":
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/@0xproject/sol-compiler/-/sol-compiler-0.5.4.tgz#3e0b04b0c02c5ec046ebb962b5ed20978c6b4cdd"
+ dependencies:
+ "@0xproject/json-schemas" "^0.8.3"
+ "@0xproject/sol-resolver" "^0.0.8"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ "@types/yargs" "10.0.2"
+ chalk "2.3.2"
+ ethereumjs-util "5.1.5"
+ isomorphic-fetch "2.2.1"
+ lodash "4.17.10"
+ mkdirp "0.5.1"
+ require-from-string "2.0.1"
+ semver "5.5.0"
+ solc "0.4.23"
+ web3 "0.20.6"
+ web3-eth-abi "1.0.0-beta.33"
+ yargs "11.1.0"
+
+"@0xproject/sol-resolver@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@0xproject/sol-resolver/-/sol-resolver-0.0.8.tgz#5496ccebc9afa9eedfb5b62104f6478aa852bf66"
+ dependencies:
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.0.3"
+ lodash "4.17.10"
+
"@0xproject/types@^0.5.0":
version "0.5.0"
resolved "https://registry.yarnpkg.com/@0xproject/types/-/types-0.5.0.tgz#ba3cfbc11a8c6344b57c9680aa7df2ea84b9bf05"
dependencies:
bignumber.js "~4.1.0"
-"@0xproject/types@^0.8.1":
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/@0xproject/types/-/types-0.8.1.tgz#ba436a1054d2ac6362bb0668611af4f52402a54e"
- dependencies:
- "@types/node" "9.6.0"
- bignumber.js "~4.1.0"
-
-"@0xproject/types@^0.8.2":
+"@0xproject/types@^0.8.1", "@0xproject/types@^0.8.2":
version "0.8.2"
resolved "https://registry.yarnpkg.com/@0xproject/types/-/types-0.8.2.tgz#6f936b73bfb6f017b5102002d97da0881da92d1b"
dependencies:
@@ -184,6 +292,39 @@
"@0xproject/types" "^0.5.0"
bignumber.js "~4.1.0"
+"@0xproject/typescript-typings@^0.4.1", "@0xproject/typescript-typings@^0.4.2", "@0xproject/typescript-typings@^0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/typescript-typings/-/typescript-typings-0.4.3.tgz#f99f939a43f2764ad7182fcd78a71212a1d76d96"
+ dependencies:
+ "@0xproject/types" "^0.8.2"
+ bignumber.js "~4.1.0"
+ ethereum-types "^0.0.2"
+
+"@0xproject/utils@^0.7.1", "@0xproject/utils@^0.7.2", "@0xproject/utils@^0.7.3":
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/utils/-/utils-0.7.3.tgz#ffa7c6da9bf0dd3e13694f185dcfc48a8981ff05"
+ dependencies:
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@types/node" "9.6.0"
+ bignumber.js "~4.1.0"
+ ethereum-types "^0.0.2"
+ ethereumjs-util "^5.1.1"
+ ethers "3.0.22"
+ js-sha3 "0.7.0"
+ lodash "4.17.10"
+ web3 "0.20.6"
+
+"@0xproject/web3-wrapper@^0.7.1", "@0xproject/web3-wrapper@^0.7.2", "@0xproject/web3-wrapper@^0.7.3":
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/web3-wrapper/-/web3-wrapper-0.7.3.tgz#9bd50b034b92fd505b6766b6e225f014b6d08b08"
+ dependencies:
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ ethers "3.0.22"
+ lodash "4.17.10"
+ web3 "0.20.6"
+
"@ledgerhq/hw-app-eth@^4.3.0":
version "4.7.3"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-4.7.3.tgz#d352e19658ae296532e522c53c8ec2a1a77b64e5"
@@ -210,6 +351,468 @@
dependencies:
events "^2.0.0"
+"@lerna/add@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.0.0-beta.21.tgz#5634492930b5f97eca3775b85f39f9e382680425"
+ dependencies:
+ "@lerna/bootstrap" "^3.0.0-beta.21"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/filter-options" "^3.0.0-beta.18"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ dedent "^0.7.0"
+ npm-package-arg "^6.0.0"
+ p-map "^1.2.0"
+ package-json "^4.0.1"
+ semver "^5.5.0"
+
+"@lerna/batch-packages@^3.0.0-beta.18":
+ version "3.0.0-beta.18"
+ resolved "https://registry.yarnpkg.com/@lerna/batch-packages/-/batch-packages-3.0.0-beta.18.tgz#69d5e3f5003e454a1615c38d9f0b65b10853625a"
+ dependencies:
+ "@lerna/package-graph" "^3.0.0-beta.18"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ npmlog "^4.1.2"
+
+"@lerna/bootstrap@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.0.0-beta.21.tgz#de9233d0c7f9881bc7c27948e515f34d47f27710"
+ dependencies:
+ "@lerna/batch-packages" "^3.0.0-beta.18"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/filter-options" "^3.0.0-beta.18"
+ "@lerna/npm-conf" "^3.0.0-beta.19"
+ "@lerna/npm-install" "^3.0.0-beta.21"
+ "@lerna/rimraf-dir" "^3.0.0-beta.21"
+ "@lerna/run-lifecycle" "^3.0.0-beta.0"
+ "@lerna/run-parallel-batches" "^3.0.0-beta.0"
+ "@lerna/symlink-binary" "^3.0.0-beta.17"
+ "@lerna/symlink-dependencies" "^3.0.0-beta.17"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ dedent "^0.7.0"
+ get-port "^3.2.0"
+ multimatch "^2.1.0"
+ npm-package-arg "^6.0.0"
+ npmlog "^4.1.2"
+ p-finally "^1.0.0"
+ p-map "^1.2.0"
+ p-map-series "^1.0.0"
+ p-waterfall "^1.0.0"
+ read-package-tree "^5.1.6"
+ semver "^5.5.0"
+
+"@lerna/changed@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.0.0-beta.21.tgz#e768dba7573dbc9cfb96c4f47ae9efcec4cb5d65"
+ dependencies:
+ "@lerna/collect-updates" "^3.0.0-beta.21"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/output" "^3.0.0-beta.0"
+ "@lerna/publish" "^3.0.0-beta.21"
+ chalk "^2.3.1"
+
+"@lerna/child-process@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-3.0.0-beta.21.tgz#9fb32cb79ee75bf0806141bac5fc64bb38aa2dbd"
+ dependencies:
+ chalk "^2.3.1"
+ execa "^0.10.0"
+ strong-log-transformer "^1.0.6"
+
+"@lerna/clean@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.0.0-beta.21.tgz#e31ff8edce00fe6eea9fb68e6057630392da1f1e"
+ dependencies:
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/filter-options" "^3.0.0-beta.18"
+ "@lerna/prompt" "^3.0.0-beta.0"
+ "@lerna/rimraf-dir" "^3.0.0-beta.21"
+ p-map "^1.2.0"
+ p-map-series "^1.0.0"
+ p-waterfall "^1.0.0"
+
+"@lerna/cli@^3.0.0-beta.14":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.0.0-beta.21.tgz#ba4cd8512a851fedcdd45028d05c9e739ebc6feb"
+ dependencies:
+ "@lerna/add" "^3.0.0-beta.21"
+ "@lerna/bootstrap" "^3.0.0-beta.21"
+ "@lerna/changed" "^3.0.0-beta.21"
+ "@lerna/clean" "^3.0.0-beta.21"
+ "@lerna/create" "^3.0.0-beta.21"
+ "@lerna/diff" "^3.0.0-beta.21"
+ "@lerna/exec" "^3.0.0-beta.21"
+ "@lerna/global-options" "^3.0.0-beta.13"
+ "@lerna/import" "^3.0.0-beta.21"
+ "@lerna/init" "^3.0.0-beta.21"
+ "@lerna/link" "^3.0.0-beta.21"
+ "@lerna/list" "^3.0.0-beta.21"
+ "@lerna/publish" "^3.0.0-beta.21"
+ "@lerna/run" "^3.0.0-beta.21"
+ dedent "^0.7.0"
+ is-ci "^1.0.10"
+ npmlog "^4.1.2"
+ yargs "^11.0.0"
+
+"@lerna/collect-packages@^3.0.0-beta.17":
+ version "3.0.0-beta.17"
+ resolved "https://registry.yarnpkg.com/@lerna/collect-packages/-/collect-packages-3.0.0-beta.17.tgz#c4965df6328e191947dbcaa37c8c76ac89b515f8"
+ dependencies:
+ "@lerna/package" "^3.0.0-beta.17"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ globby "^8.0.1"
+ load-json-file "^4.0.0"
+ p-map "^1.2.0"
+
+"@lerna/collect-updates@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.0.0-beta.21.tgz#92d165476e586222e6edd5d3b61c26e838ccd7ee"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ minimatch "^3.0.4"
+ npmlog "^4.1.2"
+ semver "^5.5.0"
+ slash "^1.0.0"
+
+"@lerna/command@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.0.0-beta.21.tgz#da4d3895e4ad458ffc2c8508156762785bcabc41"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/collect-packages" "^3.0.0-beta.17"
+ "@lerna/collect-updates" "^3.0.0-beta.21"
+ "@lerna/filter-packages" "^3.0.0-beta.10"
+ "@lerna/package-graph" "^3.0.0-beta.18"
+ "@lerna/project" "^3.0.0-beta.20"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ "@lerna/write-log-file" "^3.0.0-beta.0"
+ dedent "^0.7.0"
+ execa "^0.10.0"
+ lodash "^4.17.5"
+ npmlog "^4.1.2"
+
+"@lerna/conventional-commits@^3.0.0-beta.15":
+ version "3.0.0-beta.15"
+ resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.0.0-beta.15.tgz#42536ec435a20016205a0d30a683692bc1b93c98"
+ dependencies:
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ conventional-changelog-angular "^1.6.6"
+ conventional-changelog-core "^2.0.5"
+ conventional-recommended-bump "^2.0.6"
+ dedent "^0.7.0"
+ fs-extra "^5.0.0"
+ get-stream "^3.0.0"
+ npm-package-arg "^6.0.0"
+ npmlog "^4.1.2"
+ semver "^5.5.0"
+
+"@lerna/create-symlink@^3.0.0-beta.0":
+ version "3.0.0-beta.0"
+ resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-3.0.0-beta.0.tgz#99457b7f636d35a665a2de3cae79c2c45045a0df"
+ dependencies:
+ cmd-shim "^2.0.2"
+ fs-extra "^5.0.0"
+ npmlog "^4.1.2"
+
+"@lerna/create@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.0.0-beta.21.tgz#53d86397403c12f350c859e30e2a582aed16612e"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/npm-conf" "^3.0.0-beta.19"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ camelcase "^4.1.0"
+ dedent "^0.7.0"
+ fs-extra "^5.0.0"
+ globby "^8.0.1"
+ init-package-json "^1.10.3"
+ npm-package-arg "^6.0.0"
+ pify "^3.0.0"
+ semver "^5.5.0"
+ slash "^1.0.0"
+ validate-npm-package-license "^3.0.3"
+ validate-npm-package-name "^3.0.0"
+
+"@lerna/diff@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.0.0-beta.21.tgz#39c5842b425135e8d6cffbe0eb2e7a1a08faf048"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ npmlog "^4.1.2"
+
+"@lerna/exec@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.0.0-beta.21.tgz#5bbdd1b1ed22c42224f1ed21fe0873003182b0ec"
+ dependencies:
+ "@lerna/batch-packages" "^3.0.0-beta.18"
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/filter-options" "^3.0.0-beta.18"
+ "@lerna/run-parallel-batches" "^3.0.0-beta.0"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+
+"@lerna/filter-options@^3.0.0-beta.18":
+ version "3.0.0-beta.18"
+ resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.0.0-beta.18.tgz#f4014951ec7f58446ee0e29c0fb62c553433530a"
+ dependencies:
+ dedent "^0.7.0"
+
+"@lerna/filter-packages@^3.0.0-beta.10":
+ version "3.0.0-beta.10"
+ resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.0.0-beta.10.tgz#793a9f53964d2a1e2292fec63a2d337a559b7a78"
+ dependencies:
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ multimatch "^2.1.0"
+ npmlog "^4.1.2"
+
+"@lerna/get-npm-exec-opts@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.0.0-beta.21.tgz#ca2c721411a95ee3c1fb0292ebd89d1855706557"
+ dependencies:
+ npmlog "^4.1.2"
+
+"@lerna/global-options@^3.0.0-beta.13":
+ version "3.0.0-beta.13"
+ resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.0.0-beta.13.tgz#4ca84443056f0dce3f4a55528ad5345237675f3a"
+
+"@lerna/import@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.0.0-beta.21.tgz#a459988605986c75e017f45d4657d47e0aefc0b1"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/prompt" "^3.0.0-beta.0"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ dedent "^0.7.0"
+ fs-extra "^5.0.0"
+ p-map-series "^1.0.0"
+
+"@lerna/init@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.0.0-beta.21.tgz#7cf225b7d2add644fc262408df8cd5c9861c81bb"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/command" "^3.0.0-beta.21"
+ fs-extra "^5.0.0"
+ p-map "^1.2.0"
+ write-json-file "^2.3.0"
+
+"@lerna/link@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.0.0-beta.21.tgz#5fd5435092e17a0e558a81b5b0c2422486232ba3"
+ dependencies:
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/package-graph" "^3.0.0-beta.18"
+ "@lerna/symlink-dependencies" "^3.0.0-beta.17"
+ p-map "^1.2.0"
+ slash "^1.0.0"
+
+"@lerna/list@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.0.0-beta.21.tgz#840866592a6460302a4587da3aa4e5d3850eb8b9"
+ dependencies:
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/filter-options" "^3.0.0-beta.18"
+ "@lerna/output" "^3.0.0-beta.0"
+ chalk "^2.3.1"
+ columnify "^1.5.4"
+
+"@lerna/npm-conf@^3.0.0-beta.19":
+ version "3.0.0-beta.19"
+ resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.0.0-beta.19.tgz#957f164a33e958e60a1c1c70a2879e9fa1bb08b2"
+ dependencies:
+ config-chain "^1.1.11"
+ pify "^3.0.0"
+
+"@lerna/npm-dist-tag@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.0.0-beta.21.tgz#c15a2dc7c57d3f50b590b206e0ebb66d4eb47a7f"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/get-npm-exec-opts" "^3.0.0-beta.21"
+ npmlog "^4.1.2"
+
+"@lerna/npm-install@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.0.0-beta.21.tgz#726057f1bd684ad9fa6f87a70d9c246b966e7491"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/get-npm-exec-opts" "^3.0.0-beta.21"
+ fs-extra "^5.0.0"
+ npm-package-arg "^6.0.0"
+ npmlog "^4.1.2"
+ signal-exit "^3.0.2"
+ write-pkg "^3.1.0"
+
+"@lerna/npm-publish@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.0.0-beta.21.tgz#25a65820a6036c72fb37c914fa0fb2d615346e1d"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/get-npm-exec-opts" "^3.0.0-beta.21"
+ npmlog "^4.1.2"
+
+"@lerna/npm-run-script@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.0.0-beta.21.tgz#8f45cbee40061946942a5184f09a2b086c41fe0b"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/get-npm-exec-opts" "^3.0.0-beta.21"
+ npmlog "^4.1.2"
+
+"@lerna/output@^3.0.0-beta.0":
+ version "3.0.0-beta.0"
+ resolved "https://registry.yarnpkg.com/@lerna/output/-/output-3.0.0-beta.0.tgz#0fba8a24f425ac6705b4949ab90f74aae05955bc"
+ dependencies:
+ npmlog "^4.1.2"
+
+"@lerna/package-graph@^3.0.0-beta.18":
+ version "3.0.0-beta.18"
+ resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.0.0-beta.18.tgz#8c33a6a10453d310e14fc9d317dc51e845e11963"
+ dependencies:
+ npm-package-arg "^6.0.0"
+ semver "^5.5.0"
+
+"@lerna/package@^3.0.0-beta.17":
+ version "3.0.0-beta.17"
+ resolved "https://registry.yarnpkg.com/@lerna/package/-/package-3.0.0-beta.17.tgz#ccc833926ddfce5cac6194d2e6b415899a8e753e"
+ dependencies:
+ npm-package-arg "^6.0.0"
+ write-pkg "^3.1.0"
+
+"@lerna/project@^3.0.0-beta.20":
+ version "3.0.0-beta.20"
+ resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.0.0-beta.20.tgz#27a0330b7b13d8eebe9266f03eb60de94b15c86d"
+ dependencies:
+ "@lerna/package" "^3.0.0-beta.17"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ cosmiconfig "^5.0.2"
+ dedent "^0.7.0"
+ dot-prop "^4.2.0"
+ glob-parent "^3.1.0"
+ load-json-file "^4.0.0"
+ npmlog "^4.1.2"
+ resolve-from "^4.0.0"
+ write-json-file "^2.3.0"
+
+"@lerna/prompt@^3.0.0-beta.0":
+ version "3.0.0-beta.0"
+ resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.0.0-beta.0.tgz#f1baa4d1fe30eef4cf3f2add49aac917cfc1368b"
+ dependencies:
+ inquirer "^5.1.0"
+ npmlog "^4.1.2"
+
+"@lerna/publish@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.0.0-beta.21.tgz#8d2563793ba5b2e8f9914e799746b5a711adbc5f"
+ dependencies:
+ "@lerna/batch-packages" "^3.0.0-beta.18"
+ "@lerna/child-process" "^3.0.0-beta.21"
+ "@lerna/collect-updates" "^3.0.0-beta.21"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/conventional-commits" "^3.0.0-beta.15"
+ "@lerna/npm-conf" "^3.0.0-beta.19"
+ "@lerna/npm-dist-tag" "^3.0.0-beta.21"
+ "@lerna/npm-publish" "^3.0.0-beta.21"
+ "@lerna/output" "^3.0.0-beta.0"
+ "@lerna/prompt" "^3.0.0-beta.0"
+ "@lerna/run-lifecycle" "^3.0.0-beta.0"
+ "@lerna/run-parallel-batches" "^3.0.0-beta.0"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ chalk "^2.3.1"
+ dedent "^0.7.0"
+ minimatch "^3.0.4"
+ npmlog "^4.1.2"
+ p-finally "^1.0.0"
+ p-map "^1.2.0"
+ p-reduce "^1.0.0"
+ p-waterfall "^1.0.0"
+ semver "^5.5.0"
+ slash "^1.0.0"
+ temp-write "^3.4.0"
+ write-json-file "^2.3.0"
+
+"@lerna/resolve-symlink@^3.0.0-beta.0":
+ version "3.0.0-beta.0"
+ resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.0.0-beta.0.tgz#ca170d8190acf915c5160dc19111543989191987"
+ dependencies:
+ fs-extra "^5.0.0"
+ npmlog "^4.1.2"
+ read-cmd-shim "^1.0.1"
+
+"@lerna/rimraf-dir@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.0.0-beta.21.tgz#006b4e61e8d76e369e3749936862fb182def1dff"
+ dependencies:
+ "@lerna/child-process" "^3.0.0-beta.21"
+ npmlog "^4.1.2"
+ path-exists "^3.0.0"
+ rimraf "^2.6.2"
+
+"@lerna/run-lifecycle@^3.0.0-beta.0":
+ version "3.0.0-beta.0"
+ resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.0.0-beta.0.tgz#b30442df543dcfafa863c854c2d7338fe3bd13b3"
+ dependencies:
+ npm-lifecycle "^2.0.0"
+ npmlog "^4.1.2"
+
+"@lerna/run-parallel-batches@^3.0.0-beta.0":
+ version "3.0.0-beta.0"
+ resolved "https://registry.yarnpkg.com/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0-beta.0.tgz#24d69314ad0fd6fa65c70d239b4f2ccdd08a2eeb"
+ dependencies:
+ p-map "^1.2.0"
+ p-map-series "^1.0.0"
+
+"@lerna/run@^3.0.0-beta.21":
+ version "3.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.0.0-beta.21.tgz#f7fce5d1b1043a48b0bf33a7565527ee6e26061e"
+ dependencies:
+ "@lerna/batch-packages" "^3.0.0-beta.18"
+ "@lerna/command" "^3.0.0-beta.21"
+ "@lerna/filter-options" "^3.0.0-beta.18"
+ "@lerna/npm-run-script" "^3.0.0-beta.21"
+ "@lerna/output" "^3.0.0-beta.0"
+ "@lerna/run-parallel-batches" "^3.0.0-beta.0"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ p-map "^1.2.0"
+
+"@lerna/symlink-binary@^3.0.0-beta.17":
+ version "3.0.0-beta.17"
+ resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.0.0-beta.17.tgz#e0be4394ee4e828a496aa8b9f8f48084ed7cb0f3"
+ dependencies:
+ "@lerna/create-symlink" "^3.0.0-beta.0"
+ "@lerna/package" "^3.0.0-beta.17"
+ fs-extra "^5.0.0"
+ p-map "^1.2.0"
+ read-pkg "^3.0.0"
+
+"@lerna/symlink-dependencies@^3.0.0-beta.17":
+ version "3.0.0-beta.17"
+ resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.0.0-beta.17.tgz#82d3f2d5b76606772773d306e7640fcf309b8c56"
+ dependencies:
+ "@lerna/create-symlink" "^3.0.0-beta.0"
+ "@lerna/resolve-symlink" "^3.0.0-beta.0"
+ "@lerna/symlink-binary" "^3.0.0-beta.17"
+ fs-extra "^5.0.0"
+ p-finally "^1.0.0"
+ p-map "^1.2.0"
+ p-map-series "^1.0.0"
+
+"@lerna/validation-error@^3.0.0-beta.10":
+ version "3.0.0-beta.10"
+ resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.0.0-beta.10.tgz#cf5cbc39c4d27b89c6080e326de745f6fb7451ab"
+ dependencies:
+ npmlog "^4.1.2"
+
+"@lerna/write-log-file@^3.0.0-beta.0":
+ version "3.0.0-beta.0"
+ resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-3.0.0-beta.0.tgz#e128fee7cd7cb218ed767598ac45c6d2db5c6c89"
+ dependencies:
+ npmlog "^4.1.2"
+ write-file-atomic "^2.3.0"
+
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@@ -478,6 +1081,13 @@
dependencies:
"@types/react" "*"
+"@types/react-dom@16.0.4":
+ version "16.0.4"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.4.tgz#2e8fd45f5443780ed49bf2cdd9809e6091177a7d"
+ dependencies:
+ "@types/node" "*"
+ "@types/react" "*"
+
"@types/react-dom@^16.0.3":
version "16.0.5"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.5.tgz#a757457662e3819409229e8f86795ff37b371f96"
@@ -598,7 +1208,7 @@
"@types/events" "*"
"@types/node" "*"
-"@types/yargs@^10.0.0":
+"@types/yargs@10.0.2", "@types/yargs@^10.0.0":
version "10.0.2"
resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-10.0.2.tgz#cc4ea921877874d1261e2c44b89807bc836e1b12"
@@ -621,6 +1231,10 @@ abbrev@1.0.x:
version "1.0.9"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
+abortcontroller-polyfill@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.1.9.tgz#9fefe359fda2e9e0932dc85e6106453ac393b2da"
+
abstract-leveldown@0.12.3:
version "0.12.3"
resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.3.tgz#116b1ec5c7710ef7a2d5706768bbdb4440be1070"
@@ -690,10 +1304,6 @@ acorn@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
-add-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
-
aes-js@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
@@ -948,7 +1558,7 @@ arrify@^1.0.0, arrify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
-asap@~2.0.3:
+asap@^2.0.0, asap@~2.0.3:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
@@ -1811,7 +2421,7 @@ basscss-typography@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/basscss-typography/-/basscss-typography-3.0.4.tgz#ec946a2bad8dd1af97be9ea108ad4bb7be932464"
-basscss@^8.0.3:
+basscss@8.0.4, basscss@^8.0.3:
version "8.0.4"
resolved "https://registry.yarnpkg.com/basscss/-/basscss-8.0.4.tgz#b371a2ce25aeb9b322302f37f4e425753dd29ae1"
dependencies:
@@ -2234,6 +2844,10 @@ builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+builtins@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
+
byline@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
@@ -2424,6 +3038,14 @@ chain-function@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
+chalk@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -2762,10 +3384,6 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
-command-join@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/command-join/-/command-join-2.0.0.tgz#52e8b984f4872d952ff1bdc8b98397d27c7144cf"
-
commander@2.11.0:
version "2.11.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
@@ -2778,7 +3396,7 @@ commander@2.13.0, commander@~2.13.0:
version "2.13.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
-commander@2.15.1, commander@^2.12.1, commander@^2.8.1, commander@^2.9.0:
+commander@2.15.1, commander@^2.12.1, commander@^2.8.1:
version "2.15.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
@@ -2829,7 +3447,7 @@ concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-concat-stream@^1.4.10, concat-stream@^1.5.0:
+concat-stream@^1.5.0:
version "1.6.1"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26"
dependencies:
@@ -2846,6 +3464,13 @@ concat-stream@^1.5.1, concat-stream@^1.6.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
+config-chain@^1.1.11:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2"
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
configstore@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
@@ -2890,29 +3515,7 @@ conventional-changelog-angular@^1.6.6:
compare-func "^1.3.1"
q "^1.5.1"
-conventional-changelog-atom@^0.2.8:
- version "0.2.8"
- resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz#8037693455990e3256f297320a45fa47ee553a14"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-cli@^1.3.13:
- version "1.3.22"
- resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.22.tgz#13570fe1728f56f013ff7a88878ff49d5162a405"
- dependencies:
- add-stream "^1.0.0"
- conventional-changelog "^1.1.24"
- lodash "^4.2.1"
- meow "^4.0.0"
- tempfile "^1.1.1"
-
-conventional-changelog-codemirror@^0.3.8:
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz#a1982c8291f4ee4d6f2f62817c6b2ecd2c4b7b47"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-core@^2.0.11:
+conventional-changelog-core@^2.0.5:
version "2.0.11"
resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz#19b5fbd55a9697773ed6661f4e32030ed7e30287"
dependencies:
@@ -2930,43 +3533,6 @@ conventional-changelog-core@^2.0.11:
read-pkg-up "^1.0.1"
through2 "^2.0.0"
-conventional-changelog-ember@^0.3.12:
- version "0.3.12"
- resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz#b7d31851756d0fcb49b031dffeb6afa93b202400"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-eslint@^1.0.9:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz#b13cc7e4b472c819450ede031ff1a75c0e3d07d3"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-express@^0.3.6:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz#4a6295cb11785059fb09202180d0e59c358b9c2c"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-jquery@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510"
- dependencies:
- q "^1.4.1"
-
-conventional-changelog-jscs@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c"
- dependencies:
- q "^1.4.1"
-
-conventional-changelog-jshint@^0.3.8:
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz#9051c1ac0767abaf62a31f74d2fe8790e8acc6c8"
- dependencies:
- compare-func "^1.3.1"
- q "^1.5.1"
-
conventional-changelog-preset-loader@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz#40bb0f142cd27d16839ec6c74ee8db418099b373"
@@ -2986,30 +3552,14 @@ conventional-changelog-writer@^3.0.9:
split "^1.0.0"
through2 "^2.0.0"
-conventional-changelog@^1.1.24:
- version "1.1.24"
- resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.24.tgz#3d94c29c960f5261c002678315b756cdd3d7d1f0"
- dependencies:
- conventional-changelog-angular "^1.6.6"
- conventional-changelog-atom "^0.2.8"
- conventional-changelog-codemirror "^0.3.8"
- conventional-changelog-core "^2.0.11"
- conventional-changelog-ember "^0.3.12"
- conventional-changelog-eslint "^1.0.9"
- conventional-changelog-express "^0.3.6"
- conventional-changelog-jquery "^0.1.0"
- conventional-changelog-jscs "^0.1.0"
- conventional-changelog-jshint "^0.3.8"
- conventional-changelog-preset-loader "^1.1.8"
-
-conventional-commits-filter@^1.1.1, conventional-commits-filter@^1.1.6:
+conventional-commits-filter@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz#4389cd8e58fe89750c0b5fb58f1d7f0cc8ad3831"
dependencies:
is-subset "^0.1.1"
modify-values "^1.0.0"
-conventional-commits-parser@^2.1.1, conventional-commits-parser@^2.1.7:
+conventional-commits-parser@^2.1.7:
version "2.1.7"
resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz#eca45ed6140d72ba9722ee4132674d639e644e8e"
dependencies:
@@ -3021,17 +3571,18 @@ conventional-commits-parser@^2.1.1, conventional-commits-parser@^2.1.7:
through2 "^2.0.0"
trim-off-newlines "^1.0.0"
-conventional-recommended-bump@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz#1b7137efb5091f99fe009e2fe9ddb7cc490e9375"
+conventional-recommended-bump@^2.0.6:
+ version "2.0.9"
+ resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-2.0.9.tgz#7392421e7d0e3515f3df2040572a23cc73a68a93"
dependencies:
- concat-stream "^1.4.10"
- conventional-commits-filter "^1.1.1"
- conventional-commits-parser "^2.1.1"
- git-raw-commits "^1.3.0"
- git-semver-tags "^1.3.0"
- meow "^3.3.0"
- object-assign "^4.0.1"
+ concat-stream "^1.6.0"
+ conventional-changelog-preset-loader "^1.1.8"
+ conventional-commits-filter "^1.1.6"
+ conventional-commits-parser "^2.1.7"
+ git-raw-commits "^1.3.6"
+ git-semver-tags "^1.3.6"
+ meow "^4.0.0"
+ q "^1.5.1"
convert-source-map@^1.5.0, convert-source-map@^1.5.1:
version "1.5.1"
@@ -3124,6 +3675,14 @@ cors@^2.8.1:
object-assign "^4"
vary "^1"
+cosmiconfig@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.5.tgz#a809e3c2306891ce17ab70359dc8bdf661fe2cd0"
+ dependencies:
+ is-directory "^0.3.1"
+ js-yaml "^3.9.0"
+ parse-json "^4.0.0"
+
coveralls@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99"
@@ -3205,7 +3764,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@^6.0.4, cross-spawn@^6.0.5:
+cross-spawn@^6.0.0, cross-spawn@^6.0.4, cross-spawn@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
dependencies:
@@ -3466,6 +4025,10 @@ debug@3.1.0, debug@^3.1.0:
dependencies:
ms "2.0.0"
+debuglog@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
+
decache@^3.0.5:
version "3.1.0"
resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da"
@@ -3735,6 +4298,13 @@ detect-node@2.0.3, detect-node@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
+dezalgo@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
+ dependencies:
+ asap "^2.0.0"
+ wrappy "1"
+
diff@3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75"
@@ -3838,7 +4408,7 @@ dot-prop@^3.0.0:
dependencies:
is-obj "^1.0.0"
-dot-prop@^4.1.0:
+dot-prop@^4.1.0, dot-prop@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
dependencies:
@@ -4374,9 +4944,23 @@ ethereum-common@^0.0.18:
version "0.0.18"
resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
-ethereumjs-abi@0.6.5, ethereumjs-abi@^0.6.4, "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
+ethereum-types@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/ethereum-types/-/ethereum-types-0.0.2.tgz#6ef6faf46a24697cbf66b6c8a0ecf2095ce58c38"
+ dependencies:
+ "@types/node" "^8.0.53"
+ bignumber.js "~4.1.0"
+
+ethereumjs-abi@0.6.5:
version "0.6.5"
- resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#4ea2fdfed09e8f99117d9362d17c6b01b64a2bcf"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
+ dependencies:
+ bn.js "^4.10.0"
+ ethereumjs-util "^4.3.0"
+
+"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
+ version "0.6.5"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7"
dependencies:
bn.js "^4.10.0"
ethereumjs-util "^5.0.0"
@@ -4450,7 +5034,7 @@ ethereumjs-util@5.1.5, ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumj
safe-buffer "^5.1.1"
secp256k1 "^3.0.1"
-ethereumjs-util@^4.0.1, ethereumjs-util@^4.4.0:
+ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0, ethereumjs-util@^4.4.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6"
dependencies:
@@ -4518,7 +5102,6 @@ ethereumjs-wallet@~0.6.0:
ethers@0xproject/ethers.js#eip-838-reasons, ethers@3.0.22:
version "3.0.18"
- uid b91342bd200d142af0165d6befddf783c8ae8447
resolved "https://codeload.github.com/0xproject/ethers.js/tar.gz/b91342bd200d142af0165d6befddf783c8ae8447"
dependencies:
aes-js "3.0.0"
@@ -4614,11 +5197,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
md5.js "^1.3.4"
safe-buffer "^5.1.1"
-execa@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+execa@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
dependencies:
- cross-spawn "^5.0.1"
+ cross-spawn "^6.0.0"
get-stream "^3.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
@@ -4626,9 +5209,9 @@ execa@^0.7.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
-execa@^0.8.0:
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
dependencies:
cross-spawn "^5.0.1"
get-stream "^3.0.0"
@@ -5131,7 +5714,7 @@ fs-extra@^2.0.0, fs-extra@^2.1.2:
graceful-fs "^4.1.2"
jsonfile "^2.1.0"
-fs-extra@^4.0.0, fs-extra@^4.0.1:
+fs-extra@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
dependencies:
@@ -5343,7 +5926,7 @@ ghauth@^2.0.0:
read "~1.0.5"
xtend "~4.0.0"
-git-raw-commits@^1.3.0, git-raw-commits@^1.3.6:
+git-raw-commits@^1.3.6:
version "1.3.6"
resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff"
dependencies:
@@ -5360,7 +5943,7 @@ git-remote-origin-url@^2.0.0:
gitconfiglocal "^1.0.0"
pify "^2.3.0"
-git-semver-tags@^1.3.0, git-semver-tags@^1.3.6:
+git-semver-tags@^1.3.6:
version "1.3.6"
resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.3.6.tgz#357ea01f7280794fe0927f2806bee6414d2caba5"
dependencies:
@@ -5960,10 +6543,14 @@ homedir-polyfill@^1.0.1:
dependencies:
parse-passwd "^1.0.0"
-hosted-git-info@^2.1.4, hosted-git-info@^2.5.0:
+hosted-git-info@^2.1.4:
version "2.6.0"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
+hosted-git-info@^2.6.0:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
hpack.js@^2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
@@ -6218,6 +6805,19 @@ ini@^1.3.2, ini@^1.3.4, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+init-package-json@^1.10.3:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe"
+ dependencies:
+ glob "^7.1.1"
+ npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0"
+ promzard "^0.3.0"
+ read "~1.0.1"
+ read-package-json "1 || 2"
+ semver "2.x || 3.x || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+ validate-npm-package-name "^3.0.0"
+
inline-style-prefixer@^3.0.2:
version "3.0.8"
resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534"
@@ -6238,7 +6838,7 @@ inquirer@^0.8.2:
rx "^2.4.3"
through "^2.3.6"
-inquirer@^3.0.6, inquirer@^3.2.2:
+inquirer@^3.0.6:
version "3.3.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
dependencies:
@@ -6425,6 +7025,10 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
is-data-descriptor "^1.0.0"
kind-of "^6.0.2"
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
is-dotfile@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
@@ -6510,7 +7114,7 @@ is-installed-globally@^0.1.0:
global-dirs "^0.1.0"
is-path-inside "^1.0.0"
-is-mobile@^0.2.2:
+is-mobile@0.2.2, is-mobile@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-0.2.2.tgz#0e2e006d99ed2c2155b761df80f2a3619ae2ad9f"
@@ -6847,7 +7451,7 @@ js-yaml@3.x, js-yaml@^3.4.2, js-yaml@^3.6.1, js-yaml@^3.7.0:
argparse "^1.0.7"
esprima "^4.0.0"
-js-yaml@^3.9.1:
+js-yaml@^3.9.0, js-yaml@^3.9.1:
version "3.12.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
dependencies:
@@ -7112,53 +7716,13 @@ lead@^1.0.0:
dependencies:
flush-write-stream "^1.0.2"
-lerna-get-packages@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lerna-get-packages/-/lerna-get-packages-1.0.0.tgz#60fa309a71cf2e34eec63224368de2fe8f61ba65"
-
-lerna@^2.5.1:
- version "2.10.2"
- resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.10.2.tgz#3a0d54d398360fecc5918207c6d7ab68a5443d9f"
+lerna@3.0.0-beta.14:
+ version "3.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.0.0-beta.14.tgz#1ebada4f95fa5ae828caf88f3da80b888d43f1bc"
dependencies:
- async "^1.5.0"
- chalk "^2.1.0"
- cmd-shim "^2.0.2"
- columnify "^1.5.4"
- command-join "^2.0.0"
- conventional-changelog-cli "^1.3.13"
- conventional-recommended-bump "^1.2.1"
- dedent "^0.7.0"
- execa "^0.8.0"
- find-up "^2.1.0"
- fs-extra "^4.0.1"
- get-port "^3.2.0"
- glob "^7.1.2"
- glob-parent "^3.1.0"
- globby "^6.1.0"
- graceful-fs "^4.1.11"
- hosted-git-info "^2.5.0"
- inquirer "^3.2.2"
- is-ci "^1.0.10"
- load-json-file "^4.0.0"
- lodash "^4.17.4"
- minimatch "^3.0.4"
+ "@lerna/cli" "^3.0.0-beta.14"
+ import-local "^1.0.0"
npmlog "^4.1.2"
- p-finally "^1.0.0"
- package-json "^4.0.1"
- path-exists "^3.0.0"
- read-cmd-shim "^1.0.1"
- read-pkg "^3.0.0"
- rimraf "^2.6.1"
- safe-buffer "^5.1.1"
- semver "^5.4.1"
- signal-exit "^3.0.2"
- slash "^1.0.0"
- strong-log-transformer "^1.0.6"
- temp-write "^3.3.0"
- write-file-atomic "^2.3.0"
- write-json-file "^2.2.0"
- write-pkg "^3.1.0"
- yargs "^8.0.2"
less-loader@^2.2.3:
version "2.2.3"
@@ -7747,7 +8311,7 @@ marked@^0.3.12, marked@^0.3.5:
version "0.3.19"
resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
-material-ui@^0.17.1:
+material-ui@0.17.4, material-ui@^0.17.1:
version "0.17.4"
resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-0.17.4.tgz#193999ecb49c3ec15ae0abb4e90fdf9a7bd343e0"
dependencies:
@@ -8157,7 +8721,7 @@ multicast-dns@^6.0.1:
dns-packet "^1.3.1"
thunky "^1.0.2"
-multimatch@^2.0.0:
+multimatch@^2.0.0, multimatch@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
dependencies:
@@ -8188,7 +8752,7 @@ mz@^2.6.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
-nan@>=2.5.1, nan@^2.0.5, nan@^2.0.8, nan@^2.2.1, nan@^2.3.0, nan@^2.3.3, nan@^2.6.2:
+nan@2.10.0, nan@>=2.5.1, nan@^2.0.8, nan@^2.2.1, nan@^2.3.0, nan@^2.3.3, nan@^2.6.2:
version "2.10.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
@@ -8317,6 +8881,23 @@ node-forge@0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300"
+node-gyp@^3.6.2:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203"
+ dependencies:
+ fstream "^1.0.0"
+ glob "^7.0.3"
+ graceful-fs "^4.1.2"
+ mkdirp "^0.5.0"
+ nopt "2 || 3"
+ npmlog "0 || 1 || 2 || 3 || 4"
+ osenv "0"
+ request ">=2.9.0 <2.82.0"
+ rimraf "2"
+ semver "~5.3.0"
+ tar "^2.0.0"
+ which "1"
+
node-hid@^0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-0.7.2.tgz#15025cdea2e9756aca2de7266529996d40e52c56"
@@ -8412,7 +8993,7 @@ noop-logger@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
-nopt@3.x:
+"nopt@2 || 3", nopt@3.x:
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
dependencies:
@@ -8431,7 +9012,7 @@ nopt@~1.0.10:
dependencies:
abbrev "1"
-normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5:
+normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5:
version "2.4.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
dependencies:
@@ -8473,7 +9054,29 @@ now-and-later@^2.0.0:
dependencies:
once "^1.3.2"
-npm-run-all@4.1.3, npm-run-all@^4.1.2:
+npm-lifecycle@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.0.3.tgz#696bedf1143371163e9cc16fe872357e25d8d90e"
+ dependencies:
+ byline "^5.0.0"
+ graceful-fs "^4.1.11"
+ node-gyp "^3.6.2"
+ resolve-from "^4.0.0"
+ slide "^1.1.6"
+ uid-number "0.0.6"
+ umask "^1.1.0"
+ which "^1.3.0"
+
+"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1"
+ dependencies:
+ hosted-git-info "^2.6.0"
+ osenv "^0.1.5"
+ semver "^5.5.0"
+ validate-npm-package-name "^3.0.0"
+
+npm-run-all@^4.1.2:
version "4.1.3"
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.3.tgz#49f15b55a66bb4101664ce270cb18e7103f8f185"
dependencies:
@@ -8493,7 +9096,7 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
-npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
dependencies:
@@ -8775,7 +9378,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
-osenv@^0.1.4:
+osenv@0, osenv@^0.1.4, osenv@^0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
dependencies:
@@ -8820,7 +9423,13 @@ p-locate@^2.0.0:
dependencies:
p-limit "^1.1.0"
-p-map@^1.1.1:
+p-map-series@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
+ dependencies:
+ p-reduce "^1.0.0"
+
+p-map@^1.1.1, p-map@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
@@ -8844,6 +9453,12 @@ p-try@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+p-waterfall@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00"
+ dependencies:
+ p-reduce "^1.0.0"
+
package-json@^4.0.0, package-json@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
@@ -8875,6 +9490,17 @@ parse-asn1@^5.0.0:
evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3"
+parse-entities@^1.0.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.2.tgz#9eaf719b29dc3bd62246b4332009072e01527777"
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
parse-entities@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.1.tgz#8112d88471319f27abae4d64964b122fe4e1b890"
@@ -9617,6 +10243,12 @@ prompt@^1.0.0:
utile "0.3.x"
winston "2.1.x"
+promzard@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
+ dependencies:
+ read "1"
+
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1:
version "15.6.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
@@ -9629,6 +10261,10 @@ propagate@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/propagate/-/propagate-1.0.0.tgz#00c2daeedda20e87e3782b344adba1cddd6ad709"
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+
proxy-addr@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
@@ -9767,7 +10403,7 @@ punycode@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
-q@^1.1.2, q@^1.4.1, q@^1.5.1:
+q@^1.1.2, q@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@@ -9940,6 +10576,16 @@ react-is@^16.3.1:
version "16.4.0"
resolved "https://registry.npmjs.org/react-is/-/react-is-16.4.0.tgz#cc9fdc855ac34d2e7d9d2eb7059bbc240d35ffcf"
+react-markdown@3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-3.2.2.tgz#439774c14f25eb25d1b96c126f28ca1486fb0a24"
+ dependencies:
+ prop-types "^15.6.0"
+ remark-parse "^4.0.0"
+ unified "^6.1.5"
+ unist-util-visit "^1.1.3"
+ xtend "^4.0.1"
+
react-markdown@^3.2.2:
version "3.3.0"
resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-3.3.0.tgz#a87cdd822aa9302d6add9687961dd1a82a45d02e"
@@ -9995,6 +10641,13 @@ react-router@^4.2.0:
prop-types "^15.5.4"
warning "^3.0.0"
+react-scroll@1.7.7:
+ version "1.7.7"
+ resolved "https://registry.yarnpkg.com/react-scroll/-/react-scroll-1.7.7.tgz#948c40c9a189b62bf4a53ee0fd50e5d89d37260a"
+ dependencies:
+ lodash.throttle "^4.1.1"
+ prop-types "^15.5.8"
+
react-scroll@^1.5.2:
version "1.7.8"
resolved "https://registry.yarnpkg.com/react-scroll/-/react-scroll-1.7.8.tgz#45d8bd0f3fb104a7a1c3adb358e3a742a7091409"
@@ -10009,7 +10662,7 @@ react-side-effect@^1.0.2:
exenv "^1.2.1"
shallowequal "^1.0.1"
-react-tap-event-plugin@^2.0.1:
+react-tap-event-plugin@2.0.1, react-tap-event-plugin@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/react-tap-event-plugin/-/react-tap-event-plugin-2.0.1.tgz#316beb3bc6556e29ec869a7293e89c826a9074d2"
dependencies:
@@ -10065,6 +10718,27 @@ read-cmd-shim@^1.0.1:
dependencies:
graceful-fs "^4.1.2"
+"read-package-json@1 || 2", read-package-json@^2.0.0:
+ version "2.0.13"
+ resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a"
+ dependencies:
+ glob "^7.1.1"
+ json-parse-better-errors "^1.0.1"
+ normalize-package-data "^2.0.0"
+ slash "^1.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.2"
+
+read-package-tree@^5.1.6:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63"
+ dependencies:
+ debuglog "^1.0.1"
+ dezalgo "^1.0.0"
+ once "^1.3.0"
+ read-package-json "^2.0.0"
+ readdir-scoped-modules "^1.0.0"
+
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@@ -10110,7 +10784,7 @@ read-pkg@^3.0.0:
normalize-package-data "^2.3.2"
path-type "^3.0.0"
-read@1.0.x, read@~1.0.5:
+read@1, read@1.0.x, read@~1.0.1, read@~1.0.5:
version "1.0.7"
resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
dependencies:
@@ -10146,6 +10820,15 @@ readable-stream@^1.0.33, readable-stream@~1.1.9:
isarray "0.0.1"
string_decoder "~0.10.x"
+readdir-scoped-modules@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
+ dependencies:
+ debuglog "^1.0.1"
+ dezalgo "^1.0.0"
+ graceful-fs "^4.1.2"
+ once "^1.3.0"
+
readdirp@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
@@ -10316,6 +10999,26 @@ regjsparser@^0.1.4:
dependencies:
jsesc "~0.5.0"
+remark-parse@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-4.0.0.tgz#99f1f049afac80382366e2e0d0bd55429dd45d8b"
+ dependencies:
+ collapse-white-space "^1.0.2"
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ is-word-character "^1.0.0"
+ markdown-escapes "^1.0.0"
+ parse-entities "^1.0.2"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ trim "0.0.1"
+ trim-trailing-lines "^1.0.0"
+ unherit "^1.0.4"
+ unist-util-remove-position "^1.0.0"
+ vfile-location "^2.0.0"
+ xtend "^4.0.1"
+
remark-parse@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95"
@@ -10381,7 +11084,7 @@ request-ip@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-1.2.3.tgz#66988f0e22406ec4af630d19b573fe4b447c3b49"
-request@2.81.0:
+request@2.81.0, "request@>=2.9.0 <2.82.0":
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
dependencies:
@@ -10464,6 +11167,10 @@ require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+require-from-string@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff"
+
require-from-string@^1.1.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
@@ -10504,7 +11211,7 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1:
expand-tilde "^2.0.0"
global-modules "^1.0.0"
-resolve-from@4.0.0:
+resolve-from@4.0.0, resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -10807,7 +11514,7 @@ semver-sort@0.0.4:
version "5.4.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
-semver@5.5.0, semver@^5.5.0:
+"semver@2.x || 3.x || 4 || 5", semver@5.5.0, semver@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
@@ -10819,6 +11526,10 @@ semver@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19"
+semver@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
send@0.16.2:
version "0.16.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
@@ -10934,10 +11645,10 @@ sha.js@^2.4.0, sha.js@^2.4.8:
safe-buffer "^5.0.1"
sha3@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.0.tgz#6989f1b70a498705876a373e2c62ace96aa9399a"
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.2.tgz#a66c5098de4c25bc88336ec8b4817d005bca7ba9"
dependencies:
- nan "^2.0.5"
+ nan "2.10.0"
shallowequal@^1.0.1:
version "1.0.2"
@@ -11066,7 +11777,7 @@ slice-ansi@1.0.0:
dependencies:
is-fullwidth-code-point "^2.0.0"
-slide@^1.1.5:
+slide@^1.1.5, slide@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
@@ -11127,9 +11838,9 @@ sockjs@0.3.19:
faye-websocket "^0.10.0"
uuid "^3.0.1"
-solc@0.4.24, solc@^0.4.24:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.24.tgz#354f14b269b38cbaa82a47d1ff151723502b954e"
+solc@0.4.23, solc@^0.4.23:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.23.tgz#54a0ff4015827b32fddb62c0a418b5247310a58e"
dependencies:
fs-extra "^0.30.0"
memorystream "^0.3.1"
@@ -11137,9 +11848,9 @@ solc@0.4.24, solc@^0.4.24:
semver "^5.3.0"
yargs "^4.7.1"
-solc@^0.4.2:
- version "0.4.21"
- resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.21.tgz#6a7ecd505bfa0fc268330d5de6b9ae65c8c68264"
+solc@0.4.24, solc@^0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.24.tgz#354f14b269b38cbaa82a47d1ff151723502b954e"
dependencies:
fs-extra "^0.30.0"
memorystream "^0.3.1"
@@ -11147,9 +11858,9 @@ solc@^0.4.2:
semver "^5.3.0"
yargs "^4.7.1"
-solc@^0.4.23:
- version "0.4.23"
- resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.23.tgz#54a0ff4015827b32fddb62c0a418b5247310a58e"
+solc@^0.4.2:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.21.tgz#6a7ecd505bfa0fc268330d5de6b9ae65c8c68264"
dependencies:
fs-extra "^0.30.0"
memorystream "^0.3.1"
@@ -11817,7 +12528,7 @@ tar.gz@^1.0.5:
mout "^0.11.0"
tar "^2.1.1"
-tar@^2.1.1, tar@^2.2.1:
+tar@^2.0.0, tar@^2.1.1, tar@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
dependencies:
@@ -11840,7 +12551,7 @@ temp-write@^2.1.0:
pinkie-promise "^2.0.0"
uuid "^2.0.1"
-temp-write@^3.3.0:
+temp-write@^3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492"
dependencies:
@@ -11858,13 +12569,6 @@ temp@^0.8.1, temp@^0.8.3:
os-tmpdir "^1.0.0"
rimraf "~2.2.6"
-tempfile@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2"
- dependencies:
- os-tmpdir "^1.0.0"
- uuid "^2.0.1"
-
term-size@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
@@ -12125,7 +12829,7 @@ truffle-contract@2.0.1:
truffle-contract-schema "0.0.5"
web3 "^0.18.0"
-tslib@^1.0.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1:
+tslib@^1.0.0, tslib@^1.8.0, tslib@^1.8.1:
version "1.9.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
@@ -12149,21 +12853,22 @@ tslint-react@^3.0.0, tslint-react@^3.2.0:
dependencies:
tsutils "^2.13.1"
-tslint@5.8.0:
- version "5.8.0"
- resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.8.0.tgz#1f49ad5b2e77c76c3af4ddcae552ae4e3612eb13"
+tslint@5.11.0:
+ version "5.11.0"
+ resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed"
dependencies:
babel-code-frame "^6.22.0"
builtin-modules "^1.1.1"
- chalk "^2.1.0"
- commander "^2.9.0"
+ chalk "^2.3.0"
+ commander "^2.12.1"
diff "^3.2.0"
glob "^7.1.1"
+ js-yaml "^3.7.0"
minimatch "^3.0.4"
resolve "^1.3.2"
semver "^5.3.0"
- tslib "^1.7.1"
- tsutils "^2.12.1"
+ tslib "^1.8.0"
+ tsutils "^2.27.2"
tslint@^5.9.1:
version "5.9.1"
@@ -12198,6 +12903,12 @@ tsutils@^2.12.1, tsutils@^2.13.1:
dependencies:
tslib "^1.8.1"
+tsutils@^2.27.2:
+ version "2.27.2"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.2.tgz#60ba88a23d6f785ec4b89c6e8179cac9b431f1c7"
+ dependencies:
+ tslib "^1.8.1"
+
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -12380,7 +13091,7 @@ uglifyjs-webpack-plugin@^1.2.5:
webpack-sources "^1.1.0"
worker-farm "^1.5.2"
-uid-number@^0.0.6:
+uid-number@0.0.6, uid-number@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
@@ -12388,6 +13099,10 @@ ultron@~1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+umask@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
+
unbzip2-stream@^1.0.9:
version "1.2.5"
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47"
@@ -12508,6 +13223,12 @@ unist-util-visit@^1.1.0, unist-util-visit@^1.3.0:
dependencies:
unist-util-is "^2.1.1"
+unist-util-visit@^1.1.3:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.3.1.tgz#c019ac9337a62486be58531bc27e7499ae7d55c7"
+ dependencies:
+ unist-util-is "^2.1.1"
+
universalify@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
@@ -12695,13 +13416,19 @@ valid-url@1.0.9, valid-url@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
-validate-npm-package-license@^3.0.1:
+validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
dependencies:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
+validate-npm-package-name@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
+ dependencies:
+ builtins "^1.0.3"
+
value-equal@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7"
@@ -12881,6 +13608,14 @@ web3-bzz@1.0.0-beta.34:
swarm-js "0.1.37"
underscore "1.8.3"
+web3-core-helpers@1.0.0-beta.33:
+ version "1.0.0-beta.33"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.33.tgz#2af733e504db05e7c3648c1dacf577b0ec15dc43"
+ dependencies:
+ underscore "1.8.3"
+ web3-eth-iban "1.0.0-beta.33"
+ web3-utils "1.0.0-beta.33"
+
web3-core-helpers@1.0.0-beta.34:
version "1.0.0-beta.34"
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.34.tgz#b168da00d3e19e156bc15ae203203dd4dfee2d03"
@@ -12933,6 +13668,15 @@ web3-core@1.0.0-beta.34:
web3-core-requestmanager "1.0.0-beta.34"
web3-utils "1.0.0-beta.34"
+web3-eth-abi@1.0.0-beta.33:
+ version "1.0.0-beta.33"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.33.tgz#2221f7151643660032a4df340f612349168c824a"
+ dependencies:
+ bn.js "4.11.6"
+ underscore "1.8.3"
+ web3-core-helpers "1.0.0-beta.33"
+ web3-utils "1.0.0-beta.33"
+
web3-eth-abi@1.0.0-beta.34, web3-eth-abi@^1.0.0-beta.24:
version "1.0.0-beta.34"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.34.tgz#034533e3aa2f7e59ff31793eaea685c0ed5af67a"
@@ -12970,6 +13714,13 @@ web3-eth-contract@1.0.0-beta.34:
web3-eth-abi "1.0.0-beta.34"
web3-utils "1.0.0-beta.34"
+web3-eth-iban@1.0.0-beta.33:
+ version "1.0.0-beta.33"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.33.tgz#1d73d0c5288a4565b1754a75b5fb3ea0b77a532f"
+ dependencies:
+ bn.js "4.11.6"
+ web3-utils "1.0.0-beta.33"
+
web3-eth-iban@1.0.0-beta.34:
version "1.0.0-beta.34"
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.34.tgz#9af458605867ccf74ea979aaf326b38ba6a5ba0c"
@@ -13100,6 +13851,18 @@ web3-typescript-typings@^0.10.2:
dependencies:
bignumber.js "~4.1.0"
+web3-utils@1.0.0-beta.33:
+ version "1.0.0-beta.33"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.33.tgz#e091b7994f09b714b0198a4057d3ad2eb8cbe238"
+ dependencies:
+ bn.js "4.11.6"
+ eth-lib "0.1.27"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randomhex "0.1.5"
+ underscore "1.8.3"
+ utf8 "2.1.1"
+
web3-utils@1.0.0-beta.34:
version "1.0.0-beta.34"
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.34.tgz#9411fc39aaef39ca4e06169f762297d9ff020970"
@@ -13122,6 +13885,16 @@ web3@0.20.2:
xhr2 "*"
xmlhttprequest "*"
+web3@0.20.6:
+ version "0.20.6"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.6.tgz#3e97306ae024fb24e10a3d75c884302562215120"
+ dependencies:
+ bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git"
+ crypto-js "^3.1.4"
+ utf8 "^2.1.1"
+ xhr2 "*"
+ xmlhttprequest "*"
+
web3@^0.18.0:
version "0.18.4"
resolved "https://registry.yarnpkg.com/web3/-/web3-0.18.4.tgz#81ec1784145491f2eaa8955b31c06049e07c5e7d"
@@ -13310,6 +14083,12 @@ which-pm-runs@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
+which@1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ dependencies:
+ isexe "^2.0.0"
+
which@^1.1.1, which@^1.2.14, which@^1.2.9, which@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
@@ -13397,7 +14176,7 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
imurmurhash "^0.1.4"
signal-exit "^3.0.2"
-write-json-file@^2.2.0:
+write-json-file@^2.2.0, write-json-file@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
dependencies: