Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- BFTH_Arena
- Optimization enabled
- true
- Compiler version
- v0.8.17+commit.8df45f5f
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2025-07-15T14:13:45.217750Z
BFTH_Arena.sol
// File: @openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: contracts/BFTH-Arena/BFTH_Arena.sol
pragma solidity ^0.8.17;
contract BFTH_Arena is Ownable, ReentrancyGuard {
struct User {
string name;
uint256 paid;
bool blocked;
bool exist;
}
bool public isFinalized;
address[] public users;
mapping (address => User) public userInfo;
event Registered(address indexed userAddress, string name);
event Paid(address indexed userAddress, uint256 amount);
event Blocked(address indexed userAddress, bool blocked);
event Finalized(address recipient);
receive() external payable {}
constructor() Ownable() {}
function listOfUsers() external view returns(User[] memory) {
uint256 usersLength = users.length;
User[] memory us = new User[](usersLength);
for (uint256 i = 0; i < usersLength; i++) {
us[i] = userInfo[users[i]];
}
return us;
}
function listOfUsersAddresses() external view returns(address[] memory) {
return users;
}
function register(address userAddress_, string memory name_) external {
require(!isFinalized, "BFTH_Arena: Arena already finalized");
require(address(0) != userAddress_, "BFTH_Arena: User address cannot be null");
require(0 != bytes(name_).length, "BFTH_Arena: User name cannot be empty");
require(! userExists(userAddress_), "BFTH_Arena: User with this address already exists");
User storage u = userInfo[userAddress_];
u.name = name_;
u.paid = 0;
u.blocked = false;
u.exist = true;
users.push(userAddress_);
emit Registered(userAddress_, name_);
}
function blockUser(address userAddress_, bool block_) external onlyOwner() {
require(!isFinalized, "BFTH_Arena: Arena already finalized");
require(userExists(userAddress_), "BFTH_Arena: User with this address not exists");
userInfo[userAddress_].blocked = block_;
emit Blocked(userAddress_, block_);
}
function pay(address userAddress_, uint256 amount_) external onlyOwner() nonReentrant() {
require(!isFinalized, "BFTH_Arena: Arena already finalized");
require(userExists(userAddress_), "BFTH_Arena: User with this address not exists");
require(0 != amount_, "BFTH_Arena: amount must be greater than 0");
require(address(this).balance >= amount_, "BFTH_Arena: Not enough funds");
User storage user = userInfo[userAddress_];
require(user.blocked != true, "BFTH_Arena: user blocked");
(bool success, ) = userAddress_.call{value: amount_}('');
require(success, 'BFTH_Arena: Native token transfer failed');
user.paid += amount_;
emit Paid(userAddress_, amount_);
}
function finalize(address _recipient) public onlyOwner() {
require(!isFinalized, "BFTH_Arena: Arena already finalized");
isFinalized = true;
(bool success, ) = _recipient.call{value: address(this).balance}('');
require(success, 'BFTH_Arena: Native token transfer failed');
emit Finalized(_recipient);
}
/// Helper member functions
function userExists(address userAddress_) view private returns(bool) {
return userInfo[userAddress_].exist;
}
}
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{"BFTH_Arena.sol":{}},"evmVersion":"london"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Blocked","inputs":[{"type":"address","name":"userAddress","internalType":"address","indexed":true},{"type":"bool","name":"blocked","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Finalized","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paid","inputs":[{"type":"address","name":"userAddress","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Registered","inputs":[{"type":"address","name":"userAddress","internalType":"address","indexed":true},{"type":"string","name":"name","internalType":"string","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"blockUser","inputs":[{"type":"address","name":"userAddress_","internalType":"address"},{"type":"bool","name":"block_","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"finalize","inputs":[{"type":"address","name":"_recipient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFinalized","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct BFTH_Arena.User[]","components":[{"type":"string","name":"name","internalType":"string"},{"type":"uint256","name":"paid","internalType":"uint256"},{"type":"bool","name":"blocked","internalType":"bool"},{"type":"bool","name":"exist","internalType":"bool"}]}],"name":"listOfUsers","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"listOfUsersAddresses","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pay","inputs":[{"type":"address","name":"userAddress_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"register","inputs":[{"type":"address","name":"userAddress_","internalType":"address"},{"type":"string","name":"name_","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"name","internalType":"string"},{"type":"uint256","name":"paid","internalType":"uint256"},{"type":"bool","name":"blocked","internalType":"bool"},{"type":"bool","name":"exist","internalType":"bool"}],"name":"userInfo","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"users","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608060405234801561001057600080fd5b5061001a33610023565b60018055610073565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6112eb806100826000396000f3fe6080604052600436106100ab5760003560e01c80638d4e4083116100645780638d4e4083146101a15780638da5cb5b146101cb578063c4076876146101e9578063d9b998b414610209578063f2fde38b14610229578063f9f9686d1461024957600080fd5b80631959a002146100b757806319ce63dc146100f057806332434a2e14610112578063365b98b2146101345780634ef39b751461016c578063715018a61461018c57600080fd5b366100b257005b600080fd5b3480156100c357600080fd5b506100d76100d2366004610d57565b61026b565b6040516100e79493929190610dbf565b60405180910390f35b3480156100fc57600080fd5b50610105610322565b6040516100e79190610df0565b34801561011e57600080fd5b5061013261012d366004610e95565b6104df565b005b34801561014057600080fd5b5061015461014f366004610f57565b61070a565b6040516001600160a01b0390911681526020016100e7565b34801561017857600080fd5b50610132610187366004610d57565b610734565b34801561019857600080fd5b5061013261081d565b3480156101ad57600080fd5b506002546101bb9060ff1681565b60405190151581526020016100e7565b3480156101d757600080fd5b506000546001600160a01b0316610154565b3480156101f557600080fd5b50610132610204366004610f70565b610831565b34801561021557600080fd5b50610132610224366004610f9a565b610a85565b34801561023557600080fd5b50610132610244366004610d57565b610b37565b34801561025557600080fd5b5061025e610bb0565b6040516100e79190610fd6565b60046020526000908152604090208054819061028690611023565b80601f01602080910402602001604051908101604052809291908181526020018280546102b290611023565b80156102ff5780601f106102d4576101008083540402835291602001916102ff565b820191906000526020600020905b8154815290600101906020018083116102e257829003601f168201915b50505050600183015460029093015491929160ff80821692506101009091041684565b60035460609060008167ffffffffffffffff81111561034357610343610e7f565b60405190808252806020026020018201604052801561039657816020015b604080516080810182526060808252600060208084018290529383018190529082015282526000199092019101816103615790505b50905060005b828110156104d85760046000600383815481106103bb576103bb61105d565b60009182526020808320909101546001600160a01b0316835282019290925260409081019091208151608081019092528054829082906103fa90611023565b80601f016020809104026020016040519081016040528092919081815260200182805461042690611023565b80156104735780601f1061044857610100808354040283529160200191610473565b820191906000526020600020905b81548152906001019060200180831161045657829003601f168201915b50505091835250506001820154602082015260029091015460ff8082161515604084015261010090910416151560609091015282518390839081106104ba576104ba61105d565b602002602001018190525080806104d090611089565b91505061039c565b5092915050565b60025460ff161561050b5760405162461bcd60e51b8152600401610502906110a2565b60405180910390fd5b6001600160a01b0382166000036105745760405162461bcd60e51b815260206004820152602760248201527f424654485f4172656e613a205573657220616464726573732063616e6e6f74206044820152661899481b9d5b1b60ca1b6064820152608401610502565b80516000036105d35760405162461bcd60e51b815260206004820152602560248201527f424654485f4172656e613a2055736572206e616d652063616e6e6f7420626520604482015264656d70747960d81b6064820152608401610502565b6105dc82610c12565b156106435760405162461bcd60e51b815260206004820152603160248201527f424654485f4172656e613a205573657220776974682074686973206164647265604482015270737320616c72656164792065786973747360781b6064820152608401610502565b6001600160a01b0382166000908152600460205260409020806106668382611134565b506000600180830182905560028301805461ffff19166101001790556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0385166001600160a01b031990911681179091556040517fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a132906106fd9085906111f4565b60405180910390a2505050565b6003818154811061071a57600080fd5b6000918252602090912001546001600160a01b0316905081565b61073c610c38565b60025460ff161561075f5760405162461bcd60e51b8152600401610502906110a2565b6002805460ff191660011790556040516000906001600160a01b0383169047908381818185875af1925050503d80600081146107b7576040519150601f19603f3d011682016040523d82523d6000602084013e6107bc565b606091505b50509050806107dd5760405162461bcd60e51b815260040161050290611207565b6040516001600160a01b03831681527f8e500951de09bcc6854e88c0810bafb819503505895751e657a92df6578d3d999060200160405180910390a15050565b610825610c38565b61082f6000610c92565b565b610839610c38565b610841610ce2565b60025460ff16156108645760405162461bcd60e51b8152600401610502906110a2565b61086d82610c12565b6108895760405162461bcd60e51b81526004016105029061124f565b806000036108eb5760405162461bcd60e51b815260206004820152602960248201527f424654485f4172656e613a20616d6f756e74206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608401610502565b8047101561093b5760405162461bcd60e51b815260206004820152601c60248201527f424654485f4172656e613a204e6f7420656e6f7567682066756e6473000000006044820152606401610502565b6001600160a01b0382166000908152600460205260409020600281015460ff1615156001036109ac5760405162461bcd60e51b815260206004820152601860248201527f424654485f4172656e613a207573657220626c6f636b656400000000000000006044820152606401610502565b6000836001600160a01b03168360405160006040518083038185875af1925050503d80600081146109f9576040519150601f19603f3d011682016040523d82523d6000602084013e6109fe565b606091505b5050905080610a1f5760405162461bcd60e51b815260040161050290611207565b82826001016000828254610a33919061129c565b90915550506040518381526001600160a01b038516907f737c69225d647e5994eab1a6c301bf6d9232beb2759ae1e27a8966b4732bc4899060200160405180910390a25050610a8160018055565b5050565b610a8d610c38565b60025460ff1615610ab05760405162461bcd60e51b8152600401610502906110a2565b610ab982610c12565b610ad55760405162461bcd60e51b81526004016105029061124f565b6001600160a01b038216600081815260046020908152604091829020600201805460ff191685151590811790915591519182527fcecdf9dd6f2193d677b10450a2e4ff64d6b61a566bdc6e34ab5c9fc2f797960b910160405180910390a25050565b610b3f610c38565b6001600160a01b038116610ba45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610502565b610bad81610c92565b50565b60606003805480602002602001604051908101604052809291908181526020018280548015610c0857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bea575b5050505050905090565b6001600160a01b0316600090815260046020526040902060020154610100900460ff1690565b6000546001600160a01b0316331461082f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610502565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403610d345760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610502565b6002600155565b80356001600160a01b0381168114610d5257600080fd5b919050565b600060208284031215610d6957600080fd5b610d7282610d3b565b9392505050565b6000815180845260005b81811015610d9f57602081850181015186830182015201610d83565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610dd26080830187610d79565b60208301959095525091151560408301521515606090910152919050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015610e7157603f19898403018552815160808151818652610e3d82870182610d79565b838b0151878c01528984015115158a8801526060938401511515939096019290925250509386019390860190600101610e17565b509098975050505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610ea857600080fd5b610eb183610d3b565b9150602083013567ffffffffffffffff80821115610ece57600080fd5b818501915085601f830112610ee257600080fd5b813581811115610ef457610ef4610e7f565b604051601f8201601f19908116603f01168101908382118183101715610f1c57610f1c610e7f565b81604052828152886020848701011115610f3557600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600060208284031215610f6957600080fd5b5035919050565b60008060408385031215610f8357600080fd5b610f8c83610d3b565b946020939093013593505050565b60008060408385031215610fad57600080fd5b610fb683610d3b565b915060208301358015158114610fcb57600080fd5b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156110175783516001600160a01b031683529284019291840191600101610ff2565b50909695505050505050565b600181811c9082168061103757607f821691505b60208210810361105757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161109b5761109b611073565b5060010190565b60208082526023908201527f424654485f4172656e613a204172656e6120616c72656164792066696e616c696040820152621e995960ea1b606082015260800190565b601f82111561112f57600081815260208120601f850160051c8101602086101561110c5750805b601f850160051c820191505b8181101561112b57828155600101611118565b5050505b505050565b815167ffffffffffffffff81111561114e5761114e610e7f565b6111628161115c8454611023565b846110e5565b602080601f831160018114611197576000841561117f5750858301515b600019600386901b1c1916600185901b17855561112b565b600085815260208120601f198616915b828110156111c6578886015182559484019460019091019084016111a7565b50858210156111e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000610d726020830184610d79565b60208082526028908201527f424654485f4172656e613a204e617469766520746f6b656e207472616e7366656040820152671c8819985a5b195960c21b606082015260800190565b6020808252602d908201527f424654485f4172656e613a20557365722077697468207468697320616464726560408201526c7373206e6f742065786973747360981b606082015260800190565b808201808211156112af576112af611073565b9291505056fea2646970667358221220bd48859b8fc486c9c571dd3617c0ba72f739671fc631590e011c0d1c9b30a85c64736f6c63430008110033
Deployed ByteCode
0x6080604052600436106100ab5760003560e01c80638d4e4083116100645780638d4e4083146101a15780638da5cb5b146101cb578063c4076876146101e9578063d9b998b414610209578063f2fde38b14610229578063f9f9686d1461024957600080fd5b80631959a002146100b757806319ce63dc146100f057806332434a2e14610112578063365b98b2146101345780634ef39b751461016c578063715018a61461018c57600080fd5b366100b257005b600080fd5b3480156100c357600080fd5b506100d76100d2366004610d57565b61026b565b6040516100e79493929190610dbf565b60405180910390f35b3480156100fc57600080fd5b50610105610322565b6040516100e79190610df0565b34801561011e57600080fd5b5061013261012d366004610e95565b6104df565b005b34801561014057600080fd5b5061015461014f366004610f57565b61070a565b6040516001600160a01b0390911681526020016100e7565b34801561017857600080fd5b50610132610187366004610d57565b610734565b34801561019857600080fd5b5061013261081d565b3480156101ad57600080fd5b506002546101bb9060ff1681565b60405190151581526020016100e7565b3480156101d757600080fd5b506000546001600160a01b0316610154565b3480156101f557600080fd5b50610132610204366004610f70565b610831565b34801561021557600080fd5b50610132610224366004610f9a565b610a85565b34801561023557600080fd5b50610132610244366004610d57565b610b37565b34801561025557600080fd5b5061025e610bb0565b6040516100e79190610fd6565b60046020526000908152604090208054819061028690611023565b80601f01602080910402602001604051908101604052809291908181526020018280546102b290611023565b80156102ff5780601f106102d4576101008083540402835291602001916102ff565b820191906000526020600020905b8154815290600101906020018083116102e257829003601f168201915b50505050600183015460029093015491929160ff80821692506101009091041684565b60035460609060008167ffffffffffffffff81111561034357610343610e7f565b60405190808252806020026020018201604052801561039657816020015b604080516080810182526060808252600060208084018290529383018190529082015282526000199092019101816103615790505b50905060005b828110156104d85760046000600383815481106103bb576103bb61105d565b60009182526020808320909101546001600160a01b0316835282019290925260409081019091208151608081019092528054829082906103fa90611023565b80601f016020809104026020016040519081016040528092919081815260200182805461042690611023565b80156104735780601f1061044857610100808354040283529160200191610473565b820191906000526020600020905b81548152906001019060200180831161045657829003601f168201915b50505091835250506001820154602082015260029091015460ff8082161515604084015261010090910416151560609091015282518390839081106104ba576104ba61105d565b602002602001018190525080806104d090611089565b91505061039c565b5092915050565b60025460ff161561050b5760405162461bcd60e51b8152600401610502906110a2565b60405180910390fd5b6001600160a01b0382166000036105745760405162461bcd60e51b815260206004820152602760248201527f424654485f4172656e613a205573657220616464726573732063616e6e6f74206044820152661899481b9d5b1b60ca1b6064820152608401610502565b80516000036105d35760405162461bcd60e51b815260206004820152602560248201527f424654485f4172656e613a2055736572206e616d652063616e6e6f7420626520604482015264656d70747960d81b6064820152608401610502565b6105dc82610c12565b156106435760405162461bcd60e51b815260206004820152603160248201527f424654485f4172656e613a205573657220776974682074686973206164647265604482015270737320616c72656164792065786973747360781b6064820152608401610502565b6001600160a01b0382166000908152600460205260409020806106668382611134565b506000600180830182905560028301805461ffff19166101001790556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0385166001600160a01b031990911681179091556040517fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a132906106fd9085906111f4565b60405180910390a2505050565b6003818154811061071a57600080fd5b6000918252602090912001546001600160a01b0316905081565b61073c610c38565b60025460ff161561075f5760405162461bcd60e51b8152600401610502906110a2565b6002805460ff191660011790556040516000906001600160a01b0383169047908381818185875af1925050503d80600081146107b7576040519150601f19603f3d011682016040523d82523d6000602084013e6107bc565b606091505b50509050806107dd5760405162461bcd60e51b815260040161050290611207565b6040516001600160a01b03831681527f8e500951de09bcc6854e88c0810bafb819503505895751e657a92df6578d3d999060200160405180910390a15050565b610825610c38565b61082f6000610c92565b565b610839610c38565b610841610ce2565b60025460ff16156108645760405162461bcd60e51b8152600401610502906110a2565b61086d82610c12565b6108895760405162461bcd60e51b81526004016105029061124f565b806000036108eb5760405162461bcd60e51b815260206004820152602960248201527f424654485f4172656e613a20616d6f756e74206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608401610502565b8047101561093b5760405162461bcd60e51b815260206004820152601c60248201527f424654485f4172656e613a204e6f7420656e6f7567682066756e6473000000006044820152606401610502565b6001600160a01b0382166000908152600460205260409020600281015460ff1615156001036109ac5760405162461bcd60e51b815260206004820152601860248201527f424654485f4172656e613a207573657220626c6f636b656400000000000000006044820152606401610502565b6000836001600160a01b03168360405160006040518083038185875af1925050503d80600081146109f9576040519150601f19603f3d011682016040523d82523d6000602084013e6109fe565b606091505b5050905080610a1f5760405162461bcd60e51b815260040161050290611207565b82826001016000828254610a33919061129c565b90915550506040518381526001600160a01b038516907f737c69225d647e5994eab1a6c301bf6d9232beb2759ae1e27a8966b4732bc4899060200160405180910390a25050610a8160018055565b5050565b610a8d610c38565b60025460ff1615610ab05760405162461bcd60e51b8152600401610502906110a2565b610ab982610c12565b610ad55760405162461bcd60e51b81526004016105029061124f565b6001600160a01b038216600081815260046020908152604091829020600201805460ff191685151590811790915591519182527fcecdf9dd6f2193d677b10450a2e4ff64d6b61a566bdc6e34ab5c9fc2f797960b910160405180910390a25050565b610b3f610c38565b6001600160a01b038116610ba45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610502565b610bad81610c92565b50565b60606003805480602002602001604051908101604052809291908181526020018280548015610c0857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bea575b5050505050905090565b6001600160a01b0316600090815260046020526040902060020154610100900460ff1690565b6000546001600160a01b0316331461082f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610502565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403610d345760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610502565b6002600155565b80356001600160a01b0381168114610d5257600080fd5b919050565b600060208284031215610d6957600080fd5b610d7282610d3b565b9392505050565b6000815180845260005b81811015610d9f57602081850181015186830182015201610d83565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610dd26080830187610d79565b60208301959095525091151560408301521515606090910152919050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015610e7157603f19898403018552815160808151818652610e3d82870182610d79565b838b0151878c01528984015115158a8801526060938401511515939096019290925250509386019390860190600101610e17565b509098975050505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610ea857600080fd5b610eb183610d3b565b9150602083013567ffffffffffffffff80821115610ece57600080fd5b818501915085601f830112610ee257600080fd5b813581811115610ef457610ef4610e7f565b604051601f8201601f19908116603f01168101908382118183101715610f1c57610f1c610e7f565b81604052828152886020848701011115610f3557600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600060208284031215610f6957600080fd5b5035919050565b60008060408385031215610f8357600080fd5b610f8c83610d3b565b946020939093013593505050565b60008060408385031215610fad57600080fd5b610fb683610d3b565b915060208301358015158114610fcb57600080fd5b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156110175783516001600160a01b031683529284019291840191600101610ff2565b50909695505050505050565b600181811c9082168061103757607f821691505b60208210810361105757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161109b5761109b611073565b5060010190565b60208082526023908201527f424654485f4172656e613a204172656e6120616c72656164792066696e616c696040820152621e995960ea1b606082015260800190565b601f82111561112f57600081815260208120601f850160051c8101602086101561110c5750805b601f850160051c820191505b8181101561112b57828155600101611118565b5050505b505050565b815167ffffffffffffffff81111561114e5761114e610e7f565b6111628161115c8454611023565b846110e5565b602080601f831160018114611197576000841561117f5750858301515b600019600386901b1c1916600185901b17855561112b565b600085815260208120601f198616915b828110156111c6578886015182559484019460019091019084016111a7565b50858210156111e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000610d726020830184610d79565b60208082526028908201527f424654485f4172656e613a204e617469766520746f6b656e207472616e7366656040820152671c8819985a5b195960c21b606082015260800190565b6020808252602d908201527f424654485f4172656e613a20557365722077697468207468697320616464726560408201526c7373206e6f742065786973747360981b606082015260800190565b808201808211156112af576112af611073565b9291505056fea2646970667358221220bd48859b8fc486c9c571dd3617c0ba72f739671fc631590e011c0d1c9b30a85c64736f6c63430008110033