More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RirisuStaking
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.9; import "@openzeppelin/contracts/interfaces/IERC20.sol"; import "@openzeppelin/contracts/interfaces/IERC721.sol"; import "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "./Delegated.sol"; import "../Interfaces/ISanctum.sol"; import "../Interfaces/IAeon.sol"; contract RirisuStaking is IERC721Receiver, Delegated { using EnumerableSet for EnumerableSet.UintSet; uint256 private LORE_COST = 100 ether; // 100 AEON uint256 private NAME_COST = 100 ether; // 100 AEON uint128 public immutable MAX_RIRI_LEVEL = 80; uint128[] public MODIFIERS = [uint128(100), 125, 150, 225]; uint128[][] public RARITIES = [[uint128(6301), 9001, 9901, 10_001], [uint128(6301), 9001, 9801, 10_001]]; uint256[] public ENCHANT_COST = [ uint256(5 ether), 44 ether, 86 ether, 130 ether, 130 ether, 172 ether, 172 ether, 172 ether, 172 ether ]; // maps token id to staking info mapping(uint256 => Riri) internal riris; // maps token id to staking info mapping(uint256 => Sanctum) internal sanctums; mapping(uint256 => uint128[]) internal rooms; mapping(address => EnumerableSet.UintSet) private stkdRiris; mapping(address => EnumerableSet.UintSet) private stkdSanctums; mapping(uint256 => bool) private legendaries; IERC721 internal riri; ISanctum internal sanctum; IAeon internal aeon; bytes32 internal entropySauce; enum Actions { UNSTAKE, STAKE, CHANNEL } enum RoomRarity { COMMON, UNCOMMON, RARE, MYTHIC } struct Sanctum { address owner; uint128 totalStaked; uint128 level; Actions action; } struct Riri { address owner; uint256 sanctum; // should this be int? uint256 timestamp; uint128 level; uint128 rerolls; Actions action; string name; string description; } struct StakeMeta { uint256 rewardMultiplier; } constructor( address ririAddress, address sanctumAddress, address aeonAddress ) { riri = IERC721(ririAddress); sanctum = ISanctum(sanctumAddress); aeon = IAeon(aeonAddress); } modifier noCheaters() { uint256 size = 0; address acc = msg.sender; assembly { size := extcodesize(acc) } require(msg.sender == tx.origin && size == 0, "you're trying to cheat!"); _; // We'll use the last caller hash to add entropy to next caller entropySauce = keccak256(abi.encodePacked(acc, block.coinbase)); } function setLegendaries(uint256[] calldata _legendaries) external onlyDelegates { for (uint256 i = 0; i < _legendaries.length; i++) { legendaries[_legendaries[i]] = true; } } function removeLegendaries(uint256[] calldata _legendaries) external onlyDelegates { for (uint256 i = 0; i < _legendaries.length; i++) { legendaries[_legendaries[i]] = false; } } // claim sanctum token function claimSanctum(bool autoStake) public noCheaters { uint256 tokenId = sanctum.totalSupply(); if (autoStake) { sanctum.mint(address(this), msg.sender); sanctums[tokenId] = Sanctum(msg.sender, 0, 0, Actions.STAKE); stkdSanctums[msg.sender].add(tokenId); } else { sanctum.mint(msg.sender, msg.sender); } _generateNewRoom(tokenId); } function claimAllSanctums(bool autoStake) external noCheaters { uint256 limit = sanctum.getDistributionLimit(msg.sender); if (limit > 7) { limit = 7; } for (uint256 i = 0; i < limit; i++) { claimSanctum(autoStake); } } // claim from riri ID function claimForRiri(uint256 id) public noCheaters { Riri memory currentRiri = riris[id]; // TODO: events if (block.timestamp <= currentRiri.timestamp) return; uint256 timediff = block.timestamp - currentRiri.timestamp; if (currentRiri.action == Actions.STAKE) { uint256 mod = _aggregateRarity(currentRiri.sanctum, currentRiri.level); aeon.mint(currentRiri.owner, _claimableAeon(timediff, mod, legendaries[id])); currentRiri.timestamp = block.timestamp; // reset timestamp } if (currentRiri.action == Actions.CHANNEL) { uint128 claimableLevels = _claimableLevels(timediff); currentRiri.level = (currentRiri.level + claimableLevels > MAX_RIRI_LEVEL) ? (MAX_RIRI_LEVEL) : (currentRiri.level + claimableLevels); currentRiri.timestamp = block.timestamp; // reset timestamp riris[id] = currentRiri; } } function claimAll(uint256[] calldata ririIds) external { for (uint256 i = 0; i < ririIds.length; i++) { claimForRiri(ririIds[i]); } } function doActionsWithSanctums(uint256[] calldata ids, Actions[] calldata actions) external { require(ids.length == actions.length, "ids and actions must be the same length"); for (uint256 i = 0; i < ids.length; i++) { Sanctum memory s = sanctums[ids[i]]; require(ownerOfSanctum(ids[i]) == msg.sender, "You are not the owner of this Sanctum! uwu"); require(actions[i] < Actions.CHANNEL, "sanctum: invalid action"); if (actions[i] == Actions.UNSTAKE) { require(s.totalStaked == 0, "Sanctum must not have staked tokens to unstake"); s.action = Actions.UNSTAKE; s.owner = address(0); sanctums[ids[i]] = s; stkdSanctums[msg.sender].remove(ids[i]); sanctum.safeTransferFrom(address(this), msg.sender, ids[i]); // transfer from staking contract to owner } if (actions[i] == Actions.STAKE) { require(sanctum.getApproved(ids[i]) == address(this), "Sanctum must be approved staking"); s.action = Actions.STAKE; s.owner = msg.sender; s.totalStaked = 0; sanctums[ids[i]] = s; stkdSanctums[msg.sender].add(ids[i]); sanctum.safeTransferFrom(msg.sender, address(this), ids[i]); } } } function doActionsWithRiris( uint256[] calldata ids, Actions[] calldata actions, uint256[] calldata sanctumIds ) external noCheaters { require( ids.length == actions.length && actions.length == sanctumIds.length, "ids and actions must be the same length" ); for (uint256 i = 0; i < ids.length; i++) { Riri memory r = riris[ids[i]]; Sanctum memory s = sanctums[sanctumIds[i]]; require( ownerOfRiri(ids[i]) == msg.sender && ownerOfSanctum(sanctumIds[i]) == msg.sender, "you do not own one of these tokens! qq" ); if (actions[i] == Actions.UNSTAKE) { require(r.action == Actions.STAKE || r.action == Actions.CHANNEL, "Riri must be staked or channelling"); require(r.sanctum == sanctumIds[i], "Riri must be in this sanctum"); claimForRiri(ids[i]); r.action = Actions.UNSTAKE; r.timestamp = block.timestamp; r.owner = address(0); r.sanctum = 5555; s.totalStaked -= 1; sanctums[sanctumIds[i]] = s; riris[ids[i]] = r; stkdRiris[msg.sender].remove(ids[i]); riri.safeTransferFrom(address(this), msg.sender, ids[i]); // transfer from staking contract to owner } if (actions[i] == Actions.STAKE) { require(r.action == Actions.UNSTAKE || r.action == Actions.CHANNEL, "Riri must be unstaked"); if (r.action == Actions.UNSTAKE) { require(s.totalStaked < 5, "Sanctum has reached the maximum Riris staked"); require( riri.getApproved(ids[i]) == address(this) || riri.isApprovedForAll(msg.sender, address(this)), "Ririsu must be approved staking" ); r.sanctum = sanctumIds[i]; riri.safeTransferFrom(msg.sender, address(this), ids[i]); // transfer from staking contract to owner stkdRiris[msg.sender].add(ids[i]); } else { require(r.sanctum == sanctumIds[i], "Riri must be in this sanctum"); } r.action = Actions.STAKE; r.timestamp = block.timestamp; r.owner = address(msg.sender); s.totalStaked += 1; sanctums[sanctumIds[i]] = s; riris[ids[i]] = r; } if (actions[i] == Actions.CHANNEL) { require( riri.getApproved(ids[i]) == address(this) || riri.isApprovedForAll(msg.sender, address(this)), "Ririsu must be approved staking" ); require(r.action == Actions.UNSTAKE || r.action == Actions.STAKE, "Riri must be unstaked or staked"); // if ririsu is staked, we need to transfer it back to the staking contract if (r.action == Actions.UNSTAKE) { require(s.totalStaked < 5, "Sanctum has reached the maximum Riris"); require( riri.getApproved(ids[i]) == address(this) || riri.isApprovedForAll(msg.sender, address(this)), "Ririsu must be approved staking" ); r.sanctum = sanctumIds[i]; riri.safeTransferFrom(msg.sender, address(this), ids[i]); // transfer from staking contract to owner stkdRiris[msg.sender].add(ids[i]); } else { require(r.sanctum == sanctumIds[i], "Riri must be in this sanctum"); } r.action = Actions.CHANNEL; r.timestamp = block.timestamp; r.owner = address(msg.sender); s.totalStaked += 1; sanctums[sanctumIds[i]] = s; riris[ids[i]] = r; } } } function _claimableLevels(uint256 timeDiff) internal pure returns (uint128 levels_) { levels_ = uint128(timeDiff / 12 hours); // 1 level every 12 hours uwu } function _aggregateRarity(uint256 id, uint256 ririLevel) internal view returns (uint256) { uint256 totalRarity = 0; uint128[] memory roomArray = getSanctumRooms(id); for (uint256 i = 0; i < roomArray.length && i < ((ririLevel / 10) + 1); i++) { totalRarity += uint256(roomArray[i]); } return totalRarity; } // claimable AEON function _claimableAeon( uint256 timeDiff, uint256 mod, bool isLegendary ) internal pure returns (uint256 aeon_) { uint256 base = isLegendary ? 525 : 300; aeon_ = ((timeDiff * (base + mod) * 1 ether) / 100 / 1 days); } function _generateNewRoom(uint256 _sanctumId) internal { rooms[_sanctumId].push(_pickRarity(_sanctumId, rooms[_sanctumId].length)); // todo generate random room } function _psued(uint128[] memory args) internal view returns (uint256) { bytes32 p1 = keccak256(abi.encodePacked((args))); bytes32 p2 = keccak256( abi.encodePacked(block.number, block.timestamp, block.difficulty, block.coinbase, entropySauce) ); return uint256((p1 & p2) | (p1 ^ p2)) % 10_000; } function _pickRarity(uint256 _sanctumId, uint256 _roomNumber) internal view returns (uint128 rarity_) { uint256 ps = _psued(getSanctumRooms(_sanctumId)); uint256 roomNumber = _roomNumber < 2 ? _roomNumber : 1; uint128[] memory rarities = RARITIES[roomNumber]; rarity_ = MODIFIERS[0]; for (uint256 i = 0; i < rarities.length; i++) { if (ps < rarities[i]) { rarity_ = MODIFIERS[i]; return rarity_; } } } // claimable view function claimable(uint256 id) external view returns (uint256 amount_) { require(riris[id].action > Actions.UNSTAKE, "Riri must be staked to claim"); uint256 mod = _aggregateRarity(riris[id].sanctum, riris[id].level); uint256 timeDiff = block.timestamp > riris[id].timestamp ? uint256(block.timestamp - riris[id].timestamp) : 0; amount_ = riris[id].action == Actions.STAKE ? _claimableAeon(timeDiff, mod, legendaries[id]) : (timeDiff * 3000) / 1 days; } // writeLore -- write lore on your NFT, so cool OwO function writeLore(uint256 id, string calldata lore) external { require(ownerOfRiri(id) == msg.sender, "You are not the owner of this Riri! uwu"); require( aeon.allowance(msg.sender, address(this)) >= LORE_COST, "You don't have enough AEON to write lore! uwu" ); require(bytes(riris[id].description).length == 0, "You have already edited the lore once in the past! q.q"); aeon.burnFrom(msg.sender, LORE_COST); riris[id].description = lore; } // nameRiri -- name your NFT, so cool OwO function nameRiri(uint256 _id, string calldata _name) external { require(ownerOfRiri(_id) == msg.sender, "You are not the owner of this Riri! uwu"); require(aeon.allowance(msg.sender, address(this)) >= NAME_COST, "You don't have enough AEON to rename! uwu"); require(bytes(riris[_id].name).length == 0, "You have already edited the name once in the past! q.q"); aeon.burnFrom(msg.sender, NAME_COST); riris[_id].name = _name; } function enchantRoom( uint256 _ririId, uint256 _sanctumId, uint256 _roomNumber ) external noCheaters { require(_sanctumId < sanctum.totalSupply(), "The sanctum is not valid!"); require(_roomNumber < 9, "The room is not within the sanctum list!"); require(_roomNumber < rooms[_sanctumId].length + 1, "Cant unlock that one yet!"); require(riris[_ririId].rerolls < (riris[_ririId].level / 10), "Riri's level is too low to reroll!"); require( aeon.allowance(msg.sender, address(this)) >= ENCHANT_COST[_roomNumber], "You don't have enough AEON to reroll!" ); aeon.burnFrom(msg.sender, ENCHANT_COST[_roomNumber]); if (_roomNumber < rooms[_sanctumId].length) { rooms[_sanctumId][_roomNumber] = _pickRarity(_sanctumId, _roomNumber); } else { _generateNewRoom(_sanctumId); } } function ownerOfRiri(uint256 id) public view returns (address) { if (riri.ownerOf(id) == address(this)) return riris[id].owner; return riri.ownerOf(id); } function ownerOfSanctum(uint256 id) public view returns (address) { if (sanctum.ownerOf(id) == address(this)) return sanctums[id].owner; return sanctum.ownerOf(id); } function getSanctumRooms(uint256 _id) public view returns (uint128[] memory) { uint128[] memory rooms_ = new uint128[](rooms[_id].length); for (uint256 i = 0; i < rooms[_id].length; i++) { rooms_[i] = rooms[_id][i]; } return rooms_; } function roomInfo(uint256 _id, uint256 _roomNumber) public view returns (uint128 roomType_, uint128 rarity_) { roomType_ = uint128(_roomNumber); rarity_ = rooms[_id][_roomNumber]; } function stakedRiris(address _owner) public view returns (uint256[] memory riris_) { riris_ = stkdRiris[_owner].values(); } function stakedSanctums(address _owner) public view returns (uint256[] memory sanctums_) { sanctums_ = stkdSanctums[_owner].values(); } function ririMeta(uint256 _id) public view returns (Riri memory riri_) { riri_ = riris[_id]; } function sanctumInfo(uint256 id) public view returns (Sanctum memory sanctum_) { sanctum_ = sanctums[id]; } function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Receiver.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721Receiver.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.0; /*********************** * @author: squeebo_nft * ************************/ import "@openzeppelin/contracts/access/Ownable.sol"; contract Delegated is Ownable{ mapping(address => bool) internal _delegates; constructor(){ _delegates[owner()] = true; } modifier onlyDelegates { require(_delegates[msg.sender], "Invalid delegate" ); _; } //onlyOwner function isDelegate( address addr ) external view onlyOwner returns ( bool ){ return _delegates[addr]; } function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{ _delegates[addr] = isDelegate_; } function transferOwnership(address newOwner) public virtual override onlyOwner { _delegates[newOwner] = true; super.transferOwnership( newOwner ); } }
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.9; import "@openzeppelin/contracts/interfaces/IERC721.sol"; interface ISanctum is IERC721 { function mint(address _to, address _for) external; function totalSupply() external returns (uint256); function getDistributionLimit(address _address) external view returns (uint256); }
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.0; import "@openzeppelin/contracts/interfaces/IERC20.sol"; interface IAeon is IERC20 { function mint(address to, uint256 qty) external; function burn(uint256 qty) external; function burnFrom(address from, uint256 qty) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 2000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"ririAddress","type":"address"},{"internalType":"address","name":"sanctumAddress","type":"address"},{"internalType":"address","name":"aeonAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ENCHANT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RIRI_LEVEL","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MODIFIERS","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"RARITIES","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ririIds","type":"uint256[]"}],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"autoStake","type":"bool"}],"name":"claimAllSanctums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimForRiri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"autoStake","type":"bool"}],"name":"claimSanctum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"enum RirisuStaking.Actions[]","name":"actions","type":"uint8[]"},{"internalType":"uint256[]","name":"sanctumIds","type":"uint256[]"}],"name":"doActionsWithRiris","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"enum RirisuStaking.Actions[]","name":"actions","type":"uint8[]"}],"name":"doActionsWithSanctums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ririId","type":"uint256"},{"internalType":"uint256","name":"_sanctumId","type":"uint256"},{"internalType":"uint256","name":"_roomNumber","type":"uint256"}],"name":"enchantRoom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getSanctumRooms","outputs":[{"internalType":"uint128[]","name":"","type":"uint128[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"nameRiri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOfRiri","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOfSanctum","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_legendaries","type":"uint256[]"}],"name":"removeLegendaries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ririMeta","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"sanctum","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint128","name":"level","type":"uint128"},{"internalType":"uint128","name":"rerolls","type":"uint128"},{"internalType":"enum RirisuStaking.Actions","name":"action","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct RirisuStaking.Riri","name":"riri_","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_roomNumber","type":"uint256"}],"name":"roomInfo","outputs":[{"internalType":"uint128","name":"roomType_","type":"uint128"},{"internalType":"uint128","name":"rarity_","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"sanctumInfo","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint128","name":"totalStaked","type":"uint128"},{"internalType":"uint128","name":"level","type":"uint128"},{"internalType":"enum RirisuStaking.Actions","name":"action","type":"uint8"}],"internalType":"struct RirisuStaking.Sanctum","name":"sanctum_","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_legendaries","type":"uint256[]"}],"name":"setLegendaries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"stakedRiris","outputs":[{"internalType":"uint256[]","name":"riris_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"stakedSanctums","outputs":[{"internalType":"uint256[]","name":"sanctums_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"lore","type":"string"}],"name":"writeLore","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
68056bc75e2d6310000060028190556003556050608052610120604052606460a0908152607d60c052609660e05260e1610100526200004290600490816200025f565b506040805160c08101825261189d81830181815261232960608085018290526126ad60808087019190915261271160a0870181905293865286519081018752938452602084810192909252612649958401959095529382015291810191909152620000b29060059060026200031e565b50604051806101200160405280674563918244f4000081526020016802629f66e0c530000081526020016804a97d605a3b980000815260200168070c1cc73b00c80000815260200168070c1cc73b00c800008152602001680952fac0b4773000008152602001680952fac0b4773000008152602001680952fac0b4773000008152602001680952fac0b47730000081525060069060096200015592919062000378565b503480156200016357600080fd5b50604051620056f8380380620056f8833981016040819052620001869162000435565b62000191336200020f565b6001806000620001a96000546001600160a01b031690565b6001600160a01b0390811682526020820192909252604001600020805460ff191692151592909217909155600d80546001600160a01b0319908116958316959095179055600e8054851693821693909317909255600f805490931691161790556200047f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020906001016002900481019282156200030c5791602002820160005b83821115620002d557835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f0104928301926001030262000289565b80156200030a5782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302620002d5565b505b506200031a929150620003b6565b5090565b8280548282559060005260206000209081019282156200036a579160200282015b828111156200036a5782516200035990839060046200025f565b50916020019190600101906200033f565b506200031a929150620003cd565b8280548282559060005260206000209081019282156200030c579160200282015b828111156200030c57825182559160200191906001019062000399565b5b808211156200031a5760008155600101620003b7565b808211156200031a576000620003e48282620003ee565b50600101620003cd565b508054600082556001016002900490600052602060002090810190620004159190620003b6565b50565b80516001600160a01b03811681146200043057600080fd5b919050565b6000806000606084860312156200044b57600080fd5b620004568462000418565b9250620004666020850162000418565b9150620004766040850162000418565b90509250925092565b60805161524f620004a9600039600081816104150152818161112f015261118c015261524f6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639d54168611610104578063d1d58b25116100a2578063dc982be411610071578063dc982be4146104a9578063e2d6d08b146104c9578063e5962030146104dc578063f2fde38b146104ef57600080fd5b8063d1d58b251461045d578063d6d6b9ec14610470578063d821a12d14610483578063db0ec0391461049657600080fd5b8063c131ea16116100de578063c131ea16146103ef578063c6a14c8d14610410578063cadea27514610437578063d0c30af21461044a57600080fd5b80639d541686146103a9578063ba99aa1f146103bc578063bf2e1f8d146103dc57600080fd5b8063411a52101161017c578063659b07911161014b578063659b079114610349578063715018a61461036957806376446bce146103715780638da5cb5b1461038457600080fd5b8063411a5210146102dd5780634a994eef146103105780634c7be681146103235780634ef3ba841461033657600080fd5b806323c0f44a116101b857806323c0f44a14610282578063248c1f85146102a257806328c77820146102b75780632e745abd146102ca57600080fd5b806307779627146101df578063150b7a021461020757806315e8fcd014610257575b600080fd5b6101f26101ed3660046149d8565b610502565b60405190151581526020015b60405180910390f35b61023e610215366004614a0b565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b031990911681526020016101fe565b61026a610265366004614aeb565b610581565b6040516001600160801b0390911681526020016101fe565b610295610290366004614aeb565b6105be565b6040516101fe9190614b04565b6102b56102b0366004614b9d565b6106ba565b005b6102b56102c5366004614b9d565b610780565b6102b56102d8366004614bdf565b6107be565b6102f06102eb366004614c0b565b610d0d565b604080516001600160801b039384168152929091166020830152016101fe565b6102b561031e366004614c3b565b610d63565b6102b5610331366004614aeb565b610de8565b6102b5610344366004614c74565b6112df565b61035c6103573660046149d8565b6128ea565b6040516101fe9190614d0e565b6102b5612914565b6102b561037f366004614b9d565b61297a565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b6102b56103b7366004614d46565b612a3b565b6103cf6103ca366004614aeb565b612b62565b6040516101fe9190614de8565b6103916103ea366004614aeb565b612d71565b6104026103fd366004614aeb565b612e9a565b6040519081526020016101fe565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b61035c6104453660046149d8565b612ebb565b6102b5610458366004614d46565b612edf565b61040261046b366004614aeb565b6131c9565b61026a61047e366004614c0b565b61331f565b610391610491366004614aeb565b613377565b6102b56104a4366004614e97565b613454565b6104bc6104b7366004614aeb565b613706565b6040516101fe9190614f13565b6102b56104d7366004614f5d565b6137ba565b6102b56104ea366004614e97565b613efe565b6102b56104fd3660046149d8565b6141aa565b600080546001600160a01b031633146105625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b506001600160a01b031660009081526001602052604090205460ff1690565b6004818154811061059157600080fd5b9060005260206000209060029182820401919006601002915054906101000a90046001600160801b031681565b6000818152600960205260408120546060919067ffffffffffffffff8111156105e9576105e96149f5565b604051908082528060200260200182016040528015610612578160200160208202803683370190505b50905060005b6000848152600960205260409020548110156106b357600084815260096020526040902080548290811061064e5761064e614fc9565b90600052602060002090600291828204019190066010029054906101000a90046001600160801b031682828151811061068957610689614fc9565b6001600160801b0390921660209283029190910190910152806106ab81614ff5565b915050610618565b5092915050565b3360009081526001602052604090205460ff166107195760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610559565b60005b8181101561077b576000600c600085858581811061073c5761073c614fc9565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061077390614ff5565b91505061071c565b505050565b60005b8181101561077b576107ac8383838181106107a0576107a0614fc9565b90506020020135610de8565b806107b681614ff5565b915050610783565b33803b9032811480156107cf575081155b61081b5760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b600e60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561086b57600080fd5b505af115801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a39190615010565b84106108f15760405162461bcd60e51b815260206004820152601960248201527f5468652073616e6374756d206973206e6f742076616c696421000000000000006044820152606401610559565b600983106109675760405162461bcd60e51b815260206004820152602860248201527f54686520726f6f6d206973206e6f742077697468696e207468652073616e637460448201527f756d206c697374210000000000000000000000000000000000000000000000006064820152608401610559565b600084815260096020526040902054610981906001615029565b83106109cf5760405162461bcd60e51b815260206004820152601960248201527f43616e7420756e6c6f636b2074686174206f6e652079657421000000000000006044820152606401610559565b6000858152600760205260409020600301546109f690600a906001600160801b0316615057565b6000868152600760205260409020600301546001600160801b03918216600160801b90910490911610610a915760405162461bcd60e51b815260206004820152602260248201527f526972692773206c6576656c20697320746f6f206c6f7720746f207265726f6c60448201527f6c210000000000000000000000000000000000000000000000000000000000006064820152608401610559565b60068381548110610aa457610aa4614fc9565b600091825260209091200154600f54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e9060440160206040518083038186803b158015610af957600080fd5b505afa158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b319190615010565b1015610ba55760405162461bcd60e51b815260206004820152602560248201527f596f7520646f6e2774206861766520656e6f7567682041454f4e20746f20726560448201527f726f6c6c210000000000000000000000000000000000000000000000000000006064820152608401610559565b600f54600680546001600160a01b03909216916379cc679091339187908110610bd057610bd0614fc9565b6000918252602090912001546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610c2257600080fd5b505af1158015610c36573d6000803e3d6000fd5b5050506000858152600960205260409020548410159050610cb957610c5b8484614236565b6000858152600960205260409020805485908110610c7b57610c7b614fc9565b90600052602060002090600291828204019190066010026101000a8154816001600160801b0302191690836001600160801b03160217905550610cc2565b610cc2846143d6565b6040516bffffffffffffffffffffffff19606083811b8216602084015241901b16603482015260480160408051601f1981840301815291905280516020909101206010555050505050565b600082815260096020526040812080548392919083908110610d3157610d31614fc9565b90600052602060002090600291828204019190066010029054906101000a90046001600160801b031690509250929050565b6000546001600160a01b03163314610dbd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b33803b903281148015610df9575081155b610e455760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b600083815260076020908152604080832081516101008101835281546001600160a01b031681526001820154938101939093526002808201549284019290925260038101546001600160801b038082166060860152600160801b9091041660808401526004810154909160a084019160ff1690811115610ec757610ec7614d63565b6002811115610ed857610ed8614d63565b8152602001600582018054610eec9061507d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f189061507d565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b50505050508152602001600682018054610f7e9061507d565b80601f0160208091040260200160405190810160405280929190818152602001828054610faa9061507d565b8015610ff75780601f10610fcc57610100808354040283529160200191610ff7565b820191906000526020600020905b815481529060010190602001808311610fda57829003601f168201915b5050505050815250509050806040015142116110135750611295565b600081604001514261102591906150b8565b905060018260a00151600281111561103f5761103f614d63565b1415611102576000611062836020015184606001516001600160801b0316614433565b600f5484516000898152600c60205260409020549293506001600160a01b03909116916340c10f19919061109c908690869060ff166144ba565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156110e257600080fd5b505af11580156110f6573d6000803e3d6000fd5b50504260408601525050505b60028260a00151600281111561111a5761111a614d63565b141561129257600061112b8261451d565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160801b031681846060015161116791906150cf565b6001600160801b03161161118a5780836060015161118591906150cf565b6111ac565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160801b039081166060850190815242604080870191825260008a815260076020908152919020875181546001600160a01b039091166001600160a01b0319909116178155908701516001808301919091559151600280830191909155925160808801518516600160801b02941693909317600384015560a08601516004840180548895949293919260ff199091169190849081111561125157611251614d63565b021790555060c082015180516112719160058401916020909101906148b6565b5060e0820151805161128d9160068401916020909101906148b6565b505050505b50505b6040516bffffffffffffffffffffffff19606083811b8216602084015241901b1660348201526048015b60408051601f198184030181529190528051602090910120601055505050565b33803b9032811480156112f0575081155b61133c5760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b868514801561134a57508483145b6113bc5760405162461bcd60e51b815260206004820152602760248201527f69647320616e6420616374696f6e73206d757374206265207468652073616d6560448201527f206c656e677468000000000000000000000000000000000000000000000000006064820152608401610559565b60005b8781101561289b576000600760008b8b858181106113df576113df614fc9565b6020908102929092013583525081810192909252604090810160002081516101008101835281546001600160a01b031681526001820154938101939093526002808201549284019290925260038101546001600160801b038082166060860152600160801b9091041660808401526004810154909160a084019160ff169081111561146c5761146c614d63565b600281111561147d5761147d614d63565b81526020016005820180546114919061507d565b80601f01602080910402602001604051908101604052809291908181526020018280546114bd9061507d565b801561150a5780601f106114df5761010080835404028352916020019161150a565b820191906000526020600020905b8154815290600101906020018083116114ed57829003601f168201915b505050505081526020016006820180546115239061507d565b80601f016020809104026020016040519081016040528092919081815260200182805461154f9061507d565b801561159c5780601f106115715761010080835404028352916020019161159c565b820191906000526020600020905b81548152906001019060200180831161157f57829003601f168201915b50505050508152505090506000600860008888868181106115bf576115bf614fc9565b60209081029290920135835250818101929092526040908101600020815160808101835281546001600160a01b0316815260018201546001600160801b0380821695830195909552600160801b900490931691830191909152600280820154606084019160ff9091169081111561163857611638614d63565b600281111561164957611649614d63565b9052509050336116708c8c8681811061166457611664614fc9565b90506020020135612d71565b6001600160a01b03161480156116ae5750336116a388888681811061169757611697614fc9565b90506020020135613377565b6001600160a01b0316145b6117205760405162461bcd60e51b815260206004820152602660248201527f796f7520646f206e6f74206f776e206f6e65206f6620746865736520746f6b6560448201527f6e732120717100000000000000000000000000000000000000000000000000006064820152608401610559565b600089898581811061173457611734614fc9565b905060200201602081019061174991906150fa565b600281111561175a5761175a614d63565b1415611b295760018260a00151600281111561177857611778614d63565b1480611799575060028260a00151600281111561179757611797614d63565b145b61180b5760405162461bcd60e51b815260206004820152602260248201527f52697269206d757374206265207374616b6564206f72206368616e6e656c6c6960448201527f6e670000000000000000000000000000000000000000000000000000000000006064820152608401610559565b86868481811061181d5761181d614fc9565b905060200201358260200151146118765760405162461bcd60e51b815260206004820152601c60248201527f52697269206d75737420626520696e20746869732073616e6374756d000000006044820152606401610559565b61188b8b8b858181106107a0576107a0614fc9565b600060a0830181905242604084015282526115b360208084019190915281018051600191906118bb90839061511b565b6001600160801b031690525080600860008989878181106118de576118de614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff191691849081111561196357611963614d63565b021790555090505081600760008d8d8781811061198257611982614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b03199091161781559183015160018084019190915590830151600280840191909155606084015160808501516001600160801b03908116600160801b02911617600384015560a08401516004840180549193909260ff19909216918490811115611a2057611a20614d63565b021790555060c08201518051611a409160058401916020909101906148b6565b5060e08201518051611a5c9160068401916020909101906148b6565b50905050611a938b8b85818110611a7557611a75614fc9565b336000908152600a602090815260409091209391020135905061452b565b50600d546001600160a01b03166342842e0e30338e8e88818110611ab957611ab9614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015611b1057600080fd5b505af1158015611b24573d6000803e3d6000fd5b505050505b6001898985818110611b3d57611b3d614fc9565b9050602002016020810190611b5291906150fa565b6002811115611b6357611b63614d63565b141561212a5760008260a001516002811115611b8157611b81614d63565b1480611ba2575060028260a001516002811115611ba057611ba0614d63565b145b611bee5760405162461bcd60e51b815260206004820152601560248201527f52697269206d75737420626520756e7374616b656400000000000000000000006044820152606401610559565b60008260a001516002811115611c0657611c06614d63565b1415611ef757600581602001516001600160801b031610611c8f5760405162461bcd60e51b815260206004820152602c60248201527f53616e6374756d20686173207265616368656420746865206d6178696d756d2060448201527f5269726973207374616b656400000000000000000000000000000000000000006064820152608401610559565b600d5430906001600160a01b031663081812fc8d8d87818110611cb457611cb4614fc9565b905060200201356040518263ffffffff1660e01b8152600401611cd991815260200190565b60206040518083038186803b158015611cf157600080fd5b505afa158015611d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d299190615143565b6001600160a01b03161480611dba5750600d5460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b158015611d8257600080fd5b505afa158015611d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dba9190615160565b611e065760405162461bcd60e51b815260206004820152601f60248201527f526972697375206d75737420626520617070726f766564207374616b696e67006044820152606401610559565b868684818110611e1857611e18614fc9565b602090810292909201359184019190915250600d546001600160a01b03166342842e0e33308e8e88818110611e4f57611e4f614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015611ea657600080fd5b505af1158015611eba573d6000803e3d6000fd5b50505050611ef18b8b85818110611ed357611ed3614fc9565b336000908152600a602090815260409091209391020135905061453e565b50611f62565b868684818110611f0957611f09614fc9565b90506020020135826020015114611f625760405162461bcd60e51b815260206004820152601c60248201527f52697269206d75737420626520696e20746869732073616e6374756d000000006044820152606401610559565b600160a08301819052426040840152338352602082018051611f859083906150cf565b6001600160801b03169052508060086000898987818110611fa857611fa8614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff191691849081111561202d5761202d614d63565b021790555090505081600760008d8d8781811061204c5761204c614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b03199091161781559183015160018084019190915590830151600280840191909155606084015160808501516001600160801b03908116600160801b02911617600384015560a08401516004840180549193909260ff199092169184908111156120ea576120ea614d63565b021790555060c0820151805161210a9160058401916020909101906148b6565b5060e082015180516121269160068401916020909101906148b6565b5050505b600289898581811061213e5761213e614fc9565b905060200201602081019061215391906150fa565b600281111561216457612164614d63565b141561288657600d5430906001600160a01b031663081812fc8d8d8781811061218f5761218f614fc9565b905060200201356040518263ffffffff1660e01b81526004016121b491815260200190565b60206040518083038186803b1580156121cc57600080fd5b505afa1580156121e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122049190615143565b6001600160a01b031614806122955750600d5460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b15801561225d57600080fd5b505afa158015612271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122959190615160565b6122e15760405162461bcd60e51b815260206004820152601f60248201527f526972697375206d75737420626520617070726f766564207374616b696e67006044820152606401610559565b60008260a0015160028111156122f9576122f9614d63565b148061231a575060018260a00151600281111561231857612318614d63565b145b6123665760405162461bcd60e51b815260206004820152601f60248201527f52697269206d75737420626520756e7374616b6564206f72207374616b6564006044820152606401610559565b60008260a00151600281111561237e5761237e614d63565b141561265157600581602001516001600160801b0316106124075760405162461bcd60e51b815260206004820152602560248201527f53616e6374756d20686173207265616368656420746865206d6178696d756d2060448201527f52697269730000000000000000000000000000000000000000000000000000006064820152608401610559565b600d5430906001600160a01b031663081812fc8d8d8781811061242c5761242c614fc9565b905060200201356040518263ffffffff1660e01b815260040161245191815260200190565b60206040518083038186803b15801561246957600080fd5b505afa15801561247d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a19190615143565b6001600160a01b031614806125325750600d5460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b1580156124fa57600080fd5b505afa15801561250e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125329190615160565b61257e5760405162461bcd60e51b815260206004820152601f60248201527f526972697375206d75737420626520617070726f766564207374616b696e67006044820152606401610559565b86868481811061259057612590614fc9565b602090810292909201359184019190915250600d546001600160a01b03166342842e0e33308e8e888181106125c7576125c7614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561261e57600080fd5b505af1158015612632573d6000803e3d6000fd5b5050505061264b8b8b85818110611ed357611ed3614fc9565b506126bc565b86868481811061266357612663614fc9565b905060200201358260200151146126bc5760405162461bcd60e51b815260206004820152601c60248201527f52697269206d75737420626520696e20746869732073616e6374756d000000006044820152606401610559565b600260a0830152426040830152338252602081018051600191906126e19083906150cf565b6001600160801b0316905250806008600089898781811061270457612704614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff191691849081111561278957612789614d63565b021790555090505081600760008d8d878181106127a8576127a8614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b03199091161781559183015160018084019190915590830151600280840191909155606084015160808501516001600160801b03908116600160801b02911617600384015560a08401516004840180549193909260ff1990921691849081111561284657612846614d63565b021790555060c082015180516128669160058401916020909101906148b6565b5060e082015180516128829160068401916020909101906148b6565b5050505b5050808061289390614ff5565b9150506113bf565b506040516bffffffffffffffffffffffff19606083811b8216602084015241901b16603482015260480160408051601f1981840301815291905280516020909101206010555050505050505050565b6001600160a01b0381166000908152600a6020526040902060609061290e9061454a565b92915050565b6000546001600160a01b0316331461296e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b6129786000614557565b565b3360009081526001602052604090205460ff166129d95760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610559565b60005b8181101561077b576001600c60008585858181106129fc576129fc614fc9565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612a3390614ff5565b9150506129dc565b33803b903281148015612a4c575081155b612a985760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b600e546040517fefa0f81a0000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b03169063efa0f81a9060240160206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190615010565b90506007811115612b3c575060075b60005b8181101561129257612b5085612edf565b80612b5a81614ff5565b915050612b3f565b612baa604080516101008101825260008082526020820181905291810182905260608101829052608081018290529060a0820190815260200160608152602001606081525090565b60008281526007602090815260409182902082516101008101845281546001600160a01b031681526001820154928101929092526002808201549383019390935260038101546001600160801b038082166060850152600160801b90910416608083015260048101549192909160a084019160ff90911690811115612c3157612c31614d63565b6002811115612c4257612c42614d63565b8152602001600582018054612c569061507d565b80601f0160208091040260200160405190810160405280929190818152602001828054612c829061507d565b8015612ccf5780601f10612ca457610100808354040283529160200191612ccf565b820191906000526020600020905b815481529060010190602001808311612cb257829003601f168201915b50505050508152602001600682018054612ce89061507d565b80601f0160208091040260200160405190810160405280929190818152602001828054612d149061507d565b8015612d615780601f10612d3657610100808354040283529160200191612d61565b820191906000526020600020905b815481529060010190602001808311612d4457829003601f168201915b5050505050815250509050919050565b600d546040516331a9108f60e11b81526004810183905260009130916001600160a01b0390911690636352211e9060240160206040518083038186803b158015612dba57600080fd5b505afa158015612dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df29190615143565b6001600160a01b03161415612e1d57506000908152600760205260409020546001600160a01b031690565b600d546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e906024015b60206040518083038186803b158015612e6257600080fd5b505afa158015612e76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290e9190615143565b60068181548110612eaa57600080fd5b600091825260209091200154905081565b6001600160a01b0381166000908152600b6020526040902060609061290e9061454a565b33803b903281148015612ef0575081155b612f3c5760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b600e54604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916318160ddd91600480830192602092919082900301818787803b158015612f9b57600080fd5b505af1158015612faf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd39190615010565b9050831561311357600e546040517fee1fe2ad0000000000000000000000000000000000000000000000000000000081523060048201523360248201526001600160a01b039091169063ee1fe2ad90604401600060405180830381600087803b15801561303f57600080fd5b505af1158015613053573d6000803e3d6000fd5b505060408051608081018252338152600060208083018281528385018381526001606086018181528a8652600890945295909320845181546001600160a01b039091166001600160a01b0319909116178155905192516001600160801b03908116600160801b029316929092178285015551600280830180549497509295509093919260ff1916919084908111156130ed576130ed614d63565b021790555050336000908152600b6020526040902061310d91508261453e565b50613191565b600e546040517fee1fe2ad000000000000000000000000000000000000000000000000000000008152336004820181905260248201526001600160a01b039091169063ee1fe2ad90604401600060405180830381600087803b15801561317857600080fd5b505af115801561318c573d6000803e3d6000fd5b505050505b61319a816143d6565b506040516bffffffffffffffffffffffff19606083811b8216602084015241901b1660348201526048016112bf565b60008060008381526007602052604090206004015460ff1660028111156131f2576131f2614d63565b1161323f5760405162461bcd60e51b815260206004820152601c60248201527f52697269206d757374206265207374616b656420746f20636c61696d000000006044820152606401610559565b6000828152600760205260408120600181015460039091015461326b91906001600160801b0316614433565b60008481526007602052604081206002015491925090421161328e5760006132aa565b6000848152600760205260409020600201546132aa90426150b8565b9050600160008581526007602052604090206004015460ff1660028111156132d4576132d4614d63565b146132f857620151806132e982610bb861517d565b6132f3919061519c565b613317565b6000848152600c6020526040902054613317908290849060ff166144ba565b949350505050565b6005828154811061332f57600080fd5b90600052602060002001818154811061334757600080fd5b9060005260206000209060029182820401919006601002915091509054906101000a90046001600160801b031681565b600e546040516331a9108f60e11b81526004810183905260009130916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156133c057600080fd5b505afa1580156133d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f89190615143565b6001600160a01b0316141561342357506000908152600860205260409020546001600160a01b031690565b600e546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e90602401612e4a565b3361345e84612d71565b6001600160a01b0316146134da5760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320526960448201527f72692120757775000000000000000000000000000000000000000000000000006064820152608401610559565b600354600f54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e9060440160206040518083038186803b15801561352657600080fd5b505afa15801561353a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355e9190615010565b10156135d25760405162461bcd60e51b815260206004820152602960248201527f596f7520646f6e2774206861766520656e6f7567682041454f4e20746f20726560448201527f6e616d65212075777500000000000000000000000000000000000000000000006064820152608401610559565b600083815260076020526040902060050180546135ee9061507d565b1590506136635760405162461bcd60e51b815260206004820152603660248201527f596f75206861766520616c72656164792065646974656420746865206e616d6560448201527f206f6e636520696e2074686520706173742120712e71000000000000000000006064820152608401610559565b600f546003546040517f79cc679000000000000000000000000000000000000000000000000000000000815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156136cc57600080fd5b505af11580156136e0573d6000803e3d6000fd5b50505060008481526007602052604090206137009150600501838361493a565b50505050565b61372e6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260086020908152604091829020825160808101845281546001600160a01b0316815260018201546001600160801b0380821694830194909452600160801b900490921692820192909252600280830154919291606084019160ff909116908111156137a0576137a0614d63565b60028111156137b1576137b1614d63565b90525092915050565b82811461382f5760405162461bcd60e51b815260206004820152602760248201527f69647320616e6420616374696f6e73206d757374206265207468652073616d6560448201527f206c656e677468000000000000000000000000000000000000000000000000006064820152608401610559565b60005b83811015613ef75760006008600087878581811061385257613852614fc9565b60209081029290920135835250818101929092526040908101600020815160808101835281546001600160a01b0316815260018201546001600160801b0380821695830195909552600160801b900490931691830191909152600280820154606084019160ff909116908111156138cb576138cb614d63565b60028111156138dc576138dc614d63565b9052509050336138f787878581811061169757611697614fc9565b6001600160a01b0316146139735760405162461bcd60e51b815260206004820152602a60248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320536160448201527f6e6374756d2120757775000000000000000000000000000000000000000000006064820152608401610559565b600284848481811061398757613987614fc9565b905060200201602081019061399c91906150fa565b60028111156139ad576139ad614d63565b106139fa5760405162461bcd60e51b815260206004820152601760248201527f73616e6374756d3a20696e76616c696420616374696f6e0000000000000000006044820152606401610559565b6000848484818110613a0e57613a0e614fc9565b9050602002016020810190613a2391906150fa565b6002811115613a3457613a34614d63565b1415613c345760208101516001600160801b031615613abb5760405162461bcd60e51b815260206004820152602e60248201527f53616e6374756d206d757374206e6f742068617665207374616b656420746f6b60448201527f656e7320746f20756e7374616b650000000000000000000000000000000000006064820152608401610559565b6000606082018190528082528190600890888886818110613ade57613ade614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff1916918490811115613b6357613b63614d63565b0217905550905050613b9e868684818110613b8057613b80614fc9565b336000908152600b602090815260409091209391020135905061452b565b50600e546001600160a01b03166342842e0e3033898987818110613bc457613bc4614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015613c1b57600080fd5b505af1158015613c2f573d6000803e3d6000fd5b505050505b6001848484818110613c4857613c48614fc9565b9050602002016020810190613c5d91906150fa565b6002811115613c6e57613c6e614d63565b1415613ee457600e5430906001600160a01b031663081812fc888886818110613c9957613c99614fc9565b905060200201356040518263ffffffff1660e01b8152600401613cbe91815260200190565b60206040518083038186803b158015613cd657600080fd5b505afa158015613cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0e9190615143565b6001600160a01b031614613d645760405162461bcd60e51b815260206004820181905260248201527f53616e6374756d206d75737420626520617070726f766564207374616b696e676044820152606401610559565b600160608201523381526000602082018190528190600890888886818110613d8e57613d8e614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff1916918490811115613e1357613e13614d63565b0217905550905050613e4e868684818110613e3057613e30614fc9565b336000908152600b602090815260409091209391020135905061453e565b50600e546001600160a01b03166342842e0e3330898987818110613e7457613e74614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015613ecb57600080fd5b505af1158015613edf573d6000803e3d6000fd5b505050505b5080613eef81614ff5565b915050613832565b5050505050565b33613f0884612d71565b6001600160a01b031614613f845760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320526960448201527f72692120757775000000000000000000000000000000000000000000000000006064820152608401610559565b600254600f54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e9060440160206040518083038186803b158015613fd057600080fd5b505afa158015613fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140089190615010565b101561407c5760405162461bcd60e51b815260206004820152602d60248201527f596f7520646f6e2774206861766520656e6f7567682041454f4e20746f20777260448201527f697465206c6f72652120757775000000000000000000000000000000000000006064820152608401610559565b600083815260076020526040902060060180546140989061507d565b15905061410d5760405162461bcd60e51b815260206004820152603660248201527f596f75206861766520616c72656164792065646974656420746865206c6f726560448201527f206f6e636520696e2074686520706173742120712e71000000000000000000006064820152608401610559565b600f546002546040517f79cc679000000000000000000000000000000000000000000000000000000000815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b15801561417657600080fd5b505af115801561418a573d6000803e3d6000fd5b50505060008481526007602052604090206137009150600601838361493a565b6000546001600160a01b031633146142045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b6001600160a01b0381166000908152600160208190526040909120805460ff19169091179055614233816145a7565b50565b60008061424a614245856105be565b614686565b905060006002841061425d57600161425f565b835b905060006005828154811061427657614276614fc9565b906000526020600020018054806020026020016040519081016040528092919081815260200182805480156142fc57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116142b95790505b50505050509050600460008154811061431757614317614fc9565b60009182526020822060028204015460019091166010026101000a90046001600160801b031694505b81518110156143cc5781818151811061435b5761435b614fc9565b60200260200101516001600160801b03168410156143ba576004818154811061438657614386614fc9565b90600052602060002090600291828204019190066010029054906101000a90046001600160801b031694505050505061290e565b806143c481614ff5565b915050614340565b5050505092915050565b600081815260096020526040902080546143f1908390614236565b81546001818101845560009384526020909320600282040180546001600160801b03938416601093909516929092026101000a93840292909302191617905550565b60008080614440856105be565b905060005b815181108015614469575061445b600a8661519c565b614466906001615029565b81105b156144b05781818151811061448057614480614fc9565b60200260200101516001600160801b03168361449c9190615029565b9250806144a881614ff5565b915050614445565b5090949350505050565b600080826144ca5761012c6144ce565b61020d5b61ffff1690506201518060646144e48684615029565b6144ee908861517d565b61450090670de0b6b3a764000061517d565b61450a919061519c565b614514919061519c565b95945050505050565b600061290e61a8c08361519c565b60006145378383614718565b9392505050565b6000614537838361480b565b606060006145378361485a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146146015760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b6001600160a01b03811661467d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610559565b61423381614557565b6000808260405160200161469a91906151b0565b60408051808303601f190181528282528051602091820120601054438386015242858501524460608087019190915241901b6bffffffffffffffffffffffff191660808601526094808601919091528351808603909101815260b49094019092528251920191909120909150613317612710828416838518176151ef565b6000818152600183016020526040812054801561480157600061473c6001836150b8565b8554909150600090614750906001906150b8565b90508181146147b557600086600001828154811061477057614770614fc9565b906000526020600020015490508087600001848154811061479357614793614fc9565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806147c6576147c6615203565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061290e565b600091505061290e565b60008181526001830160205260408120546148525750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561290e565b50600061290e565b6060816000018054806020026020016040519081016040528092919081815260200182805480156148aa57602002820191906000526020600020905b815481526020019060010190808311614896575b50505050509050919050565b8280546148c29061507d565b90600052602060002090601f0160209004810192826148e4576000855561492a565b82601f106148fd57805160ff191683800117855561492a565b8280016001018555821561492a579182015b8281111561492a57825182559160200191906001019061490f565b506149369291506149ae565b5090565b8280546149469061507d565b90600052602060002090601f016020900481019282614968576000855561492a565b82601f106149815782800160ff1982351617855561492a565b8280016001018555821561492a579182015b8281111561492a578235825591602001919060010190614993565b5b8082111561493657600081556001016149af565b6001600160a01b038116811461423357600080fd5b6000602082840312156149ea57600080fd5b8135614537816149c3565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215614a2157600080fd5b8435614a2c816149c3565b93506020850135614a3c816149c3565b925060408501359150606085013567ffffffffffffffff80821115614a6057600080fd5b818701915087601f830112614a7457600080fd5b813581811115614a8657614a866149f5565b604051601f8201601f19908116603f01168101908382118183101715614aae57614aae6149f5565b816040528281528a6020848701011115614ac757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600060208284031215614afd57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015614b455783516001600160801b031683529284019291840191600101614b20565b50909695505050505050565b60008083601f840112614b6357600080fd5b50813567ffffffffffffffff811115614b7b57600080fd5b6020830191508360208260051b8501011115614b9657600080fd5b9250929050565b60008060208385031215614bb057600080fd5b823567ffffffffffffffff811115614bc757600080fd5b614bd385828601614b51565b90969095509350505050565b600080600060608486031215614bf457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215614c1e57600080fd5b50508035926020909101359150565b801515811461423357600080fd5b60008060408385031215614c4e57600080fd5b8235614c59816149c3565b91506020830135614c6981614c2d565b809150509250929050565b60008060008060008060608789031215614c8d57600080fd5b863567ffffffffffffffff80821115614ca557600080fd5b614cb18a838b01614b51565b90985096506020890135915080821115614cca57600080fd5b614cd68a838b01614b51565b90965094506040890135915080821115614cef57600080fd5b50614cfc89828a01614b51565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b81811015614b4557835183529284019291840191600101614d2a565b600060208284031215614d5857600080fd5b813561453781614c2d565b634e487b7160e01b600052602160045260246000fd5b60038110614d9757634e487b7160e01b600052602160045260246000fd5b9052565b6000815180845260005b81811015614dc157602081850181015186830182015201614da5565b81811115614dd3576000602083870101525b50601f01601f19169290920160200192915050565b602081526001600160a01b038251166020820152602082015160408201526040820151606082015260006060830151614e2c60808401826001600160801b03169052565b5060808301516001600160801b03811660a08401525060a0830151614e5460c0840182614d79565b5060c08301516101008060e0850152614e71610120850183614d9b565b915060e0850151601f198584030182860152614e8d8382614d9b565b9695505050505050565b600080600060408486031215614eac57600080fd5b83359250602084013567ffffffffffffffff80821115614ecb57600080fd5b818601915086601f830112614edf57600080fd5b813581811115614eee57600080fd5b876020828501011115614f0057600080fd5b6020830194508093505050509250925092565b60006080820190506001600160a01b03835116825260208301516001600160801b038082166020850152806040860151166040850152505060608301516106b36060840182614d79565b60008060008060408587031215614f7357600080fd5b843567ffffffffffffffff80821115614f8b57600080fd5b614f9788838901614b51565b90965094506020870135915080821115614fb057600080fd5b50614fbd87828801614b51565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561500957615009614fdf565b5060010190565b60006020828403121561502257600080fd5b5051919050565b6000821982111561503c5761503c614fdf565b500190565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061507157615071615041565b92169190910492915050565b600181811c9082168061509157607f821691505b602082108114156150b257634e487b7160e01b600052602260045260246000fd5b50919050565b6000828210156150ca576150ca614fdf565b500390565b60006001600160801b038083168185168083038211156150f1576150f1614fdf565b01949350505050565b60006020828403121561510c57600080fd5b81356003811061453757600080fd5b60006001600160801b038381169083168181101561513b5761513b614fdf565b039392505050565b60006020828403121561515557600080fd5b8151614537816149c3565b60006020828403121561517257600080fd5b815161453781614c2d565b600081600019048311821515161561519757615197614fdf565b500290565b6000826151ab576151ab615041565b500490565b815160009082906020808601845b838110156151e35781516001600160801b0316855293820193908201906001016151be565b50929695505050505050565b6000826151fe576151fe615041565b500690565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220b2ce5513de2602398d21bd589c9f79d9374f8a4aebf27e3c9552b4ba5a11efae64736f6c634300080900330000000000000000000000008d6238920d9a54bf048436d4119475a002d51fd6000000000000000000000000f4908f72c83bfdc2e79a3d30e00aa7f128da39530000000000000000000000002cc3fad9f3dd1b5f3056455d3ce9004f69b7d40b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80639d54168611610104578063d1d58b25116100a2578063dc982be411610071578063dc982be4146104a9578063e2d6d08b146104c9578063e5962030146104dc578063f2fde38b146104ef57600080fd5b8063d1d58b251461045d578063d6d6b9ec14610470578063d821a12d14610483578063db0ec0391461049657600080fd5b8063c131ea16116100de578063c131ea16146103ef578063c6a14c8d14610410578063cadea27514610437578063d0c30af21461044a57600080fd5b80639d541686146103a9578063ba99aa1f146103bc578063bf2e1f8d146103dc57600080fd5b8063411a52101161017c578063659b07911161014b578063659b079114610349578063715018a61461036957806376446bce146103715780638da5cb5b1461038457600080fd5b8063411a5210146102dd5780634a994eef146103105780634c7be681146103235780634ef3ba841461033657600080fd5b806323c0f44a116101b857806323c0f44a14610282578063248c1f85146102a257806328c77820146102b75780632e745abd146102ca57600080fd5b806307779627146101df578063150b7a021461020757806315e8fcd014610257575b600080fd5b6101f26101ed3660046149d8565b610502565b60405190151581526020015b60405180910390f35b61023e610215366004614a0b565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b031990911681526020016101fe565b61026a610265366004614aeb565b610581565b6040516001600160801b0390911681526020016101fe565b610295610290366004614aeb565b6105be565b6040516101fe9190614b04565b6102b56102b0366004614b9d565b6106ba565b005b6102b56102c5366004614b9d565b610780565b6102b56102d8366004614bdf565b6107be565b6102f06102eb366004614c0b565b610d0d565b604080516001600160801b039384168152929091166020830152016101fe565b6102b561031e366004614c3b565b610d63565b6102b5610331366004614aeb565b610de8565b6102b5610344366004614c74565b6112df565b61035c6103573660046149d8565b6128ea565b6040516101fe9190614d0e565b6102b5612914565b6102b561037f366004614b9d565b61297a565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b6102b56103b7366004614d46565b612a3b565b6103cf6103ca366004614aeb565b612b62565b6040516101fe9190614de8565b6103916103ea366004614aeb565b612d71565b6104026103fd366004614aeb565b612e9a565b6040519081526020016101fe565b61026a7f000000000000000000000000000000000000000000000000000000000000005081565b61035c6104453660046149d8565b612ebb565b6102b5610458366004614d46565b612edf565b61040261046b366004614aeb565b6131c9565b61026a61047e366004614c0b565b61331f565b610391610491366004614aeb565b613377565b6102b56104a4366004614e97565b613454565b6104bc6104b7366004614aeb565b613706565b6040516101fe9190614f13565b6102b56104d7366004614f5d565b6137ba565b6102b56104ea366004614e97565b613efe565b6102b56104fd3660046149d8565b6141aa565b600080546001600160a01b031633146105625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b506001600160a01b031660009081526001602052604090205460ff1690565b6004818154811061059157600080fd5b9060005260206000209060029182820401919006601002915054906101000a90046001600160801b031681565b6000818152600960205260408120546060919067ffffffffffffffff8111156105e9576105e96149f5565b604051908082528060200260200182016040528015610612578160200160208202803683370190505b50905060005b6000848152600960205260409020548110156106b357600084815260096020526040902080548290811061064e5761064e614fc9565b90600052602060002090600291828204019190066010029054906101000a90046001600160801b031682828151811061068957610689614fc9565b6001600160801b0390921660209283029190910190910152806106ab81614ff5565b915050610618565b5092915050565b3360009081526001602052604090205460ff166107195760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610559565b60005b8181101561077b576000600c600085858581811061073c5761073c614fc9565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061077390614ff5565b91505061071c565b505050565b60005b8181101561077b576107ac8383838181106107a0576107a0614fc9565b90506020020135610de8565b806107b681614ff5565b915050610783565b33803b9032811480156107cf575081155b61081b5760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b600e60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561086b57600080fd5b505af115801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a39190615010565b84106108f15760405162461bcd60e51b815260206004820152601960248201527f5468652073616e6374756d206973206e6f742076616c696421000000000000006044820152606401610559565b600983106109675760405162461bcd60e51b815260206004820152602860248201527f54686520726f6f6d206973206e6f742077697468696e207468652073616e637460448201527f756d206c697374210000000000000000000000000000000000000000000000006064820152608401610559565b600084815260096020526040902054610981906001615029565b83106109cf5760405162461bcd60e51b815260206004820152601960248201527f43616e7420756e6c6f636b2074686174206f6e652079657421000000000000006044820152606401610559565b6000858152600760205260409020600301546109f690600a906001600160801b0316615057565b6000868152600760205260409020600301546001600160801b03918216600160801b90910490911610610a915760405162461bcd60e51b815260206004820152602260248201527f526972692773206c6576656c20697320746f6f206c6f7720746f207265726f6c60448201527f6c210000000000000000000000000000000000000000000000000000000000006064820152608401610559565b60068381548110610aa457610aa4614fc9565b600091825260209091200154600f54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e9060440160206040518083038186803b158015610af957600080fd5b505afa158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b319190615010565b1015610ba55760405162461bcd60e51b815260206004820152602560248201527f596f7520646f6e2774206861766520656e6f7567682041454f4e20746f20726560448201527f726f6c6c210000000000000000000000000000000000000000000000000000006064820152608401610559565b600f54600680546001600160a01b03909216916379cc679091339187908110610bd057610bd0614fc9565b6000918252602090912001546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610c2257600080fd5b505af1158015610c36573d6000803e3d6000fd5b5050506000858152600960205260409020548410159050610cb957610c5b8484614236565b6000858152600960205260409020805485908110610c7b57610c7b614fc9565b90600052602060002090600291828204019190066010026101000a8154816001600160801b0302191690836001600160801b03160217905550610cc2565b610cc2846143d6565b6040516bffffffffffffffffffffffff19606083811b8216602084015241901b16603482015260480160408051601f1981840301815291905280516020909101206010555050505050565b600082815260096020526040812080548392919083908110610d3157610d31614fc9565b90600052602060002090600291828204019190066010029054906101000a90046001600160801b031690509250929050565b6000546001600160a01b03163314610dbd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b33803b903281148015610df9575081155b610e455760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b600083815260076020908152604080832081516101008101835281546001600160a01b031681526001820154938101939093526002808201549284019290925260038101546001600160801b038082166060860152600160801b9091041660808401526004810154909160a084019160ff1690811115610ec757610ec7614d63565b6002811115610ed857610ed8614d63565b8152602001600582018054610eec9061507d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f189061507d565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b50505050508152602001600682018054610f7e9061507d565b80601f0160208091040260200160405190810160405280929190818152602001828054610faa9061507d565b8015610ff75780601f10610fcc57610100808354040283529160200191610ff7565b820191906000526020600020905b815481529060010190602001808311610fda57829003601f168201915b5050505050815250509050806040015142116110135750611295565b600081604001514261102591906150b8565b905060018260a00151600281111561103f5761103f614d63565b1415611102576000611062836020015184606001516001600160801b0316614433565b600f5484516000898152600c60205260409020549293506001600160a01b03909116916340c10f19919061109c908690869060ff166144ba565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156110e257600080fd5b505af11580156110f6573d6000803e3d6000fd5b50504260408601525050505b60028260a00151600281111561111a5761111a614d63565b141561129257600061112b8261451d565b90507f00000000000000000000000000000000000000000000000000000000000000506001600160801b031681846060015161116791906150cf565b6001600160801b03161161118a5780836060015161118591906150cf565b6111ac565b7f00000000000000000000000000000000000000000000000000000000000000505b6001600160801b039081166060850190815242604080870191825260008a815260076020908152919020875181546001600160a01b039091166001600160a01b0319909116178155908701516001808301919091559151600280830191909155925160808801518516600160801b02941693909317600384015560a08601516004840180548895949293919260ff199091169190849081111561125157611251614d63565b021790555060c082015180516112719160058401916020909101906148b6565b5060e0820151805161128d9160068401916020909101906148b6565b505050505b50505b6040516bffffffffffffffffffffffff19606083811b8216602084015241901b1660348201526048015b60408051601f198184030181529190528051602090910120601055505050565b33803b9032811480156112f0575081155b61133c5760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b868514801561134a57508483145b6113bc5760405162461bcd60e51b815260206004820152602760248201527f69647320616e6420616374696f6e73206d757374206265207468652073616d6560448201527f206c656e677468000000000000000000000000000000000000000000000000006064820152608401610559565b60005b8781101561289b576000600760008b8b858181106113df576113df614fc9565b6020908102929092013583525081810192909252604090810160002081516101008101835281546001600160a01b031681526001820154938101939093526002808201549284019290925260038101546001600160801b038082166060860152600160801b9091041660808401526004810154909160a084019160ff169081111561146c5761146c614d63565b600281111561147d5761147d614d63565b81526020016005820180546114919061507d565b80601f01602080910402602001604051908101604052809291908181526020018280546114bd9061507d565b801561150a5780601f106114df5761010080835404028352916020019161150a565b820191906000526020600020905b8154815290600101906020018083116114ed57829003601f168201915b505050505081526020016006820180546115239061507d565b80601f016020809104026020016040519081016040528092919081815260200182805461154f9061507d565b801561159c5780601f106115715761010080835404028352916020019161159c565b820191906000526020600020905b81548152906001019060200180831161157f57829003601f168201915b50505050508152505090506000600860008888868181106115bf576115bf614fc9565b60209081029290920135835250818101929092526040908101600020815160808101835281546001600160a01b0316815260018201546001600160801b0380821695830195909552600160801b900490931691830191909152600280820154606084019160ff9091169081111561163857611638614d63565b600281111561164957611649614d63565b9052509050336116708c8c8681811061166457611664614fc9565b90506020020135612d71565b6001600160a01b03161480156116ae5750336116a388888681811061169757611697614fc9565b90506020020135613377565b6001600160a01b0316145b6117205760405162461bcd60e51b815260206004820152602660248201527f796f7520646f206e6f74206f776e206f6e65206f6620746865736520746f6b6560448201527f6e732120717100000000000000000000000000000000000000000000000000006064820152608401610559565b600089898581811061173457611734614fc9565b905060200201602081019061174991906150fa565b600281111561175a5761175a614d63565b1415611b295760018260a00151600281111561177857611778614d63565b1480611799575060028260a00151600281111561179757611797614d63565b145b61180b5760405162461bcd60e51b815260206004820152602260248201527f52697269206d757374206265207374616b6564206f72206368616e6e656c6c6960448201527f6e670000000000000000000000000000000000000000000000000000000000006064820152608401610559565b86868481811061181d5761181d614fc9565b905060200201358260200151146118765760405162461bcd60e51b815260206004820152601c60248201527f52697269206d75737420626520696e20746869732073616e6374756d000000006044820152606401610559565b61188b8b8b858181106107a0576107a0614fc9565b600060a0830181905242604084015282526115b360208084019190915281018051600191906118bb90839061511b565b6001600160801b031690525080600860008989878181106118de576118de614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff191691849081111561196357611963614d63565b021790555090505081600760008d8d8781811061198257611982614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b03199091161781559183015160018084019190915590830151600280840191909155606084015160808501516001600160801b03908116600160801b02911617600384015560a08401516004840180549193909260ff19909216918490811115611a2057611a20614d63565b021790555060c08201518051611a409160058401916020909101906148b6565b5060e08201518051611a5c9160068401916020909101906148b6565b50905050611a938b8b85818110611a7557611a75614fc9565b336000908152600a602090815260409091209391020135905061452b565b50600d546001600160a01b03166342842e0e30338e8e88818110611ab957611ab9614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015611b1057600080fd5b505af1158015611b24573d6000803e3d6000fd5b505050505b6001898985818110611b3d57611b3d614fc9565b9050602002016020810190611b5291906150fa565b6002811115611b6357611b63614d63565b141561212a5760008260a001516002811115611b8157611b81614d63565b1480611ba2575060028260a001516002811115611ba057611ba0614d63565b145b611bee5760405162461bcd60e51b815260206004820152601560248201527f52697269206d75737420626520756e7374616b656400000000000000000000006044820152606401610559565b60008260a001516002811115611c0657611c06614d63565b1415611ef757600581602001516001600160801b031610611c8f5760405162461bcd60e51b815260206004820152602c60248201527f53616e6374756d20686173207265616368656420746865206d6178696d756d2060448201527f5269726973207374616b656400000000000000000000000000000000000000006064820152608401610559565b600d5430906001600160a01b031663081812fc8d8d87818110611cb457611cb4614fc9565b905060200201356040518263ffffffff1660e01b8152600401611cd991815260200190565b60206040518083038186803b158015611cf157600080fd5b505afa158015611d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d299190615143565b6001600160a01b03161480611dba5750600d5460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b158015611d8257600080fd5b505afa158015611d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dba9190615160565b611e065760405162461bcd60e51b815260206004820152601f60248201527f526972697375206d75737420626520617070726f766564207374616b696e67006044820152606401610559565b868684818110611e1857611e18614fc9565b602090810292909201359184019190915250600d546001600160a01b03166342842e0e33308e8e88818110611e4f57611e4f614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015611ea657600080fd5b505af1158015611eba573d6000803e3d6000fd5b50505050611ef18b8b85818110611ed357611ed3614fc9565b336000908152600a602090815260409091209391020135905061453e565b50611f62565b868684818110611f0957611f09614fc9565b90506020020135826020015114611f625760405162461bcd60e51b815260206004820152601c60248201527f52697269206d75737420626520696e20746869732073616e6374756d000000006044820152606401610559565b600160a08301819052426040840152338352602082018051611f859083906150cf565b6001600160801b03169052508060086000898987818110611fa857611fa8614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff191691849081111561202d5761202d614d63565b021790555090505081600760008d8d8781811061204c5761204c614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b03199091161781559183015160018084019190915590830151600280840191909155606084015160808501516001600160801b03908116600160801b02911617600384015560a08401516004840180549193909260ff199092169184908111156120ea576120ea614d63565b021790555060c0820151805161210a9160058401916020909101906148b6565b5060e082015180516121269160068401916020909101906148b6565b5050505b600289898581811061213e5761213e614fc9565b905060200201602081019061215391906150fa565b600281111561216457612164614d63565b141561288657600d5430906001600160a01b031663081812fc8d8d8781811061218f5761218f614fc9565b905060200201356040518263ffffffff1660e01b81526004016121b491815260200190565b60206040518083038186803b1580156121cc57600080fd5b505afa1580156121e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122049190615143565b6001600160a01b031614806122955750600d5460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b15801561225d57600080fd5b505afa158015612271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122959190615160565b6122e15760405162461bcd60e51b815260206004820152601f60248201527f526972697375206d75737420626520617070726f766564207374616b696e67006044820152606401610559565b60008260a0015160028111156122f9576122f9614d63565b148061231a575060018260a00151600281111561231857612318614d63565b145b6123665760405162461bcd60e51b815260206004820152601f60248201527f52697269206d75737420626520756e7374616b6564206f72207374616b6564006044820152606401610559565b60008260a00151600281111561237e5761237e614d63565b141561265157600581602001516001600160801b0316106124075760405162461bcd60e51b815260206004820152602560248201527f53616e6374756d20686173207265616368656420746865206d6178696d756d2060448201527f52697269730000000000000000000000000000000000000000000000000000006064820152608401610559565b600d5430906001600160a01b031663081812fc8d8d8781811061242c5761242c614fc9565b905060200201356040518263ffffffff1660e01b815260040161245191815260200190565b60206040518083038186803b15801561246957600080fd5b505afa15801561247d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a19190615143565b6001600160a01b031614806125325750600d5460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b1580156124fa57600080fd5b505afa15801561250e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125329190615160565b61257e5760405162461bcd60e51b815260206004820152601f60248201527f526972697375206d75737420626520617070726f766564207374616b696e67006044820152606401610559565b86868481811061259057612590614fc9565b602090810292909201359184019190915250600d546001600160a01b03166342842e0e33308e8e888181106125c7576125c7614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561261e57600080fd5b505af1158015612632573d6000803e3d6000fd5b5050505061264b8b8b85818110611ed357611ed3614fc9565b506126bc565b86868481811061266357612663614fc9565b905060200201358260200151146126bc5760405162461bcd60e51b815260206004820152601c60248201527f52697269206d75737420626520696e20746869732073616e6374756d000000006044820152606401610559565b600260a0830152426040830152338252602081018051600191906126e19083906150cf565b6001600160801b0316905250806008600089898781811061270457612704614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff191691849081111561278957612789614d63565b021790555090505081600760008d8d878181106127a8576127a8614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b03199091161781559183015160018084019190915590830151600280840191909155606084015160808501516001600160801b03908116600160801b02911617600384015560a08401516004840180549193909260ff1990921691849081111561284657612846614d63565b021790555060c082015180516128669160058401916020909101906148b6565b5060e082015180516128829160068401916020909101906148b6565b5050505b5050808061289390614ff5565b9150506113bf565b506040516bffffffffffffffffffffffff19606083811b8216602084015241901b16603482015260480160408051601f1981840301815291905280516020909101206010555050505050505050565b6001600160a01b0381166000908152600a6020526040902060609061290e9061454a565b92915050565b6000546001600160a01b0316331461296e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b6129786000614557565b565b3360009081526001602052604090205460ff166129d95760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610559565b60005b8181101561077b576001600c60008585858181106129fc576129fc614fc9565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612a3390614ff5565b9150506129dc565b33803b903281148015612a4c575081155b612a985760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b600e546040517fefa0f81a0000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b03169063efa0f81a9060240160206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190615010565b90506007811115612b3c575060075b60005b8181101561129257612b5085612edf565b80612b5a81614ff5565b915050612b3f565b612baa604080516101008101825260008082526020820181905291810182905260608101829052608081018290529060a0820190815260200160608152602001606081525090565b60008281526007602090815260409182902082516101008101845281546001600160a01b031681526001820154928101929092526002808201549383019390935260038101546001600160801b038082166060850152600160801b90910416608083015260048101549192909160a084019160ff90911690811115612c3157612c31614d63565b6002811115612c4257612c42614d63565b8152602001600582018054612c569061507d565b80601f0160208091040260200160405190810160405280929190818152602001828054612c829061507d565b8015612ccf5780601f10612ca457610100808354040283529160200191612ccf565b820191906000526020600020905b815481529060010190602001808311612cb257829003601f168201915b50505050508152602001600682018054612ce89061507d565b80601f0160208091040260200160405190810160405280929190818152602001828054612d149061507d565b8015612d615780601f10612d3657610100808354040283529160200191612d61565b820191906000526020600020905b815481529060010190602001808311612d4457829003601f168201915b5050505050815250509050919050565b600d546040516331a9108f60e11b81526004810183905260009130916001600160a01b0390911690636352211e9060240160206040518083038186803b158015612dba57600080fd5b505afa158015612dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df29190615143565b6001600160a01b03161415612e1d57506000908152600760205260409020546001600160a01b031690565b600d546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e906024015b60206040518083038186803b158015612e6257600080fd5b505afa158015612e76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290e9190615143565b60068181548110612eaa57600080fd5b600091825260209091200154905081565b6001600160a01b0381166000908152600b6020526040902060609061290e9061454a565b33803b903281148015612ef0575081155b612f3c5760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610559565b600e54604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916318160ddd91600480830192602092919082900301818787803b158015612f9b57600080fd5b505af1158015612faf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd39190615010565b9050831561311357600e546040517fee1fe2ad0000000000000000000000000000000000000000000000000000000081523060048201523360248201526001600160a01b039091169063ee1fe2ad90604401600060405180830381600087803b15801561303f57600080fd5b505af1158015613053573d6000803e3d6000fd5b505060408051608081018252338152600060208083018281528385018381526001606086018181528a8652600890945295909320845181546001600160a01b039091166001600160a01b0319909116178155905192516001600160801b03908116600160801b029316929092178285015551600280830180549497509295509093919260ff1916919084908111156130ed576130ed614d63565b021790555050336000908152600b6020526040902061310d91508261453e565b50613191565b600e546040517fee1fe2ad000000000000000000000000000000000000000000000000000000008152336004820181905260248201526001600160a01b039091169063ee1fe2ad90604401600060405180830381600087803b15801561317857600080fd5b505af115801561318c573d6000803e3d6000fd5b505050505b61319a816143d6565b506040516bffffffffffffffffffffffff19606083811b8216602084015241901b1660348201526048016112bf565b60008060008381526007602052604090206004015460ff1660028111156131f2576131f2614d63565b1161323f5760405162461bcd60e51b815260206004820152601c60248201527f52697269206d757374206265207374616b656420746f20636c61696d000000006044820152606401610559565b6000828152600760205260408120600181015460039091015461326b91906001600160801b0316614433565b60008481526007602052604081206002015491925090421161328e5760006132aa565b6000848152600760205260409020600201546132aa90426150b8565b9050600160008581526007602052604090206004015460ff1660028111156132d4576132d4614d63565b146132f857620151806132e982610bb861517d565b6132f3919061519c565b613317565b6000848152600c6020526040902054613317908290849060ff166144ba565b949350505050565b6005828154811061332f57600080fd5b90600052602060002001818154811061334757600080fd5b9060005260206000209060029182820401919006601002915091509054906101000a90046001600160801b031681565b600e546040516331a9108f60e11b81526004810183905260009130916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156133c057600080fd5b505afa1580156133d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f89190615143565b6001600160a01b0316141561342357506000908152600860205260409020546001600160a01b031690565b600e546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e90602401612e4a565b3361345e84612d71565b6001600160a01b0316146134da5760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320526960448201527f72692120757775000000000000000000000000000000000000000000000000006064820152608401610559565b600354600f54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e9060440160206040518083038186803b15801561352657600080fd5b505afa15801561353a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355e9190615010565b10156135d25760405162461bcd60e51b815260206004820152602960248201527f596f7520646f6e2774206861766520656e6f7567682041454f4e20746f20726560448201527f6e616d65212075777500000000000000000000000000000000000000000000006064820152608401610559565b600083815260076020526040902060050180546135ee9061507d565b1590506136635760405162461bcd60e51b815260206004820152603660248201527f596f75206861766520616c72656164792065646974656420746865206e616d6560448201527f206f6e636520696e2074686520706173742120712e71000000000000000000006064820152608401610559565b600f546003546040517f79cc679000000000000000000000000000000000000000000000000000000000815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156136cc57600080fd5b505af11580156136e0573d6000803e3d6000fd5b50505060008481526007602052604090206137009150600501838361493a565b50505050565b61372e6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260086020908152604091829020825160808101845281546001600160a01b0316815260018201546001600160801b0380821694830194909452600160801b900490921692820192909252600280830154919291606084019160ff909116908111156137a0576137a0614d63565b60028111156137b1576137b1614d63565b90525092915050565b82811461382f5760405162461bcd60e51b815260206004820152602760248201527f69647320616e6420616374696f6e73206d757374206265207468652073616d6560448201527f206c656e677468000000000000000000000000000000000000000000000000006064820152608401610559565b60005b83811015613ef75760006008600087878581811061385257613852614fc9565b60209081029290920135835250818101929092526040908101600020815160808101835281546001600160a01b0316815260018201546001600160801b0380821695830195909552600160801b900490931691830191909152600280820154606084019160ff909116908111156138cb576138cb614d63565b60028111156138dc576138dc614d63565b9052509050336138f787878581811061169757611697614fc9565b6001600160a01b0316146139735760405162461bcd60e51b815260206004820152602a60248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320536160448201527f6e6374756d2120757775000000000000000000000000000000000000000000006064820152608401610559565b600284848481811061398757613987614fc9565b905060200201602081019061399c91906150fa565b60028111156139ad576139ad614d63565b106139fa5760405162461bcd60e51b815260206004820152601760248201527f73616e6374756d3a20696e76616c696420616374696f6e0000000000000000006044820152606401610559565b6000848484818110613a0e57613a0e614fc9565b9050602002016020810190613a2391906150fa565b6002811115613a3457613a34614d63565b1415613c345760208101516001600160801b031615613abb5760405162461bcd60e51b815260206004820152602e60248201527f53616e6374756d206d757374206e6f742068617665207374616b656420746f6b60448201527f656e7320746f20756e7374616b650000000000000000000000000000000000006064820152608401610559565b6000606082018190528082528190600890888886818110613ade57613ade614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff1916918490811115613b6357613b63614d63565b0217905550905050613b9e868684818110613b8057613b80614fc9565b336000908152600b602090815260409091209391020135905061452b565b50600e546001600160a01b03166342842e0e3033898987818110613bc457613bc4614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015613c1b57600080fd5b505af1158015613c2f573d6000803e3d6000fd5b505050505b6001848484818110613c4857613c48614fc9565b9050602002016020810190613c5d91906150fa565b6002811115613c6e57613c6e614d63565b1415613ee457600e5430906001600160a01b031663081812fc888886818110613c9957613c99614fc9565b905060200201356040518263ffffffff1660e01b8152600401613cbe91815260200190565b60206040518083038186803b158015613cd657600080fd5b505afa158015613cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0e9190615143565b6001600160a01b031614613d645760405162461bcd60e51b815260206004820181905260248201527f53616e6374756d206d75737420626520617070726f766564207374616b696e676044820152606401610559565b600160608201523381526000602082018190528190600890888886818110613d8e57613d8e614fc9565b60209081029290920135835250818101929092526040908101600020835181546001600160a01b039091166001600160a01b031990911617815591830151908301516001600160801b03908116600160801b029116176001808301919091556060830151600280840180549293909260ff1916918490811115613e1357613e13614d63565b0217905550905050613e4e868684818110613e3057613e30614fc9565b336000908152600b602090815260409091209391020135905061453e565b50600e546001600160a01b03166342842e0e3330898987818110613e7457613e74614fc9565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015613ecb57600080fd5b505af1158015613edf573d6000803e3d6000fd5b505050505b5080613eef81614ff5565b915050613832565b5050505050565b33613f0884612d71565b6001600160a01b031614613f845760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320526960448201527f72692120757775000000000000000000000000000000000000000000000000006064820152608401610559565b600254600f54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e9060440160206040518083038186803b158015613fd057600080fd5b505afa158015613fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140089190615010565b101561407c5760405162461bcd60e51b815260206004820152602d60248201527f596f7520646f6e2774206861766520656e6f7567682041454f4e20746f20777260448201527f697465206c6f72652120757775000000000000000000000000000000000000006064820152608401610559565b600083815260076020526040902060060180546140989061507d565b15905061410d5760405162461bcd60e51b815260206004820152603660248201527f596f75206861766520616c72656164792065646974656420746865206c6f726560448201527f206f6e636520696e2074686520706173742120712e71000000000000000000006064820152608401610559565b600f546002546040517f79cc679000000000000000000000000000000000000000000000000000000000815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b15801561417657600080fd5b505af115801561418a573d6000803e3d6000fd5b50505060008481526007602052604090206137009150600601838361493a565b6000546001600160a01b031633146142045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b6001600160a01b0381166000908152600160208190526040909120805460ff19169091179055614233816145a7565b50565b60008061424a614245856105be565b614686565b905060006002841061425d57600161425f565b835b905060006005828154811061427657614276614fc9565b906000526020600020018054806020026020016040519081016040528092919081815260200182805480156142fc57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116142b95790505b50505050509050600460008154811061431757614317614fc9565b60009182526020822060028204015460019091166010026101000a90046001600160801b031694505b81518110156143cc5781818151811061435b5761435b614fc9565b60200260200101516001600160801b03168410156143ba576004818154811061438657614386614fc9565b90600052602060002090600291828204019190066010029054906101000a90046001600160801b031694505050505061290e565b806143c481614ff5565b915050614340565b5050505092915050565b600081815260096020526040902080546143f1908390614236565b81546001818101845560009384526020909320600282040180546001600160801b03938416601093909516929092026101000a93840292909302191617905550565b60008080614440856105be565b905060005b815181108015614469575061445b600a8661519c565b614466906001615029565b81105b156144b05781818151811061448057614480614fc9565b60200260200101516001600160801b03168361449c9190615029565b9250806144a881614ff5565b915050614445565b5090949350505050565b600080826144ca5761012c6144ce565b61020d5b61ffff1690506201518060646144e48684615029565b6144ee908861517d565b61450090670de0b6b3a764000061517d565b61450a919061519c565b614514919061519c565b95945050505050565b600061290e61a8c08361519c565b60006145378383614718565b9392505050565b6000614537838361480b565b606060006145378361485a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146146015760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b6001600160a01b03811661467d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610559565b61423381614557565b6000808260405160200161469a91906151b0565b60408051808303601f190181528282528051602091820120601054438386015242858501524460608087019190915241901b6bffffffffffffffffffffffff191660808601526094808601919091528351808603909101815260b49094019092528251920191909120909150613317612710828416838518176151ef565b6000818152600183016020526040812054801561480157600061473c6001836150b8565b8554909150600090614750906001906150b8565b90508181146147b557600086600001828154811061477057614770614fc9565b906000526020600020015490508087600001848154811061479357614793614fc9565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806147c6576147c6615203565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061290e565b600091505061290e565b60008181526001830160205260408120546148525750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561290e565b50600061290e565b6060816000018054806020026020016040519081016040528092919081815260200182805480156148aa57602002820191906000526020600020905b815481526020019060010190808311614896575b50505050509050919050565b8280546148c29061507d565b90600052602060002090601f0160209004810192826148e4576000855561492a565b82601f106148fd57805160ff191683800117855561492a565b8280016001018555821561492a579182015b8281111561492a57825182559160200191906001019061490f565b506149369291506149ae565b5090565b8280546149469061507d565b90600052602060002090601f016020900481019282614968576000855561492a565b82601f106149815782800160ff1982351617855561492a565b8280016001018555821561492a579182015b8281111561492a578235825591602001919060010190614993565b5b8082111561493657600081556001016149af565b6001600160a01b038116811461423357600080fd5b6000602082840312156149ea57600080fd5b8135614537816149c3565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215614a2157600080fd5b8435614a2c816149c3565b93506020850135614a3c816149c3565b925060408501359150606085013567ffffffffffffffff80821115614a6057600080fd5b818701915087601f830112614a7457600080fd5b813581811115614a8657614a866149f5565b604051601f8201601f19908116603f01168101908382118183101715614aae57614aae6149f5565b816040528281528a6020848701011115614ac757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600060208284031215614afd57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015614b455783516001600160801b031683529284019291840191600101614b20565b50909695505050505050565b60008083601f840112614b6357600080fd5b50813567ffffffffffffffff811115614b7b57600080fd5b6020830191508360208260051b8501011115614b9657600080fd5b9250929050565b60008060208385031215614bb057600080fd5b823567ffffffffffffffff811115614bc757600080fd5b614bd385828601614b51565b90969095509350505050565b600080600060608486031215614bf457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215614c1e57600080fd5b50508035926020909101359150565b801515811461423357600080fd5b60008060408385031215614c4e57600080fd5b8235614c59816149c3565b91506020830135614c6981614c2d565b809150509250929050565b60008060008060008060608789031215614c8d57600080fd5b863567ffffffffffffffff80821115614ca557600080fd5b614cb18a838b01614b51565b90985096506020890135915080821115614cca57600080fd5b614cd68a838b01614b51565b90965094506040890135915080821115614cef57600080fd5b50614cfc89828a01614b51565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b81811015614b4557835183529284019291840191600101614d2a565b600060208284031215614d5857600080fd5b813561453781614c2d565b634e487b7160e01b600052602160045260246000fd5b60038110614d9757634e487b7160e01b600052602160045260246000fd5b9052565b6000815180845260005b81811015614dc157602081850181015186830182015201614da5565b81811115614dd3576000602083870101525b50601f01601f19169290920160200192915050565b602081526001600160a01b038251166020820152602082015160408201526040820151606082015260006060830151614e2c60808401826001600160801b03169052565b5060808301516001600160801b03811660a08401525060a0830151614e5460c0840182614d79565b5060c08301516101008060e0850152614e71610120850183614d9b565b915060e0850151601f198584030182860152614e8d8382614d9b565b9695505050505050565b600080600060408486031215614eac57600080fd5b83359250602084013567ffffffffffffffff80821115614ecb57600080fd5b818601915086601f830112614edf57600080fd5b813581811115614eee57600080fd5b876020828501011115614f0057600080fd5b6020830194508093505050509250925092565b60006080820190506001600160a01b03835116825260208301516001600160801b038082166020850152806040860151166040850152505060608301516106b36060840182614d79565b60008060008060408587031215614f7357600080fd5b843567ffffffffffffffff80821115614f8b57600080fd5b614f9788838901614b51565b90965094506020870135915080821115614fb057600080fd5b50614fbd87828801614b51565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561500957615009614fdf565b5060010190565b60006020828403121561502257600080fd5b5051919050565b6000821982111561503c5761503c614fdf565b500190565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061507157615071615041565b92169190910492915050565b600181811c9082168061509157607f821691505b602082108114156150b257634e487b7160e01b600052602260045260246000fd5b50919050565b6000828210156150ca576150ca614fdf565b500390565b60006001600160801b038083168185168083038211156150f1576150f1614fdf565b01949350505050565b60006020828403121561510c57600080fd5b81356003811061453757600080fd5b60006001600160801b038381169083168181101561513b5761513b614fdf565b039392505050565b60006020828403121561515557600080fd5b8151614537816149c3565b60006020828403121561517257600080fd5b815161453781614c2d565b600081600019048311821515161561519757615197614fdf565b500290565b6000826151ab576151ab615041565b500490565b815160009082906020808601845b838110156151e35781516001600160801b0316855293820193908201906001016151be565b50929695505050505050565b6000826151fe576151fe615041565b500690565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220b2ce5513de2602398d21bd589c9f79d9374f8a4aebf27e3c9552b4ba5a11efae64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008d6238920d9a54bf048436d4119475a002d51fd6000000000000000000000000f4908f72c83bfdc2e79a3d30e00aa7f128da39530000000000000000000000002cc3fad9f3dd1b5f3056455d3ce9004f69b7d40b
-----Decoded View---------------
Arg [0] : ririAddress (address): 0x8d6238920D9A54Bf048436d4119475A002D51FD6
Arg [1] : sanctumAddress (address): 0xF4908f72c83bfdC2E79a3D30e00aA7f128Da3953
Arg [2] : aeonAddress (address): 0x2Cc3faD9f3DD1B5f3056455D3CE9004F69B7d40b
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008d6238920d9a54bf048436d4119475a002d51fd6
Arg [1] : 000000000000000000000000f4908f72c83bfdc2e79a3d30e00aa7f128da3953
Arg [2] : 0000000000000000000000002cc3fad9f3dd1b5f3056455d3ce9004f69b7d40b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.