More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,895 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
End Auction | 16599998 | 501 days ago | IN | 0 ETH | 0.00446966 | ||||
Create Bid | 16599878 | 501 days ago | IN | 8.3 ETH | 0.00317592 | ||||
Create Bid | 16599875 | 501 days ago | IN | 7.7 ETH | 0.00128311 | ||||
Create Bid | 16599873 | 501 days ago | IN | 7.5 ETH | 0.00333298 | ||||
Create Bid | 16599853 | 501 days ago | IN | 7 ETH | 0.00349349 | ||||
Create Bid | 16599703 | 501 days ago | IN | 6.6 ETH | 0.00302189 | ||||
Create Bid | 16592767 | 502 days ago | IN | 6 ETH | 0.00380114 | ||||
Create Bid | 16592746 | 502 days ago | IN | 2.5 ETH | 0.00615122 | ||||
Create Auction | 16592546 | 502 days ago | IN | 0 ETH | 0.01359774 | ||||
End Auction | 16499706 | 515 days ago | IN | 0 ETH | 0.00467915 | ||||
Create Bid | 16499616 | 515 days ago | IN | 4.44 ETH | 0.00128403 | ||||
Create Bid | 16499601 | 515 days ago | IN | 6.78 ETH | 0.00362014 | ||||
Create Bid | 16499551 | 515 days ago | IN | 6 ETH | 0.00441398 | ||||
Create Bid | 16499530 | 515 days ago | IN | 5.5 ETH | 0.00569547 | ||||
Create Bid | 16499495 | 515 days ago | IN | 4.8 ETH | 0.00520492 | ||||
Create Bid | 16499289 | 515 days ago | IN | 4.2 ETH | 0.00719679 | ||||
Create Bid | 16492828 | 516 days ago | IN | 2.99 ETH | 0.00380531 | ||||
Create Auction | 16492768 | 516 days ago | IN | 0 ETH | 0.00571859 | ||||
End Auction | 16449747 | 522 days ago | IN | 0 ETH | 0.00477509 | ||||
End Auction | 16449714 | 522 days ago | IN | 0 ETH | 0.00613432 | ||||
End Auction | 16449712 | 522 days ago | IN | 0 ETH | 0.00751687 | ||||
End Auction | 16449710 | 522 days ago | IN | 0 ETH | 0.00715402 | ||||
End Auction | 16449709 | 522 days ago | IN | 0 ETH | 0.00683111 | ||||
End Auction | 16449675 | 522 days ago | IN | 0 ETH | 0.00661913 | ||||
Create Bid | 16449670 | 522 days ago | IN | 8.82 ETH | 0.00307419 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
16599998 | 501 days ago | 8.3 ETH | ||||
16599998 | 501 days ago | 8.3 ETH | ||||
16599878 | 501 days ago | 8.3 ETH | ||||
16599878 | 501 days ago | 7.5 ETH | ||||
16599878 | 501 days ago | 7.5 ETH | ||||
16599873 | 501 days ago | 7.5 ETH | ||||
16599873 | 501 days ago | 7 ETH | ||||
16599873 | 501 days ago | 7 ETH | ||||
16599853 | 501 days ago | 7 ETH | ||||
16599853 | 501 days ago | 6.6 ETH | ||||
16599853 | 501 days ago | 6.6 ETH | ||||
16599703 | 501 days ago | 6.6 ETH | ||||
16599703 | 501 days ago | 6 ETH | ||||
16599703 | 501 days ago | 6 ETH | ||||
16592767 | 502 days ago | 6 ETH | ||||
16592767 | 502 days ago | 2.5 ETH | ||||
16592767 | 502 days ago | 2.5 ETH | ||||
16592746 | 502 days ago | 2.5 ETH | ||||
16499706 | 515 days ago | 6.78 ETH | ||||
16499706 | 515 days ago | 6.78 ETH | ||||
16499601 | 515 days ago | 6.78 ETH | ||||
16499601 | 515 days ago | 6 ETH | ||||
16499601 | 515 days ago | 6 ETH | ||||
16499551 | 515 days ago | 6 ETH | ||||
16499551 | 515 days ago | 5.5 ETH |
Loading...
Loading
Contract Name:
AuctionHouse
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-05 */ pragma solidity 0.8.7; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } 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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IAuctionHouse { struct Auction { // ID for the ERC721 token uint256 tokenId; // Address for the ERC721 contract address tokenContract; // The current highest bid amount uint256 amount; // The length of time to run the auction for, after the first bid was made uint256 duration; // The time of the first bid uint256 firstBidTime; // The minimum price of the first bid uint256 reservePrice; // The address that should receive the funds once the NFT is sold. address tokenOwner; // The address of the current highest bid address payable bidder; // The address of the ERC-20 currency to run the auction with. // If set to 0x0, the auction will be run in ETH address auctionCurrency; // The address of recipient of the sale commission } struct Royalty { //The address of the beneficiary who will be receiving royalties for each sale address payable beneficiary; //The percentage of the sale the commission address receives //If percentage is set to 0, the full amount will be sent uint256 royaltyPercentage; } event AuctionCreated( uint256 indexed auctionId, uint256 indexed tokenId, address indexed tokenContract, uint256 duration, uint256 reservePrice, address tokenOwner, address auctionCurrency ); event AuctionReservePriceUpdated( uint256 indexed auctionId, uint256 indexed tokenId, address indexed tokenContract, uint256 reservePrice ); event RoyaltySet( address indexed tokenContract, address indexed newBeneficiary, uint256 indexed royaltyPercentage ); event AuctionBid( uint256 indexed auctionId, uint256 indexed tokenId, address indexed tokenContract, address sender, uint256 value, uint256 bidTime, bool firstBid, bool extended ); event AuctionDurationExtended( uint256 indexed auctionId, uint256 indexed tokenId, address indexed tokenContract, uint256 duration ); event AuctionEnded( uint256 indexed auctionId, uint256 indexed tokenId, address indexed tokenContract, address tokenOwner, address winner, uint256 amount, uint256 endTime, address auctionCurrency ); event AuctionWithRoyaltiesEnded( uint256 indexed auctionId, uint256 indexed tokenId, address indexed tokenContract, address tokenOwner, address winner, uint256 amount, address beneficiaryAddress, uint256 royaltyAmount, uint256 endTime, address auctionCurrency ); event AuctionCanceled( uint256 indexed auctionId, uint256 indexed tokenId, address indexed tokenContract, address tokenOwner ); function createAuction( uint256 tokenId, address tokenContract, uint256 duration, uint256 reservePrice, address auctionCurrency ) external returns (uint256); function setAuctionReservePrice(uint256 auctionId, uint256 reservePrice) external; function setRoyalty( address tokenContract, address payable beneficiaryAddress, uint256 royaltyPercentage ) external; function createBid(uint256 auctionId, uint256 amount) external payable; function endAuction(uint256 auctionId) external; function cancelAuction(uint256 auctionId) external; function setPublicAuctionsEnabled(bool status) external; function whitelistAccount(address sellerOrTokenContract) external; function removeWhitelistedAccount(address sellerOrTokenContract) external; function isWhitelisted(address sellerOrTekenContract) external view returns(bool); function addAuctioneer(address who) external; function removeAuctioneer(address who) external; function isAuctioneer(address who) external view returns(bool); } interface IWETH { function deposit() external payable; function withdraw(uint wad) external; function transfer(address to, uint256 value) external returns (bool); } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } contract AuctionHouse is IAuctionHouse, ReentrancyGuard, AccessControl, Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; using Counters for Counters.Counter; // The minimum amount of time left in an auction after a new bid is created uint256 public timeBuffer; // The minimum percentage difference between the last bid amount and the current bid. uint8 public minBidIncrementPercentage; // The address of the WETH contract, so that any ETH transferred can be handled as an ERC-20 address public wethAddress; // A mapping of all of the auctions currently running. mapping(uint256 => IAuctionHouse.Auction) public auctions; // A mapping of token contracts to royalty objects. mapping(address => IAuctionHouse.Royalty) public royaltyRegistry; // A mapping of all token contract addresses that ChainSaw allows on auction-house. These addresses // could belong to token contracts or individual sellers. mapping(address => bool) public whitelistedAccounts; // 721 interface id bytes4 constant interfaceId = 0x80ac58cd; // Counter for incrementing auctionId Counters.Counter private _auctionIdTracker; // Tracks whether auction house is allowing non-owners to create auctions, // e.g. in the case of secondary sales. bool public publicAuctionsEnabled; // The role that has permissions to create and cancel auctions bytes32 public constant AUCTIONEER = keccak256("AUCTIONEER"); /** * @notice Require that caller is authorized auctioneer */ modifier onlyAdmin() { require( hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Call must be made by administrator" ); _; } /** * @notice Require that caller is authorized auctioneer */ modifier onlyAuctioneer() { require( hasRole(AUCTIONEER, msg.sender) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Call must be made by authorized auctioneer" ); _; } /** * @notice Require that the specified auction exists */ modifier auctionExists(uint256 auctionId) { require(_exists(auctionId), "Auction doesn't exist"); _; } /** * @notice constructor */ constructor(address _weth, address[] memory auctioneers) { wethAddress = _weth; timeBuffer = 15 * 60; // extend 15 minutes after every bid made in last 15 minutes minBidIncrementPercentage = 5; // 5% publicAuctionsEnabled = false; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); for (uint i = 0; i < auctioneers.length; i++) { _addAuctioneer(auctioneers[i]); } } /** * @notice Create an auction. * @dev Store the auction details in the auctions mapping and emit an AuctionCreated event. */ function createAuction( uint256 tokenId, address tokenContract, uint256 duration, uint256 reservePrice, address auctionCurrency ) public override nonReentrant returns (uint256) { require( IERC165(tokenContract).supportsInterface(interfaceId), "tokenContract does not support ERC721 interface" ); address tokenOwner = IERC721(tokenContract).ownerOf(tokenId); require( tokenOwner == msg.sender, "Must be owner of NFT" ); require( _isAuthorizedAction(tokenOwner, tokenContract), "Call must be made by authorized seller, token contract or auctioneer" ); uint256 auctionId = _auctionIdTracker.current(); auctions[auctionId] = Auction({ tokenId: tokenId, tokenContract: tokenContract, amount: 0, duration: duration, firstBidTime: 0, reservePrice: reservePrice, tokenOwner: tokenOwner, bidder: payable(0), auctionCurrency: auctionCurrency }); IERC721(tokenContract).transferFrom(tokenOwner, address(this), tokenId); _auctionIdTracker.increment(); emit AuctionCreated(auctionId, tokenId, tokenContract, duration, reservePrice, tokenOwner, auctionCurrency); return auctionId; } /** * @notice sets auction reserve price if auction has not already started */ function setAuctionReservePrice(uint256 auctionId, uint256 reservePrice) external override auctionExists(auctionId) { require( _isAuctioneer(msg.sender) || auctions[auctionId].tokenOwner == msg.sender, "Must be auctioneer or owner of NFT" ); require( _isAuthorizedAction( auctions[auctionId].tokenOwner, auctions[auctionId].tokenContract ), "Call must be made by authorized seller, token contract or auctioneer" ); require(auctions[auctionId].firstBidTime == 0, "Auction has already started"); auctions[auctionId].reservePrice = reservePrice; emit AuctionReservePriceUpdated(auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, reservePrice); } /** * @notice Set royalty information for a given token contract. * @dev Store the royal details in the royaltyRegistry mapping and emit an royaltySet event. * Royalty can only be modified before any auction for tokenContract has started */ function setRoyalty(address tokenContract, address payable beneficiary, uint royaltyPercentage) external override onlyAuctioneer { royaltyRegistry[tokenContract] = Royalty({ beneficiary: beneficiary, royaltyPercentage: royaltyPercentage }); emit RoyaltySet(tokenContract, beneficiary, royaltyPercentage); } /** * @notice Create a bid on a token, with a given amount. * @dev If provided a valid bid, transfers the provided amount to this contract. * If the auction is run in native ETH, the ETH is wrapped so it can be identically to other * auction currencies in this contract. */ function createBid(uint256 auctionId, uint256 amount) external override payable auctionExists(auctionId) nonReentrant { address payable lastBidder = auctions[auctionId].bidder; require( auctions[auctionId].firstBidTime == 0 || block.timestamp < auctions[auctionId].firstBidTime.add(auctions[auctionId].duration), "Auction expired" ); require( amount >= auctions[auctionId].reservePrice, "Must send at least reservePrice" ); require( amount >= auctions[auctionId].amount.add( auctions[auctionId].amount.mul(minBidIncrementPercentage).div(100) ), "Must send more than last bid by minBidIncrementPercentage amount" ); // If this is the first valid bid, we should set the starting time now. // If it's not, then we should refund the last bidder if(auctions[auctionId].firstBidTime == 0) { auctions[auctionId].firstBidTime = block.timestamp; } else if(lastBidder != address(0)) { _handleOutgoingBid(lastBidder, auctions[auctionId].amount, auctions[auctionId].auctionCurrency); } _handleIncomingBid(amount, auctions[auctionId].auctionCurrency); auctions[auctionId].amount = amount; auctions[auctionId].bidder = payable(msg.sender); bool extended = false; // at this point we know that the timestamp is less than start + duration (since the auction would be over, otherwise) // we want to know by how much the timestamp is less than start + duration // if the difference is less than the timeBuffer, increase the duration by the timeBuffer if ( auctions[auctionId].firstBidTime.add(auctions[auctionId].duration).sub( block.timestamp ) < timeBuffer ) { // Playing code golf for gas optimization: // uint256 expectedEnd = auctions[auctionId].firstBidTime.add(auctions[auctionId].duration); // uint256 timeRemaining = expectedEnd.sub(block.timestamp); // uint256 timeToAdd = timeBuffer.sub(timeRemaining); // uint256 newDuration = auctions[auctionId].duration.add(timeToAdd); uint256 oldDuration = auctions[auctionId].duration; auctions[auctionId].duration = oldDuration.add(timeBuffer.sub(auctions[auctionId].firstBidTime.add(oldDuration).sub(block.timestamp))); extended = true; } emit AuctionBid( auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, msg.sender, amount, block.timestamp, lastBidder == address(0), // firstBid boolean extended ); if (extended) { emit AuctionDurationExtended( auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, auctions[auctionId].duration ); } } /** * @notice End an auction and pay out the respective parties. * @dev If for some reason the auction cannot be finalized (invalid token recipient, for example), * The auction is reset and the NFT is transferred back to the auction creator. */ function endAuction(uint256 auctionId) external override auctionExists(auctionId) nonReentrant { require( uint256(auctions[auctionId].firstBidTime) != 0, "Auction hasn't begun" ); require( block.timestamp >= auctions[auctionId].firstBidTime.add(auctions[auctionId].duration), "Auction hasn't completed" ); address currency = auctions[auctionId].auctionCurrency == address(0) ? wethAddress : auctions[auctionId].auctionCurrency; uint256 tokenOwnerProfit = auctions[auctionId].amount; address tokenContract = auctions[auctionId].tokenContract; // Otherwise, transfer the token to the winner and pay out the participants below try IERC721(auctions[auctionId].tokenContract).safeTransferFrom(address(this), auctions[auctionId].bidder, auctions[auctionId].tokenId) {} catch { _handleOutgoingBid(auctions[auctionId].bidder, auctions[auctionId].amount, auctions[auctionId].auctionCurrency); _cancelAuction(auctionId); return; } if ( royaltyRegistry[tokenContract].beneficiary != address(0) && royaltyRegistry[tokenContract].beneficiary != auctions[auctionId].tokenOwner && royaltyRegistry[tokenContract].royaltyPercentage > 0 ){ uint256 royaltyAmount = _generateRoyaltyAmount(auctionId, auctions[auctionId].tokenContract); uint256 amountRemaining = tokenOwnerProfit.sub(royaltyAmount); _handleOutgoingBid(royaltyRegistry[tokenContract].beneficiary, royaltyAmount, auctions[auctionId].auctionCurrency); _handleOutgoingBid(auctions[auctionId].tokenOwner, amountRemaining, auctions[auctionId].auctionCurrency); emit AuctionWithRoyaltiesEnded( auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, auctions[auctionId].tokenOwner, auctions[auctionId].bidder, amountRemaining, royaltyRegistry[tokenContract].beneficiary, royaltyAmount, block.timestamp, currency ); } else { _handleOutgoingBid(auctions[auctionId].tokenOwner, tokenOwnerProfit, auctions[auctionId].auctionCurrency); emit AuctionEnded( auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, auctions[auctionId].tokenOwner, auctions[auctionId].bidder, tokenOwnerProfit, block.timestamp, currency ); } delete auctions[auctionId]; } /** * @notice Cancel an auction. * @dev Transfers the NFT back to the auction creator and emits an AuctionCanceled event */ function cancelAuction(uint256 auctionId) external override nonReentrant auctionExists(auctionId) { require( _isAuctioneer(msg.sender) || auctions[auctionId].tokenOwner == msg.sender, "Must be auctioneer or owner of NFT" ); require( _isAuthorizedAction( auctions[auctionId].tokenOwner, auctions[auctionId].tokenContract ), "Call must be made by authorized seller, token contract or auctioneer" ); require( uint256(auctions[auctionId].firstBidTime) == 0, "Can't cancel an auction once it's begun" ); _cancelAuction(auctionId); } /** * @notice enable or disable auctions to be created on the basis of whitelist */ function setPublicAuctionsEnabled(bool status) external override onlyAdmin { publicAuctionsEnabled = status; } /** * @notice add account representing token owner (seller) or token contract to the whitelist */ function whitelistAccount(address sellerOrTokenContract) external override onlyAuctioneer { _whitelistAccount(sellerOrTokenContract); } function removeWhitelistedAccount(address sellerOrTokenContract) external override onlyAuctioneer { delete whitelistedAccounts[sellerOrTokenContract]; } function isWhitelisted(address sellerOrTekenContract) external view override returns(bool){ return _isWhitelisted(sellerOrTekenContract); } function addAuctioneer(address who) external override onlyAdmin { _addAuctioneer(who); } function removeAuctioneer(address who) external override onlyAdmin { revokeRole(AUCTIONEER, who); } function isAuctioneer(address who) external view override returns(bool) { return _isAuctioneer(who); } function _isAuctioneer(address who) internal view returns(bool) { return hasRole(AUCTIONEER, who) || hasRole(DEFAULT_ADMIN_ROLE, who); } /** * @dev Given an amount and a currency, transfer the currency to this contract. * If the currency is ETH (0x0), attempt to wrap the amount as WETH */ function _handleIncomingBid(uint256 amount, address currency) internal { // If this is an ETH bid, ensure they sent enough and convert it to WETH under the hood if(currency == address(0)) { require(msg.value == amount, "Sent ETH Value does not match specified bid amount"); IWETH(wethAddress).deposit{value: amount}(); } else { // We must check the balance that was actually transferred to the auction, // as some tokens impose a transfer fee and would not actually transfer the // full amount to the market, resulting in potentally locked funds IERC20 token = IERC20(currency); uint256 beforeBalance = token.balanceOf(address(this)); token.safeTransferFrom(msg.sender, address(this), amount); uint256 afterBalance = token.balanceOf(address(this)); require(beforeBalance.add(amount) == afterBalance, "Token transfer call did not transfer expected amount"); } } function _handleOutgoingBid(address to, uint256 amount, address currency) internal { // If the auction is in ETH, unwrap it from its underlying WETH and try to send it to the recipient. if(currency == address(0)) { IWETH(wethAddress).withdraw(amount); // If the ETH transfer fails (sigh), rewrap the ETH and try send it as WETH. if(!_safeTransferETH(to, amount)) { IWETH(wethAddress).deposit{value: amount}(); IERC20(wethAddress).safeTransfer(to, amount); } } else { IERC20(currency).safeTransfer(to, amount); } } function _generateRoyaltyAmount(uint256 auctionId, address tokenContract) internal view returns (uint256) { return auctions[auctionId].amount.div(100).mul(royaltyRegistry[tokenContract].royaltyPercentage); } function _safeTransferETH(address to, uint256 value) internal returns (bool) { (bool success, ) = to.call{value: value}(new bytes(0)); return success; } function _cancelAuction(uint256 auctionId) internal { address tokenOwner = auctions[auctionId].tokenOwner; IERC721(auctions[auctionId].tokenContract).safeTransferFrom(address(this), tokenOwner, auctions[auctionId].tokenId); emit AuctionCanceled(auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, tokenOwner); delete auctions[auctionId]; } function _exists(uint256 auctionId) internal view returns(bool) { return auctions[auctionId].tokenOwner != address(0); } /** * @dev returns true if */ function _isAuthorizedAction(address seller, address tokenContract) internal view returns(bool) { if (hasRole(DEFAULT_ADMIN_ROLE, seller) || hasRole(AUCTIONEER, seller)) { return true; } if (publicAuctionsEnabled) { return _isWhitelisted(seller) || _isWhitelisted(tokenContract); } return false; } function _addAuctioneer(address who) internal { _setupRole(AUCTIONEER, who); } function _isWhitelisted(address sellerOrTokenContract) internal view returns(bool) { return whitelistedAccounts[sellerOrTokenContract]; } function _whitelistAccount(address sellerOrTokenContract) internal { whitelistedAccounts[sellerOrTokenContract] = true; } receive() external payable {} fallback() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address[]","name":"auctioneers","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"firstBid","type":"bool"},{"indexed":false,"internalType":"bool","name":"extended","type":"bool"}],"name":"AuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"}],"name":"AuctionCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"address","name":"auctionCurrency","type":"address"}],"name":"AuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"AuctionDurationExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"auctionCurrency","type":"address"}],"name":"AuctionEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"}],"name":"AuctionReservePriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiaryAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"auctionCurrency","type":"address"}],"name":"AuctionWithRoyaltiesEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":true,"internalType":"address","name":"newBeneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"royaltyPercentage","type":"uint256"}],"name":"RoyaltySet","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AUCTIONEER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"addAuctioneer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctions","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"firstBidTime","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"address","name":"auctionCurrency","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"cancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"address","name":"auctionCurrency","type":"address"}],"name":"createAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"endAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"isAuctioneer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sellerOrTekenContract","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBidIncrementPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAuctionsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"removeAuctioneer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sellerOrTokenContract","type":"address"}],"name":"removeWhitelistedAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"royaltyRegistry","outputs":[{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"royaltyPercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"}],"name":"setAuctionReservePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPublicAuctionsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"royaltyPercentage","type":"uint256"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sellerOrTokenContract","type":"address"}],"name":"whitelistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAccounts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620061a3380380620061a3833981810160405281019062000037919062000489565b60016000819055506200005f620000536200014f60201b60201c565b6200015760201b60201c565b81600460016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103846003819055506005600460006101000a81548160ff021916908360ff1602179055506000600960006101000a81548160ff021916908315150217905550620000f56000801b336200021d60201b60201c565b60005b81518110156200014657620001308282815181106200011c576200011b62000638565b5b60200260200101516200023360201b60201c565b80806200013d90620005bb565b915050620000f8565b505050620006d5565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022f82826200026860201b60201c565b5050565b620002657f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a7826200021d60201b60201c565b50565b6200027a82826200035960201b60201c565b6200035557600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002fa6200014f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620003db620003d58462000518565b620004ef565b905080838252602082019050828560208602820111156200040157620004006200069b565b5b60005b858110156200043557816200041a88826200043f565b84526020840193506020830192505060018101905062000404565b5050509392505050565b6000815190506200045081620006bb565b92915050565b600082601f8301126200046e576200046d62000696565b5b815162000480848260208601620003c4565b91505092915050565b60008060408385031215620004a357620004a2620006a5565b5b6000620004b3858286016200043f565b925050602083015167ffffffffffffffff811115620004d757620004d6620006a0565b5b620004e58582860162000456565b9150509250929050565b6000620004fb6200050e565b905062000509828262000585565b919050565b6000604051905090565b600067ffffffffffffffff82111562000536576200053562000667565b5b602082029050602081019050919050565b600062000554826200055b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6200059082620006aa565b810181811067ffffffffffffffff82111715620005b257620005b162000667565b5b80604052505050565b6000620005c8826200057b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620005fe57620005fd62000609565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006c68162000547565b8114620006d257600080fd5b50565b615abe80620006e56000396000f3fe6080604052600436106101dc5760003560e01c80638da5cb5b11610102578063bed2b6ac11610095578063eed90aa211610064578063eed90aa2146106b9578063f2fde38b146106f7578063f6a6830f14610720578063ff88f1251461075d576101e3565b8063bed2b6ac14610613578063cbe01bc81461063c578063d547741f14610665578063ec91f2a41461068e576101e3565b8063a217fddf116100d1578063a217fddf14610578578063b296024d146105a3578063b7751c71146105ce578063b9a2de3a146105ea576101e3565b80638da5cb5b146104aa57806391d14854146104d557806396b5a755146105125780639cd85b5b1461053b576101e3565b80633af32abf1161017a57806363e0c2f81161014957806363e0c2f8146104185780636f8a41e114610441578063715018a61461046a578063856af45e14610481576101e3565b80633af32abf146103425780634f0e0ef31461037f57806355c338aa146103aa578063571a26a0146103d3576101e3565b8063248a9ca3116101b6578063248a9ca3146102765780632f2ff15d146102b357806336568abe146102dc57806336bfb6be14610305576101e3565b806301ffc9a7146101e557806312fcaffb1461022257806323e507f71461024b576101e3565b366101e357005b005b3480156101f157600080fd5b5061020c600480360381019061020791906143cd565b610788565b6040516102199190614bf1565b60405180910390f35b34801561022e57600080fd5b5061024960048036038101906102449190614259565b610802565b005b34801561025757600080fd5b506102606108d1565b60405161026d9190614c0c565b60405180910390f35b34801561028257600080fd5b5061029d60048036038101906102989190614360565b6108f5565b6040516102aa9190614c0c565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061438d565b610915565b005b3480156102e857600080fd5b5061030360048036038101906102fe919061438d565b61093e565b005b34801561031157600080fd5b5061032c60048036038101906103279190614454565b6109c1565b6040516103399190614f64565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190614259565b610f17565b6040516103769190614bf1565b60405180910390f35b34801561038b57600080fd5b50610394610f29565b6040516103a19190614a01565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc91906142b3565b610f4f565b005b3480156103df57600080fd5b506103fa60048036038101906103f591906143fa565b6110ea565b60405161040f99989796959493929190614f7f565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190614259565b6111b8565b005b34801561044d57600080fd5b50610468600480360381019061046391906144cf565b611241565b005b34801561047657600080fd5b5061047f611508565b005b34801561048d57600080fd5b506104a860048036038101906104a39190614306565b611590565b005b3480156104b657600080fd5b506104bf6115f9565b6040516104cc9190614a01565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f7919061438d565b611623565b6040516105099190614bf1565b60405180910390f35b34801561051e57600080fd5b50610539600480360381019061053491906143fa565b61168e565b005b34801561054757600080fd5b50610562600480360381019061055d9190614259565b6118fc565b60405161056f9190614bf1565b60405180910390f35b34801561058457600080fd5b5061058d61190e565b60405161059a9190614c0c565b60405180910390f35b3480156105af57600080fd5b506105b8611915565b6040516105c59190615051565b60405180910390f35b6105e860048036038101906105e391906144cf565b611928565b005b3480156105f657600080fd5b50610611600480360381019061060c91906143fa565b611fbb565b005b34801561061f57600080fd5b5061063a60048036038101906106359190614259565b612af6565b005b34801561064857600080fd5b50610663600480360381019061065e9190614259565b612b6f565b005b34801561067157600080fd5b5061068c6004803603810190610687919061438d565b612bc7565b005b34801561069a57600080fd5b506106a3612bf0565b6040516106b09190614f64565b60405180910390f35b3480156106c557600080fd5b506106e060048036038101906106db9190614259565b612bf6565b6040516106ee929190614a1c565b60405180910390f35b34801561070357600080fd5b5061071e60048036038101906107199190614259565b612c3a565b005b34801561072c57600080fd5b5061074760048036038101906107429190614259565b612d32565b6040516107549190614bf1565b60405180910390f35b34801561076957600080fd5b50610772612d52565b60405161077f9190614bf1565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fb57506107fa82612d65565b5b9050919050565b61082c7f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a733611623565b80610840575061083f6000801b33611623565b5b61087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087690614d84565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b7f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a781565b600060016000838152602001908152602001600020600101549050919050565b61091e826108f5565b61092f8161092a612dcf565b612dd7565b6109398383612e74565b505050565b610946612dcf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109aa90614f04565b60405180910390fd5b6109bd8282612f54565b5050565b600060026000541415610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090614ec4565b60405180910390fd5b60026000819055508473ffffffffffffffffffffffffffffffffffffffff166301ffc9a76380ac58cd60e01b6040518263ffffffff1660e01b8152600401610a519190614c27565b60206040518083038186803b158015610a6957600080fd5b505afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa19190614333565b610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790614f24565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b8152600401610b1b9190614f64565b60206040518083038186803b158015610b3357600080fd5b505afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b9190614286565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290614d44565b60405180910390fd5b610be58187613036565b610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90614e44565b60405180910390fd5b6000610c3060086130c4565b90506040518061012001604052808981526020018873ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001878152602001600081526020018681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815250600560008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101008201518160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508673ffffffffffffffffffffffffffffffffffffffff166323b872dd83308b6040518463ffffffff1660e01b8152600401610e6f93929190614b3e565b600060405180830381600087803b158015610e8957600080fd5b505af1158015610e9d573d6000803e3d6000fd5b50505050610eab60086130d2565b8673ffffffffffffffffffffffffffffffffffffffff1688827f4077285700d637595ba695e31bc3daf68d974df3c847fc23daba2185e98695218989878a604051610ef9949392919061500c565b60405180910390a48092505050600160008190555095945050505050565b6000610f22826130e8565b9050919050565b600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f797f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a733611623565b80610f8d5750610f8c6000801b33611623565b5b610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390614d84565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200182815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155905050808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f6f5b4e162a5bcb4c9002a853f3f0f850f68a3ea9de4507cc670f4f43654abe4a60405160405180910390a4505050565b60056020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b6111e27f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a733611623565b806111f657506111f56000801b33611623565b5b611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90614d84565b60405180910390fd5b61123e8161313e565b50565b8161124b81613199565b61128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190614de4565b60405180910390fd5b61129333613208565b806112ff57503373ffffffffffffffffffffffffffffffffffffffff166005600085815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614dc4565b60405180910390fd5b6113b46005600085815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613036565b6113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90614e44565b60405180910390fd5b600060056000858152602001908152602001600020600401541461144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614d64565b60405180910390fd5b8160056000858152602001908152602001600020600501819055506005600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600085815260200190815260200160002060000154847f01e6a465ec1edd582d333147c7b7edf5998164f2cf2269dcb9c93d46c67bd317856040516114fb9190614f64565b60405180910390a4505050565b611510612dcf565b73ffffffffffffffffffffffffffffffffffffffff1661152e6115f9565b73ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90614e04565b60405180910390fd5b61158e600061324f565b565b61159d6000801b33611623565b6115dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d390614c84565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600260005414156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90614ec4565b60405180910390fd5b6002600081905550806116e681613199565b611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c90614de4565b60405180910390fd5b61172e33613208565b8061179a57503373ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d090614dc4565b60405180910390fd5b61184f6005600084815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613036565b61188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590614e44565b60405180910390fd5b60006005600084815260200190815260200160002060040154146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90614ca4565b60405180910390fd5b6118f082613315565b50600160008190555050565b600061190782613208565b9050919050565b6000801b81565b600460009054906101000a900460ff1681565b8161193281613199565b611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890614de4565b60405180910390fd5b600260005414156119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90614ec4565b60405180910390fd5b600260008190555060006005600085815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060056000868152602001908152602001600020600401541480611a5c5750611a596005600086815260200190815260200160002060030154600560008781526020019081526020016000206004015461358590919063ffffffff16565b42105b611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290614ee4565b60405180910390fd5b6005600085815260200190815260200160002060050154831015611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90614d24565b60405180910390fd5b611b6a611b456064611b37600460009054906101000a900460ff1660ff16600560008a81526020019081526020016000206002015461359b90919063ffffffff16565b6135b190919063ffffffff16565b600560008781526020019081526020016000206002015461358590919063ffffffff16565b831015611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390614da4565b60405180910390fd5b600060056000868152602001908152602001600020600401541415611beb57426005600086815260200190815260200160002060040181905550611c78565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c7757611c768160056000878152602001908152602001600020600201546005600088815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b5b5b611cb8836005600087815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661379e565b826005600086815260200190815260200160002060020181905550336005600086815260200190815260200160002060070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600354611d7e42611d70600560008a815260200190815260200160002060030154600560008b81526020019081526020016000206004015461358590919063ffffffff16565b613a4590919063ffffffff16565b1015611e2057600060056000878152602001908152602001600020600301549050611e00611df1611de042611dd285600560008d81526020019081526020016000206004015461358590919063ffffffff16565b613a4590919063ffffffff16565b600354613a4590919063ffffffff16565b8261358590919063ffffffff16565b600560008881526020019081526020016000206003018190555060019150505b6005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002060000154867f0cdc87d824cc34065559c15a02155029135536289b672360ab162f45c04ebc4a338842600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161488604051611eeb959493929190614b9e565b60405180910390a48015611fac576005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002060000154867f55cf2b31608fbe49fa31cd0285b6b6cce46f56d26c8c59980a2af5a0ffbdd5db600560008a815260200190815260200160002060030154604051611fa39190614f64565b60405180910390a45b50506001600081905550505050565b80611fc581613199565b612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614de4565b60405180910390fd5b6002600054141561204a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204190614ec4565b60405180910390fd5b60026000819055506000600560008481526020019081526020016000206004015414156120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a390614d04565b60405180910390fd5b6120eb6005600084815260200190815260200160002060030154600560008581526020019081526020016000206004015461358590919063ffffffff16565b42101561212d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212490614ea4565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff166005600085815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121d4576005600084815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166121f8565b600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b905060006005600085815260200190815260200160002060020154905060006005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e306005600089815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008a8152602001908152602001600020600001546040518463ffffffff1660e01b815260040161230f93929190614a45565b600060405180830381600087803b15801561232957600080fd5b505af192505050801561233a575060015b6123dc576123cb6005600087815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660056000888152602001908152602001600020600201546005600089815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b6123d485613315565b505050612aea565b600073ffffffffffffffffffffffffffffffffffffffff16600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561253f57506005600086815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561258d57506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154115b156128845760006125d4866005600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a5b565b905060006125eb8285613a4590919063ffffffff16565b9050612690600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600560008b815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b6127076005600089815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600560008b815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b6005600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600089815260200190815260200160002060000154887f1cc62382fdc5c7301f869520011e13d7dda380079e98790927d0ab2aa7644fe5600560008c815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008d815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689428e6040516128759796959493929190614a7c565b60405180910390a45050612a0c565b6128fb6005600087815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836005600089815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b6005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002060000154867f46a8e27edc013eca520f0b26b7b9e7e2842ef5030f14ff09141b1bc9780cdf14600560008a815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008b815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687428a604051612a03959493929190614aeb565b60405180910390a45b600560008681526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055600482016000905560058201600090556006820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556007820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556008820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050505b60016000819055505050565b612b036000801b33611623565b612b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3990614c84565b60405180910390fd5b612b6c7f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a782612bc7565b50565b612b7c6000801b33611623565b612bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb290614c84565b60405180910390fd5b612bc481613ae3565b50565b612bd0826108f5565b612be181612bdc612dcf565b612dd7565b612beb8383612f54565b505050565b60035481565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b612c42612dcf565b73ffffffffffffffffffffffffffffffffffffffff16612c606115f9565b73ffffffffffffffffffffffffffffffffffffffff1614612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad90614e04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d90614cc4565b60405180910390fd5b612d2f8161324f565b50565b60076020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b612de18282611623565b612e7057612e068173ffffffffffffffffffffffffffffffffffffffff166014613b10565b612e148360001c6020613b10565b604051602001612e259291906149c7565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e679190614c42565b60405180910390fd5b5050565b612e7e8282611623565b612f5057600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612ef5612dcf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612f5e8282611623565b156130325760006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612fd7612dcf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006130456000801b84611623565b8061307657506130757f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a784611623565b5b1561308457600190506130be565b600960009054906101000a900460ff16156130b9576130a2836130e8565b806130b257506130b1826130e8565b5b90506130be565b600090505b92915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006132347f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a783611623565b8061324857506132476000801b83611623565b5b9050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006005600083815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506005600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e308360056000878152602001908152602001600020600001546040518463ffffffff1660e01b81526004016133d993929190614b3e565b600060405180830381600087803b1580156133f357600080fd5b505af1158015613407573d6000803e3d6000fd5b505050506005600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060000154837f6091afcbe8514686c43b167ca4f1b03e24446d29d8490d496e438f8a2c7634398460405161349f9190614a01565b60405180910390a4600560008381526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055600482016000905560058201600090556006820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556007820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556008820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b6000818361359391906150a9565b905092915050565b600081836135a99190615130565b905092915050565b600081836135bf91906150ff565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561376d57600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016136579190614f64565b600060405180830381600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506136938383613d4c565b61376857600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561370157600080fd5b505af1158015613715573d6000803e3d6000fd5b50505050506137678383600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e129092919063ffffffff16565b5b613799565b61379883838373ffffffffffffffffffffffffffffffffffffffff16613e129092919063ffffffff16565b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561389d57813414613815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380c90614e24565b60405180910390fd5b600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561387f57600080fd5b505af1158015613893573d6000803e3d6000fd5b5050505050613a41565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016138dd9190614a01565b60206040518083038186803b1580156138f557600080fd5b505afa158015613909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392d9190614427565b905061395c3330868573ffffffffffffffffffffffffffffffffffffffff16613e98909392919063ffffffff16565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016139979190614a01565b60206040518083038186803b1580156139af57600080fd5b505afa1580156139c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e79190614427565b9050806139fd868461358590919063ffffffff16565b14613a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3490614f44565b60405180910390fd5b5050505b5050565b60008183613a53919061518a565b905092915050565b6000613adb600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613acd606460056000888152602001908152602001600020600201546135b190919063ffffffff16565b61359b90919063ffffffff16565b905092915050565b613b0d7f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a782613f21565b50565b606060006002836002613b239190615130565b613b2d91906150a9565b67ffffffffffffffff811115613b4657613b4561537b565b5b6040519080825280601f01601f191660200182016040528015613b785781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613bb057613baf61534c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613c1457613c1361534c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002613c549190615130565b613c5e91906150a9565b90505b6001811115613cfe577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613ca057613c9f61534c565b5b1a60f81b828281518110613cb757613cb661534c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080613cf7906152c4565b9050613c61565b5060008414613d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3990614c64565b60405180910390fd5b8091505092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff1683600067ffffffffffffffff811115613d8257613d8161537b565b5b6040519080825280601f01601f191660200182016040528015613db45781602001600182028036833780820191505090505b50604051613dc291906149b0565b60006040518083038185875af1925050503d8060008114613dff576040519150601f19603f3d011682016040523d82523d6000602084013e613e04565b606091505b505090508091505092915050565b613e938363a9059cbb60e01b8484604051602401613e31929190614b75565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f2f565b505050565b613f1b846323b872dd60e01b858585604051602401613eb993929190614b3e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f2f565b50505050565b613f2b8282612e74565b5050565b6000613f91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ff69092919063ffffffff16565b9050600081511115613ff15780806020019051810190613fb19190614333565b613ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe790614e84565b60405180910390fd5b5b505050565b6060614005848460008561400e565b90509392505050565b606082471015614053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404a90614ce4565b60405180910390fd5b61405c85614122565b61409b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161409290614e64565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516140c491906149b0565b60006040518083038185875af1925050503d8060008114614101576040519150601f19603f3d011682016040523d82523d6000602084013e614106565b606091505b5091509150614116828286614135565b92505050949350505050565b600080823b905060008111915050919050565b6060831561414557829050614195565b6000835111156141585782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161418c9190614c42565b60405180910390fd5b9392505050565b6000813590506141ab816159fe565b92915050565b6000815190506141c0816159fe565b92915050565b6000813590506141d581615a15565b92915050565b6000813590506141ea81615a2c565b92915050565b6000815190506141ff81615a2c565b92915050565b60008135905061421481615a43565b92915050565b60008135905061422981615a5a565b92915050565b60008135905061423e81615a71565b92915050565b60008151905061425381615a71565b92915050565b60006020828403121561426f5761426e6153aa565b5b600061427d8482850161419c565b91505092915050565b60006020828403121561429c5761429b6153aa565b5b60006142aa848285016141b1565b91505092915050565b6000806000606084860312156142cc576142cb6153aa565b5b60006142da8682870161419c565b93505060206142eb868287016141c6565b92505060406142fc8682870161422f565b9150509250925092565b60006020828403121561431c5761431b6153aa565b5b600061432a848285016141db565b91505092915050565b600060208284031215614349576143486153aa565b5b6000614357848285016141f0565b91505092915050565b600060208284031215614376576143756153aa565b5b600061438484828501614205565b91505092915050565b600080604083850312156143a4576143a36153aa565b5b60006143b285828601614205565b92505060206143c38582860161419c565b9150509250929050565b6000602082840312156143e3576143e26153aa565b5b60006143f18482850161421a565b91505092915050565b6000602082840312156144105761440f6153aa565b5b600061441e8482850161422f565b91505092915050565b60006020828403121561443d5761443c6153aa565b5b600061444b84828501614244565b91505092915050565b600080600080600060a086880312156144705761446f6153aa565b5b600061447e8882890161422f565b955050602061448f8882890161419c565b94505060406144a08882890161422f565b93505060606144b18882890161422f565b92505060806144c28882890161419c565b9150509295509295909350565b600080604083850312156144e6576144e56153aa565b5b60006144f48582860161422f565b92505060206145058582860161422f565b9150509250929050565b6145188161525b565b82525050565b614527816151d0565b82525050565b614536816151be565b82525050565b614545816151e2565b82525050565b614554816151ee565b82525050565b614563816151f8565b82525050565b60006145748261506c565b61457e8185615082565b935061458e818560208601615291565b80840191505092915050565b60006145a582615077565b6145af818561508d565b93506145bf818560208601615291565b6145c8816153af565b840191505092915050565b60006145de82615077565b6145e8818561509e565b93506145f8818560208601615291565b80840191505092915050565b600061461160208361508d565b915061461c826153c0565b602082019050919050565b600061463460228361508d565b915061463f826153e9565b604082019050919050565b600061465760278361508d565b915061466282615438565b604082019050919050565b600061467a60268361508d565b915061468582615487565b604082019050919050565b600061469d60268361508d565b91506146a8826154d6565b604082019050919050565b60006146c060148361508d565b91506146cb82615525565b602082019050919050565b60006146e3601f8361508d565b91506146ee8261554e565b602082019050919050565b600061470660148361508d565b915061471182615577565b602082019050919050565b6000614729601b8361508d565b9150614734826155a0565b602082019050919050565b600061474c602a8361508d565b9150614757826155c9565b604082019050919050565b600061476f60408361508d565b915061477a82615618565b604082019050919050565b600061479260228361508d565b915061479d82615667565b604082019050919050565b60006147b560158361508d565b91506147c0826156b6565b602082019050919050565b60006147d860208361508d565b91506147e3826156df565b602082019050919050565b60006147fb60328361508d565b915061480682615708565b604082019050919050565b600061481e60448361508d565b915061482982615757565b606082019050919050565b6000614841601d8361508d565b915061484c826157cc565b602082019050919050565b600061486460178361509e565b915061486f826157f5565b601782019050919050565b6000614887602a8361508d565b91506148928261581e565b604082019050919050565b60006148aa60188361508d565b91506148b58261586d565b602082019050919050565b60006148cd601f8361508d565b91506148d882615896565b602082019050919050565b60006148f0600f8361508d565b91506148fb826158bf565b602082019050919050565b600061491360118361509e565b915061491e826158e8565b601182019050919050565b6000614936602f8361508d565b915061494182615911565b604082019050919050565b6000614959602f8361508d565b915061496482615960565b604082019050919050565b600061497c60348361508d565b9150614987826159af565b604082019050919050565b61499b81615244565b82525050565b6149aa8161524e565b82525050565b60006149bc8284614569565b915081905092915050565b60006149d282614857565b91506149de82856145d3565b91506149e982614906565b91506149f582846145d3565b91508190509392505050565b6000602082019050614a16600083018461452d565b92915050565b6000604082019050614a31600083018561451e565b614a3e6020830184614992565b9392505050565b6000606082019050614a5a600083018661452d565b614a67602083018561450f565b614a746040830184614992565b949350505050565b600060e082019050614a91600083018a61452d565b614a9e602083018961450f565b614aab6040830188614992565b614ab8606083018761450f565b614ac56080830186614992565b614ad260a0830185614992565b614adf60c083018461452d565b98975050505050505050565b600060a082019050614b00600083018861452d565b614b0d602083018761450f565b614b1a6040830186614992565b614b276060830185614992565b614b34608083018461452d565b9695505050505050565b6000606082019050614b53600083018661452d565b614b60602083018561452d565b614b6d6040830184614992565b949350505050565b6000604082019050614b8a600083018561452d565b614b976020830184614992565b9392505050565b600060a082019050614bb3600083018861452d565b614bc06020830187614992565b614bcd6040830186614992565b614bda606083018561453c565b614be7608083018461453c565b9695505050505050565b6000602082019050614c06600083018461453c565b92915050565b6000602082019050614c21600083018461454b565b92915050565b6000602082019050614c3c600083018461455a565b92915050565b60006020820190508181036000830152614c5c818461459a565b905092915050565b60006020820190508181036000830152614c7d81614604565b9050919050565b60006020820190508181036000830152614c9d81614627565b9050919050565b60006020820190508181036000830152614cbd8161464a565b9050919050565b60006020820190508181036000830152614cdd8161466d565b9050919050565b60006020820190508181036000830152614cfd81614690565b9050919050565b60006020820190508181036000830152614d1d816146b3565b9050919050565b60006020820190508181036000830152614d3d816146d6565b9050919050565b60006020820190508181036000830152614d5d816146f9565b9050919050565b60006020820190508181036000830152614d7d8161471c565b9050919050565b60006020820190508181036000830152614d9d8161473f565b9050919050565b60006020820190508181036000830152614dbd81614762565b9050919050565b60006020820190508181036000830152614ddd81614785565b9050919050565b60006020820190508181036000830152614dfd816147a8565b9050919050565b60006020820190508181036000830152614e1d816147cb565b9050919050565b60006020820190508181036000830152614e3d816147ee565b9050919050565b60006020820190508181036000830152614e5d81614811565b9050919050565b60006020820190508181036000830152614e7d81614834565b9050919050565b60006020820190508181036000830152614e9d8161487a565b9050919050565b60006020820190508181036000830152614ebd8161489d565b9050919050565b60006020820190508181036000830152614edd816148c0565b9050919050565b60006020820190508181036000830152614efd816148e3565b9050919050565b60006020820190508181036000830152614f1d81614929565b9050919050565b60006020820190508181036000830152614f3d8161494c565b9050919050565b60006020820190508181036000830152614f5d8161496f565b9050919050565b6000602082019050614f796000830184614992565b92915050565b600061012082019050614f95600083018c614992565b614fa2602083018b61452d565b614faf604083018a614992565b614fbc6060830189614992565b614fc96080830188614992565b614fd660a0830187614992565b614fe360c083018661452d565b614ff060e083018561451e565b614ffe61010083018461452d565b9a9950505050505050505050565b60006080820190506150216000830187614992565b61502e6020830186614992565b61503b604083018561452d565b615048606083018461452d565b95945050505050565b600060208201905061506660008301846149a1565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150b482615244565b91506150bf83615244565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150f4576150f36152ee565b5b828201905092915050565b600061510a82615244565b915061511583615244565b9250826151255761512461531d565b5b828204905092915050565b600061513b82615244565b915061514683615244565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561517f5761517e6152ee565b5b828202905092915050565b600061519582615244565b91506151a083615244565b9250828210156151b3576151b26152ee565b5b828203905092915050565b60006151c982615224565b9050919050565b60006151db82615224565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006152668261526d565b9050919050565b60006152788261527f565b9050919050565b600061528a82615224565b9050919050565b60005b838110156152af578082015181840152602081019050615294565b838111156152be576000848401525b50505050565b60006152cf82615244565b915060008214156152e3576152e26152ee565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f43616c6c206d757374206265206d6164652062792061646d696e69737472617460008201527f6f72000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e27742063616e63656c20616e2061756374696f6e206f6e63652069742760008201527f7320626567756e00000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206861736e277420626567756e000000000000000000000000600082015250565b7f4d7573742073656e64206174206c656173742072657365727665507269636500600082015250565b7f4d757374206265206f776e6572206f66204e4654000000000000000000000000600082015250565b7f41756374696f6e2068617320616c726561647920737461727465640000000000600082015250565b7f43616c6c206d757374206265206d61646520627920617574686f72697a65642060008201527f61756374696f6e65657200000000000000000000000000000000000000000000602082015250565b7f4d7573742073656e64206d6f7265207468616e206c617374206269642062792060008201527f6d696e426964496e6372656d656e7450657263656e7461676520616d6f756e74602082015250565b7f4d7573742062652061756374696f6e656572206f72206f776e6572206f66204e60008201527f4654000000000000000000000000000000000000000000000000000000000000602082015250565b7f41756374696f6e20646f65736e27742065786973740000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53656e74204554482056616c756520646f6573206e6f74206d6174636820737060008201527f656369666965642062696420616d6f756e740000000000000000000000000000602082015250565b7f43616c6c206d757374206265206d61646520627920617574686f72697a65642060008201527f73656c6c65722c20746f6b656e20636f6e7472616374206f722061756374696f60208201527f6e65657200000000000000000000000000000000000000000000000000000000604082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206861736e277420636f6d706c657465640000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f41756374696f6e20657870697265640000000000000000000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f746f6b656e436f6e747261637420646f6573206e6f7420737570706f7274204560008201527f524337323120696e746572666163650000000000000000000000000000000000602082015250565b7f546f6b656e207472616e736665722063616c6c20646964206e6f74207472616e60008201527f7366657220657870656374656420616d6f756e74000000000000000000000000602082015250565b615a07816151be565b8114615a1257600080fd5b50565b615a1e816151d0565b8114615a2957600080fd5b50565b615a35816151e2565b8114615a4057600080fd5b50565b615a4c816151ee565b8114615a5757600080fd5b50565b615a63816151f8565b8114615a6e57600080fd5b50565b615a7a81615244565b8114615a8557600080fd5b5056fea26469706673582212203d69ebc39a8aafbf4588b64e23ad5db23698bbd6db523b06cc2df534b9920b9e64736f6c63430008070033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c80638da5cb5b11610102578063bed2b6ac11610095578063eed90aa211610064578063eed90aa2146106b9578063f2fde38b146106f7578063f6a6830f14610720578063ff88f1251461075d576101e3565b8063bed2b6ac14610613578063cbe01bc81461063c578063d547741f14610665578063ec91f2a41461068e576101e3565b8063a217fddf116100d1578063a217fddf14610578578063b296024d146105a3578063b7751c71146105ce578063b9a2de3a146105ea576101e3565b80638da5cb5b146104aa57806391d14854146104d557806396b5a755146105125780639cd85b5b1461053b576101e3565b80633af32abf1161017a57806363e0c2f81161014957806363e0c2f8146104185780636f8a41e114610441578063715018a61461046a578063856af45e14610481576101e3565b80633af32abf146103425780634f0e0ef31461037f57806355c338aa146103aa578063571a26a0146103d3576101e3565b8063248a9ca3116101b6578063248a9ca3146102765780632f2ff15d146102b357806336568abe146102dc57806336bfb6be14610305576101e3565b806301ffc9a7146101e557806312fcaffb1461022257806323e507f71461024b576101e3565b366101e357005b005b3480156101f157600080fd5b5061020c600480360381019061020791906143cd565b610788565b6040516102199190614bf1565b60405180910390f35b34801561022e57600080fd5b5061024960048036038101906102449190614259565b610802565b005b34801561025757600080fd5b506102606108d1565b60405161026d9190614c0c565b60405180910390f35b34801561028257600080fd5b5061029d60048036038101906102989190614360565b6108f5565b6040516102aa9190614c0c565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061438d565b610915565b005b3480156102e857600080fd5b5061030360048036038101906102fe919061438d565b61093e565b005b34801561031157600080fd5b5061032c60048036038101906103279190614454565b6109c1565b6040516103399190614f64565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190614259565b610f17565b6040516103769190614bf1565b60405180910390f35b34801561038b57600080fd5b50610394610f29565b6040516103a19190614a01565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc91906142b3565b610f4f565b005b3480156103df57600080fd5b506103fa60048036038101906103f591906143fa565b6110ea565b60405161040f99989796959493929190614f7f565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190614259565b6111b8565b005b34801561044d57600080fd5b50610468600480360381019061046391906144cf565b611241565b005b34801561047657600080fd5b5061047f611508565b005b34801561048d57600080fd5b506104a860048036038101906104a39190614306565b611590565b005b3480156104b657600080fd5b506104bf6115f9565b6040516104cc9190614a01565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f7919061438d565b611623565b6040516105099190614bf1565b60405180910390f35b34801561051e57600080fd5b50610539600480360381019061053491906143fa565b61168e565b005b34801561054757600080fd5b50610562600480360381019061055d9190614259565b6118fc565b60405161056f9190614bf1565b60405180910390f35b34801561058457600080fd5b5061058d61190e565b60405161059a9190614c0c565b60405180910390f35b3480156105af57600080fd5b506105b8611915565b6040516105c59190615051565b60405180910390f35b6105e860048036038101906105e391906144cf565b611928565b005b3480156105f657600080fd5b50610611600480360381019061060c91906143fa565b611fbb565b005b34801561061f57600080fd5b5061063a60048036038101906106359190614259565b612af6565b005b34801561064857600080fd5b50610663600480360381019061065e9190614259565b612b6f565b005b34801561067157600080fd5b5061068c6004803603810190610687919061438d565b612bc7565b005b34801561069a57600080fd5b506106a3612bf0565b6040516106b09190614f64565b60405180910390f35b3480156106c557600080fd5b506106e060048036038101906106db9190614259565b612bf6565b6040516106ee929190614a1c565b60405180910390f35b34801561070357600080fd5b5061071e60048036038101906107199190614259565b612c3a565b005b34801561072c57600080fd5b5061074760048036038101906107429190614259565b612d32565b6040516107549190614bf1565b60405180910390f35b34801561076957600080fd5b50610772612d52565b60405161077f9190614bf1565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fb57506107fa82612d65565b5b9050919050565b61082c7f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a733611623565b80610840575061083f6000801b33611623565b5b61087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087690614d84565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b7f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a781565b600060016000838152602001908152602001600020600101549050919050565b61091e826108f5565b61092f8161092a612dcf565b612dd7565b6109398383612e74565b505050565b610946612dcf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109aa90614f04565b60405180910390fd5b6109bd8282612f54565b5050565b600060026000541415610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090614ec4565b60405180910390fd5b60026000819055508473ffffffffffffffffffffffffffffffffffffffff166301ffc9a76380ac58cd60e01b6040518263ffffffff1660e01b8152600401610a519190614c27565b60206040518083038186803b158015610a6957600080fd5b505afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa19190614333565b610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790614f24565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b8152600401610b1b9190614f64565b60206040518083038186803b158015610b3357600080fd5b505afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b9190614286565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290614d44565b60405180910390fd5b610be58187613036565b610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90614e44565b60405180910390fd5b6000610c3060086130c4565b90506040518061012001604052808981526020018873ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001878152602001600081526020018681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815250600560008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101008201518160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508673ffffffffffffffffffffffffffffffffffffffff166323b872dd83308b6040518463ffffffff1660e01b8152600401610e6f93929190614b3e565b600060405180830381600087803b158015610e8957600080fd5b505af1158015610e9d573d6000803e3d6000fd5b50505050610eab60086130d2565b8673ffffffffffffffffffffffffffffffffffffffff1688827f4077285700d637595ba695e31bc3daf68d974df3c847fc23daba2185e98695218989878a604051610ef9949392919061500c565b60405180910390a48092505050600160008190555095945050505050565b6000610f22826130e8565b9050919050565b600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f797f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a733611623565b80610f8d5750610f8c6000801b33611623565b5b610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390614d84565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200182815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155905050808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f6f5b4e162a5bcb4c9002a853f3f0f850f68a3ea9de4507cc670f4f43654abe4a60405160405180910390a4505050565b60056020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b6111e27f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a733611623565b806111f657506111f56000801b33611623565b5b611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90614d84565b60405180910390fd5b61123e8161313e565b50565b8161124b81613199565b61128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190614de4565b60405180910390fd5b61129333613208565b806112ff57503373ffffffffffffffffffffffffffffffffffffffff166005600085815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614dc4565b60405180910390fd5b6113b46005600085815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613036565b6113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90614e44565b60405180910390fd5b600060056000858152602001908152602001600020600401541461144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614d64565b60405180910390fd5b8160056000858152602001908152602001600020600501819055506005600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600085815260200190815260200160002060000154847f01e6a465ec1edd582d333147c7b7edf5998164f2cf2269dcb9c93d46c67bd317856040516114fb9190614f64565b60405180910390a4505050565b611510612dcf565b73ffffffffffffffffffffffffffffffffffffffff1661152e6115f9565b73ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90614e04565b60405180910390fd5b61158e600061324f565b565b61159d6000801b33611623565b6115dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d390614c84565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600260005414156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90614ec4565b60405180910390fd5b6002600081905550806116e681613199565b611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c90614de4565b60405180910390fd5b61172e33613208565b8061179a57503373ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d090614dc4565b60405180910390fd5b61184f6005600084815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613036565b61188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590614e44565b60405180910390fd5b60006005600084815260200190815260200160002060040154146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90614ca4565b60405180910390fd5b6118f082613315565b50600160008190555050565b600061190782613208565b9050919050565b6000801b81565b600460009054906101000a900460ff1681565b8161193281613199565b611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890614de4565b60405180910390fd5b600260005414156119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90614ec4565b60405180910390fd5b600260008190555060006005600085815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060056000868152602001908152602001600020600401541480611a5c5750611a596005600086815260200190815260200160002060030154600560008781526020019081526020016000206004015461358590919063ffffffff16565b42105b611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290614ee4565b60405180910390fd5b6005600085815260200190815260200160002060050154831015611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90614d24565b60405180910390fd5b611b6a611b456064611b37600460009054906101000a900460ff1660ff16600560008a81526020019081526020016000206002015461359b90919063ffffffff16565b6135b190919063ffffffff16565b600560008781526020019081526020016000206002015461358590919063ffffffff16565b831015611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390614da4565b60405180910390fd5b600060056000868152602001908152602001600020600401541415611beb57426005600086815260200190815260200160002060040181905550611c78565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c7757611c768160056000878152602001908152602001600020600201546005600088815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b5b5b611cb8836005600087815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661379e565b826005600086815260200190815260200160002060020181905550336005600086815260200190815260200160002060070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600354611d7e42611d70600560008a815260200190815260200160002060030154600560008b81526020019081526020016000206004015461358590919063ffffffff16565b613a4590919063ffffffff16565b1015611e2057600060056000878152602001908152602001600020600301549050611e00611df1611de042611dd285600560008d81526020019081526020016000206004015461358590919063ffffffff16565b613a4590919063ffffffff16565b600354613a4590919063ffffffff16565b8261358590919063ffffffff16565b600560008881526020019081526020016000206003018190555060019150505b6005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002060000154867f0cdc87d824cc34065559c15a02155029135536289b672360ab162f45c04ebc4a338842600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161488604051611eeb959493929190614b9e565b60405180910390a48015611fac576005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002060000154867f55cf2b31608fbe49fa31cd0285b6b6cce46f56d26c8c59980a2af5a0ffbdd5db600560008a815260200190815260200160002060030154604051611fa39190614f64565b60405180910390a45b50506001600081905550505050565b80611fc581613199565b612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614de4565b60405180910390fd5b6002600054141561204a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204190614ec4565b60405180910390fd5b60026000819055506000600560008481526020019081526020016000206004015414156120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a390614d04565b60405180910390fd5b6120eb6005600084815260200190815260200160002060030154600560008581526020019081526020016000206004015461358590919063ffffffff16565b42101561212d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212490614ea4565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff166005600085815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121d4576005600084815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166121f8565b600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b905060006005600085815260200190815260200160002060020154905060006005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e306005600089815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008a8152602001908152602001600020600001546040518463ffffffff1660e01b815260040161230f93929190614a45565b600060405180830381600087803b15801561232957600080fd5b505af192505050801561233a575060015b6123dc576123cb6005600087815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660056000888152602001908152602001600020600201546005600089815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b6123d485613315565b505050612aea565b600073ffffffffffffffffffffffffffffffffffffffff16600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561253f57506005600086815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561258d57506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154115b156128845760006125d4866005600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a5b565b905060006125eb8285613a4590919063ffffffff16565b9050612690600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600560008b815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b6127076005600089815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600560008b815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b6005600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600089815260200190815260200160002060000154887f1cc62382fdc5c7301f869520011e13d7dda380079e98790927d0ab2aa7644fe5600560008c815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008d815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689428e6040516128759796959493929190614a7c565b60405180910390a45050612a0c565b6128fb6005600087815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836005600089815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135c7565b6005600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002060000154867f46a8e27edc013eca520f0b26b7b9e7e2842ef5030f14ff09141b1bc9780cdf14600560008a815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008b815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687428a604051612a03959493929190614aeb565b60405180910390a45b600560008681526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055600482016000905560058201600090556006820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556007820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556008820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050505b60016000819055505050565b612b036000801b33611623565b612b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3990614c84565b60405180910390fd5b612b6c7f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a782612bc7565b50565b612b7c6000801b33611623565b612bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb290614c84565b60405180910390fd5b612bc481613ae3565b50565b612bd0826108f5565b612be181612bdc612dcf565b612dd7565b612beb8383612f54565b505050565b60035481565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b612c42612dcf565b73ffffffffffffffffffffffffffffffffffffffff16612c606115f9565b73ffffffffffffffffffffffffffffffffffffffff1614612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad90614e04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d90614cc4565b60405180910390fd5b612d2f8161324f565b50565b60076020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b612de18282611623565b612e7057612e068173ffffffffffffffffffffffffffffffffffffffff166014613b10565b612e148360001c6020613b10565b604051602001612e259291906149c7565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e679190614c42565b60405180910390fd5b5050565b612e7e8282611623565b612f5057600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612ef5612dcf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612f5e8282611623565b156130325760006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612fd7612dcf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006130456000801b84611623565b8061307657506130757f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a784611623565b5b1561308457600190506130be565b600960009054906101000a900460ff16156130b9576130a2836130e8565b806130b257506130b1826130e8565b5b90506130be565b600090505b92915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006132347f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a783611623565b8061324857506132476000801b83611623565b5b9050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006005600083815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506005600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e308360056000878152602001908152602001600020600001546040518463ffffffff1660e01b81526004016133d993929190614b3e565b600060405180830381600087803b1580156133f357600080fd5b505af1158015613407573d6000803e3d6000fd5b505050506005600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060000154837f6091afcbe8514686c43b167ca4f1b03e24446d29d8490d496e438f8a2c7634398460405161349f9190614a01565b60405180910390a4600560008381526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055600482016000905560058201600090556006820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556007820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556008820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b6000818361359391906150a9565b905092915050565b600081836135a99190615130565b905092915050565b600081836135bf91906150ff565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561376d57600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016136579190614f64565b600060405180830381600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506136938383613d4c565b61376857600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561370157600080fd5b505af1158015613715573d6000803e3d6000fd5b50505050506137678383600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e129092919063ffffffff16565b5b613799565b61379883838373ffffffffffffffffffffffffffffffffffffffff16613e129092919063ffffffff16565b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561389d57813414613815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380c90614e24565b60405180910390fd5b600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561387f57600080fd5b505af1158015613893573d6000803e3d6000fd5b5050505050613a41565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016138dd9190614a01565b60206040518083038186803b1580156138f557600080fd5b505afa158015613909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392d9190614427565b905061395c3330868573ffffffffffffffffffffffffffffffffffffffff16613e98909392919063ffffffff16565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016139979190614a01565b60206040518083038186803b1580156139af57600080fd5b505afa1580156139c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e79190614427565b9050806139fd868461358590919063ffffffff16565b14613a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3490614f44565b60405180910390fd5b5050505b5050565b60008183613a53919061518a565b905092915050565b6000613adb600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613acd606460056000888152602001908152602001600020600201546135b190919063ffffffff16565b61359b90919063ffffffff16565b905092915050565b613b0d7f1d693f62a755e2b3c6494da41af454605b9006057cb3c79b6adda1378f2a50a782613f21565b50565b606060006002836002613b239190615130565b613b2d91906150a9565b67ffffffffffffffff811115613b4657613b4561537b565b5b6040519080825280601f01601f191660200182016040528015613b785781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613bb057613baf61534c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613c1457613c1361534c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002613c549190615130565b613c5e91906150a9565b90505b6001811115613cfe577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613ca057613c9f61534c565b5b1a60f81b828281518110613cb757613cb661534c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080613cf7906152c4565b9050613c61565b5060008414613d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3990614c64565b60405180910390fd5b8091505092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff1683600067ffffffffffffffff811115613d8257613d8161537b565b5b6040519080825280601f01601f191660200182016040528015613db45781602001600182028036833780820191505090505b50604051613dc291906149b0565b60006040518083038185875af1925050503d8060008114613dff576040519150601f19603f3d011682016040523d82523d6000602084013e613e04565b606091505b505090508091505092915050565b613e938363a9059cbb60e01b8484604051602401613e31929190614b75565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f2f565b505050565b613f1b846323b872dd60e01b858585604051602401613eb993929190614b3e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f2f565b50505050565b613f2b8282612e74565b5050565b6000613f91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ff69092919063ffffffff16565b9050600081511115613ff15780806020019051810190613fb19190614333565b613ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe790614e84565b60405180910390fd5b5b505050565b6060614005848460008561400e565b90509392505050565b606082471015614053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404a90614ce4565b60405180910390fd5b61405c85614122565b61409b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161409290614e64565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516140c491906149b0565b60006040518083038185875af1925050503d8060008114614101576040519150601f19603f3d011682016040523d82523d6000602084013e614106565b606091505b5091509150614116828286614135565b92505050949350505050565b600080823b905060008111915050919050565b6060831561414557829050614195565b6000835111156141585782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161418c9190614c42565b60405180910390fd5b9392505050565b6000813590506141ab816159fe565b92915050565b6000815190506141c0816159fe565b92915050565b6000813590506141d581615a15565b92915050565b6000813590506141ea81615a2c565b92915050565b6000815190506141ff81615a2c565b92915050565b60008135905061421481615a43565b92915050565b60008135905061422981615a5a565b92915050565b60008135905061423e81615a71565b92915050565b60008151905061425381615a71565b92915050565b60006020828403121561426f5761426e6153aa565b5b600061427d8482850161419c565b91505092915050565b60006020828403121561429c5761429b6153aa565b5b60006142aa848285016141b1565b91505092915050565b6000806000606084860312156142cc576142cb6153aa565b5b60006142da8682870161419c565b93505060206142eb868287016141c6565b92505060406142fc8682870161422f565b9150509250925092565b60006020828403121561431c5761431b6153aa565b5b600061432a848285016141db565b91505092915050565b600060208284031215614349576143486153aa565b5b6000614357848285016141f0565b91505092915050565b600060208284031215614376576143756153aa565b5b600061438484828501614205565b91505092915050565b600080604083850312156143a4576143a36153aa565b5b60006143b285828601614205565b92505060206143c38582860161419c565b9150509250929050565b6000602082840312156143e3576143e26153aa565b5b60006143f18482850161421a565b91505092915050565b6000602082840312156144105761440f6153aa565b5b600061441e8482850161422f565b91505092915050565b60006020828403121561443d5761443c6153aa565b5b600061444b84828501614244565b91505092915050565b600080600080600060a086880312156144705761446f6153aa565b5b600061447e8882890161422f565b955050602061448f8882890161419c565b94505060406144a08882890161422f565b93505060606144b18882890161422f565b92505060806144c28882890161419c565b9150509295509295909350565b600080604083850312156144e6576144e56153aa565b5b60006144f48582860161422f565b92505060206145058582860161422f565b9150509250929050565b6145188161525b565b82525050565b614527816151d0565b82525050565b614536816151be565b82525050565b614545816151e2565b82525050565b614554816151ee565b82525050565b614563816151f8565b82525050565b60006145748261506c565b61457e8185615082565b935061458e818560208601615291565b80840191505092915050565b60006145a582615077565b6145af818561508d565b93506145bf818560208601615291565b6145c8816153af565b840191505092915050565b60006145de82615077565b6145e8818561509e565b93506145f8818560208601615291565b80840191505092915050565b600061461160208361508d565b915061461c826153c0565b602082019050919050565b600061463460228361508d565b915061463f826153e9565b604082019050919050565b600061465760278361508d565b915061466282615438565b604082019050919050565b600061467a60268361508d565b915061468582615487565b604082019050919050565b600061469d60268361508d565b91506146a8826154d6565b604082019050919050565b60006146c060148361508d565b91506146cb82615525565b602082019050919050565b60006146e3601f8361508d565b91506146ee8261554e565b602082019050919050565b600061470660148361508d565b915061471182615577565b602082019050919050565b6000614729601b8361508d565b9150614734826155a0565b602082019050919050565b600061474c602a8361508d565b9150614757826155c9565b604082019050919050565b600061476f60408361508d565b915061477a82615618565b604082019050919050565b600061479260228361508d565b915061479d82615667565b604082019050919050565b60006147b560158361508d565b91506147c0826156b6565b602082019050919050565b60006147d860208361508d565b91506147e3826156df565b602082019050919050565b60006147fb60328361508d565b915061480682615708565b604082019050919050565b600061481e60448361508d565b915061482982615757565b606082019050919050565b6000614841601d8361508d565b915061484c826157cc565b602082019050919050565b600061486460178361509e565b915061486f826157f5565b601782019050919050565b6000614887602a8361508d565b91506148928261581e565b604082019050919050565b60006148aa60188361508d565b91506148b58261586d565b602082019050919050565b60006148cd601f8361508d565b91506148d882615896565b602082019050919050565b60006148f0600f8361508d565b91506148fb826158bf565b602082019050919050565b600061491360118361509e565b915061491e826158e8565b601182019050919050565b6000614936602f8361508d565b915061494182615911565b604082019050919050565b6000614959602f8361508d565b915061496482615960565b604082019050919050565b600061497c60348361508d565b9150614987826159af565b604082019050919050565b61499b81615244565b82525050565b6149aa8161524e565b82525050565b60006149bc8284614569565b915081905092915050565b60006149d282614857565b91506149de82856145d3565b91506149e982614906565b91506149f582846145d3565b91508190509392505050565b6000602082019050614a16600083018461452d565b92915050565b6000604082019050614a31600083018561451e565b614a3e6020830184614992565b9392505050565b6000606082019050614a5a600083018661452d565b614a67602083018561450f565b614a746040830184614992565b949350505050565b600060e082019050614a91600083018a61452d565b614a9e602083018961450f565b614aab6040830188614992565b614ab8606083018761450f565b614ac56080830186614992565b614ad260a0830185614992565b614adf60c083018461452d565b98975050505050505050565b600060a082019050614b00600083018861452d565b614b0d602083018761450f565b614b1a6040830186614992565b614b276060830185614992565b614b34608083018461452d565b9695505050505050565b6000606082019050614b53600083018661452d565b614b60602083018561452d565b614b6d6040830184614992565b949350505050565b6000604082019050614b8a600083018561452d565b614b976020830184614992565b9392505050565b600060a082019050614bb3600083018861452d565b614bc06020830187614992565b614bcd6040830186614992565b614bda606083018561453c565b614be7608083018461453c565b9695505050505050565b6000602082019050614c06600083018461453c565b92915050565b6000602082019050614c21600083018461454b565b92915050565b6000602082019050614c3c600083018461455a565b92915050565b60006020820190508181036000830152614c5c818461459a565b905092915050565b60006020820190508181036000830152614c7d81614604565b9050919050565b60006020820190508181036000830152614c9d81614627565b9050919050565b60006020820190508181036000830152614cbd8161464a565b9050919050565b60006020820190508181036000830152614cdd8161466d565b9050919050565b60006020820190508181036000830152614cfd81614690565b9050919050565b60006020820190508181036000830152614d1d816146b3565b9050919050565b60006020820190508181036000830152614d3d816146d6565b9050919050565b60006020820190508181036000830152614d5d816146f9565b9050919050565b60006020820190508181036000830152614d7d8161471c565b9050919050565b60006020820190508181036000830152614d9d8161473f565b9050919050565b60006020820190508181036000830152614dbd81614762565b9050919050565b60006020820190508181036000830152614ddd81614785565b9050919050565b60006020820190508181036000830152614dfd816147a8565b9050919050565b60006020820190508181036000830152614e1d816147cb565b9050919050565b60006020820190508181036000830152614e3d816147ee565b9050919050565b60006020820190508181036000830152614e5d81614811565b9050919050565b60006020820190508181036000830152614e7d81614834565b9050919050565b60006020820190508181036000830152614e9d8161487a565b9050919050565b60006020820190508181036000830152614ebd8161489d565b9050919050565b60006020820190508181036000830152614edd816148c0565b9050919050565b60006020820190508181036000830152614efd816148e3565b9050919050565b60006020820190508181036000830152614f1d81614929565b9050919050565b60006020820190508181036000830152614f3d8161494c565b9050919050565b60006020820190508181036000830152614f5d8161496f565b9050919050565b6000602082019050614f796000830184614992565b92915050565b600061012082019050614f95600083018c614992565b614fa2602083018b61452d565b614faf604083018a614992565b614fbc6060830189614992565b614fc96080830188614992565b614fd660a0830187614992565b614fe360c083018661452d565b614ff060e083018561451e565b614ffe61010083018461452d565b9a9950505050505050505050565b60006080820190506150216000830187614992565b61502e6020830186614992565b61503b604083018561452d565b615048606083018461452d565b95945050505050565b600060208201905061506660008301846149a1565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150b482615244565b91506150bf83615244565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150f4576150f36152ee565b5b828201905092915050565b600061510a82615244565b915061511583615244565b9250826151255761512461531d565b5b828204905092915050565b600061513b82615244565b915061514683615244565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561517f5761517e6152ee565b5b828202905092915050565b600061519582615244565b91506151a083615244565b9250828210156151b3576151b26152ee565b5b828203905092915050565b60006151c982615224565b9050919050565b60006151db82615224565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006152668261526d565b9050919050565b60006152788261527f565b9050919050565b600061528a82615224565b9050919050565b60005b838110156152af578082015181840152602081019050615294565b838111156152be576000848401525b50505050565b60006152cf82615244565b915060008214156152e3576152e26152ee565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f43616c6c206d757374206265206d6164652062792061646d696e69737472617460008201527f6f72000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e27742063616e63656c20616e2061756374696f6e206f6e63652069742760008201527f7320626567756e00000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206861736e277420626567756e000000000000000000000000600082015250565b7f4d7573742073656e64206174206c656173742072657365727665507269636500600082015250565b7f4d757374206265206f776e6572206f66204e4654000000000000000000000000600082015250565b7f41756374696f6e2068617320616c726561647920737461727465640000000000600082015250565b7f43616c6c206d757374206265206d61646520627920617574686f72697a65642060008201527f61756374696f6e65657200000000000000000000000000000000000000000000602082015250565b7f4d7573742073656e64206d6f7265207468616e206c617374206269642062792060008201527f6d696e426964496e6372656d656e7450657263656e7461676520616d6f756e74602082015250565b7f4d7573742062652061756374696f6e656572206f72206f776e6572206f66204e60008201527f4654000000000000000000000000000000000000000000000000000000000000602082015250565b7f41756374696f6e20646f65736e27742065786973740000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53656e74204554482056616c756520646f6573206e6f74206d6174636820737060008201527f656369666965642062696420616d6f756e740000000000000000000000000000602082015250565b7f43616c6c206d757374206265206d61646520627920617574686f72697a65642060008201527f73656c6c65722c20746f6b656e20636f6e7472616374206f722061756374696f60208201527f6e65657200000000000000000000000000000000000000000000000000000000604082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206861736e277420636f6d706c657465640000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f41756374696f6e20657870697265640000000000000000000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f746f6b656e436f6e747261637420646f6573206e6f7420737570706f7274204560008201527f524337323120696e746572666163650000000000000000000000000000000000602082015250565b7f546f6b656e207472616e736665722063616c6c20646964206e6f74207472616e60008201527f7366657220657870656374656420616d6f756e74000000000000000000000000602082015250565b615a07816151be565b8114615a1257600080fd5b50565b615a1e816151d0565b8114615a2957600080fd5b50565b615a35816151e2565b8114615a4057600080fd5b50565b615a4c816151ee565b8114615a5757600080fd5b50565b615a63816151f8565b8114615a6e57600080fd5b50565b615a7a81615244565b8114615a8557600080fd5b5056fea26469706673582212203d69ebc39a8aafbf4588b64e23ad5db23698bbd6db523b06cc2df534b9920b9e64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
45400:19136:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8256:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59912:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46881:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9667:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10052:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11100:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48383:1529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60086:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45950:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51208:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46045:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;59755:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50021:904;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1323:94;;;;;;;;;;;;;:::i;:::-;;59507:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;672:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8552:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58620:778;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60482:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7643:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45805:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51957:3253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55492:2969;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60361:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60251:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10444:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45680:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46168:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1572:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46409:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46767:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8256:204;8341:4;8380:32;8365:47;;;:11;:47;;;;:87;;;;8416:36;8440:11;8416:23;:36::i;:::-;8365:87;8358:94;;8256:204;;;:::o;59912:166::-;47350:31;46918:23;47370:10;47350:7;:31::i;:::-;:74;;;;47385:39;7688:4;47393:18;;47413:10;47385:7;:39::i;:::-;47350:74;47328:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;60028:19:::1;:42;60048:21;60028:42;;;;;;;;;;;;;;;;60021:49;;;;;;;;;;;59912:166:::0;:::o;46881:60::-;46918:23;46881:60;:::o;9667:123::-;9733:7;9760:6;:12;9767:4;9760:12;;;;;;;;;;;:22;;;9753:29;;9667:123;;;:::o;10052:147::-;10135:18;10148:4;10135:12;:18::i;:::-;8134:30;8145:4;8151:12;:10;:12::i;:::-;8134:10;:30::i;:::-;10166:25:::1;10177:4;10183:7;10166:10;:25::i;:::-;10052:147:::0;;;:::o;11100:218::-;11207:12;:10;:12::i;:::-;11196:23;;:7;:23;;;11188:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;11284:26;11296:4;11302:7;11284:11;:26::i;:::-;11100:218;;:::o;48383:1529::-;48617:7;13760:1;14356:7;;:19;;14348:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13760:1;14489:7;:18;;;;48675:13:::1;48667:40;;;46524:10;48708:11;;48667:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48645:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;48818:18;48847:13;48839:30;;;48870:7;48839:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48818:60;;48923:10;48909:24;;:10;:24;;;48889:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;49012:46;49032:10;49044:13;49012:19;:46::i;:::-;48990:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;49171:17;49191:27;:17;:25;:27::i;:::-;49171:47;;49253:375;;;;;;;;49285:7;49253:375;;;;49322:13;49253:375;;;;;;49370:1;49253:375;;;;49396:8;49253:375;;;;49433:1;49253:375;;;;49463:12;49253:375;;;;49514:10;49253:375;;;;;;49555:1;49253:375;;;;;;49601:15;49253:375;;;;::::0;49231:8:::1;:19;49240:9;49231:19;;;;;;;;;;;:397;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49649:13;49641:35;;;49677:10;49697:4;49704:7;49641:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49725:29;:17;:27;:29::i;:::-;49807:13;49772:102;;49798:7;49787:9;49772:102;49822:8;49832:12;49846:10;49858:15;49772:102;;;;;;;;;:::i;:::-;;;;;;;;49895:9;49888:16;;;;13716:1:::0;14668:7;:22;;;;48383:1529;;;;;;;:::o;60086:153::-;60171:4;60194:37;60209:21;60194:14;:37::i;:::-;60187:44;;60086:153;;;:::o;45950:26::-;;;;;;;;;;;;;:::o;51208:432::-;47350:31;46918:23;47370:10;47350:7;:31::i;:::-;:74;;;;47385:39;7688:4;47393:18;;47413:10;47385:7;:39::i;:::-;47350:74;47328:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;51449:110:::1;;;;;;;;51485:11;51449:110;;;;;;51530:17;51449:110;;::::0;51416:15:::1;:30;51432:13;51416:30;;;;;;;;;;;;;;;:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51614:17;51601:11;51575:57;;51586:13;51575:57;;;;;;;;;;;;51208:432:::0;;;:::o;46045:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59755:149::-;47350:31;46918:23;47370:10;47350:7;:31::i;:::-;:74;;;;47385:39;7688:4;47393:18;;47413:10;47385:7;:39::i;:::-;47350:74;47328:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;59856:40:::1;59874:21;59856:17;:40::i;:::-;59755:149:::0;:::o;50021:904::-;50156:9;47659:18;47667:9;47659:7;:18::i;:::-;47651:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50222:25:::1;50236:10;50222:13;:25::i;:::-;:73;;;;50285:10;50251:44;;:8;:19;50260:9;50251:19;;;;;;;;;;;:30;;;;;;;;;;;;:44;;;50222:73;50202:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;50388:136;50426:8;:19;50435:9;50426:19;;;;;;;;;;;:30;;;;;;;;;;;;50476:8;:19;50485:9;50476:19;;;;;;;;;;;:33;;;;;;;;;;;;50388:19;:136::i;:::-;50366:254;;;;;;;;;;;;:::i;:::-;;;;;;;;;50675:1;50639:8;:19;50648:9;50639:19;;;;;;;;;;;:32;;;:37;50631:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50772:12;50737:8;:19;50746:9;50737:19;;;;;;;;;;;:32;;:47;;;;50869:8;:19;50878:9;50869:19;;;;;;;;;;;:33;;;;;;;;;;;;50802:115;;50840:8;:19;50849:9;50840:19;;;;;;;;;;;:27;;;50829:9;50802:115;50904:12;50802:115;;;;;;:::i;:::-;;;;;;;;50021:904:::0;;;:::o;1323:94::-;903:12;:10;:12::i;:::-;892:23;;:7;:5;:7::i;:::-;:23;;;884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1388:21:::1;1406:1;1388:9;:21::i;:::-;1323:94::o:0;59507:124::-;47083:39;7688:4;47091:18;;47111:10;47083:7;:39::i;:::-;47061:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;59617:6:::1;59593:21;;:30;;;;;;;;;;;;;;;;;;59507:124:::0;:::o;672:87::-;718:7;745:6;;;;;;;;;;;738:13;;672:87;:::o;8552:139::-;8630:4;8654:6;:12;8661:4;8654:12;;;;;;;;;;;:20;;:29;8675:7;8654:29;;;;;;;;;;;;;;;;;;;;;;;;;8647:36;;8552:139;;;;:::o;58620:778::-;13760:1;14356:7;;:19;;14348:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13760:1;14489:7;:18;;;;58747:9:::1;47659:18;47667:9;47659:7;:18::i;:::-;47651:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;58810:25:::2;58824:10;58810:13;:25::i;:::-;:73;;;;58873:10;58839:44;;:8;:19;58848:9;58839:19;;;;;;;;;;;:30;;;;;;;;;;;;:44;;;58810:73;58790:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;58976:136;59014:8;:19;59023:9;59014:19;;;;;;;;;;;:30;;;;;;;;;;;;59064:8;:19;59073:9;59064:19;;;;;;;;;;;:33;;;;;;;;;;;;58976:19;:136::i;:::-;58954:254;;;;;;;;;;;;:::i;:::-;;;;;;;;;59286:1;59249:8;:19;59258:9;59249:19;;;;;;;;;;;:32;;;59241:46;59219:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;59365:25;59380:9;59365:14;:25::i;:::-;14520:1:::1;13716::::0;14668:7;:22;;;;58620:778;:::o;60482:116::-;60548:4;60572:18;60586:3;60572:13;:18::i;:::-;60565:25;;60482:116;;;:::o;7643:49::-;7688:4;7643:49;;;:::o;45805:38::-;;;;;;;;;;;;;:::o;51957:3253::-;52087:9;47659:18;47667:9;47659:7;:18::i;:::-;47651:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;13760:1:::1;14356:7;;:19;;14348:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13760:1;14489:7;:18;;;;52136:26:::2;52165:8;:19;52174:9;52165:19;;;;;;;;;;;:26;;;;;;;;;;;;52136:55;;52268:1;52232:8;:19;52241:9;52232:19;;;;;;;;;;;:32;;;:37;:151;;;;52317:66;52354:8;:19;52363:9;52354:19;;;;;;;;;;;:28;;;52317:8;:19;52326:9;52317:19;;;;;;;;;;;:32;;;:36;;:66;;;;:::i;:::-;52286:15;:97;52232:151;52210:216;;;;;;;;;;;;:::i;:::-;;;;;;;;;52469:8;:19;52478:9;52469:19;;;;;;;;;;;:32;;;52459:6;:42;;52437:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;52607:130;52656:66;52718:3;52656:57;52687:25;;;;;;;;;;;52656:57;;:8;:19;52665:9;52656:19;;;;;;;;;;;:26;;;:30;;:57;;;;:::i;:::-;:61;;:66;;;;:::i;:::-;52607:8;:19;52616:9;52607:19;;;;;;;;;;;:26;;;:30;;:130;;;;:::i;:::-;52597:6;:140;;52575:254;;;;;;;;;;;;:::i;:::-;;;;;;;;;53025:1;52989:8;:19;52998:9;52989:19;;;;;;;;;;;:32;;;:37;52986:276;;;53078:15;53043:8;:19;53052:9;53043:19;;;;;;;;;;;:32;;:50;;;;52986:276;;;53136:1;53114:24;;:10;:24;;;53111:151;;53155:95;53174:10;53186:8;:19;53195:9;53186:19;;;;;;;;;;;:26;;;53214:8;:19;53223:9;53214:19;;;;;;;;;;;:35;;;;;;;;;;;;53155:18;:95::i;:::-;53111:151;52986:276;53274:63;53293:6;53301:8;:19;53310:9;53301:19;;;;;;;;;;;:35;;;;;;;;;;;;53274:18;:63::i;:::-;53379:6;53350:8;:19;53359:9;53350:19;;;;;;;;;;;:26;;:35;;;;53433:10;53396:8;:19;53405:9;53396:19;;;;;;;;;;;:26;;;:48;;;;;;;;;;;;;;;;;;53459:13;53942:10;;53820:119;53909:15;53820:66;53857:8;:19;53866:9;53857:19;;;;;;;;;;;:28;;;53820:8;:19;53829:9;53820:19;;;;;;;;;;;:32;;;:36;;:66;;;;:::i;:::-;:70;;:119;;;;:::i;:::-;:132;53802:821;;;54365:19;54387:8;:19;54396:9;54387:19;;;;;;;;;;;:28;;;54365:50;;54478:103;54494:86;54509:70;54563:15;54509:49;54546:11;54509:8;:19;54518:9;54509:19;;;;;;;;;;;:32;;;:36;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;54494:10;;:14;;:86;;;;:::i;:::-;54478:11;:15;;:103;;;;:::i;:::-;54430:8;:19;54439:9;54430:19;;;;;;;;;;;:28;;:151;;;;54607:4;54596:15;;53964:659;53802:821;54731:8;:19;54740:9;54731:19;;;;;;;;;;;:33;;;;;;;;;;;;54640:293;;54689:8;:19;54698:9;54689:19;;;;;;;;;;;:27;;;54665:9;54640:293;54779:10;54804:6;54825:15;54877:1;54855:24;;:10;:24;;;54914:8;54640:293;;;;;;;;;;:::i;:::-;;;;;;;;54950:8;54946:257;;;55096:8;:19;55105:9;55096:19;;;;;;;;;;;:33;;;;;;;;;;;;54980:211;;55050:8;:19;55059:9;55050:19;;;;;;;;;;;:27;;;55022:9;54980:211;55148:8;:19;55157:9;55148:19;;;;;;;;;;;:28;;;54980:211;;;;;;:::i;:::-;;;;;;;;54946:257;52125:3085;;13716:1:::1;14668:7;:22;;;;51957:3253:::0;;;:::o;55492:2969::-;55563:9;47659:18;47667:9;47659:7;:18::i;:::-;47651:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;13760:1:::1;14356:7;;:19;;14348:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13760:1;14489:7;:18;;;;55665:1:::2;55628:8;:19;55637:9;55628:19;;;;;;;;;;;:32;;;55620:46;;55598:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;55779:66;55816:8;:19;55825:9;55816:19;;;;;;;;;;;:28;;;55779:8;:19;55788:9;55779:19;;;;;;;;;;;:32;;;:36;;:66;;;;:::i;:::-;55747:15;:98;;55725:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;55910:16;55976:1:::0;55929:49:::2;;:8;:19;55938:9;55929:19;;;;;;;;;;;:35;;;;;;;;;;;;:49;;;:101;;55995:8;:19;56004:9;55995:19;;;;;;;;;;;:35;;;;;;;;;;;;55929:101;;;55981:11;;;;;;;;;;;55929:101;55910:120;;56043:24;56070:8;:19;56079:9;56070:19;;;;;;;;;;;:26;;;56043:53;;56107:21;56131:8;:19;56140:9;56131:19;;;;;;;;;;;:33;;;;;;;;;;;;56107:57;;56281:8;:19;56290:9;56281:19;;;;;;;;;;;:33;;;;;;;;;;;;56273:59;;;56341:4;56348:8;:19;56357:9;56348:19;;;;;;;;;;;:26;;;;;;;;;;;;56376:8;:19;56385:9;56376:19;;;;;;;;;;;:27;;;56273:131;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;56269:344;;56429:111;56448:8;:19;56457:9;56448:19;;;;;;;;;;;:26;;;;;;;;;;;;56476:8;:19;56485:9;56476:19;;;;;;;;;;;:26;;;56504:8;:19;56513:9;56504:19;;;;;;;;;;;:35;;;;;;;;;;;;56429:18;:111::i;:::-;56555:25;56570:9;56555:14;:25::i;:::-;56595:7;;;;;56269:344;56697:1;56643:56;;:15;:30;56659:13;56643:30;;;;;;;;;;;;;;;:42;;;;;;;;;;;;:56;;;;:150;;;;;56763:8;:19;56772:9;56763:19;;;;;;;;;;;:30;;;;;;;;;;;;56717:76;;:15;:30;56733:13;56717:30;;;;;;;;;;;;;;;:42;;;;;;;;;;;;:76;;;;56643:150;:219;;;;;56861:1;56810:15;:30;56826:13;56810:30;;;;;;;;;;;;;;;:48;;;:52;56643:219;56625:1782;;;56888:21;56912:68;56935:9;56946:8;:19;56955:9;56946:19;;;;;;;;;;;:33;;;;;;;;;;;;56912:22;:68::i;:::-;56888:92;;56995:23;57021:35;57042:13;57021:16;:20;;:35;;;;:::i;:::-;56995:61;;57087:114;57106:15;:30;57122:13;57106:30;;;;;;;;;;;;;;;:42;;;;;;;;;;;;57150:13;57165:8;:19;57174:9;57165:19;;;;;;;;;;;:35;;;;;;;;;;;;57087:18;:114::i;:::-;57216:104;57235:8;:19;57244:9;57235:19;;;;;;;;;;;:30;;;;;;;;;;;;57267:15;57284:8;:19;57293:9;57284:19;;;;;;;;;;;:35;;;;;;;;;;;;57216:18;:104::i;:::-;57462:8;:19;57471:9;57462:19;;;;;;;;;;;:33;;;;;;;;;;;;57344:472;;57416:8;:19;57425:9;57416:19;;;;;;;;;;;:27;;;57388:9;57344:472;57514:8;:19;57523:9;57514:19;;;;;;;;;;;:30;;;;;;;;;;;;57575:8;:19;57584:9;57575:19;;;;;;;;;;;:26;;;;;;;;;;;;57620:15;57654;:30;57670:13;57654:30;;;;;;;;;;;;;;;:42;;;;;;;;;;;;57715:13;57759:15;57793:8;57344:472;;;;;;;;;;;;:::i;:::-;;;;;;;;56873:959;;56625:1782;;;57853:105;57872:8;:19;57881:9;57872:19;;;;;;;;;;;:30;;;;;;;;;;;;57904:16;57922:8;:19;57931:9;57922:19;;;;;;;;;;;:35;;;;;;;;;;;;57853:18;:105::i;:::-;58085:8;:19;58094:9;58085:19;;;;;;;;;;;:33;;;;;;;;;;;;57980:415;;58039:8;:19;58048:9;58039:19;;;;;;;;;;;:27;;;58011:9;57980:415;58137:8;:19;58146:9;58137:19;;;;;;;;;;;:30;;;;;;;;;;;;58198:8;:19;58207:9;58198:19;;;;;;;;;;;:26;;;;;;;;;;;;58259:16;58296:15;58372:8;57980:415;;;;;;;;;;:::i;:::-;;;;;;;;56625:1782;58434:8;:19;58443:9;58434:19;;;;;;;;;;;;58427:26:::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55587:2874;;;14520:1;13716::::1;14668:7;:22;;;;55492:2969:::0;;:::o;60361:113::-;47083:39;7688:4;47091:18;;47111:10;47083:7;:39::i;:::-;47061:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;60439:27:::1;46918:23;60462:3;60439:10;:27::i;:::-;60361:113:::0;:::o;60251:102::-;47083:39;7688:4;47091:18;;47111:10;47083:7;:39::i;:::-;47061:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;60326:19:::1;60341:3;60326:14;:19::i;:::-;60251:102:::0;:::o;10444:149::-;10528:18;10541:4;10528:12;:18::i;:::-;8134:30;8145:4;8151:12;:10;:12::i;:::-;8134:10;:30::i;:::-;10559:26:::1;10571:4;10577:7;10559:11;:26::i;:::-;10444:149:::0;;;:::o;45680:25::-;;;;:::o;46168:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1572:192::-;903:12;:10;:12::i;:::-;892:23;;:7;:5;:7::i;:::-;:23;;;884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1681:1:::1;1661:22;;:8;:22;;;;1653:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1737:19;1747:8;1737:9;:19::i;:::-;1572:192:::0;:::o;46409:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;46767:33::-;;;;;;;;;;;;;:::o;2516:157::-;2601:4;2640:25;2625:40;;;:11;:40;;;;2618:47;;2516:157;;;:::o;57:98::-;110:7;137:10;130:17;;57:98;:::o;8981:497::-;9062:22;9070:4;9076:7;9062;:22::i;:::-;9057:414;;9250:41;9278:7;9250:41;;9288:2;9250:19;:41::i;:::-;9364:38;9392:4;9384:13;;9399:2;9364:19;:38::i;:::-;9155:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9101:358;;;;;;;;;;;:::i;:::-;;;;;;;;9057:414;8981:497;;:::o;12404:229::-;12479:22;12487:4;12493:7;12479;:22::i;:::-;12474:152;;12550:4;12518:6;:12;12525:4;12518:12;;;;;;;;;;;:20;;:29;12539:7;12518:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;12601:12;:10;:12::i;:::-;12574:40;;12592:7;12574:40;;12586:4;12574:40;;;;;;;;;;12474:152;12404:229;;:::o;12641:230::-;12716:22;12724:4;12730:7;12716;:22::i;:::-;12712:152;;;12787:5;12755:6;:12;12762:4;12755:12;;;;;;;;;;;:20;;:29;12776:7;12755:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;12839:12;:10;:12::i;:::-;12812:40;;12830:7;12812:40;;12824:4;12812:40;;;;;;;;;;12712:152;12641:230;;:::o;63661:377::-;63751:4;63772:35;7688:4;63780:18;;63800:6;63772:7;:35::i;:::-;:66;;;;63811:27;46918:23;63831:6;63811:7;:27::i;:::-;63772:66;63768:110;;;63862:4;63855:11;;;;63768:110;63894:21;;;;;;;;;;;63890:116;;;63939:22;63954:6;63939:14;:22::i;:::-;:55;;;;63965:29;63980:13;63965:14;:29::i;:::-;63939:55;63932:62;;;;63890:116;64025:5;64018:12;;63661:377;;;;;:::o;30308:114::-;30373:7;30400;:14;;;30393:21;;30308:114;;;:::o;30430:127::-;30537:1;30519:7;:14;;;:19;;;;;;;;;;;30430:127;:::o;64154:151::-;64231:4;64255:19;:42;64275:21;64255:42;;;;;;;;;;;;;;;;;;;;;;;;;64248:49;;64154:151;;;:::o;64313:143::-;64444:4;64399:19;:42;64419:21;64399:42;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;64313:143;:::o;63471:134::-;63529:4;63595:1;63553:44;;:8;:19;63562:9;63553:19;;;;;;;;;;;:30;;;;;;;;;;;;:44;;;;63546:51;;63471:134;;;:::o;60610:150::-;60668:4;60692:24;46918:23;60712:3;60692:7;:24::i;:::-;:60;;;;60720:32;7688:4;60728:18;;60748:3;60720:7;:32::i;:::-;60692:60;60685:67;;60610:150;;;:::o;1772:173::-;1828:16;1847:6;;;;;;;;;;;1828:25;;1873:8;1864:6;;:17;;;;;;;;;;;;;;;;;;1928:8;1897:40;;1918:8;1897:40;;;;;;;;;;;;1817:128;1772:173;:::o;63058:405::-;63121:18;63142:8;:19;63151:9;63142:19;;;;;;;;;;;:30;;;;;;;;;;;;63121:51;;63191:8;:19;63200:9;63191:19;;;;;;;;;;;:33;;;;;;;;;;;;63183:59;;;63251:4;63258:10;63270:8;:19;63279:9;63270:19;;;;;;;;;;;:27;;;63183:115;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63372:8;:19;63381:9;63372:19;;;;;;;;;;;:33;;;;;;;;;;;;63316:102;;63343:8;:19;63352:9;63343:19;;;;;;;;;;;:27;;;63332:9;63316:102;63407:10;63316:102;;;;;;:::i;:::-;;;;;;;;63436:8;:19;63445:9;63436:19;;;;;;;;;;;;63429:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63110:353;63058:405;:::o;36603:98::-;36661:7;36692:1;36688;:5;;;;:::i;:::-;36681:12;;36603:98;;;;:::o;37341:::-;37399:7;37430:1;37426;:5;;;;:::i;:::-;37419:12;;37341:98;;;;:::o;37740:::-;37798:7;37829:1;37825;:5;;;;:::i;:::-;37818:12;;37740:98;;;;:::o;61983:655::-;62210:1;62190:22;;:8;:22;;;62187:444;;;62235:11;;;;;;;;;;;62229:27;;;62257:6;62229:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62375:28;62392:2;62396:6;62375:16;:28::i;:::-;62371:175;;62430:11;;;;;;;;;;;62424:26;;;62458:6;62424:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62486:44;62519:2;62523:6;62493:11;;;;;;;;;;;62486:32;;;;:44;;;;;:::i;:::-;62371:175;62187:444;;;62578:41;62608:2;62612:6;62585:8;62578:29;;;;:41;;;;;:::i;:::-;62187:444;61983:655;;;:::o;60944:1031::-;61146:1;61126:22;;:8;:22;;;61123:845;;;61186:6;61173:9;:19;61165:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;61268:11;;;;;;;;;;;61262:26;;;61296:6;61262:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61123:845;;;61595:12;61617:8;61595:31;;61641:21;61665:5;:15;;;61689:4;61665:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61641:54;;61710:57;61733:10;61753:4;61760:6;61710:5;:22;;;;:57;;;;;;:::i;:::-;61782:20;61805:5;:15;;;61829:4;61805:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61782:53;;61887:12;61858:25;61876:6;61858:13;:17;;:25;;;;:::i;:::-;:41;61850:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;61323:645;;;61123:845;60944:1031;;:::o;36984:98::-;37042:7;37073:1;37069;:5;;;;:::i;:::-;37062:12;;36984:98;;;;:::o;62646:221::-;62743:7;62770:89;62810:15;:30;62826:13;62810:30;;;;;;;;;;;;;;;:48;;;62770:35;62801:3;62770:8;:19;62779:9;62770:19;;;;;;;;;;;:26;;;:30;;:35;;;;:::i;:::-;:39;;:89;;;;:::i;:::-;62763:96;;62646:221;;;;:::o;64046:100::-;64111:27;46918:23;64134:3;64111:10;:27::i;:::-;64046:100;:::o;6958:451::-;7033:13;7059:19;7104:1;7095:6;7091:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;7081:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7059:47;;7117:15;:6;7124:1;7117:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;7143;:6;7150:1;7143:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;7174:9;7199:1;7190:6;7186:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;7174:26;;7169:135;7206:1;7202;:5;7169:135;;;7241:12;7262:3;7254:5;:11;7241:25;;;;;;;:::i;:::-;;;;;7229:6;7236:1;7229:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;7291:1;7281:11;;;;;7209:3;;;;:::i;:::-;;;7169:135;;;;7331:1;7322:5;:10;7314:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;7394:6;7380:21;;;6958:451;;;;:::o;62875:175::-;62946:4;62964:12;62982:2;:7;;62997:5;63014:1;63004:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62982:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62963:54;;;63035:7;63028:14;;;62875:175;;;;:::o;30958:211::-;31075:86;31095:5;31125:23;;;31150:2;31154:5;31102:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31075:19;:86::i;:::-;30958:211;;;:::o;31177:248::-;31321:96;31341:5;31371:27;;;31400:4;31406:2;31410:5;31348:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31321:19;:96::i;:::-;31177:248;;;;:::o;11901:112::-;11980:25;11991:4;11997:7;11980:10;:25::i;:::-;11901:112;;:::o;33531:716::-;33955:23;33981:69;34009:4;33981:69;;;;;;;;;;;;;;;;;33989:5;33981:27;;;;:69;;;;;:::i;:::-;33955:95;;34085:1;34065:10;:17;:21;34061:179;;;34162:10;34151:30;;;;;;;;;;;;:::i;:::-;34143:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34061:179;33601:646;33531:716;;:::o;25374:229::-;25511:12;25543:52;25565:6;25573:4;25579:1;25582:12;25543:21;:52::i;:::-;25536:59;;25374:229;;;;;:::o;26494:510::-;26664:12;26722:5;26697:21;:30;;26689:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;26789:18;26800:6;26789:10;:18::i;:::-;26781:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;26855:12;26869:23;26896:6;:11;;26915:5;26922:4;26896:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26854:73;;;;26945:51;26962:7;26971:10;26983:12;26945:16;:51::i;:::-;26938:58;;;;26494:510;;;;;;:::o;22568:387::-;22628:4;22836:12;22903:7;22891:20;22883:28;;22946:1;22939:4;:8;22932:15;;;22568:387;;;:::o;29180:712::-;29330:12;29359:7;29355:530;;;29390:10;29383:17;;;;29355:530;29524:1;29504:10;:17;:21;29500:374;;;29702:10;29696:17;29763:15;29750:10;29746:2;29742:19;29735:44;29500:374;29845:12;29838:20;;;;;;;;;;;:::i;:::-;;;;;;;;29180:712;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;301:155::-;355:5;393:6;380:20;371:29;;409:41;444:5;409:41;:::i;:::-;301:155;;;;:::o;462:133::-;505:5;543:6;530:20;521:29;;559:30;583:5;559:30;:::i;:::-;462:133;;;;:::o;601:137::-;655:5;686:6;680:13;671:22;;702:30;726:5;702:30;:::i;:::-;601:137;;;;:::o;744:139::-;790:5;828:6;815:20;806:29;;844:33;871:5;844:33;:::i;:::-;744:139;;;;:::o;889:137::-;934:5;972:6;959:20;950:29;;988:32;1014:5;988:32;:::i;:::-;889:137;;;;:::o;1032:139::-;1078:5;1116:6;1103:20;1094:29;;1132:33;1159:5;1132:33;:::i;:::-;1032:139;;;;:::o;1177:143::-;1234:5;1265:6;1259:13;1250:22;;1281:33;1308:5;1281:33;:::i;:::-;1177:143;;;;:::o;1326:329::-;1385:6;1434:2;1422:9;1413:7;1409:23;1405:32;1402:119;;;1440:79;;:::i;:::-;1402:119;1560:1;1585:53;1630:7;1621:6;1610:9;1606:22;1585:53;:::i;:::-;1575:63;;1531:117;1326:329;;;;:::o;1661:351::-;1731:6;1780:2;1768:9;1759:7;1755:23;1751:32;1748:119;;;1786:79;;:::i;:::-;1748:119;1906:1;1931:64;1987:7;1978:6;1967:9;1963:22;1931:64;:::i;:::-;1921:74;;1877:128;1661:351;;;;:::o;2018:635::-;2103:6;2111;2119;2168:2;2156:9;2147:7;2143:23;2139:32;2136:119;;;2174:79;;:::i;:::-;2136:119;2294:1;2319:53;2364:7;2355:6;2344:9;2340:22;2319:53;:::i;:::-;2309:63;;2265:117;2421:2;2447:61;2500:7;2491:6;2480:9;2476:22;2447:61;:::i;:::-;2437:71;;2392:126;2557:2;2583:53;2628:7;2619:6;2608:9;2604:22;2583:53;:::i;:::-;2573:63;;2528:118;2018:635;;;;;:::o;2659:323::-;2715:6;2764:2;2752:9;2743:7;2739:23;2735:32;2732:119;;;2770:79;;:::i;:::-;2732:119;2890:1;2915:50;2957:7;2948:6;2937:9;2933:22;2915:50;:::i;:::-;2905:60;;2861:114;2659:323;;;;:::o;2988:345::-;3055:6;3104:2;3092:9;3083:7;3079:23;3075:32;3072:119;;;3110:79;;:::i;:::-;3072:119;3230:1;3255:61;3308:7;3299:6;3288:9;3284:22;3255:61;:::i;:::-;3245:71;;3201:125;2988:345;;;;:::o;3339:329::-;3398:6;3447:2;3435:9;3426:7;3422:23;3418:32;3415:119;;;3453:79;;:::i;:::-;3415:119;3573:1;3598:53;3643:7;3634:6;3623:9;3619:22;3598:53;:::i;:::-;3588:63;;3544:117;3339:329;;;;:::o;3674:474::-;3742:6;3750;3799:2;3787:9;3778:7;3774:23;3770:32;3767:119;;;3805:79;;:::i;:::-;3767:119;3925:1;3950:53;3995:7;3986:6;3975:9;3971:22;3950:53;:::i;:::-;3940:63;;3896:117;4052:2;4078:53;4123:7;4114:6;4103:9;4099:22;4078:53;:::i;:::-;4068:63;;4023:118;3674:474;;;;;:::o;4154:327::-;4212:6;4261:2;4249:9;4240:7;4236:23;4232:32;4229:119;;;4267:79;;:::i;:::-;4229:119;4387:1;4412:52;4456:7;4447:6;4436:9;4432:22;4412:52;:::i;:::-;4402:62;;4358:116;4154:327;;;;:::o;4487:329::-;4546:6;4595:2;4583:9;4574:7;4570:23;4566:32;4563:119;;;4601:79;;:::i;:::-;4563:119;4721:1;4746:53;4791:7;4782:6;4771:9;4767:22;4746:53;:::i;:::-;4736:63;;4692:117;4487:329;;;;:::o;4822:351::-;4892:6;4941:2;4929:9;4920:7;4916:23;4912:32;4909:119;;;4947:79;;:::i;:::-;4909:119;5067:1;5092:64;5148:7;5139:6;5128:9;5124:22;5092:64;:::i;:::-;5082:74;;5038:128;4822:351;;;;:::o;5179:911::-;5274:6;5282;5290;5298;5306;5355:3;5343:9;5334:7;5330:23;5326:33;5323:120;;;5362:79;;:::i;:::-;5323:120;5482:1;5507:53;5552:7;5543:6;5532:9;5528:22;5507:53;:::i;:::-;5497:63;;5453:117;5609:2;5635:53;5680:7;5671:6;5660:9;5656:22;5635:53;:::i;:::-;5625:63;;5580:118;5737:2;5763:53;5808:7;5799:6;5788:9;5784:22;5763:53;:::i;:::-;5753:63;;5708:118;5865:2;5891:53;5936:7;5927:6;5916:9;5912:22;5891:53;:::i;:::-;5881:63;;5836:118;5993:3;6020:53;6065:7;6056:6;6045:9;6041:22;6020:53;:::i;:::-;6010:63;;5964:119;5179:911;;;;;;;;:::o;6096:474::-;6164:6;6172;6221:2;6209:9;6200:7;6196:23;6192:32;6189:119;;;6227:79;;:::i;:::-;6189:119;6347:1;6372:53;6417:7;6408:6;6397:9;6393:22;6372:53;:::i;:::-;6362:63;;6318:117;6474:2;6500:53;6545:7;6536:6;6525:9;6521:22;6500:53;:::i;:::-;6490:63;;6445:118;6096:474;;;;;:::o;6576:147::-;6671:45;6710:5;6671:45;:::i;:::-;6666:3;6659:58;6576:147;;:::o;6729:142::-;6832:32;6858:5;6832:32;:::i;:::-;6827:3;6820:45;6729:142;;:::o;6877:118::-;6964:24;6982:5;6964:24;:::i;:::-;6959:3;6952:37;6877:118;;:::o;7001:109::-;7082:21;7097:5;7082:21;:::i;:::-;7077:3;7070:34;7001:109;;:::o;7116:118::-;7203:24;7221:5;7203:24;:::i;:::-;7198:3;7191:37;7116:118;;:::o;7240:115::-;7325:23;7342:5;7325:23;:::i;:::-;7320:3;7313:36;7240:115;;:::o;7361:373::-;7465:3;7493:38;7525:5;7493:38;:::i;:::-;7547:88;7628:6;7623:3;7547:88;:::i;:::-;7540:95;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:6;7716:3;7712:16;7705:23;;7469:265;7361:373;;;;:::o;7740:364::-;7828:3;7856:39;7889:5;7856:39;:::i;:::-;7911:71;7975:6;7970:3;7911:71;:::i;:::-;7904:78;;7991:52;8036:6;8031:3;8024:4;8017:5;8013:16;7991:52;:::i;:::-;8068:29;8090:6;8068:29;:::i;:::-;8063:3;8059:39;8052:46;;7832:272;7740:364;;;;:::o;8110:377::-;8216:3;8244:39;8277:5;8244:39;:::i;:::-;8299:89;8381:6;8376:3;8299:89;:::i;:::-;8292:96;;8397:52;8442:6;8437:3;8430:4;8423:5;8419:16;8397:52;:::i;:::-;8474:6;8469:3;8465:16;8458:23;;8220:267;8110:377;;;;:::o;8493:366::-;8635:3;8656:67;8720:2;8715:3;8656:67;:::i;:::-;8649:74;;8732:93;8821:3;8732:93;:::i;:::-;8850:2;8845:3;8841:12;8834:19;;8493:366;;;:::o;8865:::-;9007:3;9028:67;9092:2;9087:3;9028:67;:::i;:::-;9021:74;;9104:93;9193:3;9104:93;:::i;:::-;9222:2;9217:3;9213:12;9206:19;;8865:366;;;:::o;9237:::-;9379:3;9400:67;9464:2;9459:3;9400:67;:::i;:::-;9393:74;;9476:93;9565:3;9476:93;:::i;:::-;9594:2;9589:3;9585:12;9578:19;;9237:366;;;:::o;9609:::-;9751:3;9772:67;9836:2;9831:3;9772:67;:::i;:::-;9765:74;;9848:93;9937:3;9848:93;:::i;:::-;9966:2;9961:3;9957:12;9950:19;;9609:366;;;:::o;9981:::-;10123:3;10144:67;10208:2;10203:3;10144:67;:::i;:::-;10137:74;;10220:93;10309:3;10220:93;:::i;:::-;10338:2;10333:3;10329:12;10322:19;;9981:366;;;:::o;10353:::-;10495:3;10516:67;10580:2;10575:3;10516:67;:::i;:::-;10509:74;;10592:93;10681:3;10592:93;:::i;:::-;10710:2;10705:3;10701:12;10694:19;;10353:366;;;:::o;10725:::-;10867:3;10888:67;10952:2;10947:3;10888:67;:::i;:::-;10881:74;;10964:93;11053:3;10964:93;:::i;:::-;11082:2;11077:3;11073:12;11066:19;;10725:366;;;:::o;11097:::-;11239:3;11260:67;11324:2;11319:3;11260:67;:::i;:::-;11253:74;;11336:93;11425:3;11336:93;:::i;:::-;11454:2;11449:3;11445:12;11438:19;;11097:366;;;:::o;11469:::-;11611:3;11632:67;11696:2;11691:3;11632:67;:::i;:::-;11625:74;;11708:93;11797:3;11708:93;:::i;:::-;11826:2;11821:3;11817:12;11810:19;;11469:366;;;:::o;11841:::-;11983:3;12004:67;12068:2;12063:3;12004:67;:::i;:::-;11997:74;;12080:93;12169:3;12080:93;:::i;:::-;12198:2;12193:3;12189:12;12182:19;;11841:366;;;:::o;12213:::-;12355:3;12376:67;12440:2;12435:3;12376:67;:::i;:::-;12369:74;;12452:93;12541:3;12452:93;:::i;:::-;12570:2;12565:3;12561:12;12554:19;;12213:366;;;:::o;12585:::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12585:366;;;:::o;12957:::-;13099:3;13120:67;13184:2;13179:3;13120:67;:::i;:::-;13113:74;;13196:93;13285:3;13196:93;:::i;:::-;13314:2;13309:3;13305:12;13298:19;;12957:366;;;:::o;13329:::-;13471:3;13492:67;13556:2;13551:3;13492:67;:::i;:::-;13485:74;;13568:93;13657:3;13568:93;:::i;:::-;13686:2;13681:3;13677:12;13670:19;;13329:366;;;:::o;13701:::-;13843:3;13864:67;13928:2;13923:3;13864:67;:::i;:::-;13857:74;;13940:93;14029:3;13940:93;:::i;:::-;14058:2;14053:3;14049:12;14042:19;;13701:366;;;:::o;14073:::-;14215:3;14236:67;14300:2;14295:3;14236:67;:::i;:::-;14229:74;;14312:93;14401:3;14312:93;:::i;:::-;14430:2;14425:3;14421:12;14414:19;;14073:366;;;:::o;14445:::-;14587:3;14608:67;14672:2;14667:3;14608:67;:::i;:::-;14601:74;;14684:93;14773:3;14684:93;:::i;:::-;14802:2;14797:3;14793:12;14786:19;;14445:366;;;:::o;14817:402::-;14977:3;14998:85;15080:2;15075:3;14998:85;:::i;:::-;14991:92;;15092:93;15181:3;15092:93;:::i;:::-;15210:2;15205:3;15201:12;15194:19;;14817:402;;;:::o;15225:366::-;15367:3;15388:67;15452:2;15447:3;15388:67;:::i;:::-;15381:74;;15464:93;15553:3;15464:93;:::i;:::-;15582:2;15577:3;15573:12;15566:19;;15225:366;;;:::o;15597:::-;15739:3;15760:67;15824:2;15819:3;15760:67;:::i;:::-;15753:74;;15836:93;15925:3;15836:93;:::i;:::-;15954:2;15949:3;15945:12;15938:19;;15597:366;;;:::o;15969:::-;16111:3;16132:67;16196:2;16191:3;16132:67;:::i;:::-;16125:74;;16208:93;16297:3;16208:93;:::i;:::-;16326:2;16321:3;16317:12;16310:19;;15969:366;;;:::o;16341:::-;16483:3;16504:67;16568:2;16563:3;16504:67;:::i;:::-;16497:74;;16580:93;16669:3;16580:93;:::i;:::-;16698:2;16693:3;16689:12;16682:19;;16341:366;;;:::o;16713:402::-;16873:3;16894:85;16976:2;16971:3;16894:85;:::i;:::-;16887:92;;16988:93;17077:3;16988:93;:::i;:::-;17106:2;17101:3;17097:12;17090:19;;16713:402;;;:::o;17121:366::-;17263:3;17284:67;17348:2;17343:3;17284:67;:::i;:::-;17277:74;;17360:93;17449:3;17360:93;:::i;:::-;17478:2;17473:3;17469:12;17462:19;;17121:366;;;:::o;17493:::-;17635:3;17656:67;17720:2;17715:3;17656:67;:::i;:::-;17649:74;;17732:93;17821:3;17732:93;:::i;:::-;17850:2;17845:3;17841:12;17834:19;;17493:366;;;:::o;17865:::-;18007:3;18028:67;18092:2;18087:3;18028:67;:::i;:::-;18021:74;;18104:93;18193:3;18104:93;:::i;:::-;18222:2;18217:3;18213:12;18206:19;;17865:366;;;:::o;18237:118::-;18324:24;18342:5;18324:24;:::i;:::-;18319:3;18312:37;18237:118;;:::o;18361:112::-;18444:22;18460:5;18444:22;:::i;:::-;18439:3;18432:35;18361:112;;:::o;18479:271::-;18609:3;18631:93;18720:3;18711:6;18631:93;:::i;:::-;18624:100;;18741:3;18734:10;;18479:271;;;;:::o;18756:967::-;19138:3;19160:148;19304:3;19160:148;:::i;:::-;19153:155;;19325:95;19416:3;19407:6;19325:95;:::i;:::-;19318:102;;19437:148;19581:3;19437:148;:::i;:::-;19430:155;;19602:95;19693:3;19684:6;19602:95;:::i;:::-;19595:102;;19714:3;19707:10;;18756:967;;;;;:::o;19729:222::-;19822:4;19860:2;19849:9;19845:18;19837:26;;19873:71;19941:1;19930:9;19926:17;19917:6;19873:71;:::i;:::-;19729:222;;;;:::o;19957:364::-;20094:4;20132:2;20121:9;20117:18;20109:26;;20145:87;20229:1;20218:9;20214:17;20205:6;20145:87;:::i;:::-;20242:72;20310:2;20299:9;20295:18;20286:6;20242:72;:::i;:::-;19957:364;;;;;:::o;20327:458::-;20484:4;20522:2;20511:9;20507:18;20499:26;;20535:71;20603:1;20592:9;20588:17;20579:6;20535:71;:::i;:::-;20616:80;20692:2;20681:9;20677:18;20668:6;20616:80;:::i;:::-;20706:72;20774:2;20763:9;20759:18;20750:6;20706:72;:::i;:::-;20327:458;;;;;;:::o;20791:918::-;21068:4;21106:3;21095:9;21091:19;21083:27;;21120:71;21188:1;21177:9;21173:17;21164:6;21120:71;:::i;:::-;21201:80;21277:2;21266:9;21262:18;21253:6;21201:80;:::i;:::-;21291:72;21359:2;21348:9;21344:18;21335:6;21291:72;:::i;:::-;21373:80;21449:2;21438:9;21434:18;21425:6;21373:80;:::i;:::-;21463:73;21531:3;21520:9;21516:19;21507:6;21463:73;:::i;:::-;21546;21614:3;21603:9;21599:19;21590:6;21546:73;:::i;:::-;21629;21697:3;21686:9;21682:19;21673:6;21629:73;:::i;:::-;20791:918;;;;;;;;;;:::o;21715:680::-;21928:4;21966:3;21955:9;21951:19;21943:27;;21980:71;22048:1;22037:9;22033:17;22024:6;21980:71;:::i;:::-;22061:80;22137:2;22126:9;22122:18;22113:6;22061:80;:::i;:::-;22151:72;22219:2;22208:9;22204:18;22195:6;22151:72;:::i;:::-;22233;22301:2;22290:9;22286:18;22277:6;22233:72;:::i;:::-;22315:73;22383:3;22372:9;22368:19;22359:6;22315:73;:::i;:::-;21715:680;;;;;;;;:::o;22401:442::-;22550:4;22588:2;22577:9;22573:18;22565:26;;22601:71;22669:1;22658:9;22654:17;22645:6;22601:71;:::i;:::-;22682:72;22750:2;22739:9;22735:18;22726:6;22682:72;:::i;:::-;22764;22832:2;22821:9;22817:18;22808:6;22764:72;:::i;:::-;22401:442;;;;;;:::o;22849:332::-;22970:4;23008:2;22997:9;22993:18;22985:26;;23021:71;23089:1;23078:9;23074:17;23065:6;23021:71;:::i;:::-;23102:72;23170:2;23159:9;23155:18;23146:6;23102:72;:::i;:::-;22849:332;;;;;:::o;23187:640::-;23380:4;23418:3;23407:9;23403:19;23395:27;;23432:71;23500:1;23489:9;23485:17;23476:6;23432:71;:::i;:::-;23513:72;23581:2;23570:9;23566:18;23557:6;23513:72;:::i;:::-;23595;23663:2;23652:9;23648:18;23639:6;23595:72;:::i;:::-;23677:66;23739:2;23728:9;23724:18;23715:6;23677:66;:::i;:::-;23753:67;23815:3;23804:9;23800:19;23791:6;23753:67;:::i;:::-;23187:640;;;;;;;;:::o;23833:210::-;23920:4;23958:2;23947:9;23943:18;23935:26;;23971:65;24033:1;24022:9;24018:17;24009:6;23971:65;:::i;:::-;23833:210;;;;:::o;24049:222::-;24142:4;24180:2;24169:9;24165:18;24157:26;;24193:71;24261:1;24250:9;24246:17;24237:6;24193:71;:::i;:::-;24049:222;;;;:::o;24277:218::-;24368:4;24406:2;24395:9;24391:18;24383:26;;24419:69;24485:1;24474:9;24470:17;24461:6;24419:69;:::i;:::-;24277:218;;;;:::o;24501:313::-;24614:4;24652:2;24641:9;24637:18;24629:26;;24701:9;24695:4;24691:20;24687:1;24676:9;24672:17;24665:47;24729:78;24802:4;24793:6;24729:78;:::i;:::-;24721:86;;24501:313;;;;:::o;24820:419::-;24986:4;25024:2;25013:9;25009:18;25001:26;;25073:9;25067:4;25063:20;25059:1;25048:9;25044:17;25037:47;25101:131;25227:4;25101:131;:::i;:::-;25093:139;;24820:419;;;:::o;25245:::-;25411:4;25449:2;25438:9;25434:18;25426:26;;25498:9;25492:4;25488:20;25484:1;25473:9;25469:17;25462:47;25526:131;25652:4;25526:131;:::i;:::-;25518:139;;25245:419;;;:::o;25670:::-;25836:4;25874:2;25863:9;25859:18;25851:26;;25923:9;25917:4;25913:20;25909:1;25898:9;25894:17;25887:47;25951:131;26077:4;25951:131;:::i;:::-;25943:139;;25670:419;;;:::o;26095:::-;26261:4;26299:2;26288:9;26284:18;26276:26;;26348:9;26342:4;26338:20;26334:1;26323:9;26319:17;26312:47;26376:131;26502:4;26376:131;:::i;:::-;26368:139;;26095:419;;;:::o;26520:::-;26686:4;26724:2;26713:9;26709:18;26701:26;;26773:9;26767:4;26763:20;26759:1;26748:9;26744:17;26737:47;26801:131;26927:4;26801:131;:::i;:::-;26793:139;;26520:419;;;:::o;26945:::-;27111:4;27149:2;27138:9;27134:18;27126:26;;27198:9;27192:4;27188:20;27184:1;27173:9;27169:17;27162:47;27226:131;27352:4;27226:131;:::i;:::-;27218:139;;26945:419;;;:::o;27370:::-;27536:4;27574:2;27563:9;27559:18;27551:26;;27623:9;27617:4;27613:20;27609:1;27598:9;27594:17;27587:47;27651:131;27777:4;27651:131;:::i;:::-;27643:139;;27370:419;;;:::o;27795:::-;27961:4;27999:2;27988:9;27984:18;27976:26;;28048:9;28042:4;28038:20;28034:1;28023:9;28019:17;28012:47;28076:131;28202:4;28076:131;:::i;:::-;28068:139;;27795:419;;;:::o;28220:::-;28386:4;28424:2;28413:9;28409:18;28401:26;;28473:9;28467:4;28463:20;28459:1;28448:9;28444:17;28437:47;28501:131;28627:4;28501:131;:::i;:::-;28493:139;;28220:419;;;:::o;28645:::-;28811:4;28849:2;28838:9;28834:18;28826:26;;28898:9;28892:4;28888:20;28884:1;28873:9;28869:17;28862:47;28926:131;29052:4;28926:131;:::i;:::-;28918:139;;28645:419;;;:::o;29070:::-;29236:4;29274:2;29263:9;29259:18;29251:26;;29323:9;29317:4;29313:20;29309:1;29298:9;29294:17;29287:47;29351:131;29477:4;29351:131;:::i;:::-;29343:139;;29070:419;;;:::o;29495:::-;29661:4;29699:2;29688:9;29684:18;29676:26;;29748:9;29742:4;29738:20;29734:1;29723:9;29719:17;29712:47;29776:131;29902:4;29776:131;:::i;:::-;29768:139;;29495:419;;;:::o;29920:::-;30086:4;30124:2;30113:9;30109:18;30101:26;;30173:9;30167:4;30163:20;30159:1;30148:9;30144:17;30137:47;30201:131;30327:4;30201:131;:::i;:::-;30193:139;;29920:419;;;:::o;30345:::-;30511:4;30549:2;30538:9;30534:18;30526:26;;30598:9;30592:4;30588:20;30584:1;30573:9;30569:17;30562:47;30626:131;30752:4;30626:131;:::i;:::-;30618:139;;30345:419;;;:::o;30770:::-;30936:4;30974:2;30963:9;30959:18;30951:26;;31023:9;31017:4;31013:20;31009:1;30998:9;30994:17;30987:47;31051:131;31177:4;31051:131;:::i;:::-;31043:139;;30770:419;;;:::o;31195:::-;31361:4;31399:2;31388:9;31384:18;31376:26;;31448:9;31442:4;31438:20;31434:1;31423:9;31419:17;31412:47;31476:131;31602:4;31476:131;:::i;:::-;31468:139;;31195:419;;;:::o;31620:::-;31786:4;31824:2;31813:9;31809:18;31801:26;;31873:9;31867:4;31863:20;31859:1;31848:9;31844:17;31837:47;31901:131;32027:4;31901:131;:::i;:::-;31893:139;;31620:419;;;:::o;32045:::-;32211:4;32249:2;32238:9;32234:18;32226:26;;32298:9;32292:4;32288:20;32284:1;32273:9;32269:17;32262:47;32326:131;32452:4;32326:131;:::i;:::-;32318:139;;32045:419;;;:::o;32470:::-;32636:4;32674:2;32663:9;32659:18;32651:26;;32723:9;32717:4;32713:20;32709:1;32698:9;32694:17;32687:47;32751:131;32877:4;32751:131;:::i;:::-;32743:139;;32470:419;;;:::o;32895:::-;33061:4;33099:2;33088:9;33084:18;33076:26;;33148:9;33142:4;33138:20;33134:1;33123:9;33119:17;33112:47;33176:131;33302:4;33176:131;:::i;:::-;33168:139;;32895:419;;;:::o;33320:::-;33486:4;33524:2;33513:9;33509:18;33501:26;;33573:9;33567:4;33563:20;33559:1;33548:9;33544:17;33537:47;33601:131;33727:4;33601:131;:::i;:::-;33593:139;;33320:419;;;:::o;33745:::-;33911:4;33949:2;33938:9;33934:18;33926:26;;33998:9;33992:4;33988:20;33984:1;33973:9;33969:17;33962:47;34026:131;34152:4;34026:131;:::i;:::-;34018:139;;33745:419;;;:::o;34170:::-;34336:4;34374:2;34363:9;34359:18;34351:26;;34423:9;34417:4;34413:20;34409:1;34398:9;34394:17;34387:47;34451:131;34577:4;34451:131;:::i;:::-;34443:139;;34170:419;;;:::o;34595:::-;34761:4;34799:2;34788:9;34784:18;34776:26;;34848:9;34842:4;34838:20;34834:1;34823:9;34819:17;34812:47;34876:131;35002:4;34876:131;:::i;:::-;34868:139;;34595:419;;;:::o;35020:222::-;35113:4;35151:2;35140:9;35136:18;35128:26;;35164:71;35232:1;35221:9;35217:17;35208:6;35164:71;:::i;:::-;35020:222;;;;:::o;35248:1140::-;35581:4;35619:3;35608:9;35604:19;35596:27;;35633:71;35701:1;35690:9;35686:17;35677:6;35633:71;:::i;:::-;35714:72;35782:2;35771:9;35767:18;35758:6;35714:72;:::i;:::-;35796;35864:2;35853:9;35849:18;35840:6;35796:72;:::i;:::-;35878;35946:2;35935:9;35931:18;35922:6;35878:72;:::i;:::-;35960:73;36028:3;36017:9;36013:19;36004:6;35960:73;:::i;:::-;36043;36111:3;36100:9;36096:19;36087:6;36043:73;:::i;:::-;36126;36194:3;36183:9;36179:19;36170:6;36126:73;:::i;:::-;36209:89;36293:3;36282:9;36278:19;36269:6;36209:89;:::i;:::-;36308:73;36376:3;36365:9;36361:19;36352:6;36308:73;:::i;:::-;35248:1140;;;;;;;;;;;;:::o;36394:553::-;36571:4;36609:3;36598:9;36594:19;36586:27;;36623:71;36691:1;36680:9;36676:17;36667:6;36623:71;:::i;:::-;36704:72;36772:2;36761:9;36757:18;36748:6;36704:72;:::i;:::-;36786;36854:2;36843:9;36839:18;36830:6;36786:72;:::i;:::-;36868;36936:2;36925:9;36921:18;36912:6;36868:72;:::i;:::-;36394:553;;;;;;;:::o;36953:214::-;37042:4;37080:2;37069:9;37065:18;37057:26;;37093:67;37157:1;37146:9;37142:17;37133:6;37093:67;:::i;:::-;36953:214;;;;:::o;37254:98::-;37305:6;37339:5;37333:12;37323:22;;37254:98;;;:::o;37358:99::-;37410:6;37444:5;37438:12;37428:22;;37358:99;;;:::o;37463:147::-;37564:11;37601:3;37586:18;;37463:147;;;;:::o;37616:169::-;37700:11;37734:6;37729:3;37722:19;37774:4;37769:3;37765:14;37750:29;;37616:169;;;;:::o;37791:148::-;37893:11;37930:3;37915:18;;37791:148;;;;:::o;37945:305::-;37985:3;38004:20;38022:1;38004:20;:::i;:::-;37999:25;;38038:20;38056:1;38038:20;:::i;:::-;38033:25;;38192:1;38124:66;38120:74;38117:1;38114:81;38111:107;;;38198:18;;:::i;:::-;38111:107;38242:1;38239;38235:9;38228:16;;37945:305;;;;:::o;38256:185::-;38296:1;38313:20;38331:1;38313:20;:::i;:::-;38308:25;;38347:20;38365:1;38347:20;:::i;:::-;38342:25;;38386:1;38376:35;;38391:18;;:::i;:::-;38376:35;38433:1;38430;38426:9;38421:14;;38256:185;;;;:::o;38447:348::-;38487:7;38510:20;38528:1;38510:20;:::i;:::-;38505:25;;38544:20;38562:1;38544:20;:::i;:::-;38539:25;;38732:1;38664:66;38660:74;38657:1;38654:81;38649:1;38642:9;38635:17;38631:105;38628:131;;;38739:18;;:::i;:::-;38628:131;38787:1;38784;38780:9;38769:20;;38447:348;;;;:::o;38801:191::-;38841:4;38861:20;38879:1;38861:20;:::i;:::-;38856:25;;38895:20;38913:1;38895:20;:::i;:::-;38890:25;;38934:1;38931;38928:8;38925:34;;;38939:18;;:::i;:::-;38925:34;38984:1;38981;38977:9;38969:17;;38801:191;;;;:::o;38998:96::-;39035:7;39064:24;39082:5;39064:24;:::i;:::-;39053:35;;38998:96;;;:::o;39100:104::-;39145:7;39174:24;39192:5;39174:24;:::i;:::-;39163:35;;39100:104;;;:::o;39210:90::-;39244:7;39287:5;39280:13;39273:21;39262:32;;39210:90;;;:::o;39306:77::-;39343:7;39372:5;39361:16;;39306:77;;;:::o;39389:149::-;39425:7;39465:66;39458:5;39454:78;39443:89;;39389:149;;;:::o;39544:126::-;39581:7;39621:42;39614:5;39610:54;39599:65;;39544:126;;;:::o;39676:77::-;39713:7;39742:5;39731:16;;39676:77;;;:::o;39759:86::-;39794:7;39834:4;39827:5;39823:16;39812:27;;39759:86;;;:::o;39851:134::-;39909:9;39942:37;39973:5;39942:37;:::i;:::-;39929:50;;39851:134;;;:::o;39991:126::-;40041:9;40074:37;40105:5;40074:37;:::i;:::-;40061:50;;39991:126;;;:::o;40123:113::-;40173:9;40206:24;40224:5;40206:24;:::i;:::-;40193:37;;40123:113;;;:::o;40242:307::-;40310:1;40320:113;40334:6;40331:1;40328:13;40320:113;;;40419:1;40414:3;40410:11;40404:18;40400:1;40395:3;40391:11;40384:39;40356:2;40353:1;40349:10;40344:15;;40320:113;;;40451:6;40448:1;40445:13;40442:101;;;40531:1;40522:6;40517:3;40513:16;40506:27;40442:101;40291:258;40242:307;;;:::o;40555:171::-;40594:3;40617:24;40635:5;40617:24;:::i;:::-;40608:33;;40663:4;40656:5;40653:15;40650:41;;;40671:18;;:::i;:::-;40650:41;40718:1;40711:5;40707:13;40700:20;;40555:171;;;:::o;40732:180::-;40780:77;40777:1;40770:88;40877:4;40874:1;40867:15;40901:4;40898:1;40891:15;40918:180;40966:77;40963:1;40956:88;41063:4;41060:1;41053:15;41087:4;41084:1;41077:15;41104:180;41152:77;41149:1;41142:88;41249:4;41246:1;41239:15;41273:4;41270:1;41263:15;41290:180;41338:77;41335:1;41328:88;41435:4;41432:1;41425:15;41459:4;41456:1;41449:15;41599:117;41708:1;41705;41698:12;41722:102;41763:6;41814:2;41810:7;41805:2;41798:5;41794:14;41790:28;41780:38;;41722:102;;;:::o;41830:182::-;41970:34;41966:1;41958:6;41954:14;41947:58;41830:182;:::o;42018:221::-;42158:34;42154:1;42146:6;42142:14;42135:58;42227:4;42222:2;42214:6;42210:15;42203:29;42018:221;:::o;42245:226::-;42385:34;42381:1;42373:6;42369:14;42362:58;42454:9;42449:2;42441:6;42437:15;42430:34;42245:226;:::o;42477:225::-;42617:34;42613:1;42605:6;42601:14;42594:58;42686:8;42681:2;42673:6;42669:15;42662:33;42477:225;:::o;42708:::-;42848:34;42844:1;42836:6;42832:14;42825:58;42917:8;42912:2;42904:6;42900:15;42893:33;42708:225;:::o;42939:170::-;43079:22;43075:1;43067:6;43063:14;43056:46;42939:170;:::o;43115:181::-;43255:33;43251:1;43243:6;43239:14;43232:57;43115:181;:::o;43302:170::-;43442:22;43438:1;43430:6;43426:14;43419:46;43302:170;:::o;43478:177::-;43618:29;43614:1;43606:6;43602:14;43595:53;43478:177;:::o;43661:229::-;43801:34;43797:1;43789:6;43785:14;43778:58;43870:12;43865:2;43857:6;43853:15;43846:37;43661:229;:::o;43896:251::-;44036:34;44032:1;44024:6;44020:14;44013:58;44105:34;44100:2;44092:6;44088:15;44081:59;43896:251;:::o;44153:221::-;44293:34;44289:1;44281:6;44277:14;44270:58;44362:4;44357:2;44349:6;44345:15;44338:29;44153:221;:::o;44380:171::-;44520:23;44516:1;44508:6;44504:14;44497:47;44380:171;:::o;44557:182::-;44697:34;44693:1;44685:6;44681:14;44674:58;44557:182;:::o;44745:237::-;44885:34;44881:1;44873:6;44869:14;44862:58;44954:20;44949:2;44941:6;44937:15;44930:45;44745:237;:::o;44988:292::-;45128:34;45124:1;45116:6;45112:14;45105:58;45197:34;45192:2;45184:6;45180:15;45173:59;45266:6;45261:2;45253:6;45249:15;45242:31;44988:292;:::o;45286:179::-;45426:31;45422:1;45414:6;45410:14;45403:55;45286:179;:::o;45471:173::-;45611:25;45607:1;45599:6;45595:14;45588:49;45471:173;:::o;45650:229::-;45790:34;45786:1;45778:6;45774:14;45767:58;45859:12;45854:2;45846:6;45842:15;45835:37;45650:229;:::o;45885:174::-;46025:26;46021:1;46013:6;46009:14;46002:50;45885:174;:::o;46065:181::-;46205:33;46201:1;46193:6;46189:14;46182:57;46065:181;:::o;46252:165::-;46392:17;46388:1;46380:6;46376:14;46369:41;46252:165;:::o;46423:167::-;46563:19;46559:1;46551:6;46547:14;46540:43;46423:167;:::o;46596:234::-;46736:34;46732:1;46724:6;46720:14;46713:58;46805:17;46800:2;46792:6;46788:15;46781:42;46596:234;:::o;46836:::-;46976:34;46972:1;46964:6;46960:14;46953:58;47045:17;47040:2;47032:6;47028:15;47021:42;46836:234;:::o;47076:239::-;47216:34;47212:1;47204:6;47200:14;47193:58;47285:22;47280:2;47272:6;47268:15;47261:47;47076:239;:::o;47321:122::-;47394:24;47412:5;47394:24;:::i;:::-;47387:5;47384:35;47374:63;;47433:1;47430;47423:12;47374:63;47321:122;:::o;47449:138::-;47530:32;47556:5;47530:32;:::i;:::-;47523:5;47520:43;47510:71;;47577:1;47574;47567:12;47510:71;47449:138;:::o;47593:116::-;47663:21;47678:5;47663:21;:::i;:::-;47656:5;47653:32;47643:60;;47699:1;47696;47689:12;47643:60;47593:116;:::o;47715:122::-;47788:24;47806:5;47788:24;:::i;:::-;47781:5;47778:35;47768:63;;47827:1;47824;47817:12;47768:63;47715:122;:::o;47843:120::-;47915:23;47932:5;47915:23;:::i;:::-;47908:5;47905:34;47895:62;;47953:1;47950;47943:12;47895:62;47843:120;:::o;47969:122::-;48042:24;48060:5;48042:24;:::i;:::-;48035:5;48032:35;48022:63;;48081:1;48078;48071:12;48022:63;47969:122;:::o
Swarm Source
ipfs://3d69ebc39a8aafbf4588b64e23ad5db23698bbd6db523b06cc2df534b9920b9e
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.