ETH Price: $3,316.48 (+2.74%)

Token

EtherTulip (🌷)
 

Overview

Max Total Supply

0 🌷

Holders

79

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
dontpanictoo.eth
Balance
1 🌷
0x84ab6aeda45c85b910c363a454c5c0e93d8691a2
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EtherTulip

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : EtherTulip.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";

// This is a revised version of the revised version of the original EtherRock contract 0x41f28833Be34e6EDe3c58D1f597bef429861c4E2 with all the rocks removed and rock properties replaced by tulips.
// The original contract at 0x41f28833Be34e6EDe3c58D1f597bef429861c4E2 had a simple mistake in the buyRock() function where it would mint a rock and not a tulip. The line:
// require(rocks[rockNumber].currentlyForSale == true);
// Had to check for the existance of a tulip, as follows:
// require(tulips[tulipNumber].currentlyForSale == true);
// Therefore in the original contract, anyone could buy anyone elses rock whereas they should have been buying a tulip (regardless of whether the owner chose to sell it or not)

contract EtherTulip is ERC721("EtherTulip", unicode"🌷") {
    struct Tulip {
        uint256 listingTime;
        uint256 price;
        uint256 timesSold;
    }

    mapping(uint256 => Tulip) public tulips;

    uint256 public latestNewTulipForSale;

    address public immutable feeRecipient;

    event TulipForSale(uint256 tulipNumber, address owner, uint256 price);
    event TulipNotForSale(uint256 tulipNumber, address owner);
    event TulipSold(uint256 tulipNumber, address buyer, uint256 price);

    constructor(address _feeRecipient) {
        // set fee recipient
        feeRecipient = _feeRecipient;
        // mint founder tulip to yours and only
        ERC721._mint(address(0x777B0884f97Fd361c55e472530272Be61cEb87c8), 0);
        // initialize auction for second tulip
        latestNewTulipForSale = 1;
        tulips[latestNewTulipForSale].listingTime = block.timestamp;
    }

    // Dutch-ish Auction

    function currentPrice(uint256 tulipNumber) public view returns (uint256 price) {
        if (tulipNumber == latestNewTulipForSale) {
            // if currently in auction
            uint256 initialPrice = 1000 ether;
            uint256 decayPeriod = 1 days;
            // price = initial_price - initial_price * (current_time - start_time) / decay_period
            uint256 elapsedTime = block.timestamp - tulips[tulipNumber].listingTime;
            if (elapsedTime >= decayPeriod) return 0;
            return initialPrice - ((initialPrice * elapsedTime) / decayPeriod);
        } else {
            // if not in auction
            return tulips[tulipNumber].price;
        }
    }

    // ERC721

    function _baseURI() internal pure override returns (string memory) {
        return "ipfs://";
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        string memory bulbURI = "bafkreiamkokggzkchkosx5jvz6fduzwcn7qugkp7pytmk327sblrtwa4ze";
        string[100] memory tulipURIs = [
            "bafkreiajlq3nd3nc7xu245eqwnoqkh4fz25rdkinw7wkjtqp54xcbxdski",
            "bafkreickj5f3dw6abk4ezj6vvephroacnizpt474jxjffccklci4bm7ulu",
            "bafkreid3ckzlcv3p6zh3o3cwbryno3keqvzyagptnxtoer3awuvyeydz4u",
            "bafkreid43dy6zwtnvwo6skonl4tcechlhnu7rihp2gnvoaydpxn3qw6yva",
            "bafkreicnjnnu6w3crbzxkoa2g625avmnecrh4ptmuvj2q5izygeqhttjny",
            "bafkreiaefcjmmploftqi6ao3dzrpjttnrhay2hqit5pxtzpwkismviwi7e",
            "bafkreid2jrk7rquxayxdfvyg3w447wqssoutoybqeihuunmau4n5ourj4i",
            "bafkreicvpenpqezcdehpcd2snsgj4ysl2la44fzqdolblr6evpps3uujcm",
            "bafkreihuxku32udn2eolrdivdugr2dd5sot2u7cvth3qpsjoqbkllbwkgy",
            "bafkreidumlyzcwbuaajaeeycq6e6y2zcr4jwq2amy35nsh7laphiecbyvi",
            "bafkreigjkkhwb3rtdgvbhjc6aoarrlqmyfe7f4d67fvtxprqns3r5zu6jm",
            "bafkreigmgqiafi4obtmtzzsocylrfcctjtemm3tdvecr3lobo6sqz73o3u",
            "bafkreig5b6rx3mdxwyrtnumyehvuetzrs3dwkxv76wtqhfayammh2hlsve",
            "bafkreicvhumzmjl7bo4uqhngwxfpk6upry4waxm3csk7wgkkyzjejgcwai",
            "bafkreiehn3tovb6wa2nt6nsouavmy6vrijc4z775hk4hjzdn7b5y5lkiya",
            "bafkreid6lxzktumy535tvzedks3acaqzrqirim4migkbxrp5erx5g6mfeu",
            "bafkreihk3mimxxqimwkowm2arpfaewz7m5o76wcvw4acyixhtun673az34",
            "bafkreidrrmeujlvad7oigztu45yeqxwcb6wpo464vwxqst4qo3itwk6ld4",
            "bafkreihl6hl2ufborow5cfiypdtkk2segp3vxfetupapsjnjvzwxlq2che",
            "bafkreidnv2t75e3kx6ugajs23l4736assxkzrggsocz2dvygsjlvhvntza",
            "bafkreih2hhoeruntbfy4ufngko3wbdp4m6gz7otu3hntuvntlflyehkejq",
            "bafkreieiqmc2t62t2pgabenfkeiclb4gsifcwgqvmkcwqc7lkaxm4vqvai",
            "bafkreieqi56ie7iyl4rne2r7ypnvrbcpvxxqp346c74smgd3vypgspdwdi",
            "bafkreidfw4bmdl3rcoehnak43beoeoucbbvtkxlagisvnuchug4foprhpq",
            "bafkreiasg674cri4woi2nmf2be27i24gdegxhc5hgahpygd7vqcrqvz4va",
            "bafkreidn3ocz3m6lzgu7whiooq74mtczbget5fie7dldzwhafdkty5yje4",
            "bafkreieg474qoeg5mykld7dpego4oy4tvjorlgtpjacw3cjrl7oogsfs6a",
            "bafkreiclbj3ujgxgh5i3plai5t24p7g2aavfzahu2gxq4mavena5ojxfsm",
            "bafkreia2vekumcnyswh2w62htqu7vedtksepokixpqn4qwzxhefj2bdniq",
            "bafkreia5456ribmisd555cwt6vzu57oqqkonugozywjuozsoxlo7ffoqxi",
            "bafkreiekctvro262pk4uz67jpqivxtniebqk3gyfqkclw2vqy3m3iocw6e",
            "bafkreigtxjoh4rx62uzlx4t23txqk3owvn3ckhy766mjiwgvy3fny2ozza",
            "bafkreifui4jzaffl74zakibwmt2js2w2qosm7yzgimecwvqpqxpz2psnmu",
            "bafkreif7426cefprxiupxwggnkjbtht3f3uiaeci2qc3irlppuy7kqoenq",
            "bafkreigdimqwjrkoklbfiigbkfpvmrniealdjr2bv52jb72sfbk6aqorqy",
            "bafkreidy2eohxrecrk3si4coolxawlcdmqrvhskhkal4d6bvxjfmds2m24",
            "bafkreie3qfepdl4pkse6uu3iqwfb2fqusfp3qsp2rh7ynvptps3bbnqzdm",
            "bafkreih2hv3vjipj2kibpynrmulnnoxj5737cbeg2bjl42zc3bhcfdzf2u",
            "bafkreiba3227uclzobdglmkvyz4b5da6gp3p3ehtfqznuprlgu3lt7j6nq",
            "bafkreiakbrgj7y2hzb7dhrpub6c6i72i3cp6ygsrof55t5ueb7wtg33bae",
            "bafkreig5x3r3dqllt2ndhxpahni5fjeeo2obq4ffls4hkbi7a2cfqtappi",
            "bafkreihfiplwjo4rdszuhnvjynx7iesij3borjd3rf5onlfgkwlqqjpbou",
            "bafkreicpnd4dysoaov3ra3jxsnoanyfyg3d56ntuzljro77a2bpgbzo6nu",
            "bafkreicdlambpulyaytsiffl2yra55ejhdcchpzlx3trutkoc4tinkiomq",
            "bafkreia57yvsl5esloc7fsn7uiw5q6opkk477f7qgh2sd2mibl66dwgz4m",
            "bafkreigpxggeedsw2y7rd5dqzhhf4qxq3hw3y5qqnmzgmbg5225z32ke6e",
            "bafkreihnezodqrdgshpkx5mkkebiz472y6r3xjnhjtrea75td6jxobf7ha",
            "bafkreiabrwr6bj62rwayp2nvaa7welt24h3rfrsiilj6f6qav4ryjceb4q",
            "bafkreiddvsn24iswrmxt3ceo7pngsvm44qzzknqto2hz4meytsbqw2q2yy",
            "bafkreibu53ggwhoojqkqws3l6nampmzxyczkymw5ozfz6q4t7tpwimha4y",
            "bafkreigwpa25qyx7f23v7t2nbdzywfigwp324dez2kvfrwyibeckl7kmry",
            "bafkreidjlqycv7hkvn6zmsnwbjy7l563pya2fwtnj5mmiqzosjzyuvv7ay",
            "bafkreibphjjkaarzd6kknwwmjtooccup7p3wyuvahmaemcyfjnbdbjci24",
            "bafkreie3unp25d6yx7yvi7bohox2mftpq5rirhl444ylep5ivijovybs5u",
            "bafkreifwh5ih76ed44cy545vyjovzre2esgk7a6m2njeb2qo5ofzus6q34",
            "bafkreie3h3ltvvnokylzyzcpultd7a5ba5ldp4ui4ejlhr7lbucklj4zfu",
            "bafkreiho2ufocna6dgavys6w3hzjudcppni7fnmo5pdes3cn3m7ndiu3b4",
            "bafkreigdwveaxxfl4sfdnyedx4nnnfv7fzspjmmr3j4eozjfv7tjsovwma",
            "bafkreidfixu2x5svom4aivbzbwyszrt7etpy7vm4deiepxgfyzshzn2ypi",
            "bafkreialq7tz66rwqift3hwfhs7mkpjraqp24lk4kk2amlnh535zzkizzy",
            "bafkreieay36cd2bsrn2tipb4zijvkylnfj7dinsaz342gnope7wsrrypjq",
            "bafkreieo6nbwxyahaafswfbe4sahqby3h7ru2hfitzru6iqyxqgch7nrzq",
            "bafkreicsv6fe4ykonns6hxctcjht7bqx5646cbpgbsug4xr6zg5rbthdj4",
            "bafkreihsgdzvuirts3jt3g26lto73qqu4bg7n4qu72dgmkujjkenee7e7a",
            "bafkreigkjwzzhv4cndw3ehsmsbmixzrxxvrpqj2e2yemxnnlwkew5f6gs4",
            "bafkreic5k7u2m4g3yufqpin7ofnb7hgl5vdtmto36l33bw6sjw5hktmo5a",
            "bafkreihxcdefq5k4vomblxkuj75d3b3ixasxvhuobag4whkrwyahfyfidq",
            "bafkreicjwz7p6dpvcqs7ordhzwslabcwuj3y3hehk4pl63jktebjmncjfy",
            "bafkreiakfuy3pabipys3ese6uerduczphy5rdkccguhyhsgyprmn7qz3ke",
            "bafkreialjw6gr3smsmhmrvcdvlsxxvgroyubz7fk2wrvpcrmomx7pdnjoe",
            "bafkreieqchumy7zibxq4mqppdqcdvfawq6ot7dxpbz3v5fue2bwyp5ivsm",
            "bafkreicev7nx7s75yqv2jpttw4rrukztwtr4kubxrs3wv3v4qlkz4nq4uy",
            "bafkreid2itljfobnxpvjfxnsas2fqbly5dyn7tkogvcojjxmb7muqiejta",
            "bafkreibmiuznmb5lk7gsg6376b4z6orbn2b535u6wnimiq5hwe5scref6u",
            "bafkreigxvddcurbaxgubrenqeahen47dktm4om535kaedeqenx7p6zodty",
            "bafkreibtwpwhksgskwqshwuqehwfm772pu7rfxjcxpijpu5ikh2cwvczvq",
            "bafkreic6j5qpgw326wdt6wyaf6efmbzzcw4rl5zfjiken3uxhu4s65hc2e",
            "bafkreibzl22el47bco2hi6wj6zovosteowcdkzifegbg3xncdhd3d3pjnu",
            "bafkreiew3gjv2dgldfzw5kfsginkvqz5rzktd5d4n6a2fnmuqjjk7hhcim",
            "bafkreigbjzymbt3fmlmfta5oror25swedugp2drdvsjb3juahn6e33r6l4",
            "bafkreicpzyumn7fo7negxdwb3anljwf2lqyseqeh7yogcoiyi75kfbtqky",
            "bafkreihsznkosxzsgfkutuuzhh442k7esjduylhda5ausfbautruuazzmm",
            "bafkreidbg24dnbt5to5vl6m5ektfwstwhp2djhsllf5mtciizlgg4lse6y",
            "bafkreidefsxxb5i4nvdblya2mh7h4uo47dwuthb5jqmartgg4svwrvx2xe",
            "bafkreic3qsb5mn22xy46gkg3whiqhvb2lqjmucbquiq27fyf76b7gpf3kq",
            "bafkreiaej6mkm6jjixeqtheomqtbpc4xp3yrtp66vnmcywxler5qlgidw4",
            "bafkreidhgkhkuwp5qqxzdmga7uh52qzeveu53zt4a2ahoauur6gaorf3sq",
            "bafkreibbw4oyakigmurscj3aknyq4tq4b43jjk2wsoszo4672shsog4ssu",
            "bafkreibbhcuhxye2ga3yblf4vmxsq4n3aofxckbyl66axugczb3e6dansu",
            "bafkreibxvv6oipwxyaejwvf4vnftsd6n3bf6ixnvubyus4q5nqud4plcve",
            "bafkreiahwdvpwtzcn2t45rswol5gka42yd2zkn37tn4mscq7mesuwngqyq",
            "bafkreig3mw4xebzxvrj7w5yvkg6o5a55tf2nlenbpruf7oyo3gauqjhtim",
            "bafkreihkaovv3fj2usy3kkzp4hspkisaqymki56pljvqm7yrv2ijta3pbq",
            "bafkreicytcw572hqzksn3zrdut22xo7wjxkf4ovjijokhpkx6vnc3nax7i",
            "bafkreidsfwztyha6q7i5temqm44mlhslcxerjhasj2kdfqhkssl5yfrgnu",
            "bafkreibsvhu3jxeyohswwic7u3xtzwwzbgssqrmmwzyj2fwhnykwpuu7eu",
            "bafkreibexexusac5lrtzmk26f4gc7pg2hzdf4upmd7ks37rteazol76ccy",
            "bafkreiguleybtirhrwdfp3bmmkm7xwq63so3waxgbwyh277uh62dbh55n4",
            "bafkreig7bdme4w26it2vhpdu2ahxbtl2svul5i3h5xhlpbdrxnmrnomqze",
            "bafkreicjehn5krr3lcnyl65eyh3njrfw5atepdzfmjaga44fmangdv5t6q"
        ];
        require(tokenId < 100, "Enter a tokenId from 0 to 99. Only 100 tulips.");
        if (tokenId >= latestNewTulipForSale) {
            return string(abi.encodePacked(_baseURI(), bulbURI));
        } else {
            return string(abi.encodePacked(_baseURI(), tulipURIs[tokenId]));
        }
    }

    function _beforeTokenTransfer(
        address,
        address,
        uint256 tokenId
    ) internal override {
        // unlist tulip
        tulips[tokenId].listingTime = 0;
        // emit event
        emit TulipNotForSale(tokenId, msg.sender);
    }

    // ETHERROCK

    function getTulipInfo(uint256 tulipNumber)
        public
        view
        returns (
            address owner,
            uint256 listingTime,
            uint256 price,
            uint256 timesSold
        )
    {
        return (
            ERC721.ownerOf(tulipNumber),
            tulips[tulipNumber].listingTime,
            currentPrice(tulipNumber),
            tulips[tulipNumber].timesSold
        );
    }

    function buyTulip(uint256 tulipNumber) public payable {
        // check sellable
        require(tulips[tulipNumber].listingTime != 0);
        require(tulipNumber < 100, "Enter a tokenId from 0 to 99. Only 100 tulips.");
        // check for sufficient payment
        require(msg.value >= currentPrice(tulipNumber));
        // unlist and update metadata
        tulips[tulipNumber].listingTime = 0;
        tulips[tulipNumber].timesSold++;
        // swap ownership for payment
        if (tulipNumber >= latestNewTulipForSale) {
            // if new, _mint()
            uint256 _latestNewTulipForSale = latestNewTulipForSale;
            // update auction
            if (latestNewTulipForSale < 99) {
                latestNewTulipForSale++;
                tulips[latestNewTulipForSale].listingTime = block.timestamp;
            } else {
                latestNewTulipForSale++;
            }
            // mint and transfer payment
            ERC721._mint(msg.sender, _latestNewTulipForSale);
            payable(feeRecipient).transfer(msg.value);
        } else {
            // if old, _transfer()
            address seller = ERC721.ownerOf(tulipNumber);
            ERC721._transfer(seller, msg.sender, tulipNumber);
            payable(seller).transfer(msg.value);
        }
        // emit event
        emit TulipSold(tulipNumber, msg.sender, msg.value);
    }

    function sellTulip(uint256 tulipNumber, uint256 price) public {
        require(msg.sender == ERC721.ownerOf(tulipNumber));
        require(price > 0);
        tulips[tulipNumber].price = price;
        tulips[tulipNumber].listingTime = block.timestamp;
        // emit event
        emit TulipForSale(tulipNumber, msg.sender, price);
    }

    function dontSellTulip(uint256 tulipNumber) public {
        require(msg.sender == ERC721.ownerOf(tulipNumber));
        tulips[tulipNumber].listingTime = 0;
        // emit event
        emit TulipNotForSale(tulipNumber, msg.sender);
    }

    function giftTulip(uint256 tulipNumber, address receiver) public {
        ERC721.transferFrom(msg.sender, receiver, tulipNumber);
    }
}

File 2 of 10 : ERC721.sol
// SPDX-License-Identifier: MIT

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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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);
    }

    /**
     * @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);
    }

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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 {}
}

File 3 of 10 : IERC721.sol
// SPDX-License-Identifier: MIT

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;
}

File 4 of 10 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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);
}

File 5 of 10 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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);
}

File 6 of 10 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 7 of 10 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 8 of 10 : Strings.sol
// SPDX-License-Identifier: MIT

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);
    }
}

File 9 of 10 : ERC165.sol
// SPDX-License-Identifier: MIT

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;
    }
}

File 10 of 10 : IERC165.sol
// SPDX-License-Identifier: MIT

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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tulipNumber","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"TulipForSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tulipNumber","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"TulipNotForSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tulipNumber","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"TulipSold","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tulipNumber","type":"uint256"}],"name":"buyTulip","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tulipNumber","type":"uint256"}],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tulipNumber","type":"uint256"}],"name":"dontSellTulip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tulipNumber","type":"uint256"}],"name":"getTulipInfo","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timesSold","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tulipNumber","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"giftTulip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestNewTulipForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tulipNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"sellTulip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tulips","outputs":[{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timesSold","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b50604051620059db380380620059db8339818101604052810190620000379190620004db565b6040518060400160405280600a81526020017f457468657254756c6970000000000000000000000000000000000000000000008152506040518060400160405280600481526020017ff09f8cb7000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000414565b508060019080519060200190620000d492919062000414565b5050508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250506200013a73777b0884f97fd361c55e472530272be61ceb87c860006200016660201b62001f251760201c565b60016007819055504260066000600754815260200190815260200160002060000181905550506200079f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d0906200059f565b60405180910390fd5b620001ea816200034c60201b60201c565b156200022d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000224906200057d565b60405180910390fd5b6200024160008383620003b860201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620002939190620005ff565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600060066000838152602001908152602001600020600001819055507fba0927a5f9738a31a455429494626d5b656982903846684db43ca64c39c0c7ec813360405162000407929190620005c1565b60405180910390a1505050565b82805462000422906200069a565b90600052602060002090601f01602090048101928262000446576000855562000492565b82601f106200046157805160ff191683800117855562000492565b8280016001018555821562000492579182015b828111156200049157825182559160200191906001019062000474565b5b509050620004a19190620004a5565b5090565b5b80821115620004c0576000816000905550600101620004a6565b5090565b600081519050620004d58162000785565b92915050565b600060208284031215620004f457620004f36200072e565b5b60006200050484828501620004c4565b91505092915050565b62000518816200065c565b82525050565b60006200052d601c83620005ee565b91506200053a8262000733565b602082019050919050565b600062000554602083620005ee565b915062000561826200075c565b602082019050919050565b620005778162000690565b82525050565b6000602082019050818103600083015262000598816200051e565b9050919050565b60006020820190508181036000830152620005ba8162000545565b9050919050565b6000604082019050620005d860008301856200056c565b620005e760208301846200050d565b9392505050565b600082825260208201905092915050565b60006200060c8262000690565b9150620006198362000690565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620006515762000650620006d0565b5b828201905092915050565b6000620006698262000670565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620006b357607f821691505b60208210811415620006ca57620006c9620006ff565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62000790816200065c565b81146200079c57600080fd5b50565b60805160601c615216620007c5600039600081816107940152610c4b01526152166000f3fe6080604052600436106101355760003560e01c80636352211e116100ab578063a22cb4651161006f578063a22cb4651461043e578063af794a4f14610467578063b88d4fde146104a6578063c87b56dd146104cf578063ddc1d1b21461050c578063e985e9c51461053757610135565b80636352211e14610333578063672dca621461037057806370a08231146103995780637a3c4c17146103d657806395d89b411461041357610135565b806321495e84116100fd57806321495e841461022457806323b872dd1461026457806327a664e91461028d578063425864f8146102b657806342842e0e146102df578063469048401461030857610135565b806301ffc9a71461013a578063060384901461017757806306fdde0314610193578063081812fc146101be578063095ea7b3146101fb575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190612afd565b610574565b60405161016e9190612f8e565b60405180910390f35b610191600480360381019061018c9190612b57565b610656565b005b34801561019f57600080fd5b506101a861089e565b6040516101b59190612fa9565b60405180910390f35b3480156101ca57600080fd5b506101e560048036038101906101e09190612b57565b610930565b6040516101f29190612ee2565b60405180910390f35b34801561020757600080fd5b50610222600480360381019061021d9190612abd565b6109b5565b005b34801561023057600080fd5b5061024b60048036038101906102469190612b57565b610acd565b60405161025b9493929190612f49565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129a7565b610b22565b005b34801561029957600080fd5b506102b460048036038101906102af9190612b84565b610b82565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190612b57565b610b91565b005b3480156102eb57600080fd5b50610306600480360381019061030191906129a7565b610c29565b005b34801561031457600080fd5b5061031d610c49565b60405161032a9190612ee2565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190612b57565b610c6d565b6040516103679190612ee2565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190612bc4565b610d1f565b005b3480156103a557600080fd5b506103c060048036038101906103bb919061293a565b610de1565b6040516103cd919061318b565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190612b57565b610e99565b60405161040a919061318b565b60405180910390f35b34801561041f57600080fd5b50610428610f3f565b6040516104359190612fa9565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190612a7d565b610fd1565b005b34801561047357600080fd5b5061048e60048036038101906104899190612b57565b611152565b60405161049d93929190613206565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c891906129fa565b61117c565b005b3480156104db57600080fd5b506104f660048036038101906104f19190612b57565b6111de565b6040516105039190612fa9565b60405180910390f35b34801561051857600080fd5b50610521611e8b565b60405161052e919061318b565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190612967565b611e91565b60405161056b9190612f8e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061063f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061064f575061064e826120f3565b5b9050919050565b60006006600083815260200190815260200160002060000154141561067a57600080fd5b606481106106bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b4906130ab565b60405180910390fd5b6106c681610e99565b3410156106d257600080fd5b6000600660008381526020019081526020016000206000018190555060066000828152602001908152602001600020600201600081548092919061071590613504565b919050555060075481106107ff57600060075490506063600754101561076f576007600081548092919061074890613504565b91905055504260066000600754815260200190815260200160002060000181905550610788565b6007600081548092919061078290613504565b91905055505b6107923382611f25565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156107f8573d6000803e3d6000fd5b5050610860565b600061080a82610c6d565b905061081781338461215d565b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561085d573d6000803e3d6000fd5b50505b7ffc24b0dc1790ce16fa7b0d129f7fdcc2a23da18a2dfd558c47201d2c4a958122813334604051610893939291906131cf565b60405180910390a150565b6060600080546108ad906134a1565b80601f01602080910402602001604051908101604052809291908181526020018280546108d9906134a1565b80156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b5050505050905090565b600061093b826123b9565b61097a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109719061310b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c082610c6d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a289061314b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a50612425565b73ffffffffffffffffffffffffffffffffffffffff161480610a7f5750610a7e81610a79612425565b611e91565b5b610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab59061306b565b60405180910390fd5b610ac8838361242d565b505050565b600080600080610adc85610c6d565b6006600087815260200190815260200160002060000154610afc87610e99565b600660008981526020019081526020016000206002015493509350935093509193509193565b610b33610b2d612425565b826124e6565b610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b699061316b565b60405180910390fd5b610b7d83838361215d565b505050565b610b8d338284610b22565b5050565b610b9a81610c6d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd157600080fd5b600060066000838152602001908152602001600020600001819055507fba0927a5f9738a31a455429494626d5b656982903846684db43ca64c39c0c7ec8133604051610c1e9291906131a6565b60405180910390a150565b610c448383836040518060200160405280600081525061117c565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d906130cb565b60405180910390fd5b80915050919050565b610d2882610c6d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5f57600080fd5b60008111610d6c57600080fd5b8060066000848152602001908152602001600020600101819055504260066000848152602001908152602001600020600001819055507f32feaaef15eb5bbacc4618e0336f1b6c13ccbcc7f2d6d53a0ba8d2dcf54536fa823383604051610dd5939291906131cf565b60405180910390a15050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061308b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600754821415610f20576000683635c9adc5dea00000905060006201518090506000600660008681526020019081526020016000206000015442610edf91906133b7565b9050818110610ef45760009350505050610f3a565b818184610f01919061335d565b610f0b919061332c565b83610f1691906133b7565b9350505050610f3a565b600660008381526020019081526020016000206001015490505b919050565b606060018054610f4e906134a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7a906134a1565b8015610fc75780601f10610f9c57610100808354040283529160200191610fc7565b820191906000526020600020905b815481529060010190602001808311610faa57829003601f168201915b5050505050905090565b610fd9612425565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e9061302b565b60405180910390fd5b8060056000611054612425565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611101612425565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111469190612f8e565b60405180910390a35050565b60066020528060005260406000206000915090508060000154908060010154908060020154905083565b61118d611187612425565b836124e6565b6111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c39061316b565b60405180910390fd5b6111d8848484846125c4565b50505050565b606060006040518060600160405280603b815260200161507f603b91399050600060405180610c8001604052806040518060600160405280603b8152602001613d23603b913981526020016040518060600160405280603b8152602001614448603b913981526020016040518060600160405280603b8152602001613dd4603b913981526020016040518060600160405280603b8152602001614c59603b913981526020016040518060600160405280603b81526020016145e5603b913981526020016040518060600160405280603b8152602001613f36603b913981526020016040518060600160405280603b8152602001614397603b913981526020016040518060600160405280603b8152602001614a46603b913981526020016040518060600160405280603b81526020016144f9603b913981526020016040518060600160405280603b8152602001614f58603b913981526020016040518060600160405280603b8152602001614149603b913981526020016040518060600160405280603b81526020016143d2603b913981526020016040518060600160405280603b8152602001614be3603b913981526020016040518060600160405280603b8152602001614b6d603b913981526020016040518060600160405280603b8152602001613e85603b913981526020016040518060600160405280603b8152602001615130603b913981526020016040518060600160405280603b8152602001613ad5603b913981526020016040518060600160405280603b8152602001614c94603b913981526020016040518060600160405280603b8152602001614abc603b913981526020016040518060600160405280603b81526020016141bf603b913981526020016040518060600160405280603b8152602001614534603b913981526020016040518060600160405280603b81526020016142ab603b913981526020016040518060600160405280603b81526020016141fa603b913981526020016040518060600160405280603b8152602001614c1e603b913981526020016040518060600160405280603b8152602001614782603b913981526020016040518060600160405280603b8152602001614620603b913981526020016040518060600160405280603b81526020016146d1603b913981526020016040518060600160405280603b8152602001614995603b913981526020016040518060600160405280603b8152602001614fce603b913981526020016040518060600160405280603b8152602001614696603b913981526020016040518060600160405280603b8152602001614d0a603b913981526020016040518060600160405280603b815260200161440d603b913981526020016040518060600160405280603b8152602001614e31603b913981526020016040518060600160405280603b8152602001614b32603b913981526020016040518060600160405280603b8152602001613ce8603b913981526020016040518060600160405280603b8152602001615009603b913981526020016040518060600160405280603b81526020016147f8603b913981526020016040518060600160405280603b81526020016142e6603b913981526020016040518060600160405280603b8152602001614a81603b913981526020016040518060600160405280603b8152602001613d5e603b913981526020016040518060600160405280603b8152602001614dbb603b913981526020016040518060600160405280603b8152602001613b10603b913981526020016040518060600160405280603b8152602001613bfc603b913981526020016040518060600160405280603b8152602001614f1d603b913981526020016040518060600160405280603b8152602001613efb603b913981526020016040518060600160405280603b81526020016147bd603b913981526020016040518060600160405280603b8152602001613bc1603b913981526020016040518060600160405280603b8152602001613f71603b913981526020016040518060600160405280603b81526020016145aa603b913981526020016040518060600160405280603b815260200161495a603b913981526020016040518060600160405280603b815260200161465b603b913981526020016040518060600160405280603b8152602001613a9a603b913981526020016040518060600160405280603b8152602001613d99603b913981526020016040518060600160405280603b8152602001613cad603b913981526020016040518060600160405280603b8152602001614184603b913981526020016040518060600160405280603b8152602001614483603b913981526020016040518060600160405280603b81526020016144be603b913981526020016040518060600160405280603b8152602001614ba8603b913981526020016040518060600160405280603b8152602001613ec0603b913981526020016040518060600160405280603b815260200161491f603b913981526020016040518060600160405280603b8152602001614e6c603b913981526020016040518060600160405280603b81526020016151a6603b913981526020016040518060600160405280603b8152602001614df6603b913981526020016040518060600160405280603b8152602001613fe7603b913981526020016040518060600160405280603b815260200161456f603b913981526020016040518060600160405280603b815260200161486e603b913981526020016040518060600160405280603b8152602001614098603b913981526020016040518060600160405280603b8152602001614f93603b913981526020016040518060600160405280603b815260200161410e603b913981526020016040518060600160405280603b81526020016148a9603b913981526020016040518060600160405280603b8152602001614235603b913981526020016040518060600160405280603b8152602001614321603b913981526020016040518060600160405280603b81526020016150f5603b913981526020016040518060600160405280603b8152602001614ccf603b913981526020016040518060600160405280603b8152602001614ee2603b913981526020016040518060600160405280603b815260200161470c603b913981526020016040518060600160405280603b8152602001613b4b603b913981526020016040518060600160405280603b8152602001613e0f603b913981526020016040518060600160405280603b8152602001613e4a603b913981526020016040518060600160405280603b8152602001614833603b913981526020016040518060600160405280603b8152602001614270603b913981526020016040518060600160405280603b8152602001614af7603b913981526020016040518060600160405280603b81526020016150ba603b913981526020016040518060600160405280603b81526020016149d0603b913981526020016040518060600160405280603b8152602001614d45603b913981526020016040518060600160405280603b8152602001613c37603b913981526020016040518060600160405280603b8152602001614747603b913981526020016040518060600160405280603b8152602001614a0b603b913981526020016040518060600160405280603b8152602001613b86603b913981526020016040518060600160405280603b8152602001614d80603b913981526020016040518060600160405280603b8152602001613fac603b913981526020016040518060600160405280603b8152602001615044603b913981526020016040518060600160405280603b815260200161435c603b913981526020016040518060600160405280603b8152602001613c72603b913981526020016040518060600160405280603b8152602001614022603b913981526020016040518060600160405280603b81526020016140d3603b913981526020016040518060600160405280603b8152602001614ea7603b913981526020016040518060600160405280603b815260200161516b603b913981526020016040518060600160405280603b815260200161405d603b913981526020016040518060600160405280603b81526020016148e4603b9139815250905060648410611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd906130ab565b60405180910390fd5b6007548410611e4157611e17612620565b82604051602001611e29929190612ebe565b60405160208183030381529060405292505050611e86565b611e49612620565b818560648110611e5c57611e5b6135da565b5b6020020151604051602001611e72929190612ebe565b604051602081830303815290604052925050505b919050565b60075481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c906130eb565b60405180910390fd5b611f9e816123b9565b15611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590612feb565b60405180910390fd5b611fea6000838361265d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461203a91906132d6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8273ffffffffffffffffffffffffffffffffffffffff1661217d82610c6d565b73ffffffffffffffffffffffffffffffffffffffff16146121d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ca9061312b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a9061300b565b60405180910390fd5b61224e83838361265d565b61225960008261242d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122a991906133b7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230091906132d6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124a083610c6d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124f1826123b9565b612530576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125279061304b565b60405180910390fd5b600061253b83610c6d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125aa57508373ffffffffffffffffffffffffffffffffffffffff1661259284610930565b73ffffffffffffffffffffffffffffffffffffffff16145b806125bb57506125ba8185611e91565b5b91505092915050565b6125cf84848461215d565b6125db848484846126b7565b61261a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261190612fcb565b60405180910390fd5b50505050565b60606040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250905090565b600060066000838152602001908152602001600020600001819055507fba0927a5f9738a31a455429494626d5b656982903846684db43ca64c39c0c7ec81336040516126aa9291906131a6565b60405180910390a1505050565b60006126d88473ffffffffffffffffffffffffffffffffffffffff1661284e565b15612841578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612701612425565b8786866040518563ffffffff1660e01b81526004016127239493929190612efd565b602060405180830381600087803b15801561273d57600080fd5b505af192505050801561276e57506040513d601f19601f8201168201806040525081019061276b9190612b2a565b60015b6127f1573d806000811461279e576040519150601f19603f3d011682016040523d82523d6000602084013e6127a3565b606091505b506000815114156127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e090612fcb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612846565b600190505b949350505050565b600080823b905060008111915050919050565b600061287461286f84613262565b61323d565b9050828152602081018484840111156128905761288f61363d565b5b61289b84828561345f565b509392505050565b6000813590506128b281613a3d565b92915050565b6000813590506128c781613a54565b92915050565b6000813590506128dc81613a6b565b92915050565b6000815190506128f181613a6b565b92915050565b600082601f83011261290c5761290b613638565b5b813561291c848260208601612861565b91505092915050565b60008135905061293481613a82565b92915050565b6000602082840312156129505761294f613647565b5b600061295e848285016128a3565b91505092915050565b6000806040838503121561297e5761297d613647565b5b600061298c858286016128a3565b925050602061299d858286016128a3565b9150509250929050565b6000806000606084860312156129c0576129bf613647565b5b60006129ce868287016128a3565b93505060206129df868287016128a3565b92505060406129f086828701612925565b9150509250925092565b60008060008060808587031215612a1457612a13613647565b5b6000612a22878288016128a3565b9450506020612a33878288016128a3565b9350506040612a4487828801612925565b925050606085013567ffffffffffffffff811115612a6557612a64613642565b5b612a71878288016128f7565b91505092959194509250565b60008060408385031215612a9457612a93613647565b5b6000612aa2858286016128a3565b9250506020612ab3858286016128b8565b9150509250929050565b60008060408385031215612ad457612ad3613647565b5b6000612ae2858286016128a3565b9250506020612af385828601612925565b9150509250929050565b600060208284031215612b1357612b12613647565b5b6000612b21848285016128cd565b91505092915050565b600060208284031215612b4057612b3f613647565b5b6000612b4e848285016128e2565b91505092915050565b600060208284031215612b6d57612b6c613647565b5b6000612b7b84828501612925565b91505092915050565b60008060408385031215612b9b57612b9a613647565b5b6000612ba985828601612925565b9250506020612bba858286016128a3565b9150509250929050565b60008060408385031215612bdb57612bda613647565b5b6000612be985828601612925565b9250506020612bfa85828601612925565b9150509250929050565b612c0d816133eb565b82525050565b612c1c816133fd565b82525050565b6000612c2d82613293565b612c3781856132a9565b9350612c4781856020860161346e565b612c508161364c565b840191505092915050565b6000612c668261329e565b612c7081856132ba565b9350612c8081856020860161346e565b612c898161364c565b840191505092915050565b6000612c9f8261329e565b612ca981856132cb565b9350612cb981856020860161346e565b80840191505092915050565b6000612cd26032836132ba565b9150612cdd8261365d565b604082019050919050565b6000612cf5601c836132ba565b9150612d00826136ac565b602082019050919050565b6000612d186024836132ba565b9150612d23826136d5565b604082019050919050565b6000612d3b6019836132ba565b9150612d4682613724565b602082019050919050565b6000612d5e602c836132ba565b9150612d698261374d565b604082019050919050565b6000612d816038836132ba565b9150612d8c8261379c565b604082019050919050565b6000612da4602a836132ba565b9150612daf826137eb565b604082019050919050565b6000612dc7602e836132ba565b9150612dd28261383a565b604082019050919050565b6000612dea6029836132ba565b9150612df582613889565b604082019050919050565b6000612e0d6020836132ba565b9150612e18826138d8565b602082019050919050565b6000612e30602c836132ba565b9150612e3b82613901565b604082019050919050565b6000612e536029836132ba565b9150612e5e82613950565b604082019050919050565b6000612e766021836132ba565b9150612e818261399f565b604082019050919050565b6000612e996031836132ba565b9150612ea4826139ee565b604082019050919050565b612eb881613455565b82525050565b6000612eca8285612c94565b9150612ed68284612c94565b91508190509392505050565b6000602082019050612ef76000830184612c04565b92915050565b6000608082019050612f126000830187612c04565b612f1f6020830186612c04565b612f2c6040830185612eaf565b8181036060830152612f3e8184612c22565b905095945050505050565b6000608082019050612f5e6000830187612c04565b612f6b6020830186612eaf565b612f786040830185612eaf565b612f856060830184612eaf565b95945050505050565b6000602082019050612fa36000830184612c13565b92915050565b60006020820190508181036000830152612fc38184612c5b565b905092915050565b60006020820190508181036000830152612fe481612cc5565b9050919050565b6000602082019050818103600083015261300481612ce8565b9050919050565b6000602082019050818103600083015261302481612d0b565b9050919050565b6000602082019050818103600083015261304481612d2e565b9050919050565b6000602082019050818103600083015261306481612d51565b9050919050565b6000602082019050818103600083015261308481612d74565b9050919050565b600060208201905081810360008301526130a481612d97565b9050919050565b600060208201905081810360008301526130c481612dba565b9050919050565b600060208201905081810360008301526130e481612ddd565b9050919050565b6000602082019050818103600083015261310481612e00565b9050919050565b6000602082019050818103600083015261312481612e23565b9050919050565b6000602082019050818103600083015261314481612e46565b9050919050565b6000602082019050818103600083015261316481612e69565b9050919050565b6000602082019050818103600083015261318481612e8c565b9050919050565b60006020820190506131a06000830184612eaf565b92915050565b60006040820190506131bb6000830185612eaf565b6131c86020830184612c04565b9392505050565b60006060820190506131e46000830186612eaf565b6131f16020830185612c04565b6131fe6040830184612eaf565b949350505050565b600060608201905061321b6000830186612eaf565b6132286020830185612eaf565b6132356040830184612eaf565b949350505050565b6000613247613258565b905061325382826134d3565b919050565b6000604051905090565b600067ffffffffffffffff82111561327d5761327c613609565b5b6132868261364c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006132e182613455565b91506132ec83613455565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133215761332061354d565b5b828201905092915050565b600061333782613455565b915061334283613455565b9250826133525761335161357c565b5b828204905092915050565b600061336882613455565b915061337383613455565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133ac576133ab61354d565b5b828202905092915050565b60006133c282613455565b91506133cd83613455565b9250828210156133e0576133df61354d565b5b828203905092915050565b60006133f682613435565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561348c578082015181840152602081019050613471565b8381111561349b576000848401525b50505050565b600060028204905060018216806134b957607f821691505b602082108114156134cd576134cc6135ab565b5b50919050565b6134dc8261364c565b810181811067ffffffffffffffff821117156134fb576134fa613609565b5b80604052505050565b600061350f82613455565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135425761354161354d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e746572206120746f6b656e49642066726f6d203020746f2039392e204f6e60008201527f6c79203130302074756c6970732e000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613a46816133eb565b8114613a5157600080fd5b50565b613a5d816133fd565b8114613a6857600080fd5b50565b613a7481613409565b8114613a7f57600080fd5b50565b613a8b81613455565b8114613a9657600080fd5b5056fe6261666b726569646a6c7179637637686b766e367a6d736e77626a79376c353633707961326677746e6a356d6d69717a6f736a7a797576763761796261666b726569686b336d696d787871696d776b6f776d32617270666165777a376d356f3736776376773461637969786874756e363733617a33346261666b726569686669706c776a6f347264737a75686e766a796e7837696573696a33626f726a64337266356f6e6c66676b776c71716a70626f756261666b72656963366a357170677733323677647436777961663665666d627a7a637734726c357a666a696b656e337578687534733635686332656261666b7265696262686375687879653267613379626c6634766d787371346e33616f6678636b62796c363661787567637a6233653664616e73756261666b726569686e657a6f64717264677368706b78356d6b6b6562697a34373279367233786a6e686a7472656137357464366a786f62663768616261666b72656963706e64346479736f616f76337261336a78736e6f616e79667967336435366e74757a6c6a726f37376132627067627a6f366e756261666b72656961656a366d6b6d366a6a697865717468656f6d717462706334787033797274703636766e6d637977786c657235716c67696477346261666b726569637974637735373268717a6b736e337a726475743232786f37776a786b66346f766a696a6f6b68706b7836766e63336e617837696261666b7265696533756e703235643679783779766937626f686f78326d6674707135726972686c343434796c6570356976696a6f7679627335756261666b7265696764696d71776a726b6f6b6c6266696967626b6670766d726e6965616c646a7232627635326a6237327366626b3661716f7271796261666b726569616a6c71336e64336e633778753234356571776e6f716b6834667a323572646b696e7737776b6a74717035347863627864736b696261666b726569616b6272676a377932687a62376468727075623663366937326933637036796773726f66353574357565623777746733336261656261666b7265696270686a6a6b6161727a64366b6b6e77776d6a746f6f636375703770337779757661686d61656d6379666a6e6264626a636932346261666b7265696433636b7a6c63763370367a68336f3363776272796e6f336b6571767a79616770746e78746f65723361777576796579647a34756261666b726569627a6c3232656c343762636f32686936776a367a6f766f7374656f7763646b7a69666567626733786e63646864336433706a6e756261666b726569657733676a763264676c64667a77356b667367696e6b76717a35727a6b74643564346e366132666e6d75716a6a6b37686863696d6261666b72656965686e33746f7662367761326e74366e736f7561766d79367672696a63347a373735686b34686a7a646e37623579356c6b6979616261666b726569646669787532783573766f6d34616976627a627779737a7274376574707937766d346465696570786766797a73687a6e327970696261666b7265696135377976736c3565736c6f633766736e377569773571366f706b6b3437376637716768327364326d69626c36366477677a346d6261666b726569616566636a6d6d706c6f6674716936616f33647a72706a74746e726861793268716974357078747a70776b69736d7669776937656261666b726569616272777236626a36327277617970326e7661613777656c74323468337266727369696c6a3666367161763472796a63656234716261666b72656961687764767077747a636e327434357273776f6c35676b6134327964327a6b6e3337746e346d736371376d657375776e677179716261666b726569687367647a767569727473336a74336732366c746f3733717175346267376e347175373264676d6b756a6a6b656e6565376537616261666b726569647366777a74796861367137693574656d716d34346d6c68736c637865726a6861736a326b646671686b73736c35796672676e756261666b726569673762646d653477323669743276687064753261687862746c327376756c356933683578686c70626472786e6d726e6f6d717a656261666b72656968786364656671356b34766f6d626c786b756a37356433623369786173787668756f6261673477686b72777961686679666964716261666b7265696273766875336a7865796f68737777696337753378747a77777a6267737371726d6d777a796a326677686e796b777075753765756261666b726569616b667579337061626970797333657365367565726475637a7068793572646b6363677568796873677970726d6e37717a336b656261666b726569676a6b6b68776233727464677662686a6336616f6172726c716d796665376634643637667674787072716e733372357a75366a6d6261666b726569667768356968373665643434637935343576796a6f767a7265326573676b3761366d326e6a656232716f356f667a7573367133346261666b726569646e763274373565336b78367567616a7332336c34373336617373786b7a726767736f637a3264767967736a6c7668766e747a616261666b726569657169353669653769796c34726e6532723779706e76726263707678787170333436633734736d676433767970677370647764696261666b72656965716368756d79377a69627871346d717070647163647666617771366f7437647870627a3376356675653262777970356976736d6261666b72656963707a79756d6e37666f376e65677864776233616e6c6a7766326c7179736571656837796f67636f69796937356b666274716b796261666b7265696569716d6332743632743270676162656e666b6569636c62346773696663776771766d6b63777163376c6b61786d3476717661696261666b7265696832687633766a69706a326b696270796e726d756c6e6e6f786a353733376362656732626a6c34327a633362686366647a6632756261666b726569636576376e7837733735797176326a70747477347272756b7a74777472346b7562787273337776337634716c6b7a346e713475796261666b726569686b616f767633666a32757379336b6b7a70346873706b69736171796d6b693536706c6a76716d3779727632696a7461337062716261666b72656964326a726b377271757861797864667679673377343437777173736f75746f79627165696875756e6d6175346e356f75726a34696261666b726569676d677169616669346f62746d747a7a736f63796c72666363746a74656d6d33746476656372336c6f626f3673717a37336f33756261666b7265696774786a6f683472783632757a6c78347432337478716b336f77766e33636b68793736366d6a697767767933666e79326f7a7a616261666b726569636b6a35663364773661626b34657a6a367676657068726f61636e697a70743437346a786a666663636b6c636934626d37756c756261666b726569653368336c7476766e6f6b796c7a797a6370756c74643761356261356c647034756934656a6c6872376c6275636b6c6a347a66756261666b726569686f3275666f636e6136646761767973367733687a6a75646370706e6937666e6d6f357064657333636e336d376e6469753362346261666b7265696875786b75333275646e32656f6c726469766475677232646435736f7432753763767468337170736a6f71626b6c6c62776b67796261666b726569683268686f6572756e746266793475666e676b6f3377626470346d36677a376f747533686e7475766e746c666c7965686b656a716261666b726569676b6a777a7a687634636e6477336568736d73626d69787a727878767270716a32653279656d786e6e6c776b65773566366773346261666b726569646476736e3234697377726d78743363656f37706e6773766d3434717a7a6b6e71746f32687a346d6579747362717732713279796261666b726569636e6a6e6e753677336372627a786b6f61326736323561766d6e656372683470746d75766a327135697a796765716874746a6e796261666b726569646e336f637a336d366c7a6775377768696f6f7137346d74637a626765743566696537646c647a77686166646b747935796a65346261666b72656967777061323571797837663233763774326e62647a7977666967777033323464657a326b7666727779696265636b6c376b6d72796261666b72656961353435367269626d69736435353563777436767a7535376f71716b6f6e75676f7a79776a756f7a736f786c6f3766666f7178696261666b7265696567343734716f6567356d796b6c6437647065676f346f793474766a6f726c6774706a61637733636a726c376f6f6773667336616261666b7265696274777077686b7367736b77717368777571656877666d3737327075377266786a637870696a707535696b6832637776637a76716261666b7265696468676b686b757770357171787a646d67613775683532717a6576657535337a7434613261686f617575723667616f72663373716261666b72656961736736373463726934776f69326e6d66326265323769323467646567786863356867616870796764377671637271767a3476616261666b7265696770786767656564737732793772643564717a6868663471787133687733793571716e6d7a676d6267353232357a33326b6536656261666b726569653371666570646c34706b7365367575336971776662326671757366703371737032726837796e76707470733362626e717a646d6261666b72656967626a7a796d627433666d6c6d667461356f726f723235737765647567703264726476736a62336a7561686e3665333372366c346261666b72656963356b3775326d3467337975667170696e376f666e623768676c357664746d746f33366c3333627736736a7735686b746d6f35616261666b726569616c6a7736677233736d736d686d72766364766c7378787667726f7975627a37666b327772767063726d6f6d783770646e6a6f656261666b726569636a65686e356b7272336c636e796c3635657968336e6a7266773561746570647a666d6a6167613434666d616e676476357436716261666b726569616c7137747a3636727771696674336877666873376d6b706a7261717032346c6b346b6b32616d6c6e683533357a7a6b697a7a796261666b72656962753533676777686f6f6a716b717773336c366e616d706d7a7879637a6b796d77356f7a667a3671347437747077696d686134796261666b726569636c626a33756a67786768356933706c61693574323470376732616176667a61687532677871346d6176656e61356f6a7866736d6261666b726569646566737878623569346e7664626c7961326d68376834756f3437647775746862356a716d6172746767347376777276783278656261666b726569626277346f79616b69676d757273636a33616b6e7971347471346234336a6a6b3277736f737a6f343637327368736f67347373756261666b726569637670656e7071657a6364656870636432736e73676a3479736c326c613434667a71646f6c626c723665767070733375756a636d6261666b72656962613332323775636c7a6f6264676c6d6b76797a346235646136677033703365687466717a6e7570726c6775336c74376a366e716261666b726569686c36686c327566626f726f7735636669797064746b6b327365677033767866657475706170736a6e6a767a77786c71326368656261666b72656968737a6e6b6f73787a7367666b757475757a68683434326b3765736a6475796c686461356175736662617574727575617a7a6d6d6261666b7265696637343236636566707278697570787767676e6b6a627468743366337569616563693271633369726c70707579376b716f656e716261666b726569637668756d7a6d6a6c37626f347571686e67777866706b3675707279347761786d3363736b3777676b6b797a6a656a67637761696261666b7265696764777665617878666c347366646e79656478346e6e6e667637667a73706a6d6d72336a34656f7a6a667637746a736f76776d616261666b726569673562367278336d6478777972746e756d796568767565747a72733364776b7876373677747168666179616d6d6832686c7376656261666b72656964667734626d646c3372636f65686e616b343362656f656f7563626276746b786c61676973766e756368756734666f70726870716261666b7265696434336479367a77746e76776f36736b6f6e6c3474636563686c686e75377269687032676e766f61796470786e337177367976616261666b7265696472726d65756a6c766164376f69677a74753435796571787763623677706f34363476777871737434716f336974776b366c64346261666b726569626d69757a6e6d62356c6b376773673633373662347a366f72626e32623533357536776e696d69713568776535736372656636756261666b726569656b637476726f323632706b34757a36376a7071697678746e696562716b33677966716b636c7732767179336d33696f637736656261666b7265696333717362356d6e323278793436676b673377686971687662326c716a6d75636271756971323766796637366237677066336b716261666b72656962787676366f697077787961656a77766634766e66747364366e3362663669786e7675627975733471356e71756434706c6376656261666b72656967357833723364716c6c74326e6468787061686e6935666a65656f326f62713466666c7334686b626937613263667174617070696261666b72656963737636666534796b6f6e6e733668786374636a687437627178353634366362706762737567347872367a673572627468646a346261666b726569667569346a7a6166666c37347a616b6962776d74326a73327732716f736d37797a67696d6563777671707178707a3270736e6d756261666b72656965617933366364326273726e3274697062347a696a766b796c6e666a3764696e73617a333432676e6f7065377773727279706a716261666b726569626578657875736163356c72747a6d6b32366634676337706732687a64663475706d64376b733337727465617a6f6c37366363796261666b726569677876646463757262617867756272656e71656168656e3437646b746d346f6d3533356b6165646571656e783770367a6f6474796261666b72656963646c616d6270756c79617974736966666c327972613535656a6864636368707a6c7833747275746b6f633474696e6b696f6d716261666b72656964756d6c797a6377627561616a61656579637136653679327a6372346a777132616d7933356e7368376c617068696563627976696261666b726569636a777a377036647076637173376f7264687a77736c61626377756a3379336865686b34706c36336a6b7465626a6d6e636a66796261666b726569613276656b756d636e79737768327736326874717537766564746b7365706f6b697870716e3471777a786865666a3262646e69716261666b726569647932656f6878726563726b33736934636f6f6c7861776c63646d71727668736b686b616c3464366276786a666d6473326d32346261666b72656967336d77347865627a7876726a37773579766b67366f356135357466326e6c656e6270727566376f796f33676175716a6874696d6261666b726569616d6b6f6b67677a6b63686b6f7378356a767a366664757a77636e377175676b70377079746d6b33323773626c72747761347a656261666b7265696462673234646e627435746f35766c366d35656b746677737477687032646a68736c6c66356d746369697a6c6767346c736536796261666b726569643269746c6a666f626e7870766a66786e736173326671626c793564796e37746b6f6776636f6a6a786d62376d757169656a74616261666b72656964366c787a6b74756d7935333574767a65646b7333616361717a72716972696d346d69676b62787270356572783567366d6665756261666b72656967756c65796274697268727764667033626d6d6b6d377877713633736f3377617867627779683237377568363264626835356e346261666b726569656f366e627778796168616166737766626534736168716279336837727532686669747a7275366971797871676368376e727a71a264697066735822122096e6010b640216a82f54512f6f5c0bcc884cd571a21674840a7e2e8bfa32755864736f6c63430008070033000000000000000000000000e69cf6b2f44e67a7bea652a6f73e72bb163d3d69

Deployed Bytecode

0x6080604052600436106101355760003560e01c80636352211e116100ab578063a22cb4651161006f578063a22cb4651461043e578063af794a4f14610467578063b88d4fde146104a6578063c87b56dd146104cf578063ddc1d1b21461050c578063e985e9c51461053757610135565b80636352211e14610333578063672dca621461037057806370a08231146103995780637a3c4c17146103d657806395d89b411461041357610135565b806321495e84116100fd57806321495e841461022457806323b872dd1461026457806327a664e91461028d578063425864f8146102b657806342842e0e146102df578063469048401461030857610135565b806301ffc9a71461013a578063060384901461017757806306fdde0314610193578063081812fc146101be578063095ea7b3146101fb575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190612afd565b610574565b60405161016e9190612f8e565b60405180910390f35b610191600480360381019061018c9190612b57565b610656565b005b34801561019f57600080fd5b506101a861089e565b6040516101b59190612fa9565b60405180910390f35b3480156101ca57600080fd5b506101e560048036038101906101e09190612b57565b610930565b6040516101f29190612ee2565b60405180910390f35b34801561020757600080fd5b50610222600480360381019061021d9190612abd565b6109b5565b005b34801561023057600080fd5b5061024b60048036038101906102469190612b57565b610acd565b60405161025b9493929190612f49565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129a7565b610b22565b005b34801561029957600080fd5b506102b460048036038101906102af9190612b84565b610b82565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190612b57565b610b91565b005b3480156102eb57600080fd5b50610306600480360381019061030191906129a7565b610c29565b005b34801561031457600080fd5b5061031d610c49565b60405161032a9190612ee2565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190612b57565b610c6d565b6040516103679190612ee2565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190612bc4565b610d1f565b005b3480156103a557600080fd5b506103c060048036038101906103bb919061293a565b610de1565b6040516103cd919061318b565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190612b57565b610e99565b60405161040a919061318b565b60405180910390f35b34801561041f57600080fd5b50610428610f3f565b6040516104359190612fa9565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190612a7d565b610fd1565b005b34801561047357600080fd5b5061048e60048036038101906104899190612b57565b611152565b60405161049d93929190613206565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c891906129fa565b61117c565b005b3480156104db57600080fd5b506104f660048036038101906104f19190612b57565b6111de565b6040516105039190612fa9565b60405180910390f35b34801561051857600080fd5b50610521611e8b565b60405161052e919061318b565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190612967565b611e91565b60405161056b9190612f8e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061063f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061064f575061064e826120f3565b5b9050919050565b60006006600083815260200190815260200160002060000154141561067a57600080fd5b606481106106bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b4906130ab565b60405180910390fd5b6106c681610e99565b3410156106d257600080fd5b6000600660008381526020019081526020016000206000018190555060066000828152602001908152602001600020600201600081548092919061071590613504565b919050555060075481106107ff57600060075490506063600754101561076f576007600081548092919061074890613504565b91905055504260066000600754815260200190815260200160002060000181905550610788565b6007600081548092919061078290613504565b91905055505b6107923382611f25565b7f000000000000000000000000e69cf6b2f44e67a7bea652a6f73e72bb163d3d6973ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156107f8573d6000803e3d6000fd5b5050610860565b600061080a82610c6d565b905061081781338461215d565b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561085d573d6000803e3d6000fd5b50505b7ffc24b0dc1790ce16fa7b0d129f7fdcc2a23da18a2dfd558c47201d2c4a958122813334604051610893939291906131cf565b60405180910390a150565b6060600080546108ad906134a1565b80601f01602080910402602001604051908101604052809291908181526020018280546108d9906134a1565b80156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b5050505050905090565b600061093b826123b9565b61097a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109719061310b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c082610c6d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a289061314b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a50612425565b73ffffffffffffffffffffffffffffffffffffffff161480610a7f5750610a7e81610a79612425565b611e91565b5b610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab59061306b565b60405180910390fd5b610ac8838361242d565b505050565b600080600080610adc85610c6d565b6006600087815260200190815260200160002060000154610afc87610e99565b600660008981526020019081526020016000206002015493509350935093509193509193565b610b33610b2d612425565b826124e6565b610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b699061316b565b60405180910390fd5b610b7d83838361215d565b505050565b610b8d338284610b22565b5050565b610b9a81610c6d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd157600080fd5b600060066000838152602001908152602001600020600001819055507fba0927a5f9738a31a455429494626d5b656982903846684db43ca64c39c0c7ec8133604051610c1e9291906131a6565b60405180910390a150565b610c448383836040518060200160405280600081525061117c565b505050565b7f000000000000000000000000e69cf6b2f44e67a7bea652a6f73e72bb163d3d6981565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d906130cb565b60405180910390fd5b80915050919050565b610d2882610c6d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5f57600080fd5b60008111610d6c57600080fd5b8060066000848152602001908152602001600020600101819055504260066000848152602001908152602001600020600001819055507f32feaaef15eb5bbacc4618e0336f1b6c13ccbcc7f2d6d53a0ba8d2dcf54536fa823383604051610dd5939291906131cf565b60405180910390a15050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061308b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600754821415610f20576000683635c9adc5dea00000905060006201518090506000600660008681526020019081526020016000206000015442610edf91906133b7565b9050818110610ef45760009350505050610f3a565b818184610f01919061335d565b610f0b919061332c565b83610f1691906133b7565b9350505050610f3a565b600660008381526020019081526020016000206001015490505b919050565b606060018054610f4e906134a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7a906134a1565b8015610fc75780601f10610f9c57610100808354040283529160200191610fc7565b820191906000526020600020905b815481529060010190602001808311610faa57829003601f168201915b5050505050905090565b610fd9612425565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e9061302b565b60405180910390fd5b8060056000611054612425565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611101612425565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111469190612f8e565b60405180910390a35050565b60066020528060005260406000206000915090508060000154908060010154908060020154905083565b61118d611187612425565b836124e6565b6111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c39061316b565b60405180910390fd5b6111d8848484846125c4565b50505050565b606060006040518060600160405280603b815260200161507f603b91399050600060405180610c8001604052806040518060600160405280603b8152602001613d23603b913981526020016040518060600160405280603b8152602001614448603b913981526020016040518060600160405280603b8152602001613dd4603b913981526020016040518060600160405280603b8152602001614c59603b913981526020016040518060600160405280603b81526020016145e5603b913981526020016040518060600160405280603b8152602001613f36603b913981526020016040518060600160405280603b8152602001614397603b913981526020016040518060600160405280603b8152602001614a46603b913981526020016040518060600160405280603b81526020016144f9603b913981526020016040518060600160405280603b8152602001614f58603b913981526020016040518060600160405280603b8152602001614149603b913981526020016040518060600160405280603b81526020016143d2603b913981526020016040518060600160405280603b8152602001614be3603b913981526020016040518060600160405280603b8152602001614b6d603b913981526020016040518060600160405280603b8152602001613e85603b913981526020016040518060600160405280603b8152602001615130603b913981526020016040518060600160405280603b8152602001613ad5603b913981526020016040518060600160405280603b8152602001614c94603b913981526020016040518060600160405280603b8152602001614abc603b913981526020016040518060600160405280603b81526020016141bf603b913981526020016040518060600160405280603b8152602001614534603b913981526020016040518060600160405280603b81526020016142ab603b913981526020016040518060600160405280603b81526020016141fa603b913981526020016040518060600160405280603b8152602001614c1e603b913981526020016040518060600160405280603b8152602001614782603b913981526020016040518060600160405280603b8152602001614620603b913981526020016040518060600160405280603b81526020016146d1603b913981526020016040518060600160405280603b8152602001614995603b913981526020016040518060600160405280603b8152602001614fce603b913981526020016040518060600160405280603b8152602001614696603b913981526020016040518060600160405280603b8152602001614d0a603b913981526020016040518060600160405280603b815260200161440d603b913981526020016040518060600160405280603b8152602001614e31603b913981526020016040518060600160405280603b8152602001614b32603b913981526020016040518060600160405280603b8152602001613ce8603b913981526020016040518060600160405280603b8152602001615009603b913981526020016040518060600160405280603b81526020016147f8603b913981526020016040518060600160405280603b81526020016142e6603b913981526020016040518060600160405280603b8152602001614a81603b913981526020016040518060600160405280603b8152602001613d5e603b913981526020016040518060600160405280603b8152602001614dbb603b913981526020016040518060600160405280603b8152602001613b10603b913981526020016040518060600160405280603b8152602001613bfc603b913981526020016040518060600160405280603b8152602001614f1d603b913981526020016040518060600160405280603b8152602001613efb603b913981526020016040518060600160405280603b81526020016147bd603b913981526020016040518060600160405280603b8152602001613bc1603b913981526020016040518060600160405280603b8152602001613f71603b913981526020016040518060600160405280603b81526020016145aa603b913981526020016040518060600160405280603b815260200161495a603b913981526020016040518060600160405280603b815260200161465b603b913981526020016040518060600160405280603b8152602001613a9a603b913981526020016040518060600160405280603b8152602001613d99603b913981526020016040518060600160405280603b8152602001613cad603b913981526020016040518060600160405280603b8152602001614184603b913981526020016040518060600160405280603b8152602001614483603b913981526020016040518060600160405280603b81526020016144be603b913981526020016040518060600160405280603b8152602001614ba8603b913981526020016040518060600160405280603b8152602001613ec0603b913981526020016040518060600160405280603b815260200161491f603b913981526020016040518060600160405280603b8152602001614e6c603b913981526020016040518060600160405280603b81526020016151a6603b913981526020016040518060600160405280603b8152602001614df6603b913981526020016040518060600160405280603b8152602001613fe7603b913981526020016040518060600160405280603b815260200161456f603b913981526020016040518060600160405280603b815260200161486e603b913981526020016040518060600160405280603b8152602001614098603b913981526020016040518060600160405280603b8152602001614f93603b913981526020016040518060600160405280603b815260200161410e603b913981526020016040518060600160405280603b81526020016148a9603b913981526020016040518060600160405280603b8152602001614235603b913981526020016040518060600160405280603b8152602001614321603b913981526020016040518060600160405280603b81526020016150f5603b913981526020016040518060600160405280603b8152602001614ccf603b913981526020016040518060600160405280603b8152602001614ee2603b913981526020016040518060600160405280603b815260200161470c603b913981526020016040518060600160405280603b8152602001613b4b603b913981526020016040518060600160405280603b8152602001613e0f603b913981526020016040518060600160405280603b8152602001613e4a603b913981526020016040518060600160405280603b8152602001614833603b913981526020016040518060600160405280603b8152602001614270603b913981526020016040518060600160405280603b8152602001614af7603b913981526020016040518060600160405280603b81526020016150ba603b913981526020016040518060600160405280603b81526020016149d0603b913981526020016040518060600160405280603b8152602001614d45603b913981526020016040518060600160405280603b8152602001613c37603b913981526020016040518060600160405280603b8152602001614747603b913981526020016040518060600160405280603b8152602001614a0b603b913981526020016040518060600160405280603b8152602001613b86603b913981526020016040518060600160405280603b8152602001614d80603b913981526020016040518060600160405280603b8152602001613fac603b913981526020016040518060600160405280603b8152602001615044603b913981526020016040518060600160405280603b815260200161435c603b913981526020016040518060600160405280603b8152602001613c72603b913981526020016040518060600160405280603b8152602001614022603b913981526020016040518060600160405280603b81526020016140d3603b913981526020016040518060600160405280603b8152602001614ea7603b913981526020016040518060600160405280603b815260200161516b603b913981526020016040518060600160405280603b815260200161405d603b913981526020016040518060600160405280603b81526020016148e4603b9139815250905060648410611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd906130ab565b60405180910390fd5b6007548410611e4157611e17612620565b82604051602001611e29929190612ebe565b60405160208183030381529060405292505050611e86565b611e49612620565b818560648110611e5c57611e5b6135da565b5b6020020151604051602001611e72929190612ebe565b604051602081830303815290604052925050505b919050565b60075481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c906130eb565b60405180910390fd5b611f9e816123b9565b15611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590612feb565b60405180910390fd5b611fea6000838361265d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461203a91906132d6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8273ffffffffffffffffffffffffffffffffffffffff1661217d82610c6d565b73ffffffffffffffffffffffffffffffffffffffff16146121d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ca9061312b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a9061300b565b60405180910390fd5b61224e83838361265d565b61225960008261242d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122a991906133b7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230091906132d6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124a083610c6d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124f1826123b9565b612530576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125279061304b565b60405180910390fd5b600061253b83610c6d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125aa57508373ffffffffffffffffffffffffffffffffffffffff1661259284610930565b73ffffffffffffffffffffffffffffffffffffffff16145b806125bb57506125ba8185611e91565b5b91505092915050565b6125cf84848461215d565b6125db848484846126b7565b61261a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261190612fcb565b60405180910390fd5b50505050565b60606040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250905090565b600060066000838152602001908152602001600020600001819055507fba0927a5f9738a31a455429494626d5b656982903846684db43ca64c39c0c7ec81336040516126aa9291906131a6565b60405180910390a1505050565b60006126d88473ffffffffffffffffffffffffffffffffffffffff1661284e565b15612841578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612701612425565b8786866040518563ffffffff1660e01b81526004016127239493929190612efd565b602060405180830381600087803b15801561273d57600080fd5b505af192505050801561276e57506040513d601f19601f8201168201806040525081019061276b9190612b2a565b60015b6127f1573d806000811461279e576040519150601f19603f3d011682016040523d82523d6000602084013e6127a3565b606091505b506000815114156127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e090612fcb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612846565b600190505b949350505050565b600080823b905060008111915050919050565b600061287461286f84613262565b61323d565b9050828152602081018484840111156128905761288f61363d565b5b61289b84828561345f565b509392505050565b6000813590506128b281613a3d565b92915050565b6000813590506128c781613a54565b92915050565b6000813590506128dc81613a6b565b92915050565b6000815190506128f181613a6b565b92915050565b600082601f83011261290c5761290b613638565b5b813561291c848260208601612861565b91505092915050565b60008135905061293481613a82565b92915050565b6000602082840312156129505761294f613647565b5b600061295e848285016128a3565b91505092915050565b6000806040838503121561297e5761297d613647565b5b600061298c858286016128a3565b925050602061299d858286016128a3565b9150509250929050565b6000806000606084860312156129c0576129bf613647565b5b60006129ce868287016128a3565b93505060206129df868287016128a3565b92505060406129f086828701612925565b9150509250925092565b60008060008060808587031215612a1457612a13613647565b5b6000612a22878288016128a3565b9450506020612a33878288016128a3565b9350506040612a4487828801612925565b925050606085013567ffffffffffffffff811115612a6557612a64613642565b5b612a71878288016128f7565b91505092959194509250565b60008060408385031215612a9457612a93613647565b5b6000612aa2858286016128a3565b9250506020612ab3858286016128b8565b9150509250929050565b60008060408385031215612ad457612ad3613647565b5b6000612ae2858286016128a3565b9250506020612af385828601612925565b9150509250929050565b600060208284031215612b1357612b12613647565b5b6000612b21848285016128cd565b91505092915050565b600060208284031215612b4057612b3f613647565b5b6000612b4e848285016128e2565b91505092915050565b600060208284031215612b6d57612b6c613647565b5b6000612b7b84828501612925565b91505092915050565b60008060408385031215612b9b57612b9a613647565b5b6000612ba985828601612925565b9250506020612bba858286016128a3565b9150509250929050565b60008060408385031215612bdb57612bda613647565b5b6000612be985828601612925565b9250506020612bfa85828601612925565b9150509250929050565b612c0d816133eb565b82525050565b612c1c816133fd565b82525050565b6000612c2d82613293565b612c3781856132a9565b9350612c4781856020860161346e565b612c508161364c565b840191505092915050565b6000612c668261329e565b612c7081856132ba565b9350612c8081856020860161346e565b612c898161364c565b840191505092915050565b6000612c9f8261329e565b612ca981856132cb565b9350612cb981856020860161346e565b80840191505092915050565b6000612cd26032836132ba565b9150612cdd8261365d565b604082019050919050565b6000612cf5601c836132ba565b9150612d00826136ac565b602082019050919050565b6000612d186024836132ba565b9150612d23826136d5565b604082019050919050565b6000612d3b6019836132ba565b9150612d4682613724565b602082019050919050565b6000612d5e602c836132ba565b9150612d698261374d565b604082019050919050565b6000612d816038836132ba565b9150612d8c8261379c565b604082019050919050565b6000612da4602a836132ba565b9150612daf826137eb565b604082019050919050565b6000612dc7602e836132ba565b9150612dd28261383a565b604082019050919050565b6000612dea6029836132ba565b9150612df582613889565b604082019050919050565b6000612e0d6020836132ba565b9150612e18826138d8565b602082019050919050565b6000612e30602c836132ba565b9150612e3b82613901565b604082019050919050565b6000612e536029836132ba565b9150612e5e82613950565b604082019050919050565b6000612e766021836132ba565b9150612e818261399f565b604082019050919050565b6000612e996031836132ba565b9150612ea4826139ee565b604082019050919050565b612eb881613455565b82525050565b6000612eca8285612c94565b9150612ed68284612c94565b91508190509392505050565b6000602082019050612ef76000830184612c04565b92915050565b6000608082019050612f126000830187612c04565b612f1f6020830186612c04565b612f2c6040830185612eaf565b8181036060830152612f3e8184612c22565b905095945050505050565b6000608082019050612f5e6000830187612c04565b612f6b6020830186612eaf565b612f786040830185612eaf565b612f856060830184612eaf565b95945050505050565b6000602082019050612fa36000830184612c13565b92915050565b60006020820190508181036000830152612fc38184612c5b565b905092915050565b60006020820190508181036000830152612fe481612cc5565b9050919050565b6000602082019050818103600083015261300481612ce8565b9050919050565b6000602082019050818103600083015261302481612d0b565b9050919050565b6000602082019050818103600083015261304481612d2e565b9050919050565b6000602082019050818103600083015261306481612d51565b9050919050565b6000602082019050818103600083015261308481612d74565b9050919050565b600060208201905081810360008301526130a481612d97565b9050919050565b600060208201905081810360008301526130c481612dba565b9050919050565b600060208201905081810360008301526130e481612ddd565b9050919050565b6000602082019050818103600083015261310481612e00565b9050919050565b6000602082019050818103600083015261312481612e23565b9050919050565b6000602082019050818103600083015261314481612e46565b9050919050565b6000602082019050818103600083015261316481612e69565b9050919050565b6000602082019050818103600083015261318481612e8c565b9050919050565b60006020820190506131a06000830184612eaf565b92915050565b60006040820190506131bb6000830185612eaf565b6131c86020830184612c04565b9392505050565b60006060820190506131e46000830186612eaf565b6131f16020830185612c04565b6131fe6040830184612eaf565b949350505050565b600060608201905061321b6000830186612eaf565b6132286020830185612eaf565b6132356040830184612eaf565b949350505050565b6000613247613258565b905061325382826134d3565b919050565b6000604051905090565b600067ffffffffffffffff82111561327d5761327c613609565b5b6132868261364c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006132e182613455565b91506132ec83613455565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133215761332061354d565b5b828201905092915050565b600061333782613455565b915061334283613455565b9250826133525761335161357c565b5b828204905092915050565b600061336882613455565b915061337383613455565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133ac576133ab61354d565b5b828202905092915050565b60006133c282613455565b91506133cd83613455565b9250828210156133e0576133df61354d565b5b828203905092915050565b60006133f682613435565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561348c578082015181840152602081019050613471565b8381111561349b576000848401525b50505050565b600060028204905060018216806134b957607f821691505b602082108114156134cd576134cc6135ab565b5b50919050565b6134dc8261364c565b810181811067ffffffffffffffff821117156134fb576134fa613609565b5b80604052505050565b600061350f82613455565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135425761354161354d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e746572206120746f6b656e49642066726f6d203020746f2039392e204f6e60008201527f6c79203130302074756c6970732e000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613a46816133eb565b8114613a5157600080fd5b50565b613a5d816133fd565b8114613a6857600080fd5b50565b613a7481613409565b8114613a7f57600080fd5b50565b613a8b81613455565b8114613a9657600080fd5b5056fe6261666b726569646a6c7179637637686b766e367a6d736e77626a79376c353633707961326677746e6a356d6d69717a6f736a7a797576763761796261666b726569686b336d696d787871696d776b6f776d32617270666165777a376d356f3736776376773461637969786874756e363733617a33346261666b726569686669706c776a6f347264737a75686e766a796e7837696573696a33626f726a64337266356f6e6c66676b776c71716a70626f756261666b72656963366a357170677733323677647436777961663665666d627a7a637734726c357a666a696b656e337578687534733635686332656261666b7265696262686375687879653267613379626c6634766d787371346e33616f6678636b62796c363661787567637a6233653664616e73756261666b726569686e657a6f64717264677368706b78356d6b6b6562697a34373279367233786a6e686a7472656137357464366a786f62663768616261666b72656963706e64346479736f616f76337261336a78736e6f616e79667967336435366e74757a6c6a726f37376132627067627a6f366e756261666b72656961656a366d6b6d366a6a697865717468656f6d717462706334787033797274703636766e6d637977786c657235716c67696477346261666b726569637974637735373268717a6b736e337a726475743232786f37776a786b66346f766a696a6f6b68706b7836766e63336e617837696261666b7265696533756e703235643679783779766937626f686f78326d6674707135726972686c343434796c6570356976696a6f7679627335756261666b7265696764696d71776a726b6f6b6c6266696967626b6670766d726e6965616c646a7232627635326a6237327366626b3661716f7271796261666b726569616a6c71336e64336e633778753234356571776e6f716b6834667a323572646b696e7737776b6a74717035347863627864736b696261666b726569616b6272676a377932687a62376468727075623663366937326933637036796773726f66353574357565623777746733336261656261666b7265696270686a6a6b6161727a64366b6b6e77776d6a746f6f636375703770337779757661686d61656d6379666a6e6264626a636932346261666b7265696433636b7a6c63763370367a68336f3363776272796e6f336b6571767a79616770746e78746f65723361777576796579647a34756261666b726569627a6c3232656c343762636f32686936776a367a6f766f7374656f7763646b7a69666567626733786e63646864336433706a6e756261666b726569657733676a763264676c64667a77356b667367696e6b76717a35727a6b74643564346e366132666e6d75716a6a6b37686863696d6261666b72656965686e33746f7662367761326e74366e736f7561766d79367672696a63347a373735686b34686a7a646e37623579356c6b6979616261666b726569646669787532783573766f6d34616976627a627779737a7274376574707937766d346465696570786766797a73687a6e327970696261666b7265696135377976736c3565736c6f633766736e377569773571366f706b6b3437376637716768327364326d69626c36366477677a346d6261666b726569616566636a6d6d706c6f6674716936616f33647a72706a74746e726861793268716974357078747a70776b69736d7669776937656261666b726569616272777236626a36327277617970326e7661613777656c74323468337266727369696c6a3666367161763472796a63656234716261666b72656961687764767077747a636e327434357273776f6c35676b6134327964327a6b6e3337746e346d736371376d657375776e677179716261666b726569687367647a767569727473336a74336732366c746f3733717175346267376e347175373264676d6b756a6a6b656e6565376537616261666b726569647366777a74796861367137693574656d716d34346d6c68736c637865726a6861736a326b646671686b73736c35796672676e756261666b726569673762646d653477323669743276687064753261687862746c327376756c356933683578686c70626472786e6d726e6f6d717a656261666b72656968786364656671356b34766f6d626c786b756a37356433623369786173787668756f6261673477686b72777961686679666964716261666b7265696273766875336a7865796f68737777696337753378747a77777a6267737371726d6d777a796a326677686e796b777075753765756261666b726569616b667579337061626970797333657365367565726475637a7068793572646b6363677568796873677970726d6e37717a336b656261666b726569676a6b6b68776233727464677662686a6336616f6172726c716d796665376634643637667674787072716e733372357a75366a6d6261666b726569667768356968373665643434637935343576796a6f767a7265326573676b3761366d326e6a656232716f356f667a7573367133346261666b726569646e763274373565336b78367567616a7332336c34373336617373786b7a726767736f637a3264767967736a6c7668766e747a616261666b726569657169353669653769796c34726e6532723779706e76726263707678787170333436633734736d676433767970677370647764696261666b72656965716368756d79377a69627871346d717070647163647666617771366f7437647870627a3376356675653262777970356976736d6261666b72656963707a79756d6e37666f376e65677864776233616e6c6a7766326c7179736571656837796f67636f69796937356b666274716b796261666b7265696569716d6332743632743270676162656e666b6569636c62346773696663776771766d6b63777163376c6b61786d3476717661696261666b7265696832687633766a69706a326b696270796e726d756c6e6e6f786a353733376362656732626a6c34327a633362686366647a6632756261666b726569636576376e7837733735797176326a70747477347272756b7a74777472346b7562787273337776337634716c6b7a346e713475796261666b726569686b616f767633666a32757379336b6b7a70346873706b69736171796d6b693536706c6a76716d3779727632696a7461337062716261666b72656964326a726b377271757861797864667679673377343437777173736f75746f79627165696875756e6d6175346e356f75726a34696261666b726569676d677169616669346f62746d747a7a736f63796c72666363746a74656d6d33746476656372336c6f626f3673717a37336f33756261666b7265696774786a6f683472783632757a6c78347432337478716b336f77766e33636b68793736366d6a697767767933666e79326f7a7a616261666b726569636b6a35663364773661626b34657a6a367676657068726f61636e697a70743437346a786a666663636b6c636934626d37756c756261666b726569653368336c7476766e6f6b796c7a797a6370756c74643761356261356c647034756934656a6c6872376c6275636b6c6a347a66756261666b726569686f3275666f636e6136646761767973367733687a6a75646370706e6937666e6d6f357064657333636e336d376e6469753362346261666b7265696875786b75333275646e32656f6c726469766475677232646435736f7432753763767468337170736a6f71626b6c6c62776b67796261666b726569683268686f6572756e746266793475666e676b6f3377626470346d36677a376f747533686e7475766e746c666c7965686b656a716261666b726569676b6a777a7a687634636e6477336568736d73626d69787a727878767270716a32653279656d786e6e6c776b65773566366773346261666b726569646476736e3234697377726d78743363656f37706e6773766d3434717a7a6b6e71746f32687a346d6579747362717732713279796261666b726569636e6a6e6e753677336372627a786b6f61326736323561766d6e656372683470746d75766a327135697a796765716874746a6e796261666b726569646e336f637a336d366c7a6775377768696f6f7137346d74637a626765743566696537646c647a77686166646b747935796a65346261666b72656967777061323571797837663233763774326e62647a7977666967777033323464657a326b7666727779696265636b6c376b6d72796261666b72656961353435367269626d69736435353563777436767a7535376f71716b6f6e75676f7a79776a756f7a736f786c6f3766666f7178696261666b7265696567343734716f6567356d796b6c6437647065676f346f793474766a6f726c6774706a61637733636a726c376f6f6773667336616261666b7265696274777077686b7367736b77717368777571656877666d3737327075377266786a637870696a707535696b6832637776637a76716261666b7265696468676b686b757770357171787a646d67613775683532717a6576657535337a7434613261686f617575723667616f72663373716261666b72656961736736373463726934776f69326e6d66326265323769323467646567786863356867616870796764377671637271767a3476616261666b7265696770786767656564737732793772643564717a6868663471787133687733793571716e6d7a676d6267353232357a33326b6536656261666b726569653371666570646c34706b7365367575336971776662326671757366703371737032726837796e76707470733362626e717a646d6261666b72656967626a7a796d627433666d6c6d667461356f726f723235737765647567703264726476736a62336a7561686e3665333372366c346261666b72656963356b3775326d3467337975667170696e376f666e623768676c357664746d746f33366c3333627736736a7735686b746d6f35616261666b726569616c6a7736677233736d736d686d72766364766c7378787667726f7975627a37666b327772767063726d6f6d783770646e6a6f656261666b726569636a65686e356b7272336c636e796c3635657968336e6a7266773561746570647a666d6a6167613434666d616e676476357436716261666b726569616c7137747a3636727771696674336877666873376d6b706a7261717032346c6b346b6b32616d6c6e683533357a7a6b697a7a796261666b72656962753533676777686f6f6a716b717773336c366e616d706d7a7879637a6b796d77356f7a667a3671347437747077696d686134796261666b726569636c626a33756a67786768356933706c61693574323470376732616176667a61687532677871346d6176656e61356f6a7866736d6261666b726569646566737878623569346e7664626c7961326d68376834756f3437647775746862356a716d6172746767347376777276783278656261666b726569626277346f79616b69676d757273636a33616b6e7971347471346234336a6a6b3277736f737a6f343637327368736f67347373756261666b726569637670656e7071657a6364656870636432736e73676a3479736c326c613434667a71646f6c626c723665767070733375756a636d6261666b72656962613332323775636c7a6f6264676c6d6b76797a346235646136677033703365687466717a6e7570726c6775336c74376a366e716261666b726569686c36686c327566626f726f7735636669797064746b6b327365677033767866657475706170736a6e6a767a77786c71326368656261666b72656968737a6e6b6f73787a7367666b757475757a68683434326b3765736a6475796c686461356175736662617574727575617a7a6d6d6261666b7265696637343236636566707278697570787767676e6b6a627468743366337569616563693271633369726c70707579376b716f656e716261666b726569637668756d7a6d6a6c37626f347571686e67777866706b3675707279347761786d3363736b3777676b6b797a6a656a67637761696261666b7265696764777665617878666c347366646e79656478346e6e6e667637667a73706a6d6d72336a34656f7a6a667637746a736f76776d616261666b726569673562367278336d6478777972746e756d796568767565747a72733364776b7876373677747168666179616d6d6832686c7376656261666b72656964667734626d646c3372636f65686e616b343362656f656f7563626276746b786c61676973766e756368756734666f70726870716261666b7265696434336479367a77746e76776f36736b6f6e6c3474636563686c686e75377269687032676e766f61796470786e337177367976616261666b7265696472726d65756a6c766164376f69677a74753435796571787763623677706f34363476777871737434716f336974776b366c64346261666b726569626d69757a6e6d62356c6b376773673633373662347a366f72626e32623533357536776e696d69713568776535736372656636756261666b726569656b637476726f323632706b34757a36376a7071697678746e696562716b33677966716b636c7732767179336d33696f637736656261666b7265696333717362356d6e323278793436676b673377686971687662326c716a6d75636271756971323766796637366237677066336b716261666b72656962787676366f697077787961656a77766634766e66747364366e3362663669786e7675627975733471356e71756434706c6376656261666b72656967357833723364716c6c74326e6468787061686e6935666a65656f326f62713466666c7334686b626937613263667174617070696261666b72656963737636666534796b6f6e6e733668786374636a687437627178353634366362706762737567347872367a673572627468646a346261666b726569667569346a7a6166666c37347a616b6962776d74326a73327732716f736d37797a67696d6563777671707178707a3270736e6d756261666b72656965617933366364326273726e3274697062347a696a766b796c6e666a3764696e73617a333432676e6f7065377773727279706a716261666b726569626578657875736163356c72747a6d6b32366634676337706732687a64663475706d64376b733337727465617a6f6c37366363796261666b726569677876646463757262617867756272656e71656168656e3437646b746d346f6d3533356b6165646571656e783770367a6f6474796261666b72656963646c616d6270756c79617974736966666c327972613535656a6864636368707a6c7833747275746b6f633474696e6b696f6d716261666b72656964756d6c797a6377627561616a61656579637136653679327a6372346a777132616d7933356e7368376c617068696563627976696261666b726569636a777a377036647076637173376f7264687a77736c61626377756a3379336865686b34706c36336a6b7465626a6d6e636a66796261666b726569613276656b756d636e79737768327736326874717537766564746b7365706f6b697870716e3471777a786865666a3262646e69716261666b726569647932656f6878726563726b33736934636f6f6c7861776c63646d71727668736b686b616c3464366276786a666d6473326d32346261666b72656967336d77347865627a7876726a37773579766b67366f356135357466326e6c656e6270727566376f796f33676175716a6874696d6261666b726569616d6b6f6b67677a6b63686b6f7378356a767a366664757a77636e377175676b70377079746d6b33323773626c72747761347a656261666b7265696462673234646e627435746f35766c366d35656b746677737477687032646a68736c6c66356d746369697a6c6767346c736536796261666b726569643269746c6a666f626e7870766a66786e736173326671626c793564796e37746b6f6776636f6a6a786d62376d757169656a74616261666b72656964366c787a6b74756d7935333574767a65646b7333616361717a72716972696d346d69676b62787270356572783567366d6665756261666b72656967756c65796274697268727764667033626d6d6b6d377877713633736f3377617867627779683237377568363264626835356e346261666b726569656f366e627778796168616166737766626534736168716279336837727532686669747a7275366971797871676368376e727a71a264697066735822122096e6010b640216a82f54512f6f5c0bcc884cd571a21674840a7e2e8bfa32755864736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000e69cf6b2f44e67a7bea652a6f73e72bb163d3d69

-----Decoded View---------------
Arg [0] : _feeRecipient (address): 0xe69CF6B2F44e67A7bEA652A6F73E72BB163D3D69

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e69cf6b2f44e67a7bea652a6f73e72bb163d3d69


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.