xDAI Price: $0.999785 (-0.03%)
Gas: 1.1 GWei

Contract

0x9f0B5B31e7FBDe3D9B1aF4e482Ef262b4ae9Ed90

Overview

xDAI Balance

Gnosis Chain LogoGnosis Chain LogoGnosis Chain Logo12,248.16459 xDAI

xDAI Value

$12,245.53 (@ $1.00/xDAI)
Transaction Hash
Method
Block
From
To
Transfer From387468242025-02-25 18:29:5056 days ago1740508190IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000016760.2
Set Approval For...382634192025-01-28 1:04:5085 days ago1738026290IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000038641.6
Set Approval For...377469272024-12-28 0:52:40116 days ago1735347160IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000100532.1825
Set Approval For...375040572024-12-13 11:07:50130 days ago1734088070IN
xDaiPunks: xDaiPunks Token
0 xDAI0.0000651.41135
Transfer From369723572024-11-11 18:26:00162 days ago1731349560IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000147981.8
Transfer From364356172024-10-10 15:22:10194 days ago1728573730IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000246633
Set Approval For...349982322024-07-16 16:40:35280 days ago1721148035IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000050712.1
Set Approval For...346797122024-06-27 15:31:50299 days ago1719502310IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000061372.54145268
Set Approval For...344289952024-06-12 16:17:30314 days ago1718209050IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000078281.7
Set Approval For...344289772024-06-12 16:16:00314 days ago1718208960IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000092122
Set Approval For...342777912024-06-03 15:02:55323 days ago1717426975IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000041031.7
Set Approval For...341865362024-05-29 4:30:40328 days ago1716957040IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000069091.5
Set Approval For...334387752024-04-14 11:53:35373 days ago1713095615IN
xDaiPunks: xDaiPunks Token
0 xDAI0.0002656511
Transfer From332732642024-04-04 13:02:35383 days ago1712235755IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000501496.1
Transfer From332732482024-04-04 13:01:10383 days ago1712235670IN
xDaiPunks: xDaiPunks Token
0 xDAI0.0012097512.8
Set Approval For...325828412024-02-22 19:33:05425 days ago1708630385IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000080421.74600002
Set Approval For...325408542024-02-20 5:46:20427 days ago1708407980IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000153523.33292867
Set Approval For...325383722024-02-20 2:05:05427 days ago1708394705IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000144183.13017863
Set Approval For...324389182024-02-13 23:28:15434 days ago1707866895IN
xDaiPunks: xDaiPunks Token
0 xDAI0.0005444911.82096812
Transfer From324388122024-02-13 23:19:00434 days ago1707866340IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000125741.5
Transfer From324387892024-02-13 23:17:05434 days ago1707866225IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000692499.68132387
Transfer From324387842024-02-13 23:16:40434 days ago1707866200IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000665738.72191339
Transfer From324387822024-02-13 23:16:20434 days ago1707866180IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000824228.72191339
Transfer From324387782024-02-13 23:15:55434 days ago1707866155IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000768699.68132387
Transfer From324387712024-02-13 23:15:20434 days ago1707866120IN
xDaiPunks: xDaiPunks Token
0 xDAI0.000623868.72191339
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
279746492023-05-16 15:58:35707 days ago1684252715
xDaiPunks: xDaiPunks Token
1 xDAI
279746322023-05-16 15:57:10707 days ago1684252630
xDaiPunks: xDaiPunks Token
1 xDAI
279735532023-05-16 14:22:30707 days ago1684246950
xDaiPunks: xDaiPunks Token
1 xDAI
279735332023-05-16 14:20:45707 days ago1684246845
xDaiPunks: xDaiPunks Token
1 xDAI
279734982023-05-16 14:17:35707 days ago1684246655
xDaiPunks: xDaiPunks Token
1 xDAI
279733542023-05-16 14:05:25707 days ago1684245925
xDaiPunks: xDaiPunks Token
1 xDAI
279733262023-05-16 14:03:05707 days ago1684245785
xDaiPunks: xDaiPunks Token
1 xDAI
279733052023-05-16 14:01:10707 days ago1684245670
xDaiPunks: xDaiPunks Token
1 xDAI
279732282023-05-16 13:54:35707 days ago1684245275
xDaiPunks: xDaiPunks Token
1 xDAI
273068182023-04-06 6:41:10747 days ago1680763270
xDaiPunks: xDaiPunks Token
1 xDAI
273033092023-04-06 1:36:20747 days ago1680744980
xDaiPunks: xDaiPunks Token
33 xDAI
272184002023-03-31 19:32:35753 days ago1680291155
xDaiPunks: xDaiPunks Token
11 xDAI
270689822023-03-22 15:19:10762 days ago1679498350
xDaiPunks: xDaiPunks Token
15 xDAI
266939452023-02-27 17:34:10785 days ago1677519250
xDaiPunks: xDaiPunks Token
55.99 xDAI
266070152023-02-22 12:19:20790 days ago1677068360
xDaiPunks: xDaiPunks Token
0.01 xDAI
265050572023-02-16 9:26:25796 days ago1676539585
xDaiPunks: xDaiPunks Token
1 xDAI
263109812023-02-04 18:08:25808 days ago1675534105
xDaiPunks: xDaiPunks Token
25.99 xDAI
262313662023-01-30 23:16:00813 days ago1675120560
xDaiPunks: xDaiPunks Token
25 xDAI
261424062023-01-25 13:44:45818 days ago1674654285
xDaiPunks: xDaiPunks Token
1 xDAI
261424032023-01-25 13:44:25818 days ago1674654265
xDaiPunks: xDaiPunks Token
1 xDAI
261423992023-01-25 13:44:05818 days ago1674654245
xDaiPunks: xDaiPunks Token
1 xDAI
261423902023-01-25 13:43:20818 days ago1674654200
xDaiPunks: xDaiPunks Token
2 xDAI
261423872023-01-25 13:43:05818 days ago1674654185
xDaiPunks: xDaiPunks Token
3 xDAI
261423832023-01-25 13:42:45818 days ago1674654165
xDaiPunks: xDaiPunks Token
13 xDAI
261423782023-01-25 13:42:20818 days ago1674654140
xDaiPunks: xDaiPunks Token
1 xDAI
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Punks

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at gnosisscan.io on 2022-11-22
*/

//                           ,@@@@@@@@             @@@@@@@@
//                           ,@@@@@@@@             @@@@@@@@
//                       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,
//                       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,
//                       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,
//                       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,
//                       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,
//  @@@@@            ###############################################            @@@@
//  @@@@@            ###############################################            @@@@
//  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//                       /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//                       /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
//                   .........                 ........
//                   %%%%%%%%%                *%%%%%%%%
//                   %%%%%%%%%%%%%        %%%%%%%%%%%%%%%%%
//                   %%%%%%%%%%%%%        %%%%%%%%%%%%%%%%%
//                       /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//                       /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//                       *((((%%%%%%%%%%%%%%%%/        %%%%%%%%
//                       *((((((((%%%%%%%%%%%%%%%%%%%%%%%%%((((
//                       *((((((((%%%%%%%%%%%%%%%%%%%%%%%%%((((
//                       *(((((((((((((((((((((((((((((((((((((
//                       *(((((((((((((((((((((((((((((((((((((
//                       *((((((((((((((((             ((((((((
//                       /%%%%(((((((((((((((((((((((((((((((((
//                       /%%%%(((((((((((((((((((((((((((((((((
//                       /%%%%%%%%(((((((((((((((((((((((((
//                       /%%%%%%%%(((((((((((((((((((((((((
//                       /%%%%%%%%%%%%
//                       /%%%%%%%%%%%%
//                       /%%%%%%%%%%%%
//                       /%%%%%%%%%%%%

//   ▒██   ██▒▓█████▄  ▄▄▄       ██▓ ██▓███   █    ██  ███▄    █  ██ ▄█▀  ██████
//   ▒▒ █ █ ▒░▒██▀ ██▌▒████▄    ▓██▒▓██░  ██▒ ██  ▓██▒ ██ ▀█   █  ██▄█▒ ▒██    ▒
//   ░░  █   ░░██   █▌▒██  ▀█▄  ▒██▒▓██░ ██▓▒▓██  ▒██░▓██  ▀█ ██▒▓███▄░ ░ ▓██▄
//    ░ █ █ ▒ ░▓█▄   ▌░██▄▄▄▄██ ░██░▒██▄█▓▒ ▒▓▓█  ░██░▓██▒  ▐▌██▒▓██ █▄   ▒   ██▒
//   ▒██▒ ▒██▒░▒████▓  ▓█   ▓██▒░██░▒██▒ ░  ░▒▒█████▓ ▒██░   ▓██░▒██▒ █▄▒██████▒▒
//   ▒▒ ░ ░▓ ░ ▒▒▓  ▒  ▒▒   ▓▒█░░▓  ▒▓▒░ ░  ░░▒▓▒ ▒ ▒ ░ ▒░   ▒ ▒ ▒ ▒▒ ▓▒▒ ▒▓▒ ▒ ░
//   ░░   ░▒ ░ ░ ▒  ▒   ▒   ▒▒ ░ ▒ ░░▒ ░     ░░▒░ ░ ░ ░ ░░   ░ ▒░░ ░▒ ▒░░ ░▒  ░ ░
//    ░    ░   ░ ░  ░   ░   ▒    ▒ ░░░        ░░░ ░ ░    ░   ░ ░ ░ ░░ ░ ░  ░  ░
//    ░    ░     ░          ░  ░ ░              ░              ░ ░  ░         ░
//             ░

pragma solidity 0.7.6;

/**
 * SPDX-License-Identifier: GPL-3.0-or-later
 * Muevo
 * Copyright (C) 2021 xDaiPunks
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface ERC721TokenReceiver {
    function onERC721Received(
        address _operator,
        address _from,
        uint256 _tokenId,
        bytes calldata _data
    ) external returns (bytes4);
}

library SafeMath {
    /**
     * @dev Multiplies two numbers, throws on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b);
        return c;
    }

    /**
     * @dev Integer division of two numbers, truncating the quotient.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }

    /**
     * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        return a - b;
    }

    /**
     * @dev Adds two numbers, throws on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        require(c >= a);
        return c;
    }
}

contract Punks is IERC721 {
    using SafeMath for uint256;

    event Mint(uint256 indexed index, address indexed minter);
    event PunkOffered(
        uint256 indexed punkIndex,
        uint256 minValue,
        address indexed toAddress
    );
    event PunkBidEntered(
        uint256 indexed punkIndex,
        uint256 value,
        address indexed fromAddress
    );
    event PunkBidWithdrawn(
        uint256 indexed punkIndex,
        uint256 value,
        address indexed fromAddress
    );
    event PunkBought(
        uint256 indexed punkIndex,
        uint256 value,
        address indexed fromAddress,
        address indexed toAddress
    );
    event PunkNoLongerForSale(uint256 indexed punkIndex);

    /**
     * Event emitted when the public sale begins.
     */
    event SaleBegins();

    bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    uint256 public constant TOKEN_LIMIT = 10000;

    mapping(bytes4 => bool) internal supportedInterfaces;

    mapping(uint256 => address) internal idToOwner;

    mapping(uint256 => address) internal idToApproval;

    mapping(address => mapping(address => bool)) internal ownerToOperators;

    mapping(address => uint256[]) internal ownerToIds;

    mapping(uint256 => uint256) internal idToOwnerIndex;

    string internal nftName = "xDaiPunks";
    string internal nftSymbol = "xDaiPunks";

    // You can use this hash to verify the image file containing all the punks
    string public imageHash;

    uint256 internal numTokens = 0;
    uint256 internal numSales = 0;

    address payable internal deployer;
    address payable internal developer;

    bool public publicSale = false;
    uint256 private mintPrice = 12e18;
    uint256 public saleStartTime;

    //// Random index assignment
    uint256 internal nonce = 0;
    uint256[TOKEN_LIMIT] internal indices;

    //// Market
    bool public marketPaused;
    bool public contractSealed;
    mapping(address => uint256) public xDaiBalance;
    mapping(bytes32 => bool) public cancelledOffers;

    modifier onlyDeployer() {
        require(msg.sender == deployer, "Only deployer.");
        _;
    }

    bool private reentrancyLock = false;

    /* Prevent a contract function from being reentrant-called. */
    modifier reentrancyGuard() {
        if (reentrancyLock) {
            revert();
        }
        reentrancyLock = true;
        _;
        reentrancyLock = false;
    }

    modifier canOperate(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(
            tokenOwner == msg.sender ||
                ownerToOperators[tokenOwner][msg.sender],
            "Cannot operate."
        );
        _;
    }

    modifier canTransfer(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(
            tokenOwner == msg.sender ||
                idToApproval[_tokenId] == msg.sender ||
                ownerToOperators[tokenOwner][msg.sender],
            "Cannot transfer."
        );
        _;
    }

    modifier validNFToken(uint256 _tokenId) {
        require(idToOwner[_tokenId] != address(0), "Invalid token.");
        _;
    }

    constructor(address payable _developer, string memory _imageHash) {
        supportedInterfaces[0x01ffc9a7] = true; // ERC165
        supportedInterfaces[0x80ac58cd] = true; // ERC721
        supportedInterfaces[0x780e9d63] = true; // ERC721 Enumerable
        supportedInterfaces[0x5b5e139f] = true; // ERC721 Metadata
        deployer = msg.sender;
        developer = _developer;
        imageHash = _imageHash;
    }

    function startSale() external onlyDeployer {
        require(!publicSale);
        saleStartTime = block.timestamp;
        publicSale = true;
        emit SaleBegins();
    }

    function pauseMarket(bool _paused) external onlyDeployer {
        require(!contractSealed, "Contract sealed.");
        marketPaused = _paused;
    }

    function sealContract() external onlyDeployer {
        contractSealed = true;
    }

    //////////////////////////
    //// ERC 721 and 165  ////
    //////////////////////////

    function isContract(address _addr)
        internal
        view
        returns (bool addressCheck)
    {
        uint256 size;
        assembly {
            size := extcodesize(_addr)
        } // solhint-disable-line
        addressCheck = size > 0;
    }

    function supportsInterface(bytes4 _interfaceID)
        external
        view
        override
        returns (bool)
    {
        return supportedInterfaces[_interfaceID];
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes calldata _data
    ) external override {
        _safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external override {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external override canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from, "Wrong from address.");
        require(_to != address(0), "Cannot send to 0x0.");
        _transfer(_to, _tokenId);
    }

    function approve(address _approved, uint256 _tokenId)
        external
        override
        canOperate(_tokenId)
        validNFToken(_tokenId)
    {
        address tokenOwner = idToOwner[_tokenId];
        require(_approved != tokenOwner);
        idToApproval[_tokenId] = _approved;
        emit Approval(tokenOwner, _approved, _tokenId);
    }

    function setApprovalForAll(address _operator, bool _approved)
        external
        override
    {
        ownerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    function balanceOf(address _owner)
        external
        view
        override
        returns (uint256)
    {
        require(_owner != address(0));
        return _getOwnerNFTCount(_owner);
    }

    function ownerOf(uint256 _tokenId)
        public
        view
        override
        returns (address _owner)
    {
        require(idToOwner[_tokenId] != address(0));
        _owner = idToOwner[_tokenId];
    }

    function getApproved(uint256 _tokenId)
        external
        view
        override
        validNFToken(_tokenId)
        returns (address)
    {
        return idToApproval[_tokenId];
    }

    function isApprovedForAll(address _owner, address _operator)
        external
        view
        override
        returns (bool)
    {
        return ownerToOperators[_owner][_operator];
    }

    function _transfer(address _to, uint256 _tokenId) internal {
        address from = idToOwner[_tokenId];
        _clearApproval(_tokenId);

        _removeNFToken(from, _tokenId);
        _addNFToken(_to, _tokenId);

        emit Transfer(from, _to, _tokenId);
    }

    function randomIndex() internal returns (uint256) {
        uint256 totalSize = TOKEN_LIMIT - numTokens;
        uint256 index = uint256(
            keccak256(
                abi.encodePacked(
                    nonce,
                    msg.sender,
                    block.difficulty,
                    block.timestamp
                )
            )
        ) % totalSize;
        uint256 value = 0;
        if (indices[index] != 0) {
            value = indices[index];
        } else {
            value = index;
        }

        // Move last value to selected position
        if (indices[totalSize - 1] == 0) {
            // Array position not initialized, so use position
            indices[index] = totalSize - 1;
        } else {
            // Array position holds a value so use that
            indices[index] = indices[totalSize - 1];
        }
        nonce++;
        // Don't allow a zero index, start counting at 1
        return value.add(1);
    }

    function mintsRemaining() external view returns (uint256) {
        return TOKEN_LIMIT.sub(numSales);
    }

    /**
     * Public sale minting.
     */
    function mint(uint256 numberOfNfts) external payable reentrancyGuard {
        require(publicSale, "Sale not started.");
        require(!marketPaused);
        require(numberOfNfts > 0, "numberOfNfts cannot be 0");
        require(
            numberOfNfts <= 20,
            "You can not buy more than 20 NFTs at once"
        );
        require(
            totalSupply().add(numberOfNfts) <= TOKEN_LIMIT,
            "Exceeds TOKEN_LIMIT"
        );
        require(
            mintPrice.mul(numberOfNfts) == msg.value,
            "xDai value sent is not correct"
        );

        developer.transfer(msg.value);

        for (uint256 i = 0; i < numberOfNfts; i++) {
            numSales++;
            _mint(msg.sender);
        }
    }

    function _mint(address _to) internal returns (uint256) {
        require(_to != address(0), "Cannot mint to 0x0.");
        require(numTokens < TOKEN_LIMIT, "Token limit reached.");
        uint256 id = randomIndex();

        numTokens = numTokens + 1;
        _addNFToken(_to, id);

        emit Mint(id, _to);
        emit Transfer(address(0), _to, id);
        return id;
    }

    function _addNFToken(address _to, uint256 _tokenId) internal {
        require(
            idToOwner[_tokenId] == address(0),
            "Cannot add, already owned."
        );
        idToOwner[_tokenId] = _to;

        ownerToIds[_to].push(_tokenId);
        idToOwnerIndex[_tokenId] = ownerToIds[_to].length.sub(1);
    }

    function _removeNFToken(address _from, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == _from, "Incorrect owner.");
        delete idToOwner[_tokenId];

        uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
        uint256 lastTokenIndex = ownerToIds[_from].length.sub(1);

        if (lastTokenIndex != tokenToRemoveIndex) {
            uint256 lastToken = ownerToIds[_from][lastTokenIndex];
            ownerToIds[_from][tokenToRemoveIndex] = lastToken;
            idToOwnerIndex[lastToken] = tokenToRemoveIndex;
        }

        ownerToIds[_from].pop();
    }

    function _getOwnerNFTCount(address _owner) internal view returns (uint256) {
        return ownerToIds[_owner].length;
    }

    function _safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) private canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from, "Incorrect owner.");
        require(_to != address(0));

        _transfer(_to, _tokenId);

        if (isContract(_to)) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(
                msg.sender,
                _from,
                _tokenId,
                _data
            );
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    function _safeTransfer(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) private validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from, "Incorrect owner.");
        require(_to != address(0));

        _transfer(_to, _tokenId);

        if (isContract(_to)) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(
                msg.sender,
                _from,
                _tokenId,
                _data
            );
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    function _clearApproval(uint256 _tokenId) private {
        if (idToApproval[_tokenId] != address(0)) {
            delete idToApproval[_tokenId];
        }
    }

    //// Enumerable

    function totalSupply() public view returns (uint256) {
        return numTokens;
    }

    function tokenByIndex(uint256 index) public pure returns (uint256) {
        require(index >= 0 && index < TOKEN_LIMIT);
        return index + 1;
    }

    function tokenOfOwnerByIndex(address _owner, uint256 _index)
        external
        view
        returns (uint256)
    {
        require(_index < ownerToIds[_owner].length);
        return ownerToIds[_owner][_index];
    }

    //// Metadata

    /**
     * @dev Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + (temp % 10)));
            temp /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Returns a descriptive name for a collection of NFTokens.
     * @return _name Representing name.
     */
    function name() external view returns (string memory _name) {
        _name = nftName;
    }

    /**
     * @dev Returns an abbreviated name for NFTokens.
     * @return _symbol Representing symbol.
     */
    function symbol() external view returns (string memory _symbol) {
        _symbol = nftSymbol;
    }

    /**
     * @dev A distinct URI (RFC 3986) for a given NFT.
     * @param _tokenId Id for which we want uri.
     * @return _tokenId URI of _tokenId.
     */
    function tokenURI(uint256 _tokenId)
        external
        view
        validNFToken(_tokenId)
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "https://xdaipunks.com/api/punk/",
                    toString(_tokenId)
                )
            );
    }

    //// MARKET

    struct Offer {
        bool isForSale;
        uint256 punkIndex;
        address seller;
        uint256 minValue; // in xDai
        address onlySellTo; // specify to sell only to a specific person
    }

    struct Bid {
        bool hasBid;
        uint256 punkIndex;
        address bidder;
        uint256 value;
    }

    // A record of punks that are offered for sale at a specific minimum value, and perhaps to a specific person
    mapping(uint256 => Offer) public punksOfferedForSale;

    // A record of the highest punk bid
    mapping(uint256 => Bid) public punkBids;

    mapping(address => uint256) public pendingWithdrawals;

    modifier onlyTokenOwner(uint256 _tokenId) {
        require(_tokenId < 10000, "punk number is wrong");
        require(ownerOf(_tokenId) == msg.sender, "Incorrect owner.");
        _;
    }

    function punkNoLongerForSale(uint256 punkIndex)
        public
        reentrancyGuard
        onlyTokenOwner(punkIndex)
    {
        _punkNoLongerForSale(punkIndex);
    }

    function _punkNoLongerForSale(uint256 punkIndex) private {
        punksOfferedForSale[punkIndex] = Offer(
            false,
            punkIndex,
            msg.sender,
            0,
            address(0)
        );
        emit PunkNoLongerForSale(punkIndex);
    }

    function offerPunkForSale(uint256 punkIndex, uint256 minSalePriceInWei)
        public
        reentrancyGuard
        onlyTokenOwner(punkIndex)
    {
        require(marketPaused == false, "Market Paused");
        punksOfferedForSale[punkIndex] = Offer(
            true,
            punkIndex,
            msg.sender,
            minSalePriceInWei,
            address(0)
        );
        emit PunkOffered(punkIndex, minSalePriceInWei, address(0));
    }

    function offerPunkForSaleToAddress(
        uint256 punkIndex,
        uint256 minSalePriceInWei,
        address toAddress
    ) public reentrancyGuard onlyTokenOwner(punkIndex) {
        require(marketPaused == false, "Market Paused");
        punksOfferedForSale[punkIndex] = Offer(
            true,
            punkIndex,
            msg.sender,
            minSalePriceInWei,
            toAddress
        );
        emit PunkOffered(punkIndex, minSalePriceInWei, toAddress);
    }

    function buyPunk(uint256 punkIndex) public payable reentrancyGuard {
        require(marketPaused == false, "Market Paused");
        require(punkIndex < 10000, "punk number is wrong");
        Offer memory offer = punksOfferedForSale[punkIndex];
        require(offer.isForSale, "punk not actually for sale");
        require(
            offer.onlySellTo == address(0) || offer.onlySellTo == msg.sender,
            "punk not supposed to be sold to this user"
        );
        require(msg.value >= offer.minValue, "Didn't send enough amount");
        require(
            ownerOf(punkIndex) == offer.seller,
            "Seller no longer owner of punk"
        );

        address seller = offer.seller;

        _safeTransfer(seller, msg.sender, punkIndex, "");
        _punkNoLongerForSale(punkIndex);
        pendingWithdrawals[seller] += msg.value;
        emit PunkBought(punkIndex, msg.value, seller, msg.sender);

        // Check for the case where there is a bid from the new owner and refund it.
        // Any other bid can stay in place.
        Bid memory bid = punkBids[punkIndex];
        if (bid.bidder == msg.sender) {
            // Kill bid and refund value
            pendingWithdrawals[msg.sender] += bid.value;

            punkBids[punkIndex] = Bid(false, punkIndex, address(0), 0);
        }
    }

    function withdraw() public reentrancyGuard {
        uint256 amount = pendingWithdrawals[msg.sender];
        // Remember to zero the pending refund before
        // sending to prevent re-entrancy attacks
        pendingWithdrawals[msg.sender] = 0;
        msg.sender.transfer(amount);
    }

    function enterBidForPunk(uint256 punkIndex) public payable reentrancyGuard {
        require(marketPaused == false, "Market Paused");
        require(punkIndex < 10000, "punk number is wrong");
        require(
            ownerOf(punkIndex) != msg.sender,
            "you can not bid on your punk"
        );
        require(msg.value > 0, "bid can not be zero");
        Bid memory existing = punkBids[punkIndex];
        require(
            msg.value > existing.value,
            "you can not bid lower than last bid"
        );
        if (existing.value > 0) {
            // Refund the failing bid

            pendingWithdrawals[existing.bidder] += existing.value;
        }

        punkBids[punkIndex] = Bid(true, punkIndex, msg.sender, msg.value);

        emit PunkBidEntered(punkIndex, msg.value, msg.sender);
    }

    function acceptBidForPunk(uint256 punkIndex, uint256 minPrice)
        public
        reentrancyGuard
        onlyTokenOwner(punkIndex)
    {
        require(marketPaused == false, "Market Paused");
        address seller = msg.sender;
        Bid memory bid = punkBids[punkIndex];
        require(bid.value > 0, "there is not any bid");
        require(bid.value >= minPrice, "bid is lower than min price");

        _punkNoLongerForSale(punkIndex);
        _safeTransfer(seller, bid.bidder, punkIndex, "");

        uint256 amount = bid.value;

        punkBids[punkIndex] = Bid(false, punkIndex, address(0), 0);

        pendingWithdrawals[seller] += amount;
        emit PunkBought(punkIndex, bid.value, seller, bid.bidder);
    }

    function withdrawBidForPunk(uint256 punkIndex) public reentrancyGuard {
        require(punkIndex < 10000, "punk number is wrong");
        require(ownerOf(punkIndex) != msg.sender, "wrong action");
        require(
            punkBids[punkIndex].bidder == msg.sender,
            "Only bidder can withdraw"
        );

        Bid memory bid = punkBids[punkIndex];
        emit PunkBidWithdrawn(punkIndex, bid.value, msg.sender);
        uint256 amount = bid.value;
        punkBids[punkIndex] = Bid(false, punkIndex, address(0), 0);
        // Refund the bid money
        msg.sender.transfer(amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address payable","name":"_developer","type":"address"},{"internalType":"string","name":"_imageHash","type":"string"}],"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":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"minter","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"PunkBidEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"PunkBidWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"PunkBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"PunkNoLongerForSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minValue","type":"uint256"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"PunkOffered","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleBegins","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"},{"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"}],"name":"acceptBidForPunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","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":"punkIndex","type":"uint256"}],"name":"buyPunk","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cancelledOffers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"enterBidForPunk","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imageHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"marketPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"uint256","name":"minSalePriceInWei","type":"uint256"}],"name":"offerPunkForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"uint256","name":"minSalePriceInWei","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"offerPunkForSaleToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"punkBids","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"punkNoLongerForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"punksOfferedForSale","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"address","name":"onlySellTo","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":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sealContract","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":[],"name":"startSale","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":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"withdrawBidForPunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"xDaiBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c060405260096080819052687844616950756e6b7360b81b60a09081526200002c916006919062000286565b50604080518082019091526009808252687844616950756e6b7360b81b60209092019182526200005f9160079162000286565b5060006009819055600a819055600c805460ff60a01b1916905567a688906bd8b00000600d55600f55612723805460ff19169055348015620000a057600080fd5b50604051620038623803806200386283398181016040526040811015620000c657600080fd5b815160208301805160405192949293830192919084640100000000821115620000ee57600080fd5b9083019060208201858111156200010457600080fd5b82516401000000008111828201881017156200011f57600080fd5b82525081516020918201929091019080838360005b838110156200014e57818101518382015260200162000134565b50505050905090810190601f1680156200017c5780820380516001836020036101000a031916815260200191505b506040525050600060208181527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c58054600160ff1991821681179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548216831790557f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b43188054821683179055635b5e139f60e01b9093527f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805490931617909155600b8054336001600160a01b031991821617909155600c80549091166001600160a01b03861617905582516200027d925060089184019062000286565b50505062000332565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002be576000855562000309565b82601f10620002d957805160ff191683800117855562000309565b8280016001018555821562000309579182015b8281111562000309578251825591602001919060010190620002ec565b50620003179291506200031b565b5090565b5b808211156200031757600081556001016200031c565b61352080620003426000396000f3fe60806040526004361061023b5760003560e01c80636352211e1161012e578063ae5b770d116100ab578063c44193c31161006f578063c44193c3146108f5578063c87b56dd14610925578063e985e9c51461094f578063f3f437031461098a578063f6eeff1e146109bd5761023b565b8063ae5b770d146107bc578063b6501637146107ef578063b66a0e5d14610804578063b88d4fde14610819578063bf31196f146108b65761023b565b806395d89b41116100f257806395d89b41146106fb578063979bc638146107105780639f7bf7621461073a578063a0712d6814610764578063a22cb465146107815761023b565b80636352211e1461061257806368bd580e1461063c5780636e743fa91461065157806370a08231146106ab5780638264fe98146106de5761023b565b806323b872dd116101bc57806342842e0e1161018057806342842e0e1461054f57806344c66be7146105925780634f6ccce7146105a757806351605d80146105d15780635ec390d8146105e65761023b565b806323b872dd146104945780632f745c59146104d757806333bc1c5c146105105780633a283bd2146105255780633ccfd60b1461053a5761023b565b8063091dbfd211610203578063091dbfd2146103e2578063095ea7b31461040157806318160ddd1461043a5780631cbaee2d1461044f57806323165b75146104645761023b565b806301ffc9a714610240578063031bd4c41461028857806306fdde03146102af578063081812fc14610339578063088f11f31461037f575b600080fd5b34801561024c57600080fd5b506102746004803603602081101561026357600080fd5b50356001600160e01b0319166109e7565b604080519115158252519081900360200190f35b34801561029457600080fd5b5061029d610a0a565b60408051918252519081900360200190f35b3480156102bb57600080fd5b506102c4610a10565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fe5781810151838201526020016102e6565b50505050905090810190601f16801561032b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561034557600080fd5b506103636004803603602081101561035c57600080fd5b5035610aa6565b604080516001600160a01b039092168252519081900360200190f35b34801561038b57600080fd5b506103a9600480360360208110156103a257600080fd5b5035610b1f565b60408051951515865260208601949094526001600160a01b03928316858501526060850191909152166080830152519081900360a00190f35b6103ff600480360360208110156103f857600080fd5b5035610b5e565b005b34801561040d57600080fd5b506103ff6004803603604081101561042457600080fd5b506001600160a01b038135169060200135610e40565b34801561044657600080fd5b5061029d610fb2565b34801561045b57600080fd5b5061029d610fb8565b34801561047057600080fd5b506103ff6004803603604081101561048757600080fd5b5080359060200135610fbe565b3480156104a057600080fd5b506103ff600480360360608110156104b757600080fd5b506001600160a01b038135811691602081013590911690604001356112c7565b3480156104e357600080fd5b5061029d600480360360408110156104fa57600080fd5b506001600160a01b03813516906020013561149d565b34801561051c57600080fd5b506102746114f9565b34801561053157600080fd5b50610274611509565b34801561054657600080fd5b506103ff611513565b34801561055b57600080fd5b506103ff6004803603606081101561057257600080fd5b506001600160a01b03813581169160208101359091169060400135611583565b34801561059e57600080fd5b5061029d6115a3565b3480156105b357600080fd5b5061029d600480360360208110156105ca57600080fd5b50356115c1565b3480156105dd57600080fd5b506102c46115d8565b3480156105f257600080fd5b506103ff6004803603602081101561060957600080fd5b50351515611666565b34801561061e57600080fd5b506103636004803603602081101561063557600080fd5b503561171b565b34801561064857600080fd5b506103ff611758565b34801561065d57600080fd5b5061067b6004803603602081101561067457600080fd5b50356117ba565b60408051941515855260208501939093526001600160a01b03909116838301526060830152519081900360800190f35b3480156106b757600080fd5b5061029d600480360360208110156106ce57600080fd5b50356001600160a01b03166117f2565b6103ff600480360360208110156106f457600080fd5b5035611810565b34801561070757600080fd5b506102c4611c1b565b34801561071c57600080fd5b506103ff6004803603602081101561073357600080fd5b5035611c7c565b34801561074657600080fd5b506102746004803603602081101561075d57600080fd5b5035611ecf565b6103ff6004803603602081101561077a57600080fd5b5035611ee5565b34801561078d57600080fd5b506103ff600480360360408110156107a457600080fd5b506001600160a01b038135169060200135151561211b565b3480156107c857600080fd5b5061029d600480360360208110156107df57600080fd5b50356001600160a01b0316612189565b3480156107fb57600080fd5b5061027461219c565b34801561081057600080fd5b506103ff6121ab565b34801561082557600080fd5b506103ff6004803603608081101561083c57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460018302840111640100000000831117156108ab57600080fd5b509092509050612254565b3480156108c257600080fd5b506103ff600480360360608110156108d957600080fd5b50803590602081013590604001356001600160a01b031661229d565b34801561090157600080fd5b506103ff6004803603604081101561091857600080fd5b5080359060200135612484565b34801561093157600080fd5b506102c46004803603602081101561094857600080fd5b5035612667565b34801561095b57600080fd5b506102746004803603604081101561097257600080fd5b506001600160a01b0381358116916020013516612765565b34801561099657600080fd5b5061029d600480360360208110156109ad57600080fd5b50356001600160a01b0316612793565b3480156109c957600080fd5b506103ff600480360360208110156109e057600080fd5b50356127a6565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b61271081565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a9c5780601f10610a7157610100808354040283529160200191610a9c565b820191906000526020600020905b815481529060010190602001808311610a7f57829003601f168201915b5050505050905090565b60008181526001602052604081205482906001600160a01b0316610b02576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b50506000908152600260205260409020546001600160a01b031690565b612724602052600090815260409020805460018201546002830154600384015460049094015460ff9093169391926001600160a01b0391821692911685565b6127235460ff1615610b6f57600080fd5b612723805460ff191660011790556127205460ff1615610bc6576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b6127108110610c13576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b33610c1d8261171b565b6001600160a01b03161415610c79576040805162461bcd60e51b815260206004820152601c60248201527f796f752063616e206e6f7420626964206f6e20796f75722070756e6b00000000604482015290519081900360640190fd5b60003411610cc4576040805162461bcd60e51b81526020600482015260136024820152726269642063616e206e6f74206265207a65726f60681b604482015290519081900360640190fd5b600081815261272560209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b031692820192909252600390910154606082018190523411610d535760405162461bcd60e51b81526004018080602001828103825260238152602001806134c86023913960400191505060405180910390fd5b606081015115610d855760608101516040808301516001600160a01b0316600090815261272660205220805490910190555b604080516080810182526001808252602080830186815233848601818152346060870181815260008b815261272587528990209751885460ff1916901515178855935195870195909555516002860180546001600160a01b0319166001600160a01b03909216919091179055905160039094019390935583519182529251919285927f5b859394fabae0c1ba88baffe67e751ab5248d2e879028b8c8d6897b0519f56a9281900390910190a35050612723805460ff19169055565b60008181526001602052604090205481906001600160a01b031633811480610e8b57506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b610ece576040805162461bcd60e51b815260206004820152600f60248201526e21b0b73737ba1037b832b930ba329760891b604482015290519081900360640190fd5b60008381526001602052604090205483906001600160a01b0316610f2a576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6000848152600160205260409020546001600160a01b03908116908616811415610f5357600080fd5b60008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60095490565b600e5481565b6127235460ff1615610fcf57600080fd5b612723805460ff1916600117905581612710811061102b576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b336110358261171b565b6001600160a01b031614611083576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6127205460ff16156110cc576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b600083815261272560209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b03169282019290925260039091015460608201819052339190611169576040805162461bcd60e51b81526020600482015260146024820152731d1a195c99481a5cc81b9bdd08185b9e48189a5960621b604482015290519081900360640190fd5b83816060015110156111c2576040805162461bcd60e51b815260206004820152601b60248201527f626964206973206c6f776572207468616e206d696e2070726963650000000000604482015290519081900360640190fd5b6111cb85612870565b6111ea8282604001518760405180602001604052806000815250612927565b6060818101805160408051608081018252600080825260208083018c81528385018381529784018381528d845261272583528584209451855460ff19169015151785559051600185015596516002840180546001600160a01b0319166001600160a01b0392831617905596516003909301929092558786168082526127268352908390208054850190558287015194518351908152925193959490941693928a927f58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e392908290030190a45050612723805460ff1916905550505050565b60008181526001602052604090205481906001600160a01b03163381148061130557506000828152600260205260409020546001600160a01b031633145b8061133357506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b611377576040805162461bcd60e51b815260206004820152601060248201526f21b0b73737ba103a3930b739b332b91760811b604482015290519081900360640190fd5b60008381526001602052604090205483906001600160a01b03166113d3576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6000848152600160205260409020546001600160a01b039081169087168114611439576040805162461bcd60e51b81526020600482015260136024820152722bb937b73390333937b69030b2323932b9b99760691b604482015290519081900360640190fd5b6001600160a01b03861661148a576040805162461bcd60e51b815260206004820152601360248201527221b0b73737ba1039b2b732103a3790183c181760691b604482015290519081900360640190fd5b6114948686612b38565b50505050505050565b6001600160a01b03821660009081526004602052604081205482106114c157600080fd5b6001600160a01b03831660009081526004602052604090208054839081106114e557fe5b906000526020600020015490505b92915050565b600c54600160a01b900460ff1681565b6127205460ff1681565b6127235460ff161561152457600080fd5b612723805460ff191660011790553360008181526127266020526040808220805490839055905190929183156108fc02918491818181858888f19350505050158015611574573d6000803e3d6000fd5b5050612723805460ff19169055565b61159e83838360405180602001604052806000815250612bb3565b505050565b60006115bc600a54612710612e7890919063ffffffff16565b905090565b600061271082106115d157600080fd5b5060010190565b6008805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561165e5780601f106116335761010080835404028352916020019161165e565b820191906000526020600020905b81548152906001019060200180831161164157829003601f168201915b505050505081565b600b546001600160a01b031633146116b6576040805162461bcd60e51b815260206004820152600e60248201526d27b7363c903232b83637bcb2b91760911b604482015290519081900360640190fd5b61272054610100900460ff1615611707576040805162461bcd60e51b815260206004820152601060248201526f21b7b73a3930b1ba1039b2b0b632b21760811b604482015290519081900360640190fd5b612720805460ff1916911515919091179055565b6000818152600160205260408120546001600160a01b031661173c57600080fd5b506000908152600160205260409020546001600160a01b031690565b600b546001600160a01b031633146117a8576040805162461bcd60e51b815260206004820152600e60248201526d27b7363c903232b83637bcb2b91760911b604482015290519081900360640190fd5b612720805461ff001916610100179055565b61272560205260009081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b039091169084565b60006001600160a01b03821661180757600080fd5b6114f382612e8d565b6127235460ff161561182157600080fd5b612723805460ff191660011790556127205460ff1615611878576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b61271081106118c5576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b60008181526127246020908152604091829020825160a081018452815460ff16151580825260018301549382019390935260028201546001600160a01b0390811694820194909452600382015460608201526004909101549092166080830152611976576040805162461bcd60e51b815260206004820152601a60248201527f70756e6b206e6f742061637475616c6c7920666f722073616c65000000000000604482015290519081900360640190fd5b60808101516001600160a01b0316158061199c575060808101516001600160a01b031633145b6119d75760405162461bcd60e51b81526004018080602001828103825260298152602001806134766029913960400191505060405180910390fd5b8060600151341015611a30576040805162461bcd60e51b815260206004820152601960248201527f4469646e27742073656e6420656e6f75676820616d6f756e7400000000000000604482015290519081900360640190fd5b80604001516001600160a01b0316611a478361171b565b6001600160a01b031614611aa2576040805162461bcd60e51b815260206004820152601e60248201527f53656c6c6572206e6f206c6f6e676572206f776e6572206f662070756e6b0000604482015290519081900360640190fd5b600081604001519050611ac681338560405180602001604052806000815250612927565b611acf83612870565b6001600160a01b038116600081815261272660209081526040918290208054349081019091558251908152915133939287927f58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e392918290030190a4600083815261272560209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b031692820183905260030154606082015290331415611c0a5760608181015133600090815261272660209081526040808320805490940190935582516080810184528281528082018981528185018481529582018481528a8552612725909352939092209151825460ff19169015151782559151600182015591516002830180546001600160a01b0319166001600160a01b03909216919091179055516003909101555b5050612723805460ff191690555050565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a9c5780601f10610a7157610100808354040283529160200191610a9c565b6127235460ff1615611c8d57600080fd5b612723805460ff191660011790556127108110611ce8576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b33611cf28261171b565b6001600160a01b03161415611d3d576040805162461bcd60e51b815260206004820152600c60248201526b3bb937b7339030b1ba34b7b760a11b604482015290519081900360640190fd5b600081815261272560205260409020600201546001600160a01b03163314611dac576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c79206269646465722063616e2077697468647261770000000000000000604482015290519081900360640190fd5b600081815261272560209081526040918290208251608081018452815460ff161515815260018201548184015260028201546001600160a01b03168185015260039091015460608201819052835190815292519092339285927f6f30e1ee4d81dcc7a8a478577f65d2ed2edb120565960ac45fe7c50551c879329281900390910190a360608181015160408051608081018252600080825260208083018881528385018381529684018381528984526127259092528483209351845460ff191690151517845551600184015594516002830180546001600160a01b0319166001600160a01b03909216919091179055935160039091015551909133916108fc84150291849190818181858888f19350505050158015611c0a573d6000803e3d6000fd5b6127226020526000908152604090205460ff1681565b6127235460ff1615611ef657600080fd5b612723805460ff19166001179055600c54600160a01b900460ff16611f56576040805162461bcd60e51b815260206004820152601160248201527029b0b632903737ba1039ba30b93a32b21760791b604482015290519081900360640190fd5b6127205460ff1615611f6757600080fd5b60008111611fbc576040805162461bcd60e51b815260206004820152601860248201527f6e756d6265724f664e6674732063616e6e6f7420626520300000000000000000604482015290519081900360640190fd5b6014811115611ffc5760405162461bcd60e51b815260040180806020018281038252602981526020018061349f6029913960400191505060405180910390fd5b6127106120118261200b610fb2565b90612ea8565b111561205a576040805162461bcd60e51b8152602060048201526013602482015272115e18d959591cc81513d2d15397d312535255606a1b604482015290519081900360640190fd5b600d5434906120699083612eb8565b146120bb576040805162461bcd60e51b815260206004820152601e60248201527f784461692076616c75652073656e74206973206e6f7420636f72726563740000604482015290519081900360640190fd5b600c546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156120f4573d6000803e3d6000fd5b5060005b8181101561157457600a8054600101905561211233612ee0565b506001016120f8565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6127216020526000908152604090205481565b61272054610100900460ff1681565b600b546001600160a01b031633146121fb576040805162461bcd60e51b815260206004820152600e60248201526d27b7363c903232b83637bcb2b91760911b604482015290519081900360640190fd5b600c54600160a01b900460ff161561221257600080fd5b42600e55600c805460ff60a01b1916600160a01b1790556040517f771cfe172460b7d64cc46cca57a1e1f40f52b47cf1d16fe30c78a2935b3dd58090600090a1565b61229685858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612bb392505050565b5050505050565b6127235460ff16156122ae57600080fd5b612723805460ff1916600117905582612710811061230a576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b336123148261171b565b6001600160a01b031614612362576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6127205460ff16156123ab576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b6040805160a0810182526001808252602080830188815233848601908152606085018981526001600160a01b038981166080880181815260008e815261272488528a90209851895460ff191690151517895594519688019690965591516002870180546001600160a01b03199081169285169290921790559051600387015591516004909501805490921694169390931790925582518681529251909287927f3c7b682d5da98001a9b8cbda6c647d2c63d698a4184fd1d55e2ce7b66f5d21eb92918290030190a35050612723805460ff191690555050565b6127235460ff161561249557600080fd5b612723805460ff191660011790558161271081106124f1576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b336124fb8261171b565b6001600160a01b031614612549576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6127205460ff1615612592576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b6040805160a0810182526001808252602080830187815233848601908152606085018881526000608087018181528b825261272486528882209751885460ff191690151517885593519587019590955590516002860180546001600160a01b03199081166001600160a01b039384161790915591516003870155915160049095018054909116949091169390931790925582518581529251909286927f3c7b682d5da98001a9b8cbda6c647d2c63d698a4184fd1d55e2ce7b66f5d21eb92918290030190a35050612723805460ff1916905550565b60008181526001602052604090205460609082906001600160a01b03166126c6576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6126cf83613015565b60405160200180807f68747470733a2f2f7864616970756e6b732e636f6d2f6170692f70756e6b2f00815250601f0182805190602001908083835b602083106127295780518252601f19909201916020918201910161270a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6127266020526000908152604090205481565b6127235460ff16156127b757600080fd5b612723805460ff19166001179055806127108110612813576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b3361281d8261171b565b6001600160a01b03161461286b576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b611574825b6040805160a081018252600080825260208083018581523384860190815260608501848152608086018581528886526127249094528685209551865460ff191690151517865591516001860155516002850180546001600160a01b03199081166001600160a01b0393841617909155915160038601559151600490940180549091169390911692909217909155905182917fb0e0a660b4e50f26f0b7ce75c24655fc76cc66e3334a54ff410277229fa10bd491a250565b60008281526001602052604090205482906001600160a01b0316612983576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6000838152600160205260409020546001600160a01b0390811690861681146129e6576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6001600160a01b0385166129f957600080fd5b612a038585612b38565b612a0c856130f0565b15612b30576000856001600160a01b031663150b7a02338988886040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612a96578181015183820152602001612a7e565b50505050905090810190601f168015612ac35780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612ae557600080fd5b505af1158015612af9573d6000803e3d6000fd5b505050506040513d6020811015612b0f57600080fd5b505190506001600160e01b03198116630a85bd0160e11b1461149457600080fd5b505050505050565b6000818152600160205260409020546001600160a01b0316612b59826130f6565b612b638183613133565b612b6d83836132a4565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b031633811480612bf157506000828152600260205260409020546001600160a01b031633145b80612c1f57506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b612c63576040805162461bcd60e51b815260206004820152601060248201526f21b0b73737ba103a3930b739b332b91760811b604482015290519081900360640190fd5b60008481526001602052604090205484906001600160a01b0316612cbf576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6000858152600160205260409020546001600160a01b039081169088168114612d22576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6001600160a01b038716612d3557600080fd5b612d3f8787612b38565b612d48876130f0565b15612e6e576000876001600160a01b031663150b7a02338b8a8a6040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612dd2578181015183820152602001612dba565b50505050905090810190601f168015612dff5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612e2157600080fd5b505af1158015612e35573d6000803e3d6000fd5b505050506040513d6020811015612e4b57600080fd5b505190506001600160e01b03198116630a85bd0160e11b14612e6c57600080fd5b505b5050505050505050565b600082821115612e8757600080fd5b50900390565b6001600160a01b031660009081526004602052604090205490565b818101828110156114f357600080fd5b600082612ec7575060006114f3565b5081810281838281612ed557fe5b04146114f357600080fd5b60006001600160a01b038216612f33576040805162461bcd60e51b815260206004820152601360248201527221b0b73737ba1036b4b73a103a3790183c181760691b604482015290519081900360640190fd5b61271060095410612f82576040805162461bcd60e51b81526020600482015260146024820152732a37b5b2b7103634b6b4ba103932b0b1b432b21760611b604482015290519081900360640190fd5b6000612f8c613379565b6009805460010190559050612fa183826132a4565b6040516001600160a01b0384169082907ff3cea5493d790af0133817606f7350a91d7f154ea52eaa79d179d4d231e5010290600090a360405181906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a492915050565b60608161303a57506040805180820190915260018152600360fc1b6020820152610a05565b8160005b811561305257600101600a8204915061303e565b60008167ffffffffffffffff8111801561306b57600080fd5b506040519080825280601f01601f191660200182016040528015613096576020820181803683370190505b50859350905060001982015b83156130e757600a840660300160f81b828280600190039350815181106130c557fe5b60200101906001600160f81b031916908160001a905350600a840493506130a2565b50949350505050565b3b151590565b6000818152600260205260409020546001600160a01b03161561313057600081815260026020526040902080546001600160a01b03191690555b50565b6000818152600160205260409020546001600160a01b03838116911614613194576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b031916905560058252808420546001600160a01b038716855260049092528320549092916131dc9190612e78565b9050818114613267576001600160a01b038416600090815260046020526040812080548390811061320957fe5b906000526020600020015490508060046000876001600160a01b03166001600160a01b03168152602001908152602001600020848154811061324757fe5b600091825260208083209091019290925591825260059052604090208290555b6001600160a01b038416600090815260046020526040902080548061328857fe5b6001900381819060005260206000200160009055905550505050565b6000818152600160205260409020546001600160a01b03161561330e576040805162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206164642c20616c7265616479206f776e65642e000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558085526004835290842080548085018255818652928520909201859055909252905461336691612e78565b6000918252600560205260409091205550565b600954600f54604080516020808201939093523360601b81830152446054820152426074808301919091528251808303909101815260949091019091528051910120600091612710039082908290816133ce57fe5b069050600060108261271081106133e157fe5b0154156133ff5760108261271081106133f657fe5b01549050613402565b50805b601060018403612710811061341357fe5b01546134325760018303601083612710811061342b57fe5b0155613456565b601060018403612710811061344357fe5b0154601083612710811061345357fe5b01555b600f8054600190810190915561346d908290612ea8565b93505050509056fe70756e6b206e6f7420737570706f73656420746f20626520736f6c6420746f20746869732075736572596f752063616e206e6f7420627579206d6f7265207468616e203230204e465473206174206f6e6365796f752063616e206e6f7420626964206c6f776572207468616e206c61737420626964a2646970667358221220372684e70863d979afc88bacb8c62908b946fc73d2a14b9f9270cbb6489c65da64736f6c6343000706003300000000000000000000000045ac02146674614ad0ee9faaf2a7238b65754ecc0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004033613538666139363331636165356237303433363830323532613965366533653435303963616634623134646562643731346639343161333632343066303039

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636352211e1161012e578063ae5b770d116100ab578063c44193c31161006f578063c44193c3146108f5578063c87b56dd14610925578063e985e9c51461094f578063f3f437031461098a578063f6eeff1e146109bd5761023b565b8063ae5b770d146107bc578063b6501637146107ef578063b66a0e5d14610804578063b88d4fde14610819578063bf31196f146108b65761023b565b806395d89b41116100f257806395d89b41146106fb578063979bc638146107105780639f7bf7621461073a578063a0712d6814610764578063a22cb465146107815761023b565b80636352211e1461061257806368bd580e1461063c5780636e743fa91461065157806370a08231146106ab5780638264fe98146106de5761023b565b806323b872dd116101bc57806342842e0e1161018057806342842e0e1461054f57806344c66be7146105925780634f6ccce7146105a757806351605d80146105d15780635ec390d8146105e65761023b565b806323b872dd146104945780632f745c59146104d757806333bc1c5c146105105780633a283bd2146105255780633ccfd60b1461053a5761023b565b8063091dbfd211610203578063091dbfd2146103e2578063095ea7b31461040157806318160ddd1461043a5780631cbaee2d1461044f57806323165b75146104645761023b565b806301ffc9a714610240578063031bd4c41461028857806306fdde03146102af578063081812fc14610339578063088f11f31461037f575b600080fd5b34801561024c57600080fd5b506102746004803603602081101561026357600080fd5b50356001600160e01b0319166109e7565b604080519115158252519081900360200190f35b34801561029457600080fd5b5061029d610a0a565b60408051918252519081900360200190f35b3480156102bb57600080fd5b506102c4610a10565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fe5781810151838201526020016102e6565b50505050905090810190601f16801561032b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561034557600080fd5b506103636004803603602081101561035c57600080fd5b5035610aa6565b604080516001600160a01b039092168252519081900360200190f35b34801561038b57600080fd5b506103a9600480360360208110156103a257600080fd5b5035610b1f565b60408051951515865260208601949094526001600160a01b03928316858501526060850191909152166080830152519081900360a00190f35b6103ff600480360360208110156103f857600080fd5b5035610b5e565b005b34801561040d57600080fd5b506103ff6004803603604081101561042457600080fd5b506001600160a01b038135169060200135610e40565b34801561044657600080fd5b5061029d610fb2565b34801561045b57600080fd5b5061029d610fb8565b34801561047057600080fd5b506103ff6004803603604081101561048757600080fd5b5080359060200135610fbe565b3480156104a057600080fd5b506103ff600480360360608110156104b757600080fd5b506001600160a01b038135811691602081013590911690604001356112c7565b3480156104e357600080fd5b5061029d600480360360408110156104fa57600080fd5b506001600160a01b03813516906020013561149d565b34801561051c57600080fd5b506102746114f9565b34801561053157600080fd5b50610274611509565b34801561054657600080fd5b506103ff611513565b34801561055b57600080fd5b506103ff6004803603606081101561057257600080fd5b506001600160a01b03813581169160208101359091169060400135611583565b34801561059e57600080fd5b5061029d6115a3565b3480156105b357600080fd5b5061029d600480360360208110156105ca57600080fd5b50356115c1565b3480156105dd57600080fd5b506102c46115d8565b3480156105f257600080fd5b506103ff6004803603602081101561060957600080fd5b50351515611666565b34801561061e57600080fd5b506103636004803603602081101561063557600080fd5b503561171b565b34801561064857600080fd5b506103ff611758565b34801561065d57600080fd5b5061067b6004803603602081101561067457600080fd5b50356117ba565b60408051941515855260208501939093526001600160a01b03909116838301526060830152519081900360800190f35b3480156106b757600080fd5b5061029d600480360360208110156106ce57600080fd5b50356001600160a01b03166117f2565b6103ff600480360360208110156106f457600080fd5b5035611810565b34801561070757600080fd5b506102c4611c1b565b34801561071c57600080fd5b506103ff6004803603602081101561073357600080fd5b5035611c7c565b34801561074657600080fd5b506102746004803603602081101561075d57600080fd5b5035611ecf565b6103ff6004803603602081101561077a57600080fd5b5035611ee5565b34801561078d57600080fd5b506103ff600480360360408110156107a457600080fd5b506001600160a01b038135169060200135151561211b565b3480156107c857600080fd5b5061029d600480360360208110156107df57600080fd5b50356001600160a01b0316612189565b3480156107fb57600080fd5b5061027461219c565b34801561081057600080fd5b506103ff6121ab565b34801561082557600080fd5b506103ff6004803603608081101561083c57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460018302840111640100000000831117156108ab57600080fd5b509092509050612254565b3480156108c257600080fd5b506103ff600480360360608110156108d957600080fd5b50803590602081013590604001356001600160a01b031661229d565b34801561090157600080fd5b506103ff6004803603604081101561091857600080fd5b5080359060200135612484565b34801561093157600080fd5b506102c46004803603602081101561094857600080fd5b5035612667565b34801561095b57600080fd5b506102746004803603604081101561097257600080fd5b506001600160a01b0381358116916020013516612765565b34801561099657600080fd5b5061029d600480360360208110156109ad57600080fd5b50356001600160a01b0316612793565b3480156109c957600080fd5b506103ff600480360360208110156109e057600080fd5b50356127a6565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b61271081565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a9c5780601f10610a7157610100808354040283529160200191610a9c565b820191906000526020600020905b815481529060010190602001808311610a7f57829003601f168201915b5050505050905090565b60008181526001602052604081205482906001600160a01b0316610b02576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b50506000908152600260205260409020546001600160a01b031690565b612724602052600090815260409020805460018201546002830154600384015460049094015460ff9093169391926001600160a01b0391821692911685565b6127235460ff1615610b6f57600080fd5b612723805460ff191660011790556127205460ff1615610bc6576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b6127108110610c13576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b33610c1d8261171b565b6001600160a01b03161415610c79576040805162461bcd60e51b815260206004820152601c60248201527f796f752063616e206e6f7420626964206f6e20796f75722070756e6b00000000604482015290519081900360640190fd5b60003411610cc4576040805162461bcd60e51b81526020600482015260136024820152726269642063616e206e6f74206265207a65726f60681b604482015290519081900360640190fd5b600081815261272560209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b031692820192909252600390910154606082018190523411610d535760405162461bcd60e51b81526004018080602001828103825260238152602001806134c86023913960400191505060405180910390fd5b606081015115610d855760608101516040808301516001600160a01b0316600090815261272660205220805490910190555b604080516080810182526001808252602080830186815233848601818152346060870181815260008b815261272587528990209751885460ff1916901515178855935195870195909555516002860180546001600160a01b0319166001600160a01b03909216919091179055905160039094019390935583519182529251919285927f5b859394fabae0c1ba88baffe67e751ab5248d2e879028b8c8d6897b0519f56a9281900390910190a35050612723805460ff19169055565b60008181526001602052604090205481906001600160a01b031633811480610e8b57506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b610ece576040805162461bcd60e51b815260206004820152600f60248201526e21b0b73737ba1037b832b930ba329760891b604482015290519081900360640190fd5b60008381526001602052604090205483906001600160a01b0316610f2a576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6000848152600160205260409020546001600160a01b03908116908616811415610f5357600080fd5b60008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60095490565b600e5481565b6127235460ff1615610fcf57600080fd5b612723805460ff1916600117905581612710811061102b576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b336110358261171b565b6001600160a01b031614611083576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6127205460ff16156110cc576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b600083815261272560209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b03169282019290925260039091015460608201819052339190611169576040805162461bcd60e51b81526020600482015260146024820152731d1a195c99481a5cc81b9bdd08185b9e48189a5960621b604482015290519081900360640190fd5b83816060015110156111c2576040805162461bcd60e51b815260206004820152601b60248201527f626964206973206c6f776572207468616e206d696e2070726963650000000000604482015290519081900360640190fd5b6111cb85612870565b6111ea8282604001518760405180602001604052806000815250612927565b6060818101805160408051608081018252600080825260208083018c81528385018381529784018381528d845261272583528584209451855460ff19169015151785559051600185015596516002840180546001600160a01b0319166001600160a01b0392831617905596516003909301929092558786168082526127268352908390208054850190558287015194518351908152925193959490941693928a927f58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e392908290030190a45050612723805460ff1916905550505050565b60008181526001602052604090205481906001600160a01b03163381148061130557506000828152600260205260409020546001600160a01b031633145b8061133357506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b611377576040805162461bcd60e51b815260206004820152601060248201526f21b0b73737ba103a3930b739b332b91760811b604482015290519081900360640190fd5b60008381526001602052604090205483906001600160a01b03166113d3576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6000848152600160205260409020546001600160a01b039081169087168114611439576040805162461bcd60e51b81526020600482015260136024820152722bb937b73390333937b69030b2323932b9b99760691b604482015290519081900360640190fd5b6001600160a01b03861661148a576040805162461bcd60e51b815260206004820152601360248201527221b0b73737ba1039b2b732103a3790183c181760691b604482015290519081900360640190fd5b6114948686612b38565b50505050505050565b6001600160a01b03821660009081526004602052604081205482106114c157600080fd5b6001600160a01b03831660009081526004602052604090208054839081106114e557fe5b906000526020600020015490505b92915050565b600c54600160a01b900460ff1681565b6127205460ff1681565b6127235460ff161561152457600080fd5b612723805460ff191660011790553360008181526127266020526040808220805490839055905190929183156108fc02918491818181858888f19350505050158015611574573d6000803e3d6000fd5b5050612723805460ff19169055565b61159e83838360405180602001604052806000815250612bb3565b505050565b60006115bc600a54612710612e7890919063ffffffff16565b905090565b600061271082106115d157600080fd5b5060010190565b6008805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561165e5780601f106116335761010080835404028352916020019161165e565b820191906000526020600020905b81548152906001019060200180831161164157829003601f168201915b505050505081565b600b546001600160a01b031633146116b6576040805162461bcd60e51b815260206004820152600e60248201526d27b7363c903232b83637bcb2b91760911b604482015290519081900360640190fd5b61272054610100900460ff1615611707576040805162461bcd60e51b815260206004820152601060248201526f21b7b73a3930b1ba1039b2b0b632b21760811b604482015290519081900360640190fd5b612720805460ff1916911515919091179055565b6000818152600160205260408120546001600160a01b031661173c57600080fd5b506000908152600160205260409020546001600160a01b031690565b600b546001600160a01b031633146117a8576040805162461bcd60e51b815260206004820152600e60248201526d27b7363c903232b83637bcb2b91760911b604482015290519081900360640190fd5b612720805461ff001916610100179055565b61272560205260009081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b039091169084565b60006001600160a01b03821661180757600080fd5b6114f382612e8d565b6127235460ff161561182157600080fd5b612723805460ff191660011790556127205460ff1615611878576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b61271081106118c5576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b60008181526127246020908152604091829020825160a081018452815460ff16151580825260018301549382019390935260028201546001600160a01b0390811694820194909452600382015460608201526004909101549092166080830152611976576040805162461bcd60e51b815260206004820152601a60248201527f70756e6b206e6f742061637475616c6c7920666f722073616c65000000000000604482015290519081900360640190fd5b60808101516001600160a01b0316158061199c575060808101516001600160a01b031633145b6119d75760405162461bcd60e51b81526004018080602001828103825260298152602001806134766029913960400191505060405180910390fd5b8060600151341015611a30576040805162461bcd60e51b815260206004820152601960248201527f4469646e27742073656e6420656e6f75676820616d6f756e7400000000000000604482015290519081900360640190fd5b80604001516001600160a01b0316611a478361171b565b6001600160a01b031614611aa2576040805162461bcd60e51b815260206004820152601e60248201527f53656c6c6572206e6f206c6f6e676572206f776e6572206f662070756e6b0000604482015290519081900360640190fd5b600081604001519050611ac681338560405180602001604052806000815250612927565b611acf83612870565b6001600160a01b038116600081815261272660209081526040918290208054349081019091558251908152915133939287927f58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e392918290030190a4600083815261272560209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b031692820183905260030154606082015290331415611c0a5760608181015133600090815261272660209081526040808320805490940190935582516080810184528281528082018981528185018481529582018481528a8552612725909352939092209151825460ff19169015151782559151600182015591516002830180546001600160a01b0319166001600160a01b03909216919091179055516003909101555b5050612723805460ff191690555050565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a9c5780601f10610a7157610100808354040283529160200191610a9c565b6127235460ff1615611c8d57600080fd5b612723805460ff191660011790556127108110611ce8576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b33611cf28261171b565b6001600160a01b03161415611d3d576040805162461bcd60e51b815260206004820152600c60248201526b3bb937b7339030b1ba34b7b760a11b604482015290519081900360640190fd5b600081815261272560205260409020600201546001600160a01b03163314611dac576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c79206269646465722063616e2077697468647261770000000000000000604482015290519081900360640190fd5b600081815261272560209081526040918290208251608081018452815460ff161515815260018201548184015260028201546001600160a01b03168185015260039091015460608201819052835190815292519092339285927f6f30e1ee4d81dcc7a8a478577f65d2ed2edb120565960ac45fe7c50551c879329281900390910190a360608181015160408051608081018252600080825260208083018881528385018381529684018381528984526127259092528483209351845460ff191690151517845551600184015594516002830180546001600160a01b0319166001600160a01b03909216919091179055935160039091015551909133916108fc84150291849190818181858888f19350505050158015611c0a573d6000803e3d6000fd5b6127226020526000908152604090205460ff1681565b6127235460ff1615611ef657600080fd5b612723805460ff19166001179055600c54600160a01b900460ff16611f56576040805162461bcd60e51b815260206004820152601160248201527029b0b632903737ba1039ba30b93a32b21760791b604482015290519081900360640190fd5b6127205460ff1615611f6757600080fd5b60008111611fbc576040805162461bcd60e51b815260206004820152601860248201527f6e756d6265724f664e6674732063616e6e6f7420626520300000000000000000604482015290519081900360640190fd5b6014811115611ffc5760405162461bcd60e51b815260040180806020018281038252602981526020018061349f6029913960400191505060405180910390fd5b6127106120118261200b610fb2565b90612ea8565b111561205a576040805162461bcd60e51b8152602060048201526013602482015272115e18d959591cc81513d2d15397d312535255606a1b604482015290519081900360640190fd5b600d5434906120699083612eb8565b146120bb576040805162461bcd60e51b815260206004820152601e60248201527f784461692076616c75652073656e74206973206e6f7420636f72726563740000604482015290519081900360640190fd5b600c546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156120f4573d6000803e3d6000fd5b5060005b8181101561157457600a8054600101905561211233612ee0565b506001016120f8565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6127216020526000908152604090205481565b61272054610100900460ff1681565b600b546001600160a01b031633146121fb576040805162461bcd60e51b815260206004820152600e60248201526d27b7363c903232b83637bcb2b91760911b604482015290519081900360640190fd5b600c54600160a01b900460ff161561221257600080fd5b42600e55600c805460ff60a01b1916600160a01b1790556040517f771cfe172460b7d64cc46cca57a1e1f40f52b47cf1d16fe30c78a2935b3dd58090600090a1565b61229685858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612bb392505050565b5050505050565b6127235460ff16156122ae57600080fd5b612723805460ff1916600117905582612710811061230a576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b336123148261171b565b6001600160a01b031614612362576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6127205460ff16156123ab576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b6040805160a0810182526001808252602080830188815233848601908152606085018981526001600160a01b038981166080880181815260008e815261272488528a90209851895460ff191690151517895594519688019690965591516002870180546001600160a01b03199081169285169290921790559051600387015591516004909501805490921694169390931790925582518681529251909287927f3c7b682d5da98001a9b8cbda6c647d2c63d698a4184fd1d55e2ce7b66f5d21eb92918290030190a35050612723805460ff191690555050565b6127235460ff161561249557600080fd5b612723805460ff191660011790558161271081106124f1576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b336124fb8261171b565b6001600160a01b031614612549576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6127205460ff1615612592576040805162461bcd60e51b815260206004820152600d60248201526c13585c9ad95d0814185d5cd959609a1b604482015290519081900360640190fd5b6040805160a0810182526001808252602080830187815233848601908152606085018881526000608087018181528b825261272486528882209751885460ff191690151517885593519587019590955590516002860180546001600160a01b03199081166001600160a01b039384161790915591516003870155915160049095018054909116949091169390931790925582518581529251909286927f3c7b682d5da98001a9b8cbda6c647d2c63d698a4184fd1d55e2ce7b66f5d21eb92918290030190a35050612723805460ff1916905550565b60008181526001602052604090205460609082906001600160a01b03166126c6576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6126cf83613015565b60405160200180807f68747470733a2f2f7864616970756e6b732e636f6d2f6170692f70756e6b2f00815250601f0182805190602001908083835b602083106127295780518252601f19909201916020918201910161270a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6127266020526000908152604090205481565b6127235460ff16156127b757600080fd5b612723805460ff19166001179055806127108110612813576040805162461bcd60e51b815260206004820152601460248201527370756e6b206e756d6265722069732077726f6e6760601b604482015290519081900360640190fd5b3361281d8261171b565b6001600160a01b03161461286b576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b611574825b6040805160a081018252600080825260208083018581523384860190815260608501848152608086018581528886526127249094528685209551865460ff191690151517865591516001860155516002850180546001600160a01b03199081166001600160a01b0393841617909155915160038601559151600490940180549091169390911692909217909155905182917fb0e0a660b4e50f26f0b7ce75c24655fc76cc66e3334a54ff410277229fa10bd491a250565b60008281526001602052604090205482906001600160a01b0316612983576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6000838152600160205260409020546001600160a01b0390811690861681146129e6576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6001600160a01b0385166129f957600080fd5b612a038585612b38565b612a0c856130f0565b15612b30576000856001600160a01b031663150b7a02338988886040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612a96578181015183820152602001612a7e565b50505050905090810190601f168015612ac35780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612ae557600080fd5b505af1158015612af9573d6000803e3d6000fd5b505050506040513d6020811015612b0f57600080fd5b505190506001600160e01b03198116630a85bd0160e11b1461149457600080fd5b505050505050565b6000818152600160205260409020546001600160a01b0316612b59826130f6565b612b638183613133565b612b6d83836132a4565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b031633811480612bf157506000828152600260205260409020546001600160a01b031633145b80612c1f57506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b612c63576040805162461bcd60e51b815260206004820152601060248201526f21b0b73737ba103a3930b739b332b91760811b604482015290519081900360640190fd5b60008481526001602052604090205484906001600160a01b0316612cbf576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b6000858152600160205260409020546001600160a01b039081169088168114612d22576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b6001600160a01b038716612d3557600080fd5b612d3f8787612b38565b612d48876130f0565b15612e6e576000876001600160a01b031663150b7a02338b8a8a6040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612dd2578181015183820152602001612dba565b50505050905090810190601f168015612dff5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612e2157600080fd5b505af1158015612e35573d6000803e3d6000fd5b505050506040513d6020811015612e4b57600080fd5b505190506001600160e01b03198116630a85bd0160e11b14612e6c57600080fd5b505b5050505050505050565b600082821115612e8757600080fd5b50900390565b6001600160a01b031660009081526004602052604090205490565b818101828110156114f357600080fd5b600082612ec7575060006114f3565b5081810281838281612ed557fe5b04146114f357600080fd5b60006001600160a01b038216612f33576040805162461bcd60e51b815260206004820152601360248201527221b0b73737ba1036b4b73a103a3790183c181760691b604482015290519081900360640190fd5b61271060095410612f82576040805162461bcd60e51b81526020600482015260146024820152732a37b5b2b7103634b6b4ba103932b0b1b432b21760611b604482015290519081900360640190fd5b6000612f8c613379565b6009805460010190559050612fa183826132a4565b6040516001600160a01b0384169082907ff3cea5493d790af0133817606f7350a91d7f154ea52eaa79d179d4d231e5010290600090a360405181906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a492915050565b60608161303a57506040805180820190915260018152600360fc1b6020820152610a05565b8160005b811561305257600101600a8204915061303e565b60008167ffffffffffffffff8111801561306b57600080fd5b506040519080825280601f01601f191660200182016040528015613096576020820181803683370190505b50859350905060001982015b83156130e757600a840660300160f81b828280600190039350815181106130c557fe5b60200101906001600160f81b031916908160001a905350600a840493506130a2565b50949350505050565b3b151590565b6000818152600260205260409020546001600160a01b03161561313057600081815260026020526040902080546001600160a01b03191690555b50565b6000818152600160205260409020546001600160a01b03838116911614613194576040805162461bcd60e51b815260206004820152601060248201526f24b731b7b93932b1ba1037bbb732b91760811b604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b031916905560058252808420546001600160a01b038716855260049092528320549092916131dc9190612e78565b9050818114613267576001600160a01b038416600090815260046020526040812080548390811061320957fe5b906000526020600020015490508060046000876001600160a01b03166001600160a01b03168152602001908152602001600020848154811061324757fe5b600091825260208083209091019290925591825260059052604090208290555b6001600160a01b038416600090815260046020526040902080548061328857fe5b6001900381819060005260206000200160009055905550505050565b6000818152600160205260409020546001600160a01b03161561330e576040805162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206164642c20616c7265616479206f776e65642e000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558085526004835290842080548085018255818652928520909201859055909252905461336691612e78565b6000918252600560205260409091205550565b600954600f54604080516020808201939093523360601b81830152446054820152426074808301919091528251808303909101815260949091019091528051910120600091612710039082908290816133ce57fe5b069050600060108261271081106133e157fe5b0154156133ff5760108261271081106133f657fe5b01549050613402565b50805b601060018403612710811061341357fe5b01546134325760018303601083612710811061342b57fe5b0155613456565b601060018403612710811061344357fe5b0154601083612710811061345357fe5b01555b600f8054600190810190915561346d908290612ea8565b93505050509056fe70756e6b206e6f7420737570706f73656420746f20626520736f6c6420746f20746869732075736572596f752063616e206e6f7420627579206d6f7265207468616e203230204e465473206174206f6e6365796f752063616e206e6f7420626964206c6f776572207468616e206c61737420626964a2646970667358221220372684e70863d979afc88bacb8c62908b946fc73d2a14b9f9270cbb6489c65da64736f6c63430007060033

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

00000000000000000000000045ac02146674614ad0ee9faaf2a7238b65754ecc0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004033613538666139363331636165356237303433363830323532613965366533653435303963616634623134646562643731346639343161333632343066303039

-----Decoded View---------------
Arg [0] : _developer (address): 0x45Ac02146674614ad0Ee9FaAf2a7238b65754EcC
Arg [1] : _imageHash (string): 3a58fa9631cae5b7043680252a9e6e3e4509caf4b14debd714f941a36240f009

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000045ac02146674614ad0ee9faaf2a7238b65754ecc
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [3] : 3361353866613936333163616535623730343336383032353261396536653365
Arg [4] : 3435303963616634623134646562643731346639343161333632343066303039


Deployed Bytecode Sourcemap

7334:20723:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11873:186;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11873:186:0;-1:-1:-1;;;;;;11873:186:0;;:::i;:::-;;;;;;;;;;;;;;;;;;8254:43;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20926:94;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13938:201;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13938:201:0;;:::i;:::-;;;;-1:-1:-1;;;;;13938:201:0;;;;;;;;;;;;;;22257:52;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22257:52:0;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22257:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25808:852;;;;;;;;;;;;;;;;-1:-1:-1;25808:852:0;;:::i;:::-;;12878:361;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12878:361:0;;;;;;;;:::i;19623:88::-;;;;;;;;;;;;;:::i;9116:28::-;;;;;;;;;;;;;:::i;26668:754::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26668:754:0;;;;;;;:::i;12489:381::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12489:381:0;;;;;;;;;;;;;;;;;:::i;19882:231::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19882:231:0;;;;;;;;:::i;9039:30::-;;;;;;;;;;;;;:::i;9283:24::-;;;;;;;;;;;;;:::i;25502:298::-;;;;;;;;;;;;;:::i;12295:186::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12295:186:0;;;;;;;;;;;;;;;;;:::i;15654:109::-;;;;;;;;;;;;;:::i;19719:155::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19719:155:0;;:::i;8849:23::-;;;;;;;;;;;;;:::i;11243:153::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11243:153:0;;;;:::i;13708:222::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13708:222:0;;:::i;11404:86::-;;;;;;;;;;;;;:::i;22359:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22359:39:0;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22359:39:0;;;;;;;;;;;;;;;;;;;;13492:208;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13492:208:0;-1:-1:-1;;;;;13492:208:0;;:::i;24136:1358::-;;;;;;;;;;;;;;;;-1:-1:-1;24136:1358:0;;:::i;21146:102::-;;;;;;;;;;;;;:::i;27430:624::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27430:624:0;;:::i;9400:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9400:47:0;;:::i;15818:768::-;;;;;;;;;;;;;;;;-1:-1:-1;15818:768:0;;:::i;13247:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13247:237:0;;;;;;;;;;:::i;9347:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9347:46:0;-1:-1:-1;;;;;9347:46:0;;:::i;9314:26::-;;;;;;;;;;;;;:::i;11055:180::-;;;;;;;;;;;;;:::i;12067:220::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12067:220:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12067:220:0;;-1:-1:-1;12067:220:0;-1:-1:-1;12067:220:0;:::i;23627:501::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23627:501:0;;;;;;;;;;;-1:-1:-1;;;;;23627:501:0;;:::i;23146:473::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23146:473:0;;;;;;;:::i;21422:349::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21422:349:0;;:::i;14147:201::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14147:201:0;;;;;;;;;;:::i;22407:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22407:53:0;-1:-1:-1;;;;;22407:53:0;;:::i;22670:179::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22670:179:0;;:::i;11873:186::-;-1:-1:-1;;;;;;12018:33:0;;11989:4;12018:33;;;;;;;;;;;;;11873:186;;;;:::o;8254:43::-;8292:5;8254:43;:::o;20926:94::-;21005:7;20997:15;;;;;;;;-1:-1:-1;;20997:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20965:19;;20997:15;;21005:7;;20997:15;;21005:7;20997:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20926:94;:::o;13938:201::-;14077:7;10539:19;;;:9;:19;;;;;;14049:8;;-1:-1:-1;;;;;10539:19:0;10531:60;;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;;;;-1:-1:-1;;14109:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;14109:22:0::1;::::0;13938:201::o;22257:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22257:52:0;;;;;;;:::o;25808:852::-;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;25902:12:::1;::::0;9783:21;25902:12:::1;:21;25894:47;;;::::0;;-1:-1:-1;;;25894:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25894:47:0;;;;;;;;;;;;;::::1;;25972:5;25960:9;:17;25952:50;;;::::0;;-1:-1:-1;;;25952:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25952:50:0;;;;;;;;;;;;;::::1;;26057:10;26035:18;26043:9:::0;26035:7:::1;:18::i;:::-;-1:-1:-1::0;;;;;26035:32:0::1;;;26013:110;;;::::0;;-1:-1:-1;;;26013:110:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26154:1;26142:9;:13;26134:45;;;::::0;;-1:-1:-1;;;26134:45:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26134:45:0;;;;;;;;;;;;;::::1;;26190:19;26212::::0;;;:8:::1;:19;::::0;;;;;;;;26190:41;;::::1;::::0;::::1;::::0;;;;::::1;;;;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;26190:41:0::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;26264:9:::1;:26;26242:111;;;;-1:-1:-1::0;;;26242:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26368:14;::::0;::::1;::::0;:18;26364:145:::1;;26483:14;::::0;::::1;::::0;26463:15:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;26444:35:0::1;;::::0;;;:18:::1;:35;::::0;;:53;;;;::::1;::::0;;26364:145:::1;26543:43;::::0;;::::1;::::0;::::1;::::0;;26547:4:::1;26543:43:::0;;;::::1;::::0;;::::1;::::0;;;26564:10:::1;26543:43:::0;;;;;;26576:9:::1;26543:43:::0;;;;;;-1:-1:-1;26521:19:0;;;:8:::1;:19:::0;;;;;:65;;;;-1:-1:-1;;26521:65:0::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;26521:65:0::1;-1:-1:-1::0;;;;;26521:65:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;26604:48;;;;;;;26564:10;;26543:43;;26604:48:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;9827:14:0;:22;;-1:-1:-1;;9827:22:0;;;25808:852::o;12878:361::-;9914:18;9935:19;;;:9;:19;;;;;;12988:8;;-1:-1:-1;;;;;9935:19:0;10001:10;9987:24;;;:85;;-1:-1:-1;;;;;;10032:28:0;;;;;;:16;:28;;;;;;;;10061:10;10032:40;;;;;;;;;;9987:85;9965:150;;;;;-1:-1:-1;;;9965:150:0;;;;;;;;;;;;-1:-1:-1;;;9965:150:0;;;;;;;;;;;;;;;10570:1:::1;10539:19:::0;;;:9:::1;:19;::::0;;;;;13020:8;;-1:-1:-1;;;;;10539:19:0::1;10531:60;;;::::0;;-1:-1:-1;;;10531:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;;::::1;;13046:18:::2;13067:19:::0;;;:9:::2;:19;::::0;;;;;-1:-1:-1;;;;;13067:19:0;;::::2;::::0;13105:23;::::2;::::0;::::2;;13097:32;;;::::0;::::2;;13140:22;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;;;;;13140:34:0::2;-1:-1:-1::0;;;;;13140:34:0;;::::2;::::0;;::::2;::::0;;;13190:41;;13140:22;;13190:41;;::::2;::::0;::::2;::::0;::::2;10602:1;10126::::1;12878:361:::0;;;;:::o;19623:88::-;19694:9;;19623:88;:::o;9116:28::-;;;;:::o;26668:754::-;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;26796:9;22541:5:::1;22530:16:::0;::::1;22522:49;;;::::0;;-1:-1:-1;;;22522:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22522:49:0;;;;;;;;;;;;;::::1;;22611:10;22590:17;22598:8:::0;22590:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;22590:31:0::1;;22582:60;;;::::0;;-1:-1:-1;;;22582:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22582:60:0;;;;;;;;;;;;;::::1;;26831:12:::2;::::0;::::2;;:21;26823:47;;;::::0;;-1:-1:-1;;;26823:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;26823:47:0;;;;;;;;;;;;;::::2;;26881:14;26936:19:::0;;;:8:::2;:19;::::0;;;;;;;;26919:36;;::::2;::::0;::::2;::::0;;;;::::2;;;;::::0;;;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;26919:36:0::2;::::0;;;;;;;::::2;::::0;;::::2;::::0;;;;;;;26898:10:::2;::::0;26919:36;26966:46:::2;;;::::0;;-1:-1:-1;;;26966:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;26966:46:0;;;;;;;;;;;;;::::2;;27044:8;27031:3;:9;;;:21;;27023:61;;;::::0;;-1:-1:-1;;;27023:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;27097:31;27118:9;27097:20;:31::i;:::-;27139:48;27153:6;27161:3;:10;;;27173:9;27139:48;;;;;;;;;;;::::0;:13:::2;:48::i;:::-;27217:9;::::0;;::::2;::::0;;27261:36:::2;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;27261:36:0;;;-1:-1:-1;27261:36:0;;::::2;::::0;;;;;;;;;;;;;;;27239:19;;;:8:::2;:19:::0;;;;;:58;;;;-1:-1:-1;;27239:58:0::2;::::0;::::2;;;::::0;;;;-1:-1:-1;27239:58:0;::::2;::::0;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;27239:58:0::2;-1:-1:-1::0;;;;;27239:58:0;;::::2;;::::0;;;;::::2;::::0;;::::2;::::0;;;;27310:26;;::::2;::::0;;;:18:::2;:26:::0;;;;;;:36;;;::::2;::::0;;27403:10;;::::2;::::0;27384:9;;27362:52;;;;;;;27217:9;;27362:52;;;::::2;::::0;27310:26;27261:36;;27362:52:::2;::::0;;;;;;;::::2;-1:-1:-1::0;;9827:14:0;:22;;-1:-1:-1;;9827:22:0;;;-1:-1:-1;;;;26668:754:0:o;12489:381::-;10193:18;10214:19;;;:9;:19;;;;;;12621:8;;-1:-1:-1;;;;;10214:19:0;10280:10;10266:24;;;:81;;-1:-1:-1;10311:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;10311:22:0;10337:10;10311:36;10266:81;:142;;;-1:-1:-1;;;;;;10368:28:0;;;;;;:16;:28;;;;;;;;10397:10;10368:40;;;;;;;;;;10266:142;10244:208;;;;;-1:-1:-1;;;10244:208:0;;;;;;;;;;;;-1:-1:-1;;;10244:208:0;;;;;;;;;;;;;;;10570:1:::1;10539:19:::0;;;:9:::1;:19;::::0;;;;;12644:8;;-1:-1:-1;;;;;10539:19:0::1;10531:60;;;::::0;;-1:-1:-1;;;10531:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;;::::1;;12665:18:::2;12686:19:::0;;;:9:::2;:19;::::0;;;;;-1:-1:-1;;;;;12686:19:0;;::::2;::::0;12724;::::2;::::0;::::2;12716:51;;;::::0;;-1:-1:-1;;;12716:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;12716:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;12786:17:0;::::2;12778:49;;;::::0;;-1:-1:-1;;;12778:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;12778:49:0;;;;;;;;;;;;;::::2;;12838:24;12848:3;12853:8;12838:9;:24::i;:::-;10602:1;10463::::1;12489:381:::0;;;;;:::o;19882:231::-;-1:-1:-1;;;;;20035:18:0;;19993:7;20035:18;;;:10;:18;;;;;:25;20026:34;;20018:43;;;;;;-1:-1:-1;;;;;20079:18:0;;;;;;:10;:18;;;;;:26;;20098:6;;20079:26;;;;;;;;;;;;;;20072:33;;19882:231;;;;;:::o;9039:30::-;;;-1:-1:-1;;;9039:30:0;;;;;:::o;9283:24::-;;;;;;:::o;25502:298::-;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;25592:10:::1;9783:14:::0;25573:30;;;:18:::1;:30;::::0;;;;;;;25720:34;;;;25765:27;;25573:30;;25592:10;25765:27;::::1;;;::::0;25573:30;;25765:27;9783:14;25765:27;25573:30;25592:10;25765:27;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;9827:14:0;:22;;-1:-1:-1;;9827:22:0;;;25502:298::o;12295:186::-;12430:43;12448:5;12455:3;12460:8;12430:43;;;;;;;;;;;;:17;:43::i;:::-;12295:186;;;:::o;15654:109::-;15703:7;15730:25;15746:8;;8292:5;15730:15;;:25;;;;:::i;:::-;15723:32;;15654:109;:::o;19719:155::-;19777:7;8292:5;19819;:19;19797:42;;;;;;-1:-1:-1;19865:1:0;19857:9;;19719:155::o;8849:23::-;;;;;;;;;;;;;;;-1:-1:-1;;8849:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11243:153::-;9513:8;;-1:-1:-1;;;;;9513:8:0;9499:10;:22;9491:49;;;;;-1:-1:-1;;;9491:49:0;;;;;;;;;;;;-1:-1:-1;;;9491:49:0;;;;;;;;;;;;;;;11320:14:::1;::::0;::::1;::::0;::::1;;;11319:15;11311:44;;;::::0;;-1:-1:-1;;;11311:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11311:44:0;;;;;;;;;;;;;::::1;;11366:12;:22:::0;;-1:-1:-1;;11366:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;11243:153::o;13708:222::-;13809:14;13849:19;;;:9;:19;;;;;;-1:-1:-1;;;;;13849:19:0;13841:42;;;;;;-1:-1:-1;13903:19:0;;;;:9;:19;;;;;;-1:-1:-1;;;;;13903:19:0;;13708:222::o;11404:86::-;9513:8;;-1:-1:-1;;;;;9513:8:0;9499:10;:22;9491:49;;;;;-1:-1:-1;;;9491:49:0;;;;;;;;;;;;-1:-1:-1;;;9491:49:0;;;;;;;;;;;;;;;11461:14:::1;:21:::0;;-1:-1:-1;;11461:21:0::1;;;::::0;;11404:86::o;22359:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22359:39:0;;;;;:::o;13492:208::-;13595:7;-1:-1:-1;;;;;13628:20:0;;13620:29;;;;;;13667:25;13685:6;13667:17;:25::i;24136:1358::-;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;24222:12:::1;::::0;9783:21;24222:12:::1;:21;24214:47;;;::::0;;-1:-1:-1;;;24214:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24214:47:0;;;;;;;;;;;;;::::1;;24292:5;24280:9;:17;24272:50;;;::::0;;-1:-1:-1;;;24272:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24272:50:0;;;;;;;;;;;;;::::1;;24333:18;24354:30:::0;;;:19:::1;:30;::::0;;;;;;;;24333:51;;::::1;::::0;::::1;::::0;;;;::::1;;;;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;24333:51:0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;24395:54:::1;;;::::0;;-1:-1:-1;;;24395:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24482:16;::::0;::::1;::::0;-1:-1:-1;;;;;24482:30:0::1;::::0;;:64:::1;;-1:-1:-1::0;24516:16:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;24516:30:0::1;24536:10;24516:30;24482:64;24460:155;;;;-1:-1:-1::0;;;24460:155:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24647:5;:14;;;24634:9;:27;;24626:65;;;::::0;;-1:-1:-1;;;24626:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24746:5;:12;;;-1:-1:-1::0;;;;;24724:34:0::1;:18;24732:9;24724:7;:18::i;:::-;-1:-1:-1::0;;;;;24724:34:0::1;;24702:114;;;::::0;;-1:-1:-1;;;24702:114:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24829:14;24846:5;:12;;;24829:29;;24871:48;24885:6;24893:10;24905:9;24871:48;;;;;;;;;;;::::0;:13:::1;:48::i;:::-;24930:31;24951:9;24930:20;:31::i;:::-;-1:-1:-1::0;;;;;24972:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;;;;:39;;25002:9:::1;24972:39:::0;;::::1;::::0;;;25027:52;;;;;;;25068:10:::1;::::0;24972:26;25038:9;;25027:52:::1;::::0;;;;;;;::::1;25223:14;25240:19:::0;;;:8:::1;:19;::::0;;;;;;;;25223:36;;::::1;::::0;::::1;::::0;;;;::::1;;;;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;25223:36:0::1;::::0;;;;;;::::1;;::::0;;;;;;25288:10:::1;25274:24;25270:217;;;25391:9;::::0;;::::1;::::0;25376:10:::1;25357:30;::::0;;;:18:::1;:30;::::0;;;;;;;:43;;;;::::1;::::0;;;25439:36;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;;;25417:19;;;:8:::1;:19:::0;;;;;;;:58;;;;-1:-1:-1;;25417:58:0::1;::::0;::::1;;;::::0;;;;-1:-1:-1;25417:58:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;25417:58:0::1;-1:-1:-1::0;;;;;25417:58:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;25270:217:::1;-1:-1:-1::0;;9827:14:0;:22;;-1:-1:-1;;9827:22:0;;;-1:-1:-1;;24136:1358:0:o;21146:102::-;21231:9;21221:19;;;;;;;;-1:-1:-1;;21221:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21187:21;;21221:19;;21231:9;;21221:19;;21231:9;21221:19;;;;;;;;;;;;;;;;;;;;;;;;27430:624;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;27531:5:::1;27519:17:::0;::::1;27511:50;;;::::0;;-1:-1:-1;;;27511:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27511:50:0;;;;;;;;;;;;;::::1;;27602:10;27580:18;27588:9:::0;27580:7:::1;:18::i;:::-;-1:-1:-1::0;;;;;27580:32:0::1;;;27572:57;;;::::0;;-1:-1:-1;;;27572:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27572:57:0;;;;;;;;;;;;;::::1;;27662:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;-1:-1:-1;;;;;27662:26:0::1;27692:10;27662:40;27640:114;;;::::0;;-1:-1:-1;;;27640:114:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27767:14;27784:19:::0;;;:8:::1;:19;::::0;;;;;;;;27767:36;;::::1;::::0;::::1;::::0;;;;::::1;;;;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;27767:36:0::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;;27819:50;;;;;;;27767:36;;27858:10:::1;::::0;27793:9;;27819:50:::1;::::0;;;;;;;;::::1;27897:9;::::0;;::::1;::::0;27939:36:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;27939:36:0;;;-1:-1:-1;27939:36:0;;::::1;::::0;;;;;;;;;;;;;;;27917:19;;;:8:::1;:19:::0;;;;;;:58;;;;-1:-1:-1;;27917:58:0::1;::::0;::::1;;;::::0;;;-1:-1:-1;27917:58:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;27917:58:0::1;-1:-1:-1::0;;;;;27917:58:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;28019:27;27897:9;;28019:10:::1;::::0;:27:::1;::::0;::::1;;::::0;27897:9;;28019:27;;-1:-1:-1;28019:27:0;27897:9;28019:10;:27;::::1;;;;;;;;;;;;;::::0;::::1;;;;9400:47:::0;;;;;;;;;;;;;;;:::o;15818:768::-;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;15906:10:::1;::::0;-1:-1:-1;;;15906:10:0;::::1;9783:21:::0;15906:10:::1;15898:40;;;::::0;;-1:-1:-1;;;15898:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;15898:40:0;;;;;;;;;;;;;::::1;;15958:12;::::0;::::1;;15957:13;15949:22;;;::::0;::::1;;16005:1;15990:12;:16;15982:53;;;::::0;;-1:-1:-1;;;15982:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;16084:2;16068:12;:18;;16046:109;;;;-1:-1:-1::0;;;16046:109:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8292:5;16188:31;16206:12;16188:13;:11;:13::i;:::-;:17:::0;::::1;:31::i;:::-;:46;;16166:115;;;::::0;;-1:-1:-1;;;16166:115:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16166:115:0;;;;;;;;;;;;;::::1;;16314:9;::::0;16345::::1;::::0;16314:27:::1;::::0;16328:12;16314:13:::1;:27::i;:::-;:40;16292:120;;;::::0;;-1:-1:-1;;;16292:120:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;16425:9;::::0;:29:::1;::::0;-1:-1:-1;;;;;16425:9:0;;::::1;::::0;16444::::1;16425:29:::0;::::1;;;::::0;:9:::1;:29:::0;:9;:29;16444:9;16425;:29;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;16472:9;16467:112;16491:12;16487:1;:16;16467:112;;;16525:8;:10:::0;;::::1;;::::0;;16550:17:::1;16556:10;16550:5;:17::i;:::-;-1:-1:-1::0;16505:3:0::1;;16467:112;;13247:237:::0;13378:10;13361:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;13361:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;13361:51:0;;;;;;;;;;13428:48;;;;;;;13361:39;;13378:10;13428:48;;;;;;;;;;;13247:237;;:::o;9347:46::-;;;;;;;;;;;;;:::o;9314:26::-;;;;;;;;;:::o;11055:180::-;9513:8;;-1:-1:-1;;;;;9513:8:0;9499:10;:22;9491:49;;;;;-1:-1:-1;;;9491:49:0;;;;;;;;;;;;-1:-1:-1;;;9491:49:0;;;;;;;;;;;;;;;11118:10:::1;::::0;-1:-1:-1;;;11118:10:0;::::1;;;11117:11;11109:20;;;::::0;::::1;;11156:15;11140:13;:31:::0;11182:10:::1;:17:::0;;-1:-1:-1;;;;11182:17:0::1;-1:-1:-1::0;;;11182:17:0::1;::::0;;11215:12:::1;::::0;::::1;::::0;11182:17;;11215:12:::1;11055:180::o:0;12067:220::-;12233:46;12251:5;12258:3;12263:8;12273:5;;12233:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12233:17:0;;-1:-1:-1;;;12233:46:0:i;:::-;12067:220;;;;;:::o;23627:501::-;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;23799:9;22541:5:::1;22530:16:::0;::::1;22522:49;;;::::0;;-1:-1:-1;;;22522:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22522:49:0;;;;;;;;;;;;;::::1;;22611:10;22590:17;22598:8:::0;22590:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;22590:31:0::1;;22582:60;;;::::0;;-1:-1:-1;;;22582:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22582:60:0;;;;;;;;;;;;;::::1;;23829:12:::2;::::0;::::2;;:21;23821:47;;;::::0;;-1:-1:-1;;;23821:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;23821:47:0;;;;;;;;;;;;;::::2;;23912:140;::::0;;::::2;::::0;::::2;::::0;;23932:4:::2;23912:140:::0;;;::::2;::::0;;::::2;::::0;;;23975:10:::2;23912:140:::0;;;;;;;;;;;;-1:-1:-1;;;;;23912:140:0;;::::2;::::0;;;;;;-1:-1:-1;23879:30:0;;;:19:::2;:30:::0;;;;;:173;;;;-1:-1:-1;;23879:173:0::2;::::0;::::2;;;::::0;;;;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;23879:173:0;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;24068:52;;;;;;;23912:140;;;;24068:52:::2;::::0;;;;;;;::::2;-1:-1:-1::0;;9827:14:0;:22;;-1:-1:-1;;9827:22:0;;;-1:-1:-1;;23627:501:0:o;23146:473::-;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;23283:9;22541:5:::1;22530:16:::0;::::1;22522:49;;;::::0;;-1:-1:-1;;;22522:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22522:49:0;;;;;;;;;;;;;::::1;;22611:10;22590:17;22598:8:::0;22590:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;22590:31:0::1;;22582:60;;;::::0;;-1:-1:-1;;;22582:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22582:60:0;;;;;;;;;;;;;::::1;;23318:12:::2;::::0;::::2;;:21;23310:47;;;::::0;;-1:-1:-1;;;23310:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;23310:47:0;;;;;;;;;;;;;::::2;;23401:141;::::0;;::::2;::::0;::::2;::::0;;23421:4:::2;23401:141:::0;;;::::2;::::0;;::::2;::::0;;;23464:10:::2;23401:141:::0;;;;;;;;;;;;-1:-1:-1;23401:141:0;;;;;;23368:30;;;:19:::2;:30:::0;;;;;:174;;;;-1:-1:-1;;23368:174:0::2;::::0;::::2;;;::::0;;;;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;23368:174:0;;::::2;-1:-1:-1::0;;;;;23368:174:0;;::::2;;::::0;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;;23558:53;;;;;;;-1:-1:-1;;23401:141:0;;23558:53:::2;::::0;;;;;;;::::2;-1:-1:-1::0;;9827:14:0;:22;;-1:-1:-1;;9827:22:0;;;-1:-1:-1;23146:473:0:o;21422:349::-;10570:1;10539:19;;;:9;:19;;;;;;21540:13;;21512:8;;-1:-1:-1;;;;;10539:19:0;10531:60;;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;;;;21711:18:::1;21720:8;21711;:18::i;:::-;21616:132;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;21616:132:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21571:192;;21422:349:::0;;;;:::o;14147:201::-;-1:-1:-1;;;;;14305:24:0;;;14276:4;14305:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;14147:201::o;22407:53::-;;;;;;;;;;;;;:::o;22670:179::-;9722:14;;;;9718:55;;;9753:8;;;9718:55;9783:14;:21;;-1:-1:-1;;9783:21:0;9800:4;9783:21;;;22783:9;22541:5:::1;22530:16:::0;::::1;22522:49;;;::::0;;-1:-1:-1;;;22522:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22522:49:0;;;;;;;;;;;;;::::1;;22611:10;22590:17;22598:8:::0;22590:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;22590:31:0::1;;22582:60;;;::::0;;-1:-1:-1;;;22582:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22582:60:0;;;;;;;;;;;;;::::1;;22810:31:::2;22831:9;22857:281:::0;22958:126;;;;;;;;-1:-1:-1;22958:126:0;;;;;;;;;;23022:10;22958:126;;;;;;;;;;;;;;;;;;22925:30;;;:19;:30;;;;;;:159;;;;-1:-1:-1;;22925:159:0;;;;;;;;;-1:-1:-1;22925:159:0;;;;;;;;;-1:-1:-1;;;;;;22925:159:0;;;-1:-1:-1;;;;;22925:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23100:30;;22958:126;;23100:30;;;22857:281;:::o;18769:649::-;10570:1;10539:19;;;:9;:19;;;;;;18922:8;;-1:-1:-1;;;;;10539:19:0;10531:60;;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;;;;18943:18:::1;18964:19:::0;;;:9:::1;:19;::::0;;;;;-1:-1:-1;;;;;18964:19:0;;::::1;::::0;19002;::::1;::::0;::::1;18994:48;;;::::0;;-1:-1:-1;;;18994:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18994:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;19061:17:0;::::1;19053:26;;;::::0;::::1;;19092:24;19102:3;19107:8;19092:9;:24::i;:::-;19133:15;19144:3;19133:10;:15::i;:::-;19129:282;;;19165:13;19201:3;-1:-1:-1::0;;;;;19181:41:0::1;;19241:10;19270:5;19294:8;19321:5;19181:160;;;;;;;;;;;;;-1:-1:-1::0;;;;;19181:160:0::1;;;;;;-1:-1:-1::0;;;;;19181:160:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19181:160:0;;-1:-1:-1;;;;;;;19364:34:0;::::1;-1:-1:-1::0;;;19364:34:0::1;19356:43;;;::::0;::::1;19129:282;10602:1;18769:649:::0;;;;;:::o;14356:274::-;14426:12;14441:19;;;:9;:19;;;;;;-1:-1:-1;;;;;14441:19:0;14471:24;14451:8;14471:14;:24::i;:::-;14508:30;14523:4;14529:8;14508:14;:30::i;:::-;14549:26;14561:3;14566:8;14549:11;:26::i;:::-;14613:8;14608:3;-1:-1:-1;;;;;14593:29:0;14602:4;-1:-1:-1;;;;;14593:29:0;;;;;;;;;;;14356:274;;;:::o;18086:675::-;10193:18;10214:19;;;:9;:19;;;;;;18242:8;;-1:-1:-1;;;;;10214:19:0;10280:10;10266:24;;;:81;;-1:-1:-1;10311:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;10311:22:0;10337:10;10311:36;10266:81;:142;;;-1:-1:-1;;;;;;10368:28:0;;;;;;:16;:28;;;;;;;;10397:10;10368:40;;;;;;;;;;10266:142;10244:208;;;;;-1:-1:-1;;;10244:208:0;;;;;;;;;;;;-1:-1:-1;;;10244:208:0;;;;;;;;;;;;;;;10570:1:::1;10539:19:::0;;;:9:::1;:19;::::0;;;;;18265:8;;-1:-1:-1;;;;;10539:19:0::1;10531:60;;;::::0;;-1:-1:-1;;;10531:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10531:60:0;;;;;;;;;;;;;::::1;;18286:18:::2;18307:19:::0;;;:9:::2;:19;::::0;;;;;-1:-1:-1;;;;;18307:19:0;;::::2;::::0;18345;::::2;::::0;::::2;18337:48;;;::::0;;-1:-1:-1;;;18337:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;18337:48:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;18404:17:0;::::2;18396:26;;;::::0;::::2;;18435:24;18445:3;18450:8;18435:9;:24::i;:::-;18476:15;18487:3;18476:10;:15::i;:::-;18472:282;;;18508:13;18544:3;-1:-1:-1::0;;;;;18524:41:0::2;;18584:10;18613:5;18637:8;18664:5;18524:160;;;;;;;;;;;;;-1:-1:-1::0;;;;;18524:160:0::2;;;;;;-1:-1:-1::0;;;;;18524:160:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;18524:160:0;;-1:-1:-1;;;;;;;18707:34:0;::::2;-1:-1:-1::0;;;18707:34:0::2;18699:43;;;::::0;::::2;;18472:282;;10602:1;10463::::1;18086:675:::0;;;;;;:::o;6984:124::-;7042:7;7075:1;7070;:6;;7062:15;;;;;;-1:-1:-1;7095:5:0;;;6984:124::o;17952:126::-;-1:-1:-1;;;;;18045:18:0;18018:7;18045:18;;;:10;:18;;;;;:25;;17952:126::o;7185:142::-;7269:5;;;7293:6;;;;7285:15;;;;;6262:203;6320:9;6346:6;6342:47;;-1:-1:-1;6376:1:0;6369:8;;6342:47;-1:-1:-1;6403:5:0;;;6407:1;6403;:5;:1;6427:5;;;;;:10;6419:19;;;;;16594:392;16640:7;-1:-1:-1;;;;;16668:17:0;;16660:49;;;;;-1:-1:-1;;;16660:49:0;;;;;;;;;;;;-1:-1:-1;;;16660:49:0;;;;;;;;;;;;;;;8292:5;16728:9;;:23;16720:56;;;;;-1:-1:-1;;;16720:56:0;;;;;;;;;;;;-1:-1:-1;;;16720:56:0;;;;;;;;;;;;;;;16787:10;16800:13;:11;:13::i;:::-;16838:9;;;16850:1;16838:13;16826:25;;16787:26;-1:-1:-1;16862:20:0;16874:3;16787:26;16862:11;:20::i;:::-;16900:13;;-1:-1:-1;;;;;16900:13:0;;;16905:2;;16900:13;;;;;16929:29;;16955:2;;-1:-1:-1;;;;;16929:29:0;;;16946:1;;16929:29;;16946:1;;16929:29;16976:2;16594:392;-1:-1:-1;;16594:392:0:o;20232:557::-;20288:13;20318:10;20314:53;;-1:-1:-1;20345:10:0;;;;;;;;;;;;-1:-1:-1;;;20345:10:0;;;;;;20314:53;20392:5;20377:12;20433:78;20440:9;;20433:78;;20466:8;;20497:2;20489:10;;;;20433:78;;;20521:19;20553:6;20543:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20543:17:0;-1:-1:-1;20615:5:0;;-1:-1:-1;20521:39:0;-1:-1:-1;;;20587:10:0;;20631:119;20638:9;;20631:119;;20708:2;20701:4;:9;20695:2;:16;20682:31;;20664:6;20671:7;;;;;;;20664:15;;;;;;;;;;;:49;-1:-1:-1;;;;;20664:49:0;;;;;;;;-1:-1:-1;20736:2:0;20728:10;;;;20631:119;;;-1:-1:-1;20774:6:0;20232:557;-1:-1:-1;;;;20232:557:0:o;11596:269::-;11771:18;11849:8;;;11596:269::o;19426:166::-;19525:1;19491:22;;;:12;:22;;;;;;-1:-1:-1;;;;;19491:22:0;:36;19487:98;;19551:22;;;;:12;:22;;;;;19544:29;;-1:-1:-1;;;;;;19544:29:0;;;19487:98;19426:166;:::o;17337:607::-;17422:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;17422:28:0;;;:19;;:28;17414:57;;;;;-1:-1:-1;;;17414:57:0;;;;;;;;;;;;-1:-1:-1;;;17414:57:0;;;;;;;;;;;;;;;17489:19;;;;:9;:19;;;;;;;;17482:26;;-1:-1:-1;;;;;;17482:26:0;;;17550:14;:24;;;;;;-1:-1:-1;;;;;17610:17:0;;;;:10;:17;;;;;:24;17550;;17489:19;17610:31;;:24;:28;:31::i;:::-;17585:56;;17676:18;17658:14;:36;17654:247;;-1:-1:-1;;;;;17731:17:0;;17711;17731;;;:10;:17;;;;;:33;;17749:14;;17731:33;;;;;;;;;;;;;;17711:53;;17819:9;17779:10;:17;17790:5;-1:-1:-1;;;;;17779:17:0;-1:-1:-1;;;;;17779:17:0;;;;;;;;;;;;17797:18;17779:37;;;;;;;;;;;;;;;;;;;:49;;;;17843:25;;;:14;:25;;;;;:46;;;17654:247;-1:-1:-1;;;;;17913:17:0;;;;;;:10;:17;;;;;:23;;;;;;;;;;;;;;;;;;;;;;;;17337:607;;;;:::o;16994:335::-;17119:1;17088:19;;;:9;:19;;;;;;-1:-1:-1;;;;;17088:19:0;:33;17066:109;;;;;-1:-1:-1;;;17066:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17186:19;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;17186:25:0;-1:-1:-1;;;;;17186:25:0;;;;;;;;17224:15;;;:10;:15;;;;;:30;;;;;;;;;;;;;;;;;;;17292:15;;;:22;;:29;;:26;:29::i;:::-;17265:24;;;;:14;:24;;;;;;:56;-1:-1:-1;16994:335:0:o;14638:1008::-;14733:9;;14858:5;;14819:173;;;;;;;;;;;14886:10;14819:173;;;;;;14919:16;14819:173;;;;14958:15;14819:173;;;;;;;;;;;;;;;;;;;;;;;;;14791:216;;;;;14679:7;;8292:5;14719:23;;14679:7;;14719:23;;;14769:261;;;;;14753:277;;15041:13;15073:7;15081:5;15073:14;;;;;;;;;:19;15069:120;;15117:7;15125:5;15117:14;;;;;;;;;15109:22;;15069:120;;;-1:-1:-1;15172:5:0;15069:120;15254:7;15274:1;15262:9;:13;15254:22;;;;;;;;;15250:283;;15391:1;15379:9;:13;15362:7;15370:5;15362:14;;;;;;;;:30;15250:283;;;15499:7;15519:1;15507:9;:13;15499:22;;;;;;;;;15482:7;15490:5;15482:14;;;;;;;;:39;15250:283;15543:5;:7;;;;;;;;;15626:12;;:5;;:9;:12::i;:::-;15619:19;;;;;14638:1008;:::o

Swarm Source

ipfs://372684e70863d979afc88bacb8c62908b946fc73d2a14b9f9270cbb6489c65da

Block Transaction Gas Used Reward
view all blocks validated

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

xDaiPunks is a collection of 3D Punk NFTs that lives on the xDai blockchain.

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.