Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Stays
- Optimization enabled
- true
- Compiler version
- v0.8.7+commit.e28d00a7
- Optimization runs
- 200
- Verified at
- 2022-03-23T21:28:26.161300Z
contracts/Stays.sol
// SPDX-License-Identifier: GPL
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "./IStays.sol";
import "./StayEscrow.sol";
import "./libraries/StayTokenMeta.sol";
// import "hardhat/console.sol";
contract Stays is IStays, StayEscrow, ERC721URIStorage, ERC721Enumerable {
using Counters for Counters.Counter;
Counters.Counter private _stayTokenIds;
uint32 public constant dayZero = 1645567342; // 22 Feb 2022
address private constant _ukraineDAO = 0x633b7218644b83D57d90e7299039ebAb19698e9C; // ukrainedao.eth https://twitter.com/Ukraine_DAO/status/1497274679823941632
uint8 private constant _ukraineDAOfee = 2; // percents
string public constant serviceURI = "https://localhost:3000/";
string private constant tokenImageURI = 'https://bafybeigg7mwwpnnm6mmk3twxc4arizoyc6ijnaye3pdciwcohheo7xi7hm.ipfs.dweb.link/token-image.png';
// Schema conformance URLs for reference
string public constant lodgingFacilitySchemaURI = "";
string public constant spaceSchemaURI = "";
string public constant staySchemaURI = "";
// Lodging Facility is any type of accommodation: hotel, hostel, apartment, etc.
struct LodgingFacility {
address owner;
bool active;
bool exists;
string dataURI; // must be conformant with "lodgingFacilitySchemaURI"
address fren;
}
// Space = Room Type
struct Space {
bytes32 lodgingFacilityId;
uint256 capacity; // number of rooms of this type
uint256 pricePerNightWei;
bool active;
bool exists;
string dataURI; // must be conformant with "spaceSchemaURI"
}
// Stay
struct Stay {
bytes32 spaceId;
uint256 startDay;
uint256 numberOfDays;
uint256 quantity;
bool checkIn;
bool checkOut;
}
bytes32[] private _lodgingFacilityIds;
// Facility owner => LodgingFacility[]
mapping (address => bytes32[]) private _facilityIdsByOwner;
// facilityId => LodgingFacility
mapping (bytes32 => LodgingFacility) public lodgingFacilities;
// facilityId => spaceId[]
mapping (bytes32 => bytes32[]) private _spaceIdsByFacilityId;
// spaceId => Space
mapping (bytes32 => Space) public spaces;
// spaceId => daysFromDayZero => numberOfBookings
mapping(bytes32 => mapping(uint256 => uint256)) private _booked;
// Stay token => Stay
mapping(uint256 => Stay) private _stays;
// spaceId => tokenId[]
mapping(bytes32 => uint256[]) private _stayTokens;
constructor() ERC721("StayToken", "ST22") {}
/**
* Modifiers
*/
modifier onlyLodgingFacilityOwner(bytes32 _lodgingFacilityId) {
require(
_msgSender() == lodgingFacilities[_lodgingFacilityId].owner,
"Only lodging facility owner is allowed"
);
_;
}
modifier onlySpaceOwner(bytes32 _spaceId) {
require(
_msgSender() == lodgingFacilities[spaces[_spaceId].lodgingFacilityId].owner,
"Only space owner is allowed"
);
_;
}
modifier onlyTokenOwner(uint256 _tokenId) {
require(
_msgSender() == ownerOf(_tokenId),
"Only stay token owner is allowed"
);
_;
}
/**
* Lodging Facilities Getters
*/
// All registered Ids
function getAllLodgingFacilityIds() public view override returns (bytes32[] memory) {
return _lodgingFacilityIds;
}
// All ACTIVE facilities Ids
function getActiveLodgingFacilityIds() public view override returns (bytes32[] memory activeLodgingFacilityIds) {
activeLodgingFacilityIds = new bytes32[](_getActiveLodgingFacilitiesCount());
uint256 index;
for (uint256 i = 0; i < _lodgingFacilityIds.length; i++) {
if (lodgingFacilities[_lodgingFacilityIds[i]].active) {
activeLodgingFacilityIds[index] = _lodgingFacilityIds[i];
index++;
}
}
}
// All spaces Ids from facility by Id
function getSpaceIdsByFacilityId(bytes32 _lodgingFacilityId) public view override returns (bytes32[] memory) {
return _spaceIdsByFacilityId[_lodgingFacilityId];
}
// All ACTIVE spaces Ids from facility by Id
function getActiveSpaceIdsByFacilityId(bytes32 _lodgingFacilityId) public view override returns (bytes32[] memory activeSpacesIds) {
activeSpacesIds = new bytes32[](_getActiveSpacesCount(_lodgingFacilityId));
bytes32[] memory facilitiesSpaces = _spaceIdsByFacilityId[_lodgingFacilityId];
uint256 index;
for (uint256 i = 0; i < facilitiesSpaces.length; i++) {
if (spaces[facilitiesSpaces[i]].active) {
activeSpacesIds[index] = facilitiesSpaces[i];
index++;
}
}
}
// Availability of the space
function getAvailability(
bytes32 _spaceId,
uint256 _startDay,
uint256 _numberOfDays
) public view override returns (uint256[] memory) {
_checkBookingParams(_spaceId, _startDay, _numberOfDays);
Space memory _s = spaces[_spaceId];
uint256[] memory _availability = new uint256[](_numberOfDays);
for (uint256 _x = 0; _x < _numberOfDays; _x++) {
_availability[_x] = _s.capacity - _booked[_spaceId][_startDay + _x];
}
return _availability;
}
// Facilities by owner
function getLodgingFacilityIdsByOwner(address _owner) public view override returns (bytes32[] memory) {
return _facilityIdsByOwner[_owner];
}
// Facility details
function getLodgingFacilityById(bytes32 _lodgingFacilityId) public view override returns(
bool exists,
address owner,
bool active,
string memory dataURI
) {
LodgingFacility storage facility = lodgingFacilities[_lodgingFacilityId];
exists = facility.exists;
owner = facility.owner;
active = facility.active;
dataURI = facility.dataURI;
}
// Space details
function getSpaceById(bytes32 _spaceId) public view override returns (
bool exists,
bytes32 lodgingFacilityId,
uint256 capacity,
uint256 pricePerNightWei,
bool active,
string memory dataURI
) {
Space storage space = spaces[_spaceId];
exists = space.exists;
lodgingFacilityId = space.lodgingFacilityId;
capacity = space.capacity;
pricePerNightWei = space.pricePerNightWei;
active = space.active;
dataURI = space.dataURI;
}
/*
* Lodging Facilities Management
*/
// Lodging Facility registration (with fren option)
function registerLodgingFacility(string calldata _dataURI, bool _active, address _fren) public override {
_dataUriMustBeProvided(_dataURI);
bytes32 _id = keccak256(
abi.encodePacked(
_msgSender(),
_dataURI
)
);
require(!lodgingFacilities[_id].exists, "Facility already exists");
lodgingFacilities[_id] = LodgingFacility(
_msgSender(),
_active,
true,
_dataURI,
_fren
);
_lodgingFacilityIds.push(_id);
_facilityIdsByOwner[_msgSender()].push(_id);
emit LodgingFacilityCreated(_id, _msgSender(), _dataURI);
}
// Lodging Facility registration (WITHOUT fren option)
function registerLodgingFacility(string calldata _dataURI, bool _active) public override {
return registerLodgingFacility(_dataURI, _active, address(0));
}
function updateLodgingFacility(bytes32 _lodgingFacilityId, string calldata _newDataURI) public override onlyLodgingFacilityOwner(_lodgingFacilityId) {
lodgingFacilities[_lodgingFacilityId].dataURI = _newDataURI;
emit LodgingFacilityUpdated(_lodgingFacilityId, _newDataURI);
}
function activateLodgingFacility(bytes32 _lodgingFacilityId) public override onlyLodgingFacilityOwner(_lodgingFacilityId) {
lodgingFacilities[_lodgingFacilityId].active = true;
emit LodgingFacilityActiveState(_lodgingFacilityId, true);
}
function deactivateLodgingFacility(bytes32 _lodgingFacilityId) public override onlyLodgingFacilityOwner(_lodgingFacilityId) {
lodgingFacilities[_lodgingFacilityId].active = false;
emit LodgingFacilityActiveState(_lodgingFacilityId, false);
}
function yieldLodgingFacility(bytes32 _lodgingFacilityId, address _newOwner) public override onlyLodgingFacilityOwner(_lodgingFacilityId) {
emit LodgingFacilityOwnershipTransfer(_lodgingFacilityId, lodgingFacilities[_lodgingFacilityId].owner, _newOwner);
lodgingFacilities[_lodgingFacilityId].owner = _newOwner;
}
function deleteLodgingFacility(bytes32 _lodgingFacilityId) public override onlyLodgingFacilityOwner(_lodgingFacilityId) {
lodgingFacilities[_lodgingFacilityId].exists = false;
emit LodgingFacilityRemoved(_lodgingFacilityId);
}
/*
* Spaces
*/
function addSpace(
bytes32 _lodgingFacilityId,
uint256 _capacity,
uint256 _pricePerNightWei,
bool _active,
string calldata _dataURI
) public override {
bytes32 _i = _lodgingFacilityId;
_facilityShouldExist(_i);
_shouldOnlyBeCalledByOwner(_i, "Only facility owner may add Spaces");
_dataUriMustBeProvided(_dataURI);
bytes32 _id = keccak256(abi.encodePacked(
_i,
_dataURI
));
require(!spaces[_id].exists, "Space already exists");
spaces[_id] = Space(
_i,
_capacity,
_pricePerNightWei,
_active,
true,
_dataURI
);
_spaceIdsByFacilityId[_i].push(_id);
emit SpaceAdded(_id, _i, _capacity, _pricePerNightWei, _active, _dataURI);
}
function updateSpace(
bytes32 _spaceId,
uint256 _capacity,
uint256 _pricePerNightWei,
bool _active,
string calldata _dataURI
) public override onlySpaceOwner(_spaceId) {
Space storage space = spaces[_spaceId];
emit SpaceAdded(
_spaceId,
space.lodgingFacilityId,
_capacity,
_pricePerNightWei,
_active,
_dataURI
);
}
function deleteSpace(bytes32 _spaceId) public override onlySpaceOwner(_spaceId) {
spaces[_spaceId].exists = false;
emit SpaceRemoved(_spaceId);
}
/**
* Stay escrow
*/
function deposit(
address payee,
bytes32 spaceId
) public payable override(StayEscrow) {
super.deposit(payee, spaceId);
}
// Complete withdraw. Allowed in Checkout deposit state only
function withdraw(
address payer,
address payable payee,
bytes32 _spaceId
)
internal override(StayEscrow)
{
super.withdraw(payer, payee, _spaceId);
}
// Partial withdraw
function withdraw(
address payer,
address payable payee,
uint256 payment,
bytes32 _spaceId
) internal override(StayEscrow) {
// partial withdraw condition
require(
payment <= spaces[_spaceId].pricePerNightWei,
"Withdraw amount not allows in this state"
);
super.withdraw(payer, payee, payment, _spaceId);
}
/**
* Stays
*/
// Returns a list of currently occupied spaces
function getCurrentStayIdsByFacilityId(bytes32 _lodgingFacilityId)
public view override returns (bytes32[] memory)
{
if (block.timestamp < dayZero) {
return new bytes32[](0);
}
bytes32[] memory _activeSpacesIds =
getActiveSpaceIdsByFacilityId(_lodgingFacilityId);
uint256 currentDay = (block.timestamp - dayZero) / 86400;
uint256 currentCount;
Stay memory stay;
for (uint256 i = 0; i < _activeSpacesIds.length; i++) {
for (uint256 t=0; t < _stayTokens[_activeSpacesIds[i]].length; t++) {
stay = _stays[_stayTokens[_activeSpacesIds[i]][t]];
if (
currentDay >= stay.startDay &&
currentDay <= (stay.startDay + stay.numberOfDays)
) {
currentCount++;
}
}
}
bytes32[] memory stayIds = new bytes32[](currentCount);
uint256 index;
for (uint256 i = 0; i < currentCount; i++) {
for (uint256 t=0; t < _stayTokens[_activeSpacesIds[i]].length; t++) {
stay = _stays[_stayTokens[_activeSpacesIds[i]][t]];
if (
currentDay >= stay.startDay &&
currentDay <= (stay.startDay + stay.numberOfDays)
) {
stayIds[index] = _activeSpacesIds[i];
}
}
}
return stayIds;
}
// Returns a list of booked spaces (except for checked in spaces)
function getFutureStayIdsByFacilityId(bytes32 _lodgingFacilityId)
public view override returns (bytes32[] memory)
{
if (block.timestamp < dayZero) {
return new bytes32[](0);
}
bytes32[] memory _activeSpacesIds =
getActiveSpaceIdsByFacilityId(_lodgingFacilityId);
uint256 currentDay = (block.timestamp - dayZero) / 86400;
uint256 futureCount;
Stay memory stay;
for (uint256 i = 0; i < _activeSpacesIds.length; i++) {
for (uint256 t=0; t < _stayTokens[_activeSpacesIds[i]].length; t++) {
stay = _stays[_stayTokens[_activeSpacesIds[i]][t]];
if ((stay.startDay + stay.numberOfDays) > currentDay) {
futureCount++;
}
}
}
bytes32[] memory stayIds = new bytes32[](futureCount);
uint256 index;
for (uint256 i = 0; i < futureCount; i++) {
for (uint256 t=0; t < _stayTokens[_activeSpacesIds[i]].length; t++) {
stay = _stays[_stayTokens[_activeSpacesIds[i]][t]];
if ((stay.startDay + stay.numberOfDays) > currentDay) {
stayIds[index] = _activeSpacesIds[i];
}
}
}
return stayIds;
}
// Book a new stay in a space
function newStay(
bytes32 _spaceId,
uint256 _startDay,
uint256 _numberOfDays,
uint256 _quantity
) public payable override returns (uint256) {
_checkBookingParams(_spaceId, _startDay, _numberOfDays);
Space storage _s = spaces[_spaceId];
uint256 _stayPrice = _numberOfDays * _quantity * _s.pricePerNightWei;
require(msg.value >= _stayPrice, "Need. More. Money!");
for (uint256 _x = 0; _x < _numberOfDays; _x++) {
require(
_s.capacity - _booked[_spaceId][_startDay+_x] >= _quantity,
"Insufficient inventory"
);
_booked[_spaceId][_startDay+_x] += _quantity;
}
deposit(_msgSender(), _spaceId);
_stayTokenIds.increment();
uint256 _newStayTokenId = _stayTokenIds.current();
_safeMint(_msgSender(), _newStayTokenId);
// Inline tokenURI (data:application/json;base64)
string memory _tokenURI = StayTokenMeta.createTokenUri(
_newStayTokenId,
_s.lodgingFacilityId,
_spaceId,
_startDay,
_numberOfDays,
_quantity,
tokenImageURI,
serviceURI
);
_setTokenURI(_newStayTokenId, _tokenURI);
_stays[_newStayTokenId] = Stay(
_spaceId,
_startDay,
_numberOfDays,
_quantity,
false,
false
);
_stayTokens[_spaceId].push(_newStayTokenId);
// @todo LIF/WIN
// @todo LodgingFacility loyalty token
// @todo divert all the excess WEI to Ukraine DAO
// @todo Receive Ukraine Supporter NFT
emit NewStay(_spaceId, _newStayTokenId);
return _newStayTokenId;
}
/**
* CheckIn
*/
// Stay checkIn; can be called by a stay token owner
function checkIn(uint256 _tokenId) public override onlyTokenOwner(_tokenId) {
Stay storage _stay = _stays[_tokenId];
require(!_stay.checkIn, "Already checked in");
bytes32 _spaceId = _stay.spaceId;
uint256 firstNight = spaces[_spaceId].pricePerNightWei;
// Partial withdraw, just for a first night
_stay.checkIn = true;
withdraw(
ownerOf(_tokenId),
payable(lodgingFacilities[spaces[_spaceId].lodgingFacilityId].owner),
firstNight,
_spaceId
);
emit CheckIn(_tokenId);
}
/**
* CheckOut
*/
function checkOut(uint256 _tokenId) public virtual override {
Stay storage _stay = _stays[_tokenId];
require(!_stay.checkOut, "Already checked out");
bytes32 _spaceId = _stay.spaceId;
address spaceOwner = lodgingFacilities[spaces[_spaceId].lodgingFacilityId].owner;
require(
_msgSender() == spaceOwner,
"Only space owner is allowed"
);
// CheckOut condition by time
require(
dayZero + (_stay.startDay + _stay.numberOfDays) * 86400 >= block.timestamp,
"Forbidden unless checkout date"
);
// Complete withdraw (rest of deposit)
_stay.checkOut = true;
withdraw(
ownerOf(_tokenId),
payable(spaceOwner),
_spaceId
);
emit CheckOut(_tokenId);
}
/*
* Helpers
*/
function _facilityShouldExist(bytes32 _i) internal view {
require(lodgingFacilities[_i].exists, "Facility does not exist");
}
function _spaceShouldExist(bytes32 _i) internal view {
require(spaces[_i].exists, "Space does not exist");
}
function _shouldOnlyBeCalledByOwner(bytes32 _i, string memory _message) internal view {
require(lodgingFacilities[_i].owner == _msgSender(), _message);
}
function _dataUriMustBeProvided(string memory _uri) internal pure {
require(bytes(_uri).length > 0, "Data URI must be provided");
}
function _checkBookingParams(bytes32 _spaceId, uint256 _startDay, uint256 _numberOfDays) internal view {
require(dayZero + _startDay * 86400 > block.timestamp - 86400 * 2, "Don't stay in the past");
require(lodgingFacilities[spaces[_spaceId].lodgingFacilityId].active, "Lodging Facility is inactive");
require(spaces[_spaceId].active, "Space is inactive");
require(_numberOfDays > 0, "Number of days should be 1 or more");
}
function _getActiveLodgingFacilitiesCount() internal view returns (uint256 count) {
for (uint256 i = 0; i < _lodgingFacilityIds.length; i++) {
if (lodgingFacilities[_lodgingFacilityIds[i]].active) {
count++;
}
}
}
function _getActiveSpacesCount(bytes32 _lodgingFacilityId) internal view returns (uint256 count) {
bytes32[] storage facilitiesSpaces = _spaceIdsByFacilityId[_lodgingFacilityId];
for (uint256 i = 0; i < facilitiesSpaces.length; i++) {
if (spaces[facilitiesSpaces[i]].active) {
count++;
}
}
}
/** Overrides */
function _beforeTokenTransfer(address from, address to, uint256 tokenId)
internal
override(ERC721, ERC721Enumerable)
{
super._beforeTokenTransfer(from, to, tokenId);
}
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721Enumerable)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}
@openzeppelin/contracts/token/ERC721/ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @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.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
@openzeppelin/contracts/token/ERC721/IERC721.sol
// 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;
}
@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// 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);
}
@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../ERC721.sol";
import "./IERC721Enumerable.sol";
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)
pragma solidity ^0.8.0;
import "../ERC721.sol";
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is ERC721 {
using Strings for uint256;
// Optional mapping for token URIs
mapping(uint256 => string) private _tokenURIs;
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual override {
super._burn(tokenId);
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
}
}
@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
@openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
@openzeppelin/contracts/utils/Base64.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Base64.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides a set of functions to operate with Base64 strings.
*
* _Available since v4.5._
*/
library Base64 {
/**
* @dev Base64 Encoding/Decoding Table
*/
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* @dev Converts a `bytes` to its Bytes64 `string` representation.
*/
function encode(bytes memory data) internal pure returns (string memory) {
/**
* Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
* https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
*/
if (data.length == 0) return "";
// Loads the table into memory
string memory table = _TABLE;
// Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
// and split into 4 numbers of 6 bits.
// The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
// - `data.length + 2` -> Round up
// - `/ 3` -> Number of 3-bytes chunks
// - `4 *` -> 4 characters for each chunk
string memory result = new string(4 * ((data.length + 2) / 3));
assembly {
// Prepare the lookup table (skip the first "length" byte)
let tablePtr := add(table, 1)
// Prepare result pointer, jump over length
let resultPtr := add(result, 32)
// Run over the input, 3 bytes at a time
for {
let dataPtr := data
let endPtr := add(data, mload(data))
} lt(dataPtr, endPtr) {
} {
// Advance 3 bytes
dataPtr := add(dataPtr, 3)
let input := mload(dataPtr)
// To write each character, shift the 3 bytes (18 bits) chunk
// 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
// and apply logical AND with 0x3F which is the number of
// the previous character in the ASCII table prior to the Base64 Table
// The result is then added to the table to get the character to write,
// and finally write it in the result pointer but with a left shift
// of 256 (1 byte) - 8 (1 ASCII char) = 248 bits
mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
}
// When data `bytes` is not exactly 3 bytes long
// it is padded with `=` characters at the end
switch mod(mload(data), 3)
case 1 {
mstore8(sub(resultPtr, 1), 0x3d)
mstore8(sub(resultPtr, 2), 0x3d)
}
case 2 {
mstore8(sub(resultPtr, 1), 0x3d)
}
}
return result;
}
}
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
@openzeppelin/contracts/utils/Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
@openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
@openzeppelin/contracts/utils/introspection/ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
@openzeppelin/contracts/utils/introspection/IERC165.sol
// 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);
}
contracts/IStays.sol
// SPDX-License-Identifier: GPL
pragma solidity ^0.8.0;
abstract contract IStays {
// Events
event LodgingFacilityCreated(bytes32 facilityId, address indexed owner, string dataURI);
event LodgingFacilityUpdated(bytes32 facilityId, string dataURI);
event LodgingFacilityActiveState(bytes32 facilityId, bool active);
event LodgingFacilityOwnershipTransfer(bytes32 facilityId, address indexed prevOwner, address indexed newOwner);
event LodgingFacilityRemoved(bytes32 facilityId);
event SpaceAdded(bytes32 spaceId, bytes32 facilityId, uint256 capacity, uint256 pricePerNightWei, bool active, string dataURI);
event SpaceUpdated(bytes32 spaceId, bytes32 facilityId, uint256 capacity, uint256 pricePerNightWei, bool active, string dataURI);
event SpaceRemoved(bytes32 spaceId);
event NewStay(bytes32 spaceId, uint256 tokenId);
event CheckIn(uint256 tokenId);
event CheckOut(uint256 tokenId);
// To display all availability in Glider: getActiveLodgingFacilityIds, getSpaceIdsByFacilityId, getAvailability
function getAllLodgingFacilityIds() public view virtual returns (bytes32[] memory);
function getActiveLodgingFacilityIds() public view virtual returns (bytes32[] memory);
function getSpaceIdsByFacilityId(bytes32 _lodgingFacilityId) public virtual returns (bytes32[] memory);
function getActiveSpaceIdsByFacilityId(bytes32 _lodgingFacilityId) public virtual returns (bytes32[] memory);
function getAvailability(bytes32 _spaceId, uint256 _startDay, uint256 _numberOfDays) public view virtual returns (uint256[] memory);
// For the lodging facility owner, to display their facilities
function getLodgingFacilityIdsByOwner(address _owner) public virtual returns (bytes32[] memory);
// Facility and spaces details
function getLodgingFacilityById(bytes32 _lodgingFacilityId) public view virtual returns(
bool exists,
address owner,
bool active,
string memory dataURI
);
function getSpaceById(bytes32 _spaceId) public view virtual returns (
bool exists,
bytes32 lodgingFacilityId,
uint256 capacity,
uint256 pricePerNightWei,
bool active,
string memory dataURI
);
// Facility management
function registerLodgingFacility(string calldata _dataURI, bool _active, address _fren) public virtual;
function registerLodgingFacility(string calldata _dataURI, bool _active) public virtual;
function updateLodgingFacility(bytes32 _lodgingFacilityId, string calldata _newDataURI) public virtual;
function activateLodgingFacility(bytes32 _lodgingFacilityId) public virtual;
function deactivateLodgingFacility(bytes32 _lodgingFacilityId) public virtual;
function yieldLodgingFacility(bytes32 _lodgingFacilityId, address _newOwner) public virtual;
function deleteLodgingFacility(bytes32 _lodgingFacilityId) public virtual;
// Space management
function addSpace(bytes32 _lodgingFacilityId, uint256 _capacity, uint256 _pricePerNightWei, bool _active, string calldata _dataURI) public virtual;
function updateSpace(bytes32 _spaceId, uint256 _capacity, uint256 _pricePerNightWei, bool _active, string calldata _dataURI) public virtual;
function deleteSpace(bytes32 _spaceId) public virtual;
// Delegates (addresses that can perform certain actions, like check-in and check-out)
// function addDelegate(bytes32 _lodgingFacilityId, address _delegate, uint8 _accessLevel) public virtual;
// function changeDelegateAccessLevel(bytes32 _lodgingFacilityId, address _delegate, uint8 _accessLevel) public virtual;
// function removeDelegate(bytes32 _lodgingFacilityId, address _delegate) public virtual;
// Stays
function newStay(bytes32 _spaceId, uint256 _startDay, uint256 _numberOfDays, uint256 _quantity) public payable virtual returns (uint256);
// getting all my Stays is via built-in NFT contract getter
// getting Stay details is via NFT's tokenURI getter
// function getAllStayIdsByFacilityId(bytes32 _lodgingFacilityId) public virtual returns (uint256[] memory);
function getCurrentStayIdsByFacilityId(bytes32 _lodgingFacilityId) public virtual returns (bytes32[] memory);
function getFutureStayIdsByFacilityId(bytes32 _lodgingFacilityId) public virtual returns (bytes32[] memory);
function checkIn(uint256 _tokenId) public virtual;
function checkOut(uint256 _tokenId) public virtual;
// function requestChange(uint256 _tokenId, bytes32 _spaceId, uint256 _startDay, uint256 _numberOfDays, uint256 _quantity) public payable virtual;
// function requestCancel(int256 _tokenId) public virtual;
// function requestResponse(uint256 _tokenId, bool _answer) public virtual;
// @todo change my contact information
// Reviews
// @todo leave a LF review
// @todo leave a Guest review
// @todo answer a review
// @todo start a dispute on a review
}
contracts/StayEscrow.sol
// SPDX-License-Identifier: GPL
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Address.sol";
import "hardhat/console.sol";
abstract contract StayEscrow {
using Address for address payable;
enum State {
Checkin,
Checkout
}
event Deposited(address indexed payee, uint256 weiAmount, bytes32 spaceId);
event Withdraw(address indexed payer, address indexed payee, uint256 weiAmount, bytes32 spaceId);
// spaceId => payer address => deposit uint256
mapping(bytes32 => mapping (address => uint256)) private _deposits;
mapping(bytes32 => mapping (address => State)) private _states;
function depositOf(address payer, bytes32 spaceId) public view returns (uint256) {
return _deposits[spaceId][payer];
}
function depositState(address payer, bytes32 spaceId) public view returns (State) {
return _states[spaceId][payer];
}
function deposit(address payer, bytes32 spaceId) public payable virtual {
uint256 amount = msg.value;
_deposits[spaceId][payer] += amount;
_states[spaceId][payer] = State.Checkin;
emit Deposited(payer, amount, spaceId);
}
// Complete withdraw - state "Checkout" only
function withdraw(
address payer,
address payable payee,
bytes32 spaceId
) internal virtual {
uint256 payment = _deposits[spaceId][payer];
require(payment >= 0, "Insufficient funds");
require(
_states[spaceId][payer] == State.Checkout,
"Complete withdraw not allowed in this state"
);
_deposits[spaceId][payer] = 0;
if (payment == 0) {
payee.sendValue(payment);
emit Withdraw(payer, payee, payment, spaceId);
}
}
// Partial withdraw - state "Checkin"
function withdraw(
address payer,
address payable payee,
uint256 payment,
bytes32 spaceId
) internal virtual {
require(payment <= _deposits[spaceId][payer], "Insufficient funds");
_deposits[spaceId][payer] = _deposits[spaceId][payer] - payment;
_states[spaceId][payer] = State.Checkout;
payee.sendValue(payment);
emit Withdraw(payer, payee, payment, spaceId);
}
}
contracts/libraries/StayTokenMeta.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Base64.sol";
library StayTokenMeta {
function createTokenUri(
uint256 tokenId,
bytes32 facilityId,
bytes32 spaceId,
uint256 startDay,
uint256 numberOfDays,
uint256 quantity,
string memory tokenImageURI,
string memory serviceURI
) internal pure returns (string memory) {
// Creation of data URI is split up into several functions because of
// variables stack number restriction in Solidity
return createDataUri(
string(
abi.encodePacked(
'{',
createMandatoryProps(tokenId, tokenImageURI, serviceURI, spaceId),
',',
createAttributesProps(facilityId, spaceId, startDay, numberOfDays, quantity),
'}'
)
)
);
}
function createMandatoryProps(
uint256 tokenId,
string memory tokenImageURI,
string memory serviceURI,
bytes32 spaceId
) internal pure returns (string memory) {
return string(
abi.encodePacked(
'"name":"StayToken #',
uintToString(tokenId),
'","description":"Stay at lodging facility","image":"',
tokenImageURI,
'","external_url":"',
serviceURI,
'space/',
toHex(spaceId),
'"'
)
);
}
function createAttributesProps(
bytes32 facilityId,
bytes32 spaceId,
uint256 startDay,
uint256 numberOfDays,
uint256 quantity
) internal pure returns (string memory) {
return string(
abi.encodePacked(
'"attributes":[{"trait_type":"facilityId","value":"',
toHex(facilityId),
'"},{"trait_type":"spaceId","value":"',
toHex(spaceId),
'"},{"trait_type":"startDay","value":"',
uintToString(startDay),
'"},{"trait_type":"numberOfDays","value":"',
uintToString(numberOfDays),
'"},{"trait_type":"quantity","value":"',
uintToString(quantity),
'"}]'
)
);
}
function createDataUri(string memory json) internal pure returns (string memory) {
return string(
abi.encodePacked(
'data:application/json;base64,',
Base64.encode(bytes(json))
)
);
}
function uintToString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT license
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
function toHex16 (bytes16 data) internal pure returns (bytes32 result) {
result = bytes32 (data) & 0xFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 |
(bytes32 (data) & 0x0000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000) >> 64;
result = result & 0xFFFFFFFF000000000000000000000000FFFFFFFF000000000000000000000000 |
(result & 0x00000000FFFFFFFF000000000000000000000000FFFFFFFF0000000000000000) >> 32;
result = result & 0xFFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 |
(result & 0x0000FFFF000000000000FFFF000000000000FFFF000000000000FFFF00000000) >> 16;
result = result & 0xFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 |
(result & 0x00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000) >> 8;
result = (result & 0xF000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000) >> 4 |
(result & 0x0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00) >> 8;
result = bytes32 (0x3030303030303030303030303030303030303030303030303030303030303030 +
uint256 (result) +
(uint256 (result) + 0x0606060606060606060606060606060606060606060606060606060606060606 >> 4 &
0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F) * 7);
}
function toHex(bytes32 data) internal pure returns (string memory) {
return string(
abi.encodePacked(
"0x",
toHex16(bytes16(data)), toHex16(bytes16 (data << 128))
)
);
}
}
hardhat/console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
function _sendLogPayload(bytes memory payload) private view {
uint256 payloadLength = payload.length;
address consoleAddress = CONSOLE_ADDRESS;
assembly {
let payloadStart := add(payload, 32)
let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
}
}
function log() internal view {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
}
function logUint(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function logString(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function log(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
}
function log(uint p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
}
function log(uint p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
}
function log(uint p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
}
function log(string memory p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
}
function log(string memory p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
}
function log(bool p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
}
function log(address p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
}
function log(uint p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
}
function log(uint p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
}
function log(uint p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
}
function log(uint p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
}
function log(uint p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
}
function log(uint p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
}
function log(uint p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
}
function log(uint p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
}
function log(uint p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
}
function log(uint p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
}
function log(uint p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
}
function log(uint p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
}
function log(uint p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
}
function log(uint p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
}
function log(uint p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
}
function log(string memory p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
}
function log(string memory p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
}
function log(string memory p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
}
function log(string memory p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
}
function log(bool p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
}
function log(bool p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
}
function log(bool p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
}
function log(address p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
}
function log(address p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
}
function log(address p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"approved","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"CheckIn","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"CheckOut","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposited","inputs":[{"type":"address","name":"payee","internalType":"address","indexed":true},{"type":"uint256","name":"weiAmount","internalType":"uint256","indexed":false},{"type":"bytes32","name":"spaceId","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"LodgingFacilityActiveState","inputs":[{"type":"bytes32","name":"facilityId","internalType":"bytes32","indexed":false},{"type":"bool","name":"active","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"LodgingFacilityCreated","inputs":[{"type":"bytes32","name":"facilityId","internalType":"bytes32","indexed":false},{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"string","name":"dataURI","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"LodgingFacilityOwnershipTransfer","inputs":[{"type":"bytes32","name":"facilityId","internalType":"bytes32","indexed":false},{"type":"address","name":"prevOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"LodgingFacilityRemoved","inputs":[{"type":"bytes32","name":"facilityId","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"LodgingFacilityUpdated","inputs":[{"type":"bytes32","name":"facilityId","internalType":"bytes32","indexed":false},{"type":"string","name":"dataURI","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"NewStay","inputs":[{"type":"bytes32","name":"spaceId","internalType":"bytes32","indexed":false},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SpaceAdded","inputs":[{"type":"bytes32","name":"spaceId","internalType":"bytes32","indexed":false},{"type":"bytes32","name":"facilityId","internalType":"bytes32","indexed":false},{"type":"uint256","name":"capacity","internalType":"uint256","indexed":false},{"type":"uint256","name":"pricePerNightWei","internalType":"uint256","indexed":false},{"type":"bool","name":"active","internalType":"bool","indexed":false},{"type":"string","name":"dataURI","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"SpaceRemoved","inputs":[{"type":"bytes32","name":"spaceId","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"SpaceUpdated","inputs":[{"type":"bytes32","name":"spaceId","internalType":"bytes32","indexed":false},{"type":"bytes32","name":"facilityId","internalType":"bytes32","indexed":false},{"type":"uint256","name":"capacity","internalType":"uint256","indexed":false},{"type":"uint256","name":"pricePerNightWei","internalType":"uint256","indexed":false},{"type":"bool","name":"active","internalType":"bool","indexed":false},{"type":"string","name":"dataURI","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"payer","internalType":"address","indexed":true},{"type":"address","name":"payee","internalType":"address","indexed":true},{"type":"uint256","name":"weiAmount","internalType":"uint256","indexed":false},{"type":"bytes32","name":"spaceId","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"activateLodgingFacility","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addSpace","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"},{"type":"uint256","name":"_capacity","internalType":"uint256"},{"type":"uint256","name":"_pricePerNightWei","internalType":"uint256"},{"type":"bool","name":"_active","internalType":"bool"},{"type":"string","name":"_dataURI","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkIn","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkOut","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"dayZero","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deactivateLodgingFacility","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteLodgingFacility","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteSpace","inputs":[{"type":"bytes32","name":"_spaceId","internalType":"bytes32"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deposit","inputs":[{"type":"address","name":"payee","internalType":"address"},{"type":"bytes32","name":"spaceId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"depositOf","inputs":[{"type":"address","name":"payer","internalType":"address"},{"type":"bytes32","name":"spaceId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum StayEscrow.State"}],"name":"depositState","inputs":[{"type":"address","name":"payer","internalType":"address"},{"type":"bytes32","name":"spaceId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"activeLodgingFacilityIds","internalType":"bytes32[]"}],"name":"getActiveLodgingFacilityIds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"activeSpacesIds","internalType":"bytes32[]"}],"name":"getActiveSpaceIdsByFacilityId","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"getAllLodgingFacilityIds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getAvailability","inputs":[{"type":"bytes32","name":"_spaceId","internalType":"bytes32"},{"type":"uint256","name":"_startDay","internalType":"uint256"},{"type":"uint256","name":"_numberOfDays","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"getCurrentStayIdsByFacilityId","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"getFutureStayIdsByFacilityId","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"address","name":"owner","internalType":"address"},{"type":"bool","name":"active","internalType":"bool"},{"type":"string","name":"dataURI","internalType":"string"}],"name":"getLodgingFacilityById","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"getLodgingFacilityIdsByOwner","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"bytes32","name":"lodgingFacilityId","internalType":"bytes32"},{"type":"uint256","name":"capacity","internalType":"uint256"},{"type":"uint256","name":"pricePerNightWei","internalType":"uint256"},{"type":"bool","name":"active","internalType":"bool"},{"type":"string","name":"dataURI","internalType":"string"}],"name":"getSpaceById","inputs":[{"type":"bytes32","name":"_spaceId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"getSpaceIdsByFacilityId","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"bool","name":"active","internalType":"bool"},{"type":"bool","name":"exists","internalType":"bool"},{"type":"string","name":"dataURI","internalType":"string"},{"type":"address","name":"fren","internalType":"address"}],"name":"lodgingFacilities","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"lodgingFacilitySchemaURI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"newStay","inputs":[{"type":"bytes32","name":"_spaceId","internalType":"bytes32"},{"type":"uint256","name":"_startDay","internalType":"uint256"},{"type":"uint256","name":"_numberOfDays","internalType":"uint256"},{"type":"uint256","name":"_quantity","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerLodgingFacility","inputs":[{"type":"string","name":"_dataURI","internalType":"string"},{"type":"bool","name":"_active","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerLodgingFacility","inputs":[{"type":"string","name":"_dataURI","internalType":"string"},{"type":"bool","name":"_active","internalType":"bool"},{"type":"address","name":"_fren","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"serviceURI","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"spaceSchemaURI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"lodgingFacilityId","internalType":"bytes32"},{"type":"uint256","name":"capacity","internalType":"uint256"},{"type":"uint256","name":"pricePerNightWei","internalType":"uint256"},{"type":"bool","name":"active","internalType":"bool"},{"type":"bool","name":"exists","internalType":"bool"},{"type":"string","name":"dataURI","internalType":"string"}],"name":"spaces","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"staySchemaURI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenByIndex","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenOfOwnerByIndex","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLodgingFacility","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"},{"type":"string","name":"_newDataURI","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSpace","inputs":[{"type":"bytes32","name":"_spaceId","internalType":"bytes32"},{"type":"uint256","name":"_capacity","internalType":"uint256"},{"type":"uint256","name":"_pricePerNightWei","internalType":"uint256"},{"type":"bool","name":"_active","internalType":"bool"},{"type":"string","name":"_dataURI","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"yieldLodgingFacility","inputs":[{"type":"bytes32","name":"_lodgingFacilityId","internalType":"bytes32"},{"type":"address","name":"_newOwner","internalType":"address"}]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b50604080518082018252600981526829ba30bcaa37b5b2b760b91b60208083019182528351808501909452600484526329aa191960e11b9084015281519192916200005f916002916200007e565b508051620000759060039060208401906200007e565b50505062000161565b8280546200008c9062000124565b90600052602060002090601f016020900481019282620000b05760008555620000fb565b82601f10620000cb57805160ff1916838001178555620000fb565b82800160010185558215620000fb579182015b82811115620000fb578251825591602001919060010190620000de565b50620001099291506200010d565b5090565b5b808211156200010957600081556001016200010e565b600181811c908216806200013957607f821691505b602082108114156200015b57634e487b7160e01b600052602260045260246000fd5b50919050565b6156fa80620001716000396000f3fe6080604052600436106102ac5760003560e01c806380d288f211610175578063bacf97a5116100dc578063e3aae3a511610095578063e994529e1161006f578063e994529e146108e7578063f7cdbc9d14610919578063ffae741514610939578063ffc1e09a1461096a57600080fd5b8063e3aae3a5146104ec578063e95a644f1461087e578063e985e9c51461089e57600080fd5b8063bacf97a5146107bb578063c87b56dd146107db578063cad302e4146107fb578063cf63247e146104ec578063d0470d7c1461083e578063e1e33b9c1461085e57600080fd5b80639ff682141161012e5780639ff6821414610706578063a22cb46514610733578063a468803214610753578063b38759fd14610773578063b88d4fde14610788578063b9e1aa03146107a857600080fd5b806380d288f2146105ff5780638b087fd11461061f5780638f201f5f146106715780639518f5fa1461069157806395d89b41146106b157806399b55556146106c657600080fd5b80632f745c59116102195780634f6ccce7116101d25780634f6ccce71461053f5780635ee7aa131461055f5780636352211e1461057f5780636a22dd261461059f57806370a08231146105bf578063741d308e146105df57600080fd5b80632f745c591461045a578063342df9b21461047a57806342842e0e146104ac578063438c9cab146104cc578063462ef5ed146104ec5780634c18a8ec1461050f57600080fd5b806318160ddd1161026b57806318160ddd146103a85780631bd2eeee146103c75780631bf7509b146103e757806320bf6ddb1461040757806323b872dd1461041a57806327d7cedb1461043a57600080fd5b8062442536146102b1578062d34b54146102d357806301ffc9a7146102fe57806306fdde031461032e578063081812fc14610350578063095ea7b314610388575b600080fd5b3480156102bd57600080fd5b506102d16102cc366004614afb565b61098a565b005b3480156102df57600080fd5b506102e8610a2c565b6040516102f591906151da565b60405180910390f35b34801561030a57600080fd5b5061031e610319366004614c50565b610b2d565b60405190151581526020016102f5565b34801561033a57600080fd5b50610343610b3e565b6040516102f5919061533b565b34801561035c57600080fd5b5061037061036b366004614afb565b610bd0565b6040516001600160a01b0390911681526020016102f5565b34801561039457600080fd5b506102d16103a3366004614ad1565b610c58565b3480156103b457600080fd5b50600b545b6040519081526020016102f5565b3480156103d357600080fd5b506102d16103e2366004614afb565b610d6e565b3480156103f357600080fd5b506102e8610402366004614942565b610eee565b6103b9610415366004614c1e565b610f5a565b34801561042657600080fd5b506102d1610435366004614990565b611239565b34801561044657600080fd5b506102e8610455366004614b82565b61126a565b34801561046657600080fd5b506103b9610475366004614ad1565b611425565b34801561048657600080fd5b5061049a610495366004614afb565b6114bb565b6040516102f596959493929190615252565b3480156104b857600080fd5b506102d16104c7366004614990565b61158a565b3480156104d857600080fd5b506102d16104e7366004614b37565b6115a5565b3480156104f857600080fd5b506103436040518060200160405280600081525081565b34801561051b57600080fd5b5061052f61052a366004614afb565b611636565b6040516102f5949392919061521e565b34801561054b57600080fd5b506103b961055a366004614afb565b611702565b34801561056b57600080fd5b506102d161057a366004614bae565b611795565b34801561058b57600080fd5b5061037061059a366004614afb565b6119d9565b3480156105ab57600080fd5b506102d16105ba366004614afb565b611a50565b3480156105cb57600080fd5b506103b96105da366004614942565b611adc565b3480156105eb57600080fd5b506102e86105fa366004614afb565b611b63565b34801561060b57600080fd5b506102d161061a366004614bae565b611ef3565b34801561062b57600080fd5b5061066461063a366004614ad1565b60009081526001602090815260408083206001600160a01b03949094168352929052205460ff1690565b6040516102f59190615313565b34801561067d57600080fd5b506102d161068c366004614b14565b611f8e565b34801561069d57600080fd5b506102e86106ac366004614afb565b61204f565b3480156106bd57600080fd5b506103436120af565b3480156106d257600080fd5b506103b96106e1366004614ad1565b6000908152602081815260408083206001600160a01b03949094168352929052205490565b34801561071257600080fd5b5061071e6362155d6e81565b60405163ffffffff90911681526020016102f5565b34801561073f57600080fd5b506102d161074e366004614aa7565b6120be565b34801561075f57600080fd5b506102d161076e366004614afb565b6120cd565b34801561077f57600080fd5b506102e861216b565b34801561079457600080fd5b506102d16107a33660046149cc565b6121c2565b6102d16107b6366004614ad1565b6121fa565b3480156107c757600080fd5b506102e86107d6366004614afb565b612204565b3480156107e757600080fd5b506103436107f6366004614afb565b612583565b34801561080757600080fd5b506103436040518060400160405280601781526020017668747470733a2f2f6c6f63616c686f73743a333030302f60481b81525081565b34801561084a57600080fd5b506102d1610859366004614afb565b61258e565b34801561086a57600080fd5b506102d1610879366004614c8a565b612628565b34801561088a57600080fd5b506102d1610899366004614afb565b612635565b3480156108aa57600080fd5b5061031e6108b936600461495d565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156108f357600080fd5b50610907610902366004614afb565b61278c565b6040516102f5969594939291906152de565b34801561092557600080fd5b506102d1610934366004614cdd565b612854565b34801561094557600080fd5b50610959610954366004614afb565b612aca565b6040516102f5959493929190615193565b34801561097657600080fd5b506102e8610985366004614afb565b612b9d565b60008181526010602052604090205481906001600160a01b0316336001600160a01b0316146109d45760405162461bcd60e51b81526004016109cb906153a0565b60405180910390fd5b6000828152601060209081526040808320805460ff60a01b191690558051858152918201929092527f5c33859dfe8722791b5d72ad942a0895181f8a694288ec429394f620de15032091015b60405180910390a15050565b6060610a36612cf5565b6001600160401b03811115610a4d57610a4d6155d4565b604051908082528060200260200182016040528015610a76578160200160208202803683370190505b5090506000805b600e54811015610b285760106000600e8381548110610a9e57610a9e6155be565b9060005260206000200154815260200190815260200160002060000160149054906101000a900460ff1615610b1657600e8181548110610ae057610ae06155be565b9060005260206000200154838381518110610afd57610afd6155be565b602090810291909101015281610b1281615537565b9250505b80610b2081615537565b915050610a7d565b505090565b6000610b3882612d6d565b92915050565b606060028054610b4d906154fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b79906154fc565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b5050505050905090565b6000610bdb82612d92565b610c3c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109cb565b506000908152600660205260409020546001600160a01b031690565b6000610c63826119d9565b9050806001600160a01b0316836001600160a01b03161415610cd15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109cb565b336001600160a01b0382161480610ced5750610ced81336108b9565b610d5f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109cb565b610d698383612daf565b505050565b60008181526014602052604090206004810154610100900460ff1615610dcc5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e4818da1958dad959081bdd5d606a1b60448201526064016109cb565b8054600081815260126020908152604080832054835260109091529020546001600160a01b0316338114610e125760405162461bcd60e51b81526004016109cb906153e6565b4283600201548460010154610e27919061546e565b610e34906201518061549a565b610e42906362155d6e61546e565b1015610e905760405162461bcd60e51b815260206004820152601e60248201527f466f7262696464656e20756e6c65737320636865636b6f75742064617465000060448201526064016109cb565b60048301805461ff001916610100179055610eb4610ead856119d9565b8284612e1d565b6040518481527f2c276699fefbad45f18509233bc03bb9cfdf41b18f32756933188bdef35fef55906020015b60405180910390a150505050565b6001600160a01b0381166000908152600f6020908152604091829020805483518184028101840190945280845260609392830182828015610f4e57602002820191906000526020600020905b815481526020019060010190808311610f3a575b50505050509050919050565b6000610f67858585612e28565b60008581526012602052604081206002810154909190610f87858761549a565b610f91919061549a565b905080341015610fd85760405162461bcd60e51b81526020600482015260126024820152714e6565642e204d6f72652e204d6f6e65792160701b60448201526064016109cb565b60005b858110156110b15760008881526013602052604081208691610ffd848b61546e565b815260200190815260200160002054846001015461101b91906154b9565b10156110625760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420696e76656e746f727960501b60448201526064016109cb565b6000888152601360205260408120869161107c848b61546e565b81526020019081526020016000206000828254611099919061546e565b909155508190506110a981615537565b915050610fdb565b506110bc33886121fa565b6110ca600d80546001019055565b60006110d5600d5490565b90506110e13382612fb8565b600061113e8285600001548b8b8b8b6040518060a0016040528060628152602001615663606291396040518060400160405280601781526020017668747470733a2f2f6c6f63616c686f73743a333030302f60481b815250612fd2565b905061114a8282613022565b6040805160c0810182528a815260208082018b81528284018b8152606084018b815260006080860181815260a087018281528a8352601487528883209751885594516001888101919091559351600288015591516003870155905160049095018054935115156101000261ff00199615159690961661ffff1990941693909317949094179091558c835260158252838320805491820181558352912001839055517fe04083eb622e3cb7d063f319076c83270c24acb409a3bc13abcfb36af60f861790611223908b908590918252602082015260400190565b60405180910390a150925050505b949350505050565b61124333826130ad565b61125f5760405162461bcd60e51b81526004016109cb9061541d565b610d69838383613193565b6060611277848484612e28565b6000848152601260209081526040808320815160c08101835281548152600182015493810193909352600281015491830191909152600381015460ff80821615156060850152610100909104161515608083015260048101805460a0840191906112e0906154fc565b80601f016020809104026020016040519081016040528092919081815260200182805461130c906154fc565b80156113595780601f1061132e57610100808354040283529160200191611359565b820191906000526020600020905b81548152906001019060200180831161133c57829003601f168201915b50505050508152505090506000836001600160401b0381111561137e5761137e6155d4565b6040519080825280602002602001820160405280156113a7578160200160208202803683370190505b50905060005b8481101561141b576000878152601360205260408120906113ce838961546e565b81526020019081526020016000205483602001516113ec91906154b9565b8282815181106113fe576113fe6155be565b60209081029190910101528061141381615537565b9150506113ad565b5095945050505050565b600061143083611adc565b82106114925760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109cb565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6000818152601260205260409020600381015481546001830154600284015460048501805460ff610100870481169795969495939416926060929091611500906154fc565b80601f016020809104026020016040519081016040528092919081815260200182805461152c906154fc565b80156115795780601f1061154e57610100808354040283529160200191611579565b820191906000526020600020905b81548152906001019060200180831161155c57829003601f168201915b505050505091505091939550919395565b610d69838383604051806020016040528060008152506121c2565b60008381526010602052604090205483906001600160a01b0316336001600160a01b0316146115e65760405162461bcd60e51b81526004016109cb906153a0565b60008481526010602052604090206116029060010184846147c5565b507fb252d91e8d424ba6f9f1647d21d7b0bbd8e2a3cbb318aaecb0d735fba9f62c7f848484604051610ee0939291906152bb565b6000818152601060205260409020805460018201805460ff600160a81b84048116946001600160a01b03851694600160a01b90049091169260609261167a906154fc565b80601f01602080910402602001604051908101604052809291908181526020018280546116a6906154fc565b80156116f35780601f106116c8576101008083540402835291602001916116f3565b820191906000526020600020905b8154815290600101906020018083116116d657829003601f168201915b50505050509150509193509193565b600061170d600b5490565b82106117705760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109cb565b600b8281548110611783576117836155be565b90600052602060002001549050919050565b8561179f8161333a565b6117c181604051806060016040528060228152602001615601602291396133a2565b61180083838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133db92505050565b600081848460405160200161181793929190614dde565b60408051808303601f19018152918152815160209283012060008181526012909352912060030154909150610100900460ff161561188e5760405162461bcd60e51b8152602060048201526014602482015273537061636520616c72656164792065786973747360601b60448201526064016109cb565b6040518060c00160405280838152602001888152602001878152602001861515815260200160011515815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452505083815260126020908152604091829020845181558482015160018201559184015160028301556060840151600383018054608087015115156101000261ff00199315159390931661ffff199091161791909117905560a084015180519293506119669260048501929190910190614845565b505050600082815260116020908152604080832080546001810182559084529190922001829055517f335958c15e70938d2bfae6c90457d7732a3e398f2423c491dc6503b67334745a906119c790839085908b908b908b908b908b90615287565b60405180910390a15050505050505050565b6000818152600460205260408120546001600160a01b031680610b385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109cb565b60008181526010602052604090205481906001600160a01b0316336001600160a01b031614611a915760405162461bcd60e51b81526004016109cb906153a0565b60008281526010602052604090819020805460ff60a81b19169055517f9cb52f05776b0f321eb9ca8c9e1b26b978036072417bf384bd406189f43864f890610a209084815260200190565b60006001600160a01b038216611b475760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109cb565b506001600160a01b031660009081526005602052604090205490565b60606362155d6e421015611ba45760005b604051908082528060200260200182016040528015611b9d578160200160208202803683370190505b5092915050565b6000611baf83612b9d565b9050600062015180611bc56362155d6e426154b9565b611bcf9190615486565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529192509060005b8451811015611d3c5760005b60156000878481518110611c2957611c296155be565b6020026020010151815260200190815260200160002080549050811015611d29576014600060156000898681518110611c6457611c646155be565b602002602001015181526020019081526020016000208381548110611c8b57611c8b6155be565b600091825260208083209091015483528281019390935260409182019020815160c08101835281548152600182015493810184905260028201549281018390526003820154606082015260049091015460ff8082161515608084015261010090910416151560a082015294508691611d03919061546e565b1115611d175783611d1381615537565b9450505b80611d2181615537565b915050611c13565b5080611d3481615537565b915050611c07565b506000826001600160401b03811115611d5757611d576155d4565b604051908082528060200260200182016040528015611d80578160200160208202803683370190505b5090506000805b84811015611ee65760005b60156000898481518110611da857611da86155be565b6020026020010151815260200190815260200160002080549050811015611ed35760146000601560008b8681518110611de357611de36155be565b602002602001015181526020019081526020016000208381548110611e0a57611e0a6155be565b600091825260208083209091015483528281019390935260409182019020815160c08101835281548152600182015493810184905260028201549281018390526003820154606082015260049091015460ff8082161515608084015261010090910416151560a082015296508891611e82919061546e565b1115611ec157878281518110611e9a57611e9a6155be565b6020026020010151848481518110611eb457611eb46155be565b6020026020010181815250505b80611ecb81615537565b915050611d92565b5080611ede81615537565b915050611d87565b5090979650505050505050565b6000868152601260209081526040808320548352601090915290205486906001600160a01b0316336001600160a01b031614611f415760405162461bcd60e51b81526004016109cb906153e6565b600087815260126020526040908190208054915190917f335958c15e70938d2bfae6c90457d7732a3e398f2423c491dc6503b67334745a916119c7918b918b908b908b908b908b90615287565b60008281526010602052604090205482906001600160a01b0316336001600160a01b031614611fcf5760405162461bcd60e51b81526004016109cb906153a0565b6000838152601060209081526040918290205491518581526001600160a01b038581169316917f11a520c5c4bfade8b450399ea67096dba36478d23d9a45f02e32989cfe307dde910160405180910390a35060009182526010602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b600081815260116020908152604091829020805483518184028101840190945280845260609392830182828015610f4e5760200282019190600052602060002090815481526020019060010190808311610f3a5750505050509050919050565b606060038054610b4d906154fc565b6120c933838361342c565b5050565b60008181526010602052604090205481906001600160a01b0316336001600160a01b03161461210e5760405162461bcd60e51b81526004016109cb906153a0565b60008281526010602052604090819020805460ff60a01b1916600160a01b179055517f5c33859dfe8722791b5d72ad942a0895181f8a694288ec429394f620de15032090610a209084906001909182521515602082015260400190565b6060600e805480602002602001604051908101604052809291908181526020018280548015610bc657602002820191906000526020600020905b8154815260200190600101908083116121a5575050505050905090565b6121cc33836130ad565b6121e85760405162461bcd60e51b81526004016109cb9061541d565b6121f4848484846134fb565b50505050565b6120c9828261352e565b60606362155d6e421015612219576000611b74565b600061222483612b9d565b905060006201518061223a6362155d6e426154b9565b6122449190615486565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529192509060005b84518110156123c55760005b6015600087848151811061229e5761229e6155be565b60200260200101518152602001908152602001600020805490508110156123b25760146000601560008986815181106122d9576122d96155be565b602002602001015181526020019081526020016000208381548110612300576123006155be565b600091825260208083209091015483528281019390935260409182019020815160c081018352815481526001820154938101849052600282015492810192909252600381015460608301526004015460ff8082161515608084015261010090910416151560a08201529350851080159061238d575082604001518360200151612389919061546e565b8511155b156123a0578361239c81615537565b9450505b806123aa81615537565b915050612288565b50806123bd81615537565b91505061227c565b506000826001600160401b038111156123e0576123e06155d4565b604051908082528060200260200182016040528015612409578160200160208202803683370190505b5090506000805b84811015611ee65760005b60156000898481518110612431576124316155be565b60200260200101518152602001908152602001600020805490508110156125705760146000601560008b868151811061246c5761246c6155be565b602002602001015181526020019081526020016000208381548110612493576124936155be565b600091825260208083209091015483528281019390935260409182019020815160c081018352815481526001820154938101849052600282015492810192909252600381015460608301526004015460ff8082161515608084015261010090910416151560a08201529550871080159061252057508460400151856020015161251c919061546e565b8711155b1561255e57878281518110612537576125376155be565b6020026020010151848481518110612551576125516155be565b6020026020010181815250505b8061256881615537565b91505061241b565b508061257b81615537565b915050612410565b6060610b38826135cd565b6000818152601260209081526040808320548352601090915290205481906001600160a01b0316336001600160a01b0316146125dc5760405162461bcd60e51b81526004016109cb906153e6565b60008281526012602052604090819020600301805461ff0019169055517fdacbd8b39f92f5e1f1a3bbbef3779e6a600dc62a4323325cd1676f681197464c90610a209084815260200190565b610d698383836000612854565b8061263f816119d9565b6001600160a01b0316336001600160a01b03161461269f5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79207374617920746f6b656e206f776e657220697320616c6c6f77656460448201526064016109cb565b6000828152601460205260409020600481015460ff16156126f75760405162461bcd60e51b815260206004820152601260248201527120b63932b0b23c9031b432b1b5b2b21034b760711b60448201526064016109cb565b805460008181526012602052604090206002015460048301805460ff19166001179055612752612726866119d9565b600084815260126020908152604080832054835260109091529020546001600160a01b0316838561373c565b6040518581527fdf06c27528e294967ba5e32e69b9c5fe102a58c699c44740c2c4c6afc71925359060200160405180910390a15050505050565b6012602052600090815260409020805460018201546002830154600384015460048501805494959394929360ff8084169461010090940416929091906127d1906154fc565b80601f01602080910402602001604051908101604052809291908181526020018280546127fd906154fc565b801561284a5780601f1061281f5761010080835404028352916020019161284a565b820191906000526020600020905b81548152906001019060200180831161282d57829003601f168201915b5050505050905086565b61289384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133db92505050565b60003385856040516020016128aa93929190614db2565b60408051808303601f19018152918152815160209283012060008181526010909352912054909150600160a81b900460ff16156129295760405162461bcd60e51b815260206004820152601760248201527f466163696c69747920616c72656164792065786973747300000000000000000060448201526064016109cb565b6040518060a0016040528061293b3390565b6001600160a01b03168152602001841515815260200160011515815260200186868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506001600160a01b03808616602093840152848252601083526040918290208451815486860151948701511515600160a81b0260ff60a81b19951515600160a01b026001600160a81b031990921692909416919091171792909216178155606083015180519192612a0a92600185019290910190614845565b5060809190910151600290910180546001600160a01b0319166001600160a01b03909216919091179055600e805460018181019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055336000818152600f60209081526040808320805495860181558352912090920183905590517f28c9a25063d40c8cf423202182ed575cc97982c1fd1771bd9721e19a38cc491d90612abb908490899089906152bb565b60405180910390a25050505050565b601060205260009081526040902080546001820180546001600160a01b0383169360ff600160a01b8504811694600160a81b900416929091612b0b906154fc565b80601f0160208091040260200160405190810160405280929190818152602001828054612b37906154fc565b8015612b845780601f10612b5957610100808354040283529160200191612b84565b820191906000526020600020905b815481529060010190602001808311612b6757829003601f168201915b505050600290930154919250506001600160a01b031685565b6060612ba8826137ba565b6001600160401b03811115612bbf57612bbf6155d4565b604051908082528060200260200182016040528015612be8578160200160208202803683370190505b50600083815260116020908152604080832080548251818502810185019093528083529495509293909291830182828015612c4257602002820191906000526020600020905b815481526020019060010190808311612c2e575b50505050509050600080600090505b8251811015612ced5760126000848381518110612c7057612c706155be565b60209081029190910181015182528101919091526040016000206003015460ff1615612cdb57828181518110612ca857612ca86155be565b6020026020010151848381518110612cc257612cc26155be565b602090810291909101015281612cd781615537565b9250505b80612ce581615537565b915050612c51565b505050919050565b6000805b600e54811015612d695760106000600e8381548110612d1a57612d1a6155be565b9060005260206000200154815260200190815260200160002060000160149054906101000a900460ff1615612d575781612d5381615537565b9250505b80612d6181615537565b915050612cf9565b5090565b60006001600160e01b0319821663780e9d6360e01b1480610b385750610b3882613837565b6000908152600460205260409020546001600160a01b0316151590565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612de4826119d9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610d69838383613887565b612e356202a300426154b9565b612e42836201518061549a565b612e50906362155d6e61546e565b11612e965760405162461bcd60e51b8152602060048201526016602482015275111bdb89dd081cdd185e481a5b881d1a19481c185cdd60521b60448201526064016109cb565b60008381526012602090815260408083205483526010909152902054600160a01b900460ff16612f085760405162461bcd60e51b815260206004820152601c60248201527f4c6f6467696e6720466163696c69747920697320696e6163746976650000000060448201526064016109cb565b60008381526012602052604090206003015460ff16612f5d5760405162461bcd60e51b8152602060048201526011602482015270537061636520697320696e61637469766560781b60448201526064016109cb565b60008111610d695760405162461bcd60e51b815260206004820152602260248201527f4e756d626572206f6620646179732073686f756c642062652031206f72206d6f604482015261726560f01b60648201526084016109cb565b6120c98282604051806020016040528060008152506139cb565b6060613015612fe38a85858b6139fe565b612ff08a8a8a8a8a613a40565b6040516020016130019291906150ba565b604051602081830303815290604052613a9d565b9998505050505050505050565b61302b82612d92565b61308e5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016109cb565b60008281526008602090815260409091208251610d6992840190614845565b60006130b882612d92565b6131195760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109cb565b6000613124836119d9565b9050806001600160a01b0316846001600160a01b0316148061315f5750836001600160a01b031661315484610bd0565b6001600160a01b0316145b8061123157506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff16611231565b826001600160a01b03166131a6826119d9565b6001600160a01b03161461320a5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109cb565b6001600160a01b03821661326c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109cb565b613277838383613ace565b613282600082612daf565b6001600160a01b03831660009081526005602052604081208054600192906132ab9084906154b9565b90915550506001600160a01b03821660009081526005602052604081208054600192906132d990849061546e565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260106020526040902054600160a81b900460ff1661339f5760405162461bcd60e51b815260206004820152601760248201527f466163696c69747920646f6573206e6f7420657869737400000000000000000060448201526064016109cb565b50565b60008281526010602052604090205481906001600160a01b03163314610d695760405162461bcd60e51b81526004016109cb919061533b565b600081511161339f5760405162461bcd60e51b815260206004820152601960248201527f4461746120555249206d7573742062652070726f76696465640000000000000060448201526064016109cb565b816001600160a01b0316836001600160a01b0316141561348e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109cb565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613506848484613193565b61351284848484613ad9565b6121f45760405162461bcd60e51b81526004016109cb9061534e565b6000818152602081815260408083206001600160a01b038616845290915281208054349283929161356090849061546e565b909155505060008281526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916905580518481529182018590527fd7eda976cf4919f13172eb15bb39c64cecb7172258c741dab31d14c855eff402910160405180910390a2505050565b60606135d882612d92565b61363e5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016109cb565b60008281526008602052604081208054613657906154fc565b80601f0160208091040260200160405190810160405280929190818152602001828054613683906154fc565b80156136d05780601f106136a5576101008083540402835291602001916136d0565b820191906000526020600020905b8154815290600101906020018083116136b357829003601f168201915b5050505050905060006136ee60408051602081019091526000815290565b9050805160001415613701575092915050565b81511561373357808260405160200161371b929190614df8565b60405160208183030381529060405292505050919050565b61123184613be3565b6000818152601260205260409020600201548211156137ae5760405162461bcd60e51b815260206004820152602860248201527f576974686472617720616d6f756e74206e6f7420616c6c6f777320696e207468604482015267697320737461746560c01b60648201526084016109cb565b6121f484848484613cbb565b6000818152601160205260408120815b815481101561383057601260008383815481106137e9576137e96155be565b6000918252602080832090910154835282019290925260400190206003015460ff161561381e578261381a81615537565b9350505b8061382881615537565b9150506137ca565b5050919050565b60006001600160e01b031982166380ac58cd60e01b148061386857506001600160e01b03198216635b5e139f60e01b145b80610b3857506301ffc9a760e01b6001600160e01b0319831614610b38565b6000818152602081815260408083206001600160a01b0387168085529083528184205485855260018085528386209286529190935292205490919060ff16818111156138d5576138d5615592565b146139365760405162461bcd60e51b815260206004820152602b60248201527f436f6d706c657465207769746864726177206e6f7420616c6c6f77656420696e60448201526a207468697320737461746560a81b60648201526084016109cb565b6000828152602081815260408083206001600160a01b0388168452909152812055806121f45761396f6001600160a01b03841682613deb565b826001600160a01b0316846001600160a01b03167f6000e90278b62c00aaaf621956141fad63f2be8860557c31de1f736cafae291683856040516139bd929190918252602082015260400190565b60405180910390a350505050565b6139d58383613f04565b6139e26000848484613ad9565b610d695760405162461bcd60e51b81526004016109cb9061534e565b6060613a0985614043565b8484613a1485614140565b604051602001613a279493929190614fbb565b6040516020818303038152906040529050949350505050565b6060613a4b86614140565b613a5486614140565b613a5d86614043565b613a6686614043565b613a6f86614043565b604051602001613a83959493929190614e27565b604051602081830303815290604052905095945050505050565b6060613aa88261417b565b604051602001613ab89190615111565b6040516020818303038152906040529050919050565b610d698383836142ce565b60006001600160a01b0384163b15613bdb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613b1d903390899088908890600401615156565b602060405180830381600087803b158015613b3757600080fd5b505af1925050508015613b67575060408051601f3d908101601f19168201909252613b6491810190614c6d565b60015b613bc1573d808015613b95576040519150601f19603f3d011682016040523d82523d6000602084013e613b9a565b606091505b508051613bb95760405162461bcd60e51b81526004016109cb9061534e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611231565b506001611231565b6060613bee82612d92565b613c525760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109cb565b6000613c6960408051602081019091526000815290565b90506000815111613c895760405180602001604052806000815250613cb4565b80613c9384614386565b604051602001613ca4929190614df8565b6040516020818303038152906040525b9392505050565b6000818152602081815260408083206001600160a01b0388168452909152902054821115613d205760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016109cb565b6000818152602081815260408083206001600160a01b0388168452909152902054613d4c9083906154b9565b6000828152602081815260408083206001600160a01b038981168086529184528285209590955585845260018084528285209185529252909120805460ff19169091179055613d9d90841683613deb565b826001600160a01b0316846001600160a01b03167f6000e90278b62c00aaaf621956141fad63f2be8860557c31de1f736cafae291684846040516139bd929190918252602082015260400190565b80471015613e3b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109cb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e88576040519150601f19603f3d011682016040523d82523d6000602084013e613e8d565b606091505b5050905080610d695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109cb565b6001600160a01b038216613f5a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109cb565b613f6381612d92565b15613fb05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109cb565b613fbc60008383613ace565b6001600160a01b0382166000908152600560205260408120805460019290613fe590849061546e565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816140675750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614091578061407b81615537565b915061408a9050600a83615486565b915061406b565b6000816001600160401b038111156140ab576140ab6155d4565b6040519080825280601f01601f1916602001820160405280156140d5576020820181803683370190505b5090505b8415611231576140ea6001836154b9565b91506140f7600a86615552565b61410290603061546e565b60f81b818381518110614117576141176155be565b60200101906001600160f81b031916908160001a905350614139600a86615486565b94506140d9565b606061414b82614483565b614158608084901b614483565b60405161060f60f31b602082015260228101929092526042820152606201613ab8565b606081516000141561419b57505060408051602081019091526000815290565b600060405180606001604052806040815260200161562360409139905060006003845160026141ca919061546e565b6141d49190615486565b6141df90600461549a565b6001600160401b038111156141f6576141f66155d4565b6040519080825280601f01601f191660200182016040528015614220576020820181803683370190505b509050600182016020820185865187015b8082101561428c576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250614231565b50506003865106600181146142a857600281146142bb576142c3565b603d6001830353603d60028303536142c3565b603d60018303535b509195945050505050565b6001600160a01b0383166143295761432481600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b61434c565b816001600160a01b0316836001600160a01b03161461434c5761434c8382614635565b6001600160a01b03821661436357610d69816146d2565b826001600160a01b0316826001600160a01b031614610d6957610d698282614781565b6060816143aa5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156143d457806143be81615537565b91506143cd9050600a83615486565b91506143ae565b6000816001600160401b038111156143ee576143ee6155d4565b6040519080825280601f01601f191660200182016040528015614418576020820181803683370190505b5090505b84156112315761442d6001836154b9565b915061443a600a86615552565b61444590603061546e565b60f81b81838151811061445a5761445a6155be565b60200101906001600160f81b031916908160001a90535061447c600a86615486565b945061441c565b7aff00000000000000ff00000000000000ff00000000000000ff00006bffffffff0000000000000000604083901c90811663ffffffff60c01b84161760201c63ffffffff60601b919091166001600160e01b031984161717601081901c9182167eff00000000000000ff00000000000000ff00000000000000ff000000000000821617600890811c7bff00000000000000ff00000000000000ff00000000000000ff000000939093167fff00000000000000ff00000000000000ff00000000000000ff000000000000009290921691909117919091179081901c7e0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f167f0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f00600492831c1617906145d1827f060606060606060606060606060606060606060606060606060606060606060661546e565b901c7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f166007614601919061549a565b61462b827f303030303030303030303030303030303030303030303030303030303030303061546e565b610b38919061546e565b6000600161464284611adc565b61464c91906154b9565b6000838152600a602052604090205490915080821461469f576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600b546000906146e4906001906154b9565b6000838152600c6020526040812054600b805493945090928490811061470c5761470c6155be565b9060005260206000200154905080600b838154811061472d5761472d6155be565b6000918252602080832090910192909255828152600c9091526040808220849055858252812055600b805480614765576147656155a8565b6001900381819060005260206000200160009055905550505050565b600061478c83611adc565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b8280546147d1906154fc565b90600052602060002090601f0160209004810192826147f35760008555614839565b82601f1061480c5782800160ff19823516178555614839565b82800160010185558215614839579182015b8281111561483957823582559160200191906001019061481e565b50612d699291506148b9565b828054614851906154fc565b90600052602060002090601f0160209004810192826148735760008555614839565b82601f1061488c57805160ff1916838001178555614839565b82800160010185558215614839579182015b8281111561483957825182559160200191906001019061489e565b5b80821115612d6957600081556001016148ba565b80356001600160a01b03811681146148e557600080fd5b919050565b803580151581146148e557600080fd5b60008083601f84011261490c57600080fd5b5081356001600160401b0381111561492357600080fd5b60208301915083602082850101111561493b57600080fd5b9250929050565b60006020828403121561495457600080fd5b613cb4826148ce565b6000806040838503121561497057600080fd5b614979836148ce565b9150614987602084016148ce565b90509250929050565b6000806000606084860312156149a557600080fd5b6149ae846148ce565b92506149bc602085016148ce565b9150604084013590509250925092565b600080600080608085870312156149e257600080fd5b6149eb856148ce565b93506149f9602086016148ce565b92506040850135915060608501356001600160401b0380821115614a1c57600080fd5b818701915087601f830112614a3057600080fd5b813581811115614a4257614a426155d4565b604051601f8201601f19908116603f01168101908382118183101715614a6a57614a6a6155d4565b816040528281528a6020848701011115614a8357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215614aba57600080fd5b614ac3836148ce565b9150614987602084016148ea565b60008060408385031215614ae457600080fd5b614aed836148ce565b946020939093013593505050565b600060208284031215614b0d57600080fd5b5035919050565b60008060408385031215614b2757600080fd5b82359150614987602084016148ce565b600080600060408486031215614b4c57600080fd5b8335925060208401356001600160401b03811115614b6957600080fd5b614b75868287016148fa565b9497909650939450505050565b600080600060608486031215614b9757600080fd5b505081359360208301359350604090920135919050565b60008060008060008060a08789031215614bc757600080fd5b863595506020870135945060408701359350614be5606088016148ea565b925060808701356001600160401b03811115614c0057600080fd5b614c0c89828a016148fa565b979a9699509497509295939492505050565b60008060008060808587031215614c3457600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215614c6257600080fd5b8135613cb4816155ea565b600060208284031215614c7f57600080fd5b8151613cb4816155ea565b600080600060408486031215614c9f57600080fd5b83356001600160401b03811115614cb557600080fd5b614cc1868287016148fa565b9094509250614cd49050602085016148ea565b90509250925092565b60008060008060608587031215614cf357600080fd5b84356001600160401b03811115614d0957600080fd5b614d15878288016148fa565b9095509350614d289050602086016148ea565b9150614d36604086016148ce565b905092959194509250565b60008151808452614d598160208601602086016154d0565b601f01601f19169290920160200192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151614da88185602086016154d0565b9290920192915050565b6bffffffffffffffffffffffff198460601b168152818360148301376000910160140190815292915050565b838152818360208301376000910160200190815292915050565b60008351614e0a8184602088016154d0565b835190830190614e1e8183602088016154d0565b01949350505050565b7f2261747472696275746573223a5b7b2274726169745f74797065223a2266616381527134b634ba3ca4b21116113b30b63ab2911d1160711b602082015260008651614e7a816032850160208b016154d0565b7f227d2c7b2274726169745f74797065223a2273706163654964222c2276616c756032918401918201526332911d1160e11b60528201528651614ec4816056840160208b016154d0565b7f227d2c7b2274726169745f74797065223a227374617274446179222c2276616c60569290910191820152643ab2911d1160d91b60768201528551614f1081607b840160208a016154d0565b7f227d2c7b2274726169745f74797065223a226e756d6265724f6644617973222c607b929091019182015268113b30b63ab2911d1160b91b609b820152614faf614fa0614f9a614f6360a4850189614d96565b7f227d2c7b2274726169745f74797065223a227175616e74697479222c2276616c8152643ab2911d1160d91b602082015260250190565b86614d96565b62227d5d60e81b815260030190565b98975050505050505050565b72226e616d65223a2253746179546f6b656e202360681b81528451600090614fea816013850160208a016154d0565b7f222c226465736372697074696f6e223a2253746179206174206c6f6467696e6760139184019182015273103330b1b4b634ba3c91161134b6b0b3b2911d1160611b60338201528551615044816047840160208a016154d0565b7111161132bc3a32b93730b62fbab936111d1160711b6047929091019182015284516150778160598401602089016154d0565b6573706163652f60d01b60599290910191820152835161509e81605f8401602088016154d0565b601160f91b605f92909101918201526060019695505050505050565b607b60f81b8152600083516150d68160018501602088016154d0565b600b60fa1b60019184019182015283516150f78160028401602088016154d0565b607d60f81b60029290910191820152600301949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161514981601d8501602087016154d0565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061518990830184614d41565b9695505050505050565b600060018060a01b0380881683528615156020840152851515604084015260a060608401526151c560a0840186614d41565b91508084166080840152509695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015615212578351835292840192918401916001016151f6565b50909695505050505050565b84151581526001600160a01b0384166020820152821515604082015260806060820181905260009061518990830184614d41565b8615158152856020820152846040820152836060820152821515608082015260c060a08201526000614faf60c0830184614d41565b878152866020820152856040820152846060820152831515608082015260c060a0820152600061301560c083018486614d6d565b8381526040602082015260006152d5604083018486614d6d565b95945050505050565b8681528560208201528460408201528315156060820152821515608082015260c060a08201526000614faf60c0830184614d41565b602081016002831061533557634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000613cb46020830184614d41565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f6e6c79206c6f6467696e6720666163696c697479206f776e657220697320616040820152651b1b1bddd95960d21b606082015260800190565b6020808252601b908201527f4f6e6c79207370616365206f776e657220697320616c6c6f7765640000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561548157615481615566565b500190565b6000826154955761549561557c565b500490565b60008160001904831182151516156154b4576154b4615566565b500290565b6000828210156154cb576154cb615566565b500390565b60005b838110156154eb5781810151838201526020016154d3565b838111156121f45750506000910152565b600181811c9082168061551057607f821691505b6020821081141561553157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561554b5761554b615566565b5060010190565b6000826155615761556161557c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461339f57600080fdfe4f6e6c7920666163696c697479206f776e6572206d617920616464205370616365734142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f68747470733a2f2f626166796265696767376d7777706e6e6d366d6d6b3374777863346172697a6f796336696a6e617965337064636977636f6868656f37786937686d2e697066732e647765622e6c696e6b2f746f6b656e2d696d6167652e706e67a2646970667358221220e3dc6c2a4070c213fe8f2ad116e4e0d1e71cf6e238094e4dcfc8b8ce3b84433764736f6c63430008070033
Deployed ByteCode
0x6080604052600436106102ac5760003560e01c806380d288f211610175578063bacf97a5116100dc578063e3aae3a511610095578063e994529e1161006f578063e994529e146108e7578063f7cdbc9d14610919578063ffae741514610939578063ffc1e09a1461096a57600080fd5b8063e3aae3a5146104ec578063e95a644f1461087e578063e985e9c51461089e57600080fd5b8063bacf97a5146107bb578063c87b56dd146107db578063cad302e4146107fb578063cf63247e146104ec578063d0470d7c1461083e578063e1e33b9c1461085e57600080fd5b80639ff682141161012e5780639ff6821414610706578063a22cb46514610733578063a468803214610753578063b38759fd14610773578063b88d4fde14610788578063b9e1aa03146107a857600080fd5b806380d288f2146105ff5780638b087fd11461061f5780638f201f5f146106715780639518f5fa1461069157806395d89b41146106b157806399b55556146106c657600080fd5b80632f745c59116102195780634f6ccce7116101d25780634f6ccce71461053f5780635ee7aa131461055f5780636352211e1461057f5780636a22dd261461059f57806370a08231146105bf578063741d308e146105df57600080fd5b80632f745c591461045a578063342df9b21461047a57806342842e0e146104ac578063438c9cab146104cc578063462ef5ed146104ec5780634c18a8ec1461050f57600080fd5b806318160ddd1161026b57806318160ddd146103a85780631bd2eeee146103c75780631bf7509b146103e757806320bf6ddb1461040757806323b872dd1461041a57806327d7cedb1461043a57600080fd5b8062442536146102b1578062d34b54146102d357806301ffc9a7146102fe57806306fdde031461032e578063081812fc14610350578063095ea7b314610388575b600080fd5b3480156102bd57600080fd5b506102d16102cc366004614afb565b61098a565b005b3480156102df57600080fd5b506102e8610a2c565b6040516102f591906151da565b60405180910390f35b34801561030a57600080fd5b5061031e610319366004614c50565b610b2d565b60405190151581526020016102f5565b34801561033a57600080fd5b50610343610b3e565b6040516102f5919061533b565b34801561035c57600080fd5b5061037061036b366004614afb565b610bd0565b6040516001600160a01b0390911681526020016102f5565b34801561039457600080fd5b506102d16103a3366004614ad1565b610c58565b3480156103b457600080fd5b50600b545b6040519081526020016102f5565b3480156103d357600080fd5b506102d16103e2366004614afb565b610d6e565b3480156103f357600080fd5b506102e8610402366004614942565b610eee565b6103b9610415366004614c1e565b610f5a565b34801561042657600080fd5b506102d1610435366004614990565b611239565b34801561044657600080fd5b506102e8610455366004614b82565b61126a565b34801561046657600080fd5b506103b9610475366004614ad1565b611425565b34801561048657600080fd5b5061049a610495366004614afb565b6114bb565b6040516102f596959493929190615252565b3480156104b857600080fd5b506102d16104c7366004614990565b61158a565b3480156104d857600080fd5b506102d16104e7366004614b37565b6115a5565b3480156104f857600080fd5b506103436040518060200160405280600081525081565b34801561051b57600080fd5b5061052f61052a366004614afb565b611636565b6040516102f5949392919061521e565b34801561054b57600080fd5b506103b961055a366004614afb565b611702565b34801561056b57600080fd5b506102d161057a366004614bae565b611795565b34801561058b57600080fd5b5061037061059a366004614afb565b6119d9565b3480156105ab57600080fd5b506102d16105ba366004614afb565b611a50565b3480156105cb57600080fd5b506103b96105da366004614942565b611adc565b3480156105eb57600080fd5b506102e86105fa366004614afb565b611b63565b34801561060b57600080fd5b506102d161061a366004614bae565b611ef3565b34801561062b57600080fd5b5061066461063a366004614ad1565b60009081526001602090815260408083206001600160a01b03949094168352929052205460ff1690565b6040516102f59190615313565b34801561067d57600080fd5b506102d161068c366004614b14565b611f8e565b34801561069d57600080fd5b506102e86106ac366004614afb565b61204f565b3480156106bd57600080fd5b506103436120af565b3480156106d257600080fd5b506103b96106e1366004614ad1565b6000908152602081815260408083206001600160a01b03949094168352929052205490565b34801561071257600080fd5b5061071e6362155d6e81565b60405163ffffffff90911681526020016102f5565b34801561073f57600080fd5b506102d161074e366004614aa7565b6120be565b34801561075f57600080fd5b506102d161076e366004614afb565b6120cd565b34801561077f57600080fd5b506102e861216b565b34801561079457600080fd5b506102d16107a33660046149cc565b6121c2565b6102d16107b6366004614ad1565b6121fa565b3480156107c757600080fd5b506102e86107d6366004614afb565b612204565b3480156107e757600080fd5b506103436107f6366004614afb565b612583565b34801561080757600080fd5b506103436040518060400160405280601781526020017668747470733a2f2f6c6f63616c686f73743a333030302f60481b81525081565b34801561084a57600080fd5b506102d1610859366004614afb565b61258e565b34801561086a57600080fd5b506102d1610879366004614c8a565b612628565b34801561088a57600080fd5b506102d1610899366004614afb565b612635565b3480156108aa57600080fd5b5061031e6108b936600461495d565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156108f357600080fd5b50610907610902366004614afb565b61278c565b6040516102f5969594939291906152de565b34801561092557600080fd5b506102d1610934366004614cdd565b612854565b34801561094557600080fd5b50610959610954366004614afb565b612aca565b6040516102f5959493929190615193565b34801561097657600080fd5b506102e8610985366004614afb565b612b9d565b60008181526010602052604090205481906001600160a01b0316336001600160a01b0316146109d45760405162461bcd60e51b81526004016109cb906153a0565b60405180910390fd5b6000828152601060209081526040808320805460ff60a01b191690558051858152918201929092527f5c33859dfe8722791b5d72ad942a0895181f8a694288ec429394f620de15032091015b60405180910390a15050565b6060610a36612cf5565b6001600160401b03811115610a4d57610a4d6155d4565b604051908082528060200260200182016040528015610a76578160200160208202803683370190505b5090506000805b600e54811015610b285760106000600e8381548110610a9e57610a9e6155be565b9060005260206000200154815260200190815260200160002060000160149054906101000a900460ff1615610b1657600e8181548110610ae057610ae06155be565b9060005260206000200154838381518110610afd57610afd6155be565b602090810291909101015281610b1281615537565b9250505b80610b2081615537565b915050610a7d565b505090565b6000610b3882612d6d565b92915050565b606060028054610b4d906154fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b79906154fc565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b5050505050905090565b6000610bdb82612d92565b610c3c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109cb565b506000908152600660205260409020546001600160a01b031690565b6000610c63826119d9565b9050806001600160a01b0316836001600160a01b03161415610cd15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109cb565b336001600160a01b0382161480610ced5750610ced81336108b9565b610d5f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109cb565b610d698383612daf565b505050565b60008181526014602052604090206004810154610100900460ff1615610dcc5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e4818da1958dad959081bdd5d606a1b60448201526064016109cb565b8054600081815260126020908152604080832054835260109091529020546001600160a01b0316338114610e125760405162461bcd60e51b81526004016109cb906153e6565b4283600201548460010154610e27919061546e565b610e34906201518061549a565b610e42906362155d6e61546e565b1015610e905760405162461bcd60e51b815260206004820152601e60248201527f466f7262696464656e20756e6c65737320636865636b6f75742064617465000060448201526064016109cb565b60048301805461ff001916610100179055610eb4610ead856119d9565b8284612e1d565b6040518481527f2c276699fefbad45f18509233bc03bb9cfdf41b18f32756933188bdef35fef55906020015b60405180910390a150505050565b6001600160a01b0381166000908152600f6020908152604091829020805483518184028101840190945280845260609392830182828015610f4e57602002820191906000526020600020905b815481526020019060010190808311610f3a575b50505050509050919050565b6000610f67858585612e28565b60008581526012602052604081206002810154909190610f87858761549a565b610f91919061549a565b905080341015610fd85760405162461bcd60e51b81526020600482015260126024820152714e6565642e204d6f72652e204d6f6e65792160701b60448201526064016109cb565b60005b858110156110b15760008881526013602052604081208691610ffd848b61546e565b815260200190815260200160002054846001015461101b91906154b9565b10156110625760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420696e76656e746f727960501b60448201526064016109cb565b6000888152601360205260408120869161107c848b61546e565b81526020019081526020016000206000828254611099919061546e565b909155508190506110a981615537565b915050610fdb565b506110bc33886121fa565b6110ca600d80546001019055565b60006110d5600d5490565b90506110e13382612fb8565b600061113e8285600001548b8b8b8b6040518060a0016040528060628152602001615663606291396040518060400160405280601781526020017668747470733a2f2f6c6f63616c686f73743a333030302f60481b815250612fd2565b905061114a8282613022565b6040805160c0810182528a815260208082018b81528284018b8152606084018b815260006080860181815260a087018281528a8352601487528883209751885594516001888101919091559351600288015591516003870155905160049095018054935115156101000261ff00199615159690961661ffff1990941693909317949094179091558c835260158252838320805491820181558352912001839055517fe04083eb622e3cb7d063f319076c83270c24acb409a3bc13abcfb36af60f861790611223908b908590918252602082015260400190565b60405180910390a150925050505b949350505050565b61124333826130ad565b61125f5760405162461bcd60e51b81526004016109cb9061541d565b610d69838383613193565b6060611277848484612e28565b6000848152601260209081526040808320815160c08101835281548152600182015493810193909352600281015491830191909152600381015460ff80821615156060850152610100909104161515608083015260048101805460a0840191906112e0906154fc565b80601f016020809104026020016040519081016040528092919081815260200182805461130c906154fc565b80156113595780601f1061132e57610100808354040283529160200191611359565b820191906000526020600020905b81548152906001019060200180831161133c57829003601f168201915b50505050508152505090506000836001600160401b0381111561137e5761137e6155d4565b6040519080825280602002602001820160405280156113a7578160200160208202803683370190505b50905060005b8481101561141b576000878152601360205260408120906113ce838961546e565b81526020019081526020016000205483602001516113ec91906154b9565b8282815181106113fe576113fe6155be565b60209081029190910101528061141381615537565b9150506113ad565b5095945050505050565b600061143083611adc565b82106114925760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109cb565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6000818152601260205260409020600381015481546001830154600284015460048501805460ff610100870481169795969495939416926060929091611500906154fc565b80601f016020809104026020016040519081016040528092919081815260200182805461152c906154fc565b80156115795780601f1061154e57610100808354040283529160200191611579565b820191906000526020600020905b81548152906001019060200180831161155c57829003601f168201915b505050505091505091939550919395565b610d69838383604051806020016040528060008152506121c2565b60008381526010602052604090205483906001600160a01b0316336001600160a01b0316146115e65760405162461bcd60e51b81526004016109cb906153a0565b60008481526010602052604090206116029060010184846147c5565b507fb252d91e8d424ba6f9f1647d21d7b0bbd8e2a3cbb318aaecb0d735fba9f62c7f848484604051610ee0939291906152bb565b6000818152601060205260409020805460018201805460ff600160a81b84048116946001600160a01b03851694600160a01b90049091169260609261167a906154fc565b80601f01602080910402602001604051908101604052809291908181526020018280546116a6906154fc565b80156116f35780601f106116c8576101008083540402835291602001916116f3565b820191906000526020600020905b8154815290600101906020018083116116d657829003601f168201915b50505050509150509193509193565b600061170d600b5490565b82106117705760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109cb565b600b8281548110611783576117836155be565b90600052602060002001549050919050565b8561179f8161333a565b6117c181604051806060016040528060228152602001615601602291396133a2565b61180083838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133db92505050565b600081848460405160200161181793929190614dde565b60408051808303601f19018152918152815160209283012060008181526012909352912060030154909150610100900460ff161561188e5760405162461bcd60e51b8152602060048201526014602482015273537061636520616c72656164792065786973747360601b60448201526064016109cb565b6040518060c00160405280838152602001888152602001878152602001861515815260200160011515815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452505083815260126020908152604091829020845181558482015160018201559184015160028301556060840151600383018054608087015115156101000261ff00199315159390931661ffff199091161791909117905560a084015180519293506119669260048501929190910190614845565b505050600082815260116020908152604080832080546001810182559084529190922001829055517f335958c15e70938d2bfae6c90457d7732a3e398f2423c491dc6503b67334745a906119c790839085908b908b908b908b908b90615287565b60405180910390a15050505050505050565b6000818152600460205260408120546001600160a01b031680610b385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109cb565b60008181526010602052604090205481906001600160a01b0316336001600160a01b031614611a915760405162461bcd60e51b81526004016109cb906153a0565b60008281526010602052604090819020805460ff60a81b19169055517f9cb52f05776b0f321eb9ca8c9e1b26b978036072417bf384bd406189f43864f890610a209084815260200190565b60006001600160a01b038216611b475760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109cb565b506001600160a01b031660009081526005602052604090205490565b60606362155d6e421015611ba45760005b604051908082528060200260200182016040528015611b9d578160200160208202803683370190505b5092915050565b6000611baf83612b9d565b9050600062015180611bc56362155d6e426154b9565b611bcf9190615486565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529192509060005b8451811015611d3c5760005b60156000878481518110611c2957611c296155be565b6020026020010151815260200190815260200160002080549050811015611d29576014600060156000898681518110611c6457611c646155be565b602002602001015181526020019081526020016000208381548110611c8b57611c8b6155be565b600091825260208083209091015483528281019390935260409182019020815160c08101835281548152600182015493810184905260028201549281018390526003820154606082015260049091015460ff8082161515608084015261010090910416151560a082015294508691611d03919061546e565b1115611d175783611d1381615537565b9450505b80611d2181615537565b915050611c13565b5080611d3481615537565b915050611c07565b506000826001600160401b03811115611d5757611d576155d4565b604051908082528060200260200182016040528015611d80578160200160208202803683370190505b5090506000805b84811015611ee65760005b60156000898481518110611da857611da86155be565b6020026020010151815260200190815260200160002080549050811015611ed35760146000601560008b8681518110611de357611de36155be565b602002602001015181526020019081526020016000208381548110611e0a57611e0a6155be565b600091825260208083209091015483528281019390935260409182019020815160c08101835281548152600182015493810184905260028201549281018390526003820154606082015260049091015460ff8082161515608084015261010090910416151560a082015296508891611e82919061546e565b1115611ec157878281518110611e9a57611e9a6155be565b6020026020010151848481518110611eb457611eb46155be565b6020026020010181815250505b80611ecb81615537565b915050611d92565b5080611ede81615537565b915050611d87565b5090979650505050505050565b6000868152601260209081526040808320548352601090915290205486906001600160a01b0316336001600160a01b031614611f415760405162461bcd60e51b81526004016109cb906153e6565b600087815260126020526040908190208054915190917f335958c15e70938d2bfae6c90457d7732a3e398f2423c491dc6503b67334745a916119c7918b918b908b908b908b908b90615287565b60008281526010602052604090205482906001600160a01b0316336001600160a01b031614611fcf5760405162461bcd60e51b81526004016109cb906153a0565b6000838152601060209081526040918290205491518581526001600160a01b038581169316917f11a520c5c4bfade8b450399ea67096dba36478d23d9a45f02e32989cfe307dde910160405180910390a35060009182526010602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b600081815260116020908152604091829020805483518184028101840190945280845260609392830182828015610f4e5760200282019190600052602060002090815481526020019060010190808311610f3a5750505050509050919050565b606060038054610b4d906154fc565b6120c933838361342c565b5050565b60008181526010602052604090205481906001600160a01b0316336001600160a01b03161461210e5760405162461bcd60e51b81526004016109cb906153a0565b60008281526010602052604090819020805460ff60a01b1916600160a01b179055517f5c33859dfe8722791b5d72ad942a0895181f8a694288ec429394f620de15032090610a209084906001909182521515602082015260400190565b6060600e805480602002602001604051908101604052809291908181526020018280548015610bc657602002820191906000526020600020905b8154815260200190600101908083116121a5575050505050905090565b6121cc33836130ad565b6121e85760405162461bcd60e51b81526004016109cb9061541d565b6121f4848484846134fb565b50505050565b6120c9828261352e565b60606362155d6e421015612219576000611b74565b600061222483612b9d565b905060006201518061223a6362155d6e426154b9565b6122449190615486565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529192509060005b84518110156123c55760005b6015600087848151811061229e5761229e6155be565b60200260200101518152602001908152602001600020805490508110156123b25760146000601560008986815181106122d9576122d96155be565b602002602001015181526020019081526020016000208381548110612300576123006155be565b600091825260208083209091015483528281019390935260409182019020815160c081018352815481526001820154938101849052600282015492810192909252600381015460608301526004015460ff8082161515608084015261010090910416151560a08201529350851080159061238d575082604001518360200151612389919061546e565b8511155b156123a0578361239c81615537565b9450505b806123aa81615537565b915050612288565b50806123bd81615537565b91505061227c565b506000826001600160401b038111156123e0576123e06155d4565b604051908082528060200260200182016040528015612409578160200160208202803683370190505b5090506000805b84811015611ee65760005b60156000898481518110612431576124316155be565b60200260200101518152602001908152602001600020805490508110156125705760146000601560008b868151811061246c5761246c6155be565b602002602001015181526020019081526020016000208381548110612493576124936155be565b600091825260208083209091015483528281019390935260409182019020815160c081018352815481526001820154938101849052600282015492810192909252600381015460608301526004015460ff8082161515608084015261010090910416151560a08201529550871080159061252057508460400151856020015161251c919061546e565b8711155b1561255e57878281518110612537576125376155be565b6020026020010151848481518110612551576125516155be565b6020026020010181815250505b8061256881615537565b91505061241b565b508061257b81615537565b915050612410565b6060610b38826135cd565b6000818152601260209081526040808320548352601090915290205481906001600160a01b0316336001600160a01b0316146125dc5760405162461bcd60e51b81526004016109cb906153e6565b60008281526012602052604090819020600301805461ff0019169055517fdacbd8b39f92f5e1f1a3bbbef3779e6a600dc62a4323325cd1676f681197464c90610a209084815260200190565b610d698383836000612854565b8061263f816119d9565b6001600160a01b0316336001600160a01b03161461269f5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79207374617920746f6b656e206f776e657220697320616c6c6f77656460448201526064016109cb565b6000828152601460205260409020600481015460ff16156126f75760405162461bcd60e51b815260206004820152601260248201527120b63932b0b23c9031b432b1b5b2b21034b760711b60448201526064016109cb565b805460008181526012602052604090206002015460048301805460ff19166001179055612752612726866119d9565b600084815260126020908152604080832054835260109091529020546001600160a01b0316838561373c565b6040518581527fdf06c27528e294967ba5e32e69b9c5fe102a58c699c44740c2c4c6afc71925359060200160405180910390a15050505050565b6012602052600090815260409020805460018201546002830154600384015460048501805494959394929360ff8084169461010090940416929091906127d1906154fc565b80601f01602080910402602001604051908101604052809291908181526020018280546127fd906154fc565b801561284a5780601f1061281f5761010080835404028352916020019161284a565b820191906000526020600020905b81548152906001019060200180831161282d57829003601f168201915b5050505050905086565b61289384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133db92505050565b60003385856040516020016128aa93929190614db2565b60408051808303601f19018152918152815160209283012060008181526010909352912054909150600160a81b900460ff16156129295760405162461bcd60e51b815260206004820152601760248201527f466163696c69747920616c72656164792065786973747300000000000000000060448201526064016109cb565b6040518060a0016040528061293b3390565b6001600160a01b03168152602001841515815260200160011515815260200186868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506001600160a01b03808616602093840152848252601083526040918290208451815486860151948701511515600160a81b0260ff60a81b19951515600160a01b026001600160a81b031990921692909416919091171792909216178155606083015180519192612a0a92600185019290910190614845565b5060809190910151600290910180546001600160a01b0319166001600160a01b03909216919091179055600e805460018181019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055336000818152600f60209081526040808320805495860181558352912090920183905590517f28c9a25063d40c8cf423202182ed575cc97982c1fd1771bd9721e19a38cc491d90612abb908490899089906152bb565b60405180910390a25050505050565b601060205260009081526040902080546001820180546001600160a01b0383169360ff600160a01b8504811694600160a81b900416929091612b0b906154fc565b80601f0160208091040260200160405190810160405280929190818152602001828054612b37906154fc565b8015612b845780601f10612b5957610100808354040283529160200191612b84565b820191906000526020600020905b815481529060010190602001808311612b6757829003601f168201915b505050600290930154919250506001600160a01b031685565b6060612ba8826137ba565b6001600160401b03811115612bbf57612bbf6155d4565b604051908082528060200260200182016040528015612be8578160200160208202803683370190505b50600083815260116020908152604080832080548251818502810185019093528083529495509293909291830182828015612c4257602002820191906000526020600020905b815481526020019060010190808311612c2e575b50505050509050600080600090505b8251811015612ced5760126000848381518110612c7057612c706155be565b60209081029190910181015182528101919091526040016000206003015460ff1615612cdb57828181518110612ca857612ca86155be565b6020026020010151848381518110612cc257612cc26155be565b602090810291909101015281612cd781615537565b9250505b80612ce581615537565b915050612c51565b505050919050565b6000805b600e54811015612d695760106000600e8381548110612d1a57612d1a6155be565b9060005260206000200154815260200190815260200160002060000160149054906101000a900460ff1615612d575781612d5381615537565b9250505b80612d6181615537565b915050612cf9565b5090565b60006001600160e01b0319821663780e9d6360e01b1480610b385750610b3882613837565b6000908152600460205260409020546001600160a01b0316151590565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612de4826119d9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610d69838383613887565b612e356202a300426154b9565b612e42836201518061549a565b612e50906362155d6e61546e565b11612e965760405162461bcd60e51b8152602060048201526016602482015275111bdb89dd081cdd185e481a5b881d1a19481c185cdd60521b60448201526064016109cb565b60008381526012602090815260408083205483526010909152902054600160a01b900460ff16612f085760405162461bcd60e51b815260206004820152601c60248201527f4c6f6467696e6720466163696c69747920697320696e6163746976650000000060448201526064016109cb565b60008381526012602052604090206003015460ff16612f5d5760405162461bcd60e51b8152602060048201526011602482015270537061636520697320696e61637469766560781b60448201526064016109cb565b60008111610d695760405162461bcd60e51b815260206004820152602260248201527f4e756d626572206f6620646179732073686f756c642062652031206f72206d6f604482015261726560f01b60648201526084016109cb565b6120c98282604051806020016040528060008152506139cb565b6060613015612fe38a85858b6139fe565b612ff08a8a8a8a8a613a40565b6040516020016130019291906150ba565b604051602081830303815290604052613a9d565b9998505050505050505050565b61302b82612d92565b61308e5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016109cb565b60008281526008602090815260409091208251610d6992840190614845565b60006130b882612d92565b6131195760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109cb565b6000613124836119d9565b9050806001600160a01b0316846001600160a01b0316148061315f5750836001600160a01b031661315484610bd0565b6001600160a01b0316145b8061123157506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff16611231565b826001600160a01b03166131a6826119d9565b6001600160a01b03161461320a5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109cb565b6001600160a01b03821661326c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109cb565b613277838383613ace565b613282600082612daf565b6001600160a01b03831660009081526005602052604081208054600192906132ab9084906154b9565b90915550506001600160a01b03821660009081526005602052604081208054600192906132d990849061546e565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260106020526040902054600160a81b900460ff1661339f5760405162461bcd60e51b815260206004820152601760248201527f466163696c69747920646f6573206e6f7420657869737400000000000000000060448201526064016109cb565b50565b60008281526010602052604090205481906001600160a01b03163314610d695760405162461bcd60e51b81526004016109cb919061533b565b600081511161339f5760405162461bcd60e51b815260206004820152601960248201527f4461746120555249206d7573742062652070726f76696465640000000000000060448201526064016109cb565b816001600160a01b0316836001600160a01b0316141561348e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109cb565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613506848484613193565b61351284848484613ad9565b6121f45760405162461bcd60e51b81526004016109cb9061534e565b6000818152602081815260408083206001600160a01b038616845290915281208054349283929161356090849061546e565b909155505060008281526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916905580518481529182018590527fd7eda976cf4919f13172eb15bb39c64cecb7172258c741dab31d14c855eff402910160405180910390a2505050565b60606135d882612d92565b61363e5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016109cb565b60008281526008602052604081208054613657906154fc565b80601f0160208091040260200160405190810160405280929190818152602001828054613683906154fc565b80156136d05780601f106136a5576101008083540402835291602001916136d0565b820191906000526020600020905b8154815290600101906020018083116136b357829003601f168201915b5050505050905060006136ee60408051602081019091526000815290565b9050805160001415613701575092915050565b81511561373357808260405160200161371b929190614df8565b60405160208183030381529060405292505050919050565b61123184613be3565b6000818152601260205260409020600201548211156137ae5760405162461bcd60e51b815260206004820152602860248201527f576974686472617720616d6f756e74206e6f7420616c6c6f777320696e207468604482015267697320737461746560c01b60648201526084016109cb565b6121f484848484613cbb565b6000818152601160205260408120815b815481101561383057601260008383815481106137e9576137e96155be565b6000918252602080832090910154835282019290925260400190206003015460ff161561381e578261381a81615537565b9350505b8061382881615537565b9150506137ca565b5050919050565b60006001600160e01b031982166380ac58cd60e01b148061386857506001600160e01b03198216635b5e139f60e01b145b80610b3857506301ffc9a760e01b6001600160e01b0319831614610b38565b6000818152602081815260408083206001600160a01b0387168085529083528184205485855260018085528386209286529190935292205490919060ff16818111156138d5576138d5615592565b146139365760405162461bcd60e51b815260206004820152602b60248201527f436f6d706c657465207769746864726177206e6f7420616c6c6f77656420696e60448201526a207468697320737461746560a81b60648201526084016109cb565b6000828152602081815260408083206001600160a01b0388168452909152812055806121f45761396f6001600160a01b03841682613deb565b826001600160a01b0316846001600160a01b03167f6000e90278b62c00aaaf621956141fad63f2be8860557c31de1f736cafae291683856040516139bd929190918252602082015260400190565b60405180910390a350505050565b6139d58383613f04565b6139e26000848484613ad9565b610d695760405162461bcd60e51b81526004016109cb9061534e565b6060613a0985614043565b8484613a1485614140565b604051602001613a279493929190614fbb565b6040516020818303038152906040529050949350505050565b6060613a4b86614140565b613a5486614140565b613a5d86614043565b613a6686614043565b613a6f86614043565b604051602001613a83959493929190614e27565b604051602081830303815290604052905095945050505050565b6060613aa88261417b565b604051602001613ab89190615111565b6040516020818303038152906040529050919050565b610d698383836142ce565b60006001600160a01b0384163b15613bdb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613b1d903390899088908890600401615156565b602060405180830381600087803b158015613b3757600080fd5b505af1925050508015613b67575060408051601f3d908101601f19168201909252613b6491810190614c6d565b60015b613bc1573d808015613b95576040519150601f19603f3d011682016040523d82523d6000602084013e613b9a565b606091505b508051613bb95760405162461bcd60e51b81526004016109cb9061534e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611231565b506001611231565b6060613bee82612d92565b613c525760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109cb565b6000613c6960408051602081019091526000815290565b90506000815111613c895760405180602001604052806000815250613cb4565b80613c9384614386565b604051602001613ca4929190614df8565b6040516020818303038152906040525b9392505050565b6000818152602081815260408083206001600160a01b0388168452909152902054821115613d205760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016109cb565b6000818152602081815260408083206001600160a01b0388168452909152902054613d4c9083906154b9565b6000828152602081815260408083206001600160a01b038981168086529184528285209590955585845260018084528285209185529252909120805460ff19169091179055613d9d90841683613deb565b826001600160a01b0316846001600160a01b03167f6000e90278b62c00aaaf621956141fad63f2be8860557c31de1f736cafae291684846040516139bd929190918252602082015260400190565b80471015613e3b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109cb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e88576040519150601f19603f3d011682016040523d82523d6000602084013e613e8d565b606091505b5050905080610d695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109cb565b6001600160a01b038216613f5a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109cb565b613f6381612d92565b15613fb05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109cb565b613fbc60008383613ace565b6001600160a01b0382166000908152600560205260408120805460019290613fe590849061546e565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816140675750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614091578061407b81615537565b915061408a9050600a83615486565b915061406b565b6000816001600160401b038111156140ab576140ab6155d4565b6040519080825280601f01601f1916602001820160405280156140d5576020820181803683370190505b5090505b8415611231576140ea6001836154b9565b91506140f7600a86615552565b61410290603061546e565b60f81b818381518110614117576141176155be565b60200101906001600160f81b031916908160001a905350614139600a86615486565b94506140d9565b606061414b82614483565b614158608084901b614483565b60405161060f60f31b602082015260228101929092526042820152606201613ab8565b606081516000141561419b57505060408051602081019091526000815290565b600060405180606001604052806040815260200161562360409139905060006003845160026141ca919061546e565b6141d49190615486565b6141df90600461549a565b6001600160401b038111156141f6576141f66155d4565b6040519080825280601f01601f191660200182016040528015614220576020820181803683370190505b509050600182016020820185865187015b8082101561428c576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250614231565b50506003865106600181146142a857600281146142bb576142c3565b603d6001830353603d60028303536142c3565b603d60018303535b509195945050505050565b6001600160a01b0383166143295761432481600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b61434c565b816001600160a01b0316836001600160a01b03161461434c5761434c8382614635565b6001600160a01b03821661436357610d69816146d2565b826001600160a01b0316826001600160a01b031614610d6957610d698282614781565b6060816143aa5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156143d457806143be81615537565b91506143cd9050600a83615486565b91506143ae565b6000816001600160401b038111156143ee576143ee6155d4565b6040519080825280601f01601f191660200182016040528015614418576020820181803683370190505b5090505b84156112315761442d6001836154b9565b915061443a600a86615552565b61444590603061546e565b60f81b81838151811061445a5761445a6155be565b60200101906001600160f81b031916908160001a90535061447c600a86615486565b945061441c565b7aff00000000000000ff00000000000000ff00000000000000ff00006bffffffff0000000000000000604083901c90811663ffffffff60c01b84161760201c63ffffffff60601b919091166001600160e01b031984161717601081901c9182167eff00000000000000ff00000000000000ff00000000000000ff000000000000821617600890811c7bff00000000000000ff00000000000000ff00000000000000ff000000939093167fff00000000000000ff00000000000000ff00000000000000ff000000000000009290921691909117919091179081901c7e0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f167f0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f00600492831c1617906145d1827f060606060606060606060606060606060606060606060606060606060606060661546e565b901c7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f166007614601919061549a565b61462b827f303030303030303030303030303030303030303030303030303030303030303061546e565b610b38919061546e565b6000600161464284611adc565b61464c91906154b9565b6000838152600a602052604090205490915080821461469f576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600b546000906146e4906001906154b9565b6000838152600c6020526040812054600b805493945090928490811061470c5761470c6155be565b9060005260206000200154905080600b838154811061472d5761472d6155be565b6000918252602080832090910192909255828152600c9091526040808220849055858252812055600b805480614765576147656155a8565b6001900381819060005260206000200160009055905550505050565b600061478c83611adc565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b8280546147d1906154fc565b90600052602060002090601f0160209004810192826147f35760008555614839565b82601f1061480c5782800160ff19823516178555614839565b82800160010185558215614839579182015b8281111561483957823582559160200191906001019061481e565b50612d699291506148b9565b828054614851906154fc565b90600052602060002090601f0160209004810192826148735760008555614839565b82601f1061488c57805160ff1916838001178555614839565b82800160010185558215614839579182015b8281111561483957825182559160200191906001019061489e565b5b80821115612d6957600081556001016148ba565b80356001600160a01b03811681146148e557600080fd5b919050565b803580151581146148e557600080fd5b60008083601f84011261490c57600080fd5b5081356001600160401b0381111561492357600080fd5b60208301915083602082850101111561493b57600080fd5b9250929050565b60006020828403121561495457600080fd5b613cb4826148ce565b6000806040838503121561497057600080fd5b614979836148ce565b9150614987602084016148ce565b90509250929050565b6000806000606084860312156149a557600080fd5b6149ae846148ce565b92506149bc602085016148ce565b9150604084013590509250925092565b600080600080608085870312156149e257600080fd5b6149eb856148ce565b93506149f9602086016148ce565b92506040850135915060608501356001600160401b0380821115614a1c57600080fd5b818701915087601f830112614a3057600080fd5b813581811115614a4257614a426155d4565b604051601f8201601f19908116603f01168101908382118183101715614a6a57614a6a6155d4565b816040528281528a6020848701011115614a8357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215614aba57600080fd5b614ac3836148ce565b9150614987602084016148ea565b60008060408385031215614ae457600080fd5b614aed836148ce565b946020939093013593505050565b600060208284031215614b0d57600080fd5b5035919050565b60008060408385031215614b2757600080fd5b82359150614987602084016148ce565b600080600060408486031215614b4c57600080fd5b8335925060208401356001600160401b03811115614b6957600080fd5b614b75868287016148fa565b9497909650939450505050565b600080600060608486031215614b9757600080fd5b505081359360208301359350604090920135919050565b60008060008060008060a08789031215614bc757600080fd5b863595506020870135945060408701359350614be5606088016148ea565b925060808701356001600160401b03811115614c0057600080fd5b614c0c89828a016148fa565b979a9699509497509295939492505050565b60008060008060808587031215614c3457600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215614c6257600080fd5b8135613cb4816155ea565b600060208284031215614c7f57600080fd5b8151613cb4816155ea565b600080600060408486031215614c9f57600080fd5b83356001600160401b03811115614cb557600080fd5b614cc1868287016148fa565b9094509250614cd49050602085016148ea565b90509250925092565b60008060008060608587031215614cf357600080fd5b84356001600160401b03811115614d0957600080fd5b614d15878288016148fa565b9095509350614d289050602086016148ea565b9150614d36604086016148ce565b905092959194509250565b60008151808452614d598160208601602086016154d0565b601f01601f19169290920160200192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151614da88185602086016154d0565b9290920192915050565b6bffffffffffffffffffffffff198460601b168152818360148301376000910160140190815292915050565b838152818360208301376000910160200190815292915050565b60008351614e0a8184602088016154d0565b835190830190614e1e8183602088016154d0565b01949350505050565b7f2261747472696275746573223a5b7b2274726169745f74797065223a2266616381527134b634ba3ca4b21116113b30b63ab2911d1160711b602082015260008651614e7a816032850160208b016154d0565b7f227d2c7b2274726169745f74797065223a2273706163654964222c2276616c756032918401918201526332911d1160e11b60528201528651614ec4816056840160208b016154d0565b7f227d2c7b2274726169745f74797065223a227374617274446179222c2276616c60569290910191820152643ab2911d1160d91b60768201528551614f1081607b840160208a016154d0565b7f227d2c7b2274726169745f74797065223a226e756d6265724f6644617973222c607b929091019182015268113b30b63ab2911d1160b91b609b820152614faf614fa0614f9a614f6360a4850189614d96565b7f227d2c7b2274726169745f74797065223a227175616e74697479222c2276616c8152643ab2911d1160d91b602082015260250190565b86614d96565b62227d5d60e81b815260030190565b98975050505050505050565b72226e616d65223a2253746179546f6b656e202360681b81528451600090614fea816013850160208a016154d0565b7f222c226465736372697074696f6e223a2253746179206174206c6f6467696e6760139184019182015273103330b1b4b634ba3c91161134b6b0b3b2911d1160611b60338201528551615044816047840160208a016154d0565b7111161132bc3a32b93730b62fbab936111d1160711b6047929091019182015284516150778160598401602089016154d0565b6573706163652f60d01b60599290910191820152835161509e81605f8401602088016154d0565b601160f91b605f92909101918201526060019695505050505050565b607b60f81b8152600083516150d68160018501602088016154d0565b600b60fa1b60019184019182015283516150f78160028401602088016154d0565b607d60f81b60029290910191820152600301949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161514981601d8501602087016154d0565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061518990830184614d41565b9695505050505050565b600060018060a01b0380881683528615156020840152851515604084015260a060608401526151c560a0840186614d41565b91508084166080840152509695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015615212578351835292840192918401916001016151f6565b50909695505050505050565b84151581526001600160a01b0384166020820152821515604082015260806060820181905260009061518990830184614d41565b8615158152856020820152846040820152836060820152821515608082015260c060a08201526000614faf60c0830184614d41565b878152866020820152856040820152846060820152831515608082015260c060a0820152600061301560c083018486614d6d565b8381526040602082015260006152d5604083018486614d6d565b95945050505050565b8681528560208201528460408201528315156060820152821515608082015260c060a08201526000614faf60c0830184614d41565b602081016002831061533557634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000613cb46020830184614d41565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f6e6c79206c6f6467696e6720666163696c697479206f776e657220697320616040820152651b1b1bddd95960d21b606082015260800190565b6020808252601b908201527f4f6e6c79207370616365206f776e657220697320616c6c6f7765640000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561548157615481615566565b500190565b6000826154955761549561557c565b500490565b60008160001904831182151516156154b4576154b4615566565b500290565b6000828210156154cb576154cb615566565b500390565b60005b838110156154eb5781810151838201526020016154d3565b838111156121f45750506000910152565b600181811c9082168061551057607f821691505b6020821081141561553157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561554b5761554b615566565b5060010190565b6000826155615761556161557c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461339f57600080fdfe4f6e6c7920666163696c697479206f776e6572206d617920616464205370616365734142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f68747470733a2f2f626166796265696767376d7777706e6e6d366d6d6b3374777863346172697a6f796336696a6e617965337064636977636f6868656f37786937686d2e697066732e647765622e6c696e6b2f746f6b656e2d696d6167652e706e67a2646970667358221220e3dc6c2a4070c213fe8f2ad116e4e0d1e71cf6e238094e4dcfc8b8ce3b84433764736f6c63430008070033