ETH Price: $2,123.65 (-9.45%)

Contract

0x036d5E237EfBdb1583c29B8648f637812A94cdF2
 

Overview

ETH Balance

0.08 ETH

Eth Value

$169.89 (@ $2,123.65/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Refund Phase Ple...159846782022-11-16 19:30:47834 days ago1668627047IN
0x036d5E23...12A94cdF2
0 ETH0.0007616618.22599618
Refund Phase Ple...158778562022-11-01 21:27:11849 days ago1667338031IN
0x036d5E23...12A94cdF2
0 ETH0.0004829311.556319
Refund Phase Ple...158778422022-11-01 21:24:23849 days ago1667337863IN
0x036d5E23...12A94cdF2
0 ETH0.0004981611.92068
Refund Phase Ple...158778402022-11-01 21:23:59849 days ago1667337839IN
0x036d5E23...12A94cdF2
0 ETH0.0004455710.66220301
Unpledge158778402022-11-01 21:23:59849 days ago1667337839IN
0x036d5E23...12A94cdF2
0 ETH0.0008199924.420023
Unpledge158778402022-11-01 21:23:59849 days ago1667337839IN
0x036d5E23...12A94cdF2
0 ETH0.0003657310.89166692
Pledge158778382022-11-01 21:23:35849 days ago1667337815IN
0x036d5E23...12A94cdF2
0.08 ETH0.0016354242.81789095
Refund Phase Ple...158778372022-11-01 21:23:23849 days ago1667337803IN
0x036d5E23...12A94cdF2
0 ETH0.0005037312.05387212
Refund Phase Ple...158778342022-11-01 21:22:47849 days ago1667337767IN
0x036d5E23...12A94cdF2
0 ETH0.0004668611.17168621
Refund Phase Ple...158778312022-11-01 21:22:11849 days ago1667337731IN
0x036d5E23...12A94cdF2
0 ETH0.0004808111.50556713
Unpledge158764192022-11-01 16:38:11849 days ago1667320691IN
0x036d5E23...12A94cdF2
0 ETH0.0007245618.61106936
Unpledge158750222022-11-01 11:57:11850 days ago1667303831IN
0x036d5E23...12A94cdF2
0 ETH0.000355139.12183454
Unpledge158735142022-11-01 6:51:11850 days ago1667285471IN
0x036d5E23...12A94cdF2
0 ETH0.000356589.15909769
Unpledge158719092022-11-01 1:25:59850 days ago1667265959IN
0x036d5E23...12A94cdF2
0 ETH0.0004748112.19608441
Unpledge158715702022-11-01 0:18:11850 days ago1667261891IN
0x036d5E23...12A94cdF2
0 ETH0.0006076115.60697744
Unpledge158713532022-10-31 23:34:35850 days ago1667259275IN
0x036d5E23...12A94cdF2
0 ETH0.0004791412.30721815
Unpledge158706752022-10-31 21:18:59850 days ago1667251139IN
0x036d5E23...12A94cdF2
0 ETH0.0011757730.20082516
Unpledge158706622022-10-31 21:15:59850 days ago1667250959IN
0x036d5E23...12A94cdF2
0 ETH0.0010434326.80152989
Unpledge158689632022-10-31 15:33:35850 days ago1667230415IN
0x036d5E23...12A94cdF2
0 ETH0.0007489219.23677261
Unpledge158685082022-10-31 14:02:23850 days ago1667224943IN
0x036d5E23...12A94cdF2
0 ETH0.001670642.91073798
Unpledge158664252022-10-31 7:04:23851 days ago1667199863IN
0x036d5E23...12A94cdF2
0 ETH0.000277067.11668339
Unpledge158644452022-10-31 0:25:23851 days ago1667175923IN
0x036d5E23...12A94cdF2
0 ETH0.000378719.72752447
Unpledge158637732022-10-30 22:09:59851 days ago1667167799IN
0x036d5E23...12A94cdF2
0 ETH0.0003918810.06580085
Unpledge158634942022-10-30 21:13:59851 days ago1667164439IN
0x036d5E23...12A94cdF2
0 ETH0.000357499.18253076
Refund Phase158631562022-10-30 20:06:11851 days ago1667160371IN
0x036d5E23...12A94cdF2
0 ETH0.0008847914.12345384
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
159846782022-11-16 19:30:47834 days ago1668627047
0x036d5E23...12A94cdF2
0.08 ETH
158778562022-11-01 21:27:11849 days ago1667338031
0x036d5E23...12A94cdF2
0.08 ETH
158778422022-11-01 21:24:23849 days ago1667337863
0x036d5E23...12A94cdF2
0.08 ETH
158778402022-11-01 21:23:59849 days ago1667337839
0x036d5E23...12A94cdF2
0.08 ETH
158778372022-11-01 21:23:23849 days ago1667337803
0x036d5E23...12A94cdF2
0.08 ETH
158778342022-11-01 21:22:47849 days ago1667337767
0x036d5E23...12A94cdF2
0.08 ETH
158778312022-11-01 21:22:11849 days ago1667337731
0x036d5E23...12A94cdF2
0.08 ETH
158764192022-11-01 16:38:11849 days ago1667320691
0x036d5E23...12A94cdF2
0.08 ETH
158750222022-11-01 11:57:11850 days ago1667303831
0x036d5E23...12A94cdF2
0.08 ETH
158735142022-11-01 6:51:11850 days ago1667285471
0x036d5E23...12A94cdF2
0.08 ETH
158719092022-11-01 1:25:59850 days ago1667265959
0x036d5E23...12A94cdF2
0.08 ETH
158715702022-11-01 0:18:11850 days ago1667261891
0x036d5E23...12A94cdF2
0.08 ETH
158713532022-10-31 23:34:35850 days ago1667259275
0x036d5E23...12A94cdF2
0.08 ETH
158706752022-10-31 21:18:59850 days ago1667251139
0x036d5E23...12A94cdF2
0.08 ETH
158706622022-10-31 21:15:59850 days ago1667250959
0x036d5E23...12A94cdF2
0.08 ETH
158689632022-10-31 15:33:35850 days ago1667230415
0x036d5E23...12A94cdF2
0.08 ETH
158685082022-10-31 14:02:23850 days ago1667224943
0x036d5E23...12A94cdF2
0.08 ETH
158664252022-10-31 7:04:23851 days ago1667199863
0x036d5E23...12A94cdF2
0.08 ETH
158644452022-10-31 0:25:23851 days ago1667175923
0x036d5E23...12A94cdF2
0.08 ETH
158637732022-10-30 22:09:59851 days ago1667167799
0x036d5E23...12A94cdF2
0.08 ETH
158634942022-10-30 21:13:59851 days ago1667164439
0x036d5E23...12A94cdF2
0.08 ETH
158631562022-10-30 20:06:11851 days ago1667160371
0x036d5E23...12A94cdF2
0.1 ETH
158631562022-10-30 20:06:11851 days ago1667160371
0x036d5E23...12A94cdF2
0.1 ETH
158631512022-10-30 20:05:11851 days ago1667160311
0x036d5E23...12A94cdF2
0.1 ETH
158631512022-10-30 20:05:11851 days ago1667160311
0x036d5E23...12A94cdF2
0.1 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PledgeMint

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : PledgeMint.sol
/// @notice Pledge Mint v1.2 contract by Culture Cubs
// pledgemint.io
//
// For your ERC721 contract to be compatible, follow the following instructions:
// - declare a variable for the pledgemint contract address:
//   address public pledgeContractAddress;
// - add the following function to allow Pledge Mint to mint NFT for your pledgers:
//   function pledgeMint(address to, uint8 quantity) override
//       external
//       payable {
//       require(pledgeContractAddress == msg.sender, "The caller is not PledgeMint");
//       require(totalSupply() + quantity <= maxCollectionSize, "reached max supply");
//       _mint(to, quantity);
//   }
//
//    * Please ensure you test this method before deploying your contract.
//    * PledgeMint will send the funds collected along with the mint call, minus the fee agreed upon.

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./utils/Errors.sol";

interface IERC721Pledge {
    function pledgeMint(address to, uint8 quantity) external payable;
}

contract PledgeMint is Ownable, ReentrancyGuard {
    // Phases allow to have different cohorts of pledgers, with different contracts, prices and limits.
    struct PhaseConfig {
        address admin;
        IERC721Pledge mintContract;
        uint256 mintPrice;
        uint8 maxPerWallet;
        // When locked, the contract on which the mint happens cannot ever be changed again
        bool mintContractLocked;
        // Can only be set to true if mint contract is locked, which is irreversible.
        // Owner of the contract can still trigger refunds - but not access anyone's funds.
        bool pledgesLocked;
        uint16 fee; // int representing the percentage with 2 digits. e.g. 1.75% -> 175
        uint16 cap; // max number of NFTs to sell during this phase
        uint256 startTime;
        uint256 endTime;
    }

    // Mapping from phase Id to array of pledgers
    mapping(uint16 => address[]) public pledgers;
    // Mapping from phase Id to mapping from address to boolean allow value
    mapping(uint16 => mapping(address => bool)) public allowlists;
    // Mapping from phase Id to mapping from address to pladge number
    mapping(uint16 => mapping(address => uint8)) public pledges;

    uint256 public pledgeMintRevenue;

    PhaseConfig[] public phases;

    modifier callerIsUser() {
        if (tx.origin != msg.sender) revert Errors.CallerIsContract();
        _;
    }

    modifier onlyAdminOrOwner(uint16 phaseId) {
        if (owner() != _msgSender() && phases[phaseId].admin != _msgSender())
            revert Errors.CallerIsNotOwner();
        _;
    }

    constructor() {}

    function addPhase(
        address admin,
        IERC721Pledge mintContract,
        uint256 mintPrice,
        uint8 maxPerWallet,
        uint16 fee,
        uint16 cap,
        uint startTime,
        uint endTime
    ) external onlyOwner {
        phases.push(
            PhaseConfig(
                admin,
                mintContract,
                mintPrice,
                maxPerWallet,
                false,
                false,
                fee,
                cap,
                startTime,
                endTime
            )
        );
    }

    function allowAddresses(uint16 phaseId, address[] calldata allowlist_)
        external
        onlyAdminOrOwner(phaseId)
    {
        mapping(address => bool) storage _allowlist = allowlists[phaseId];
        for (uint256 i; i < allowlist_.length; ) {
            _allowlist[allowlist_[i]] = true;

            unchecked {
                ++i;
            }
        }
    }

    function pledgeWithCap(uint16 phaseId, uint8 number)
        external
        payable
        callerIsUser
    {
        PhaseConfig memory phase = phases[phaseId];
        if (block.timestamp < phase.startTime || phase.endTime > 0 && block.timestamp > phase.endTime) revert Errors.PhaseNotActive();
        (uint256 nbPledged, ) = _nbNFTsPledge(phaseId);
        if (phase.cap > 0 && nbPledged + number > phase.cap) revert Errors.OverPhaseCap();
        if (number > phase.maxPerWallet) revert Errors.NFTAmountNotAllowed();
        if (number < 1) revert Errors.AmountNeedsToBeGreaterThanZero();
        if (msg.value != phase.mintPrice * number)
            revert Errors.AmountMismatch();
        if (pledges[phaseId][msg.sender] != 0) revert Errors.AlreadyPledged();
        pledgers[phaseId].push(msg.sender);
        pledges[phaseId][msg.sender] = number;
    }

    function pledge(uint16 phaseId, uint8 number)
        external
        payable
        callerIsUser
    {
        PhaseConfig memory phase = phases[phaseId];
        if (block.timestamp < phase.startTime || phase.endTime > 0 && block.timestamp > phase.endTime) revert Errors.PhaseNotActive();
        if (number > phase.maxPerWallet) revert Errors.NFTAmountNotAllowed();
        if (number < 1) revert Errors.AmountNeedsToBeGreaterThanZero();
        if (msg.value != phase.mintPrice * number)
            revert Errors.AmountMismatch();
        if (pledges[phaseId][msg.sender] != 0) revert Errors.AlreadyPledged();
        pledgers[phaseId].push(msg.sender);
        pledges[phaseId][msg.sender] = number;
    }

    function unpledge(uint16 phaseId) external nonReentrant callerIsUser {
        if (phases[phaseId].pledgesLocked == true)
            revert Errors.PledgesAreLocked();

        uint256 nbPledged = pledges[phaseId][msg.sender];
        if (nbPledged < 1) revert Errors.NothingWasPledged();
        pledges[phaseId][msg.sender] = 0;

        (bool success, ) = msg.sender.call{
            value: phases[phaseId].mintPrice * nbPledged
        }("");

        if (!success) revert Errors.UnableToSendValue();
    }

    function lockPhase(uint16 phaseId) external onlyAdminOrOwner(phaseId) {
        if (phases[phaseId].mintContractLocked == false)
            revert Errors.CannotLockPledgeWithoutLockingMint();
        phases[phaseId].pledgesLocked = true;
    }

    function unlockPhase(uint16 phaseId) external onlyAdminOrOwner(phaseId) {
        phases[phaseId].pledgesLocked = false;
    }

    // mint for all participants
    function mintPhase(uint16 phaseId) external onlyAdminOrOwner(phaseId) {
        address[] memory _addresses = pledgers[phaseId];
        _mintPhase(phaseId, _addresses, 0, _addresses.length, false);
    }

    // mint for all participants
    function mintAllPledgesInPhase(uint16 phaseId)
        external
        onlyAdminOrOwner(phaseId)
    {
        address[] memory _addresses = pledgers[phaseId];
        _mintPhase(phaseId, _addresses, 0, _addresses.length, true);
    }

    // mint for all participants, paginated
    function mintPhase(
        uint16 phaseId,
        uint256 startIdx,
        uint256 length
    ) external onlyAdminOrOwner(phaseId) {
        address[] memory _addresses = pledgers[phaseId];
        _mintPhase(phaseId, _addresses, startIdx, length, false);
    }

    // mint for select participants
    // internal function checks eligibility and pledged number.
    function mintPhase(uint16 phaseId, address[] calldata selectPledgers)
        external
        onlyAdminOrOwner(phaseId)
    {
        _mintPhase(phaseId, selectPledgers, 0, selectPledgers.length, false);
    }

    function _mintPhase(
        uint16 phaseId,
        address[] memory addresses,
        uint256 startIdx,
        uint256 count,
        bool allowAllMints
    ) internal {
        PhaseConfig memory _phase = phases[phaseId];
        if (_phase.mintContractLocked == false)
            revert Errors.CannotLaunchMintWithoutLockingContract();
        mapping(address => uint8) storage _pledges = pledges[phaseId];
        mapping(address => bool) storage _allowlist = allowlists[phaseId];
        uint256 phaseRevenue;
        for (uint256 i = startIdx; i < count; ) {
            address addy = addresses[i];
            uint8 quantity = _pledges[addy];

            // Any address not allowed will have to withdraw their pledge manually. We skip them here.
            if ((allowAllMints || _allowlist[addy]) && quantity > 0) {
                _pledges[addy] = 0;
                uint256 totalCost = _phase.mintPrice * quantity;
                uint256 pmRevenue = (totalCost * _phase.fee) / 10000;
                phaseRevenue += pmRevenue;
                _phase.mintContract.pledgeMint{value: totalCost - pmRevenue}(
                    addy,
                    quantity
                );
            }

            unchecked {
                ++i;
            }
        }
        pledgeMintRevenue += phaseRevenue;
    }

    // These stats may decrease in case of refund or mint. They are not itended to archive states.
    function currentPhaseStats(uint16 phaseId)
        public
        view
        returns (
            uint256 nbPledges,
            uint256 nbNFTsPledged,
            uint256 amountPledged,
            uint256 nbAllowedPledges,
            uint256 nbNAllowedFTsPledged,
            uint256 allowedAmountPledged
        )
    {
        PhaseConfig memory _phase = phases[phaseId];
        mapping(address => uint8) storage _pledges = pledges[phaseId];
        mapping(address => bool) storage _allowlist = allowlists[phaseId];
        address[] storage _pledgers = pledgers[phaseId];
        for (uint256 i; i < _pledgers.length; ) {
            address addy = _pledgers[i];
            uint8 quantity = _pledges[addy];
            if (quantity > 0) {
                nbPledges += 1;
                nbNFTsPledged += quantity;
                amountPledged += quantity * _phase.mintPrice;
                if (_allowlist[addy]) {
                    nbAllowedPledges += 1;
                    nbNAllowedFTsPledged += quantity;
                    allowedAmountPledged += quantity * _phase.mintPrice;
                }
            }

            unchecked {
                ++i;
            }
        }
    }

    function refundPhase(uint16 phaseId)
        external
        onlyAdminOrOwner(phaseId)
        nonReentrant
    {
        _refundPhase(phaseId);
    }

    function refundAll() external onlyOwner nonReentrant {
        for (uint8 i; i < phases.length; ) {
            _refundPhase(i);

            unchecked {
                ++i;
            }
        }
    }

    function refundPhasePledger(uint16 phaseId, address pledger)
        external
        onlyAdminOrOwner(phaseId)
        nonReentrant
    {
        uint256 amount = pledges[phaseId][pledger] * phases[phaseId].mintPrice;
        pledges[phaseId][pledger] = 0;
        (bool success, ) = pledger.call{value: amount}("");
        if (!success) revert Errors.UnableToSendValue();
    }

    function _refundPhase(uint16 phaseId) internal {
        PhaseConfig memory _phase = phases[phaseId];
        address[] storage _addresses = pledgers[phaseId];
        for (uint8 i; i < _addresses.length; ) {
            address addy = _addresses[i];
            uint8 quantity = pledges[phaseId][addy];
            if (quantity > 0) {
                pledges[phaseId][addy] = 0;
                (bool success, ) = addy.call{
                    value: _phase.mintPrice * quantity
                }("");
                if (!success) revert Errors.UnableToSendValue();
            }

            unchecked {
                ++i;
            }
        }
    }

    function _nbNFTsPledge(uint16 phaseId)
        internal
        view
        returns (
            uint256 nbNFTsPledged,
            uint256 nbNAllowedFTsPledged
        )
    {
        mapping(address => uint8) storage _pledges = pledges[phaseId];
        mapping(address => bool) storage _allowlist = allowlists[phaseId];
        address[] storage _pledgers = pledgers[phaseId];
        for (uint256 i; i < _pledgers.length; ) {
            address addy = _pledgers[i];
            uint8 quantity = _pledges[addy];
            if (quantity > 0) {
                nbNFTsPledged += quantity;
                if (_allowlist[addy]) {
                    nbNAllowedFTsPledged += quantity;
                }
            }

            unchecked {
                ++i;
            }
        }
    }

    function emergencyRefund(
        uint16 phaseId,
        uint256 startIdx,
        uint256 count
    ) external onlyOwner {
        PhaseConfig memory _phase = phases[phaseId];
        for (uint256 i = startIdx; i < count; ) {
            address addy = pledgers[phaseId][i];
            uint8 quantity = pledges[phaseId][addy];

            (bool success, ) = addy.call{value: _phase.mintPrice * quantity}(
                ""
            );
            if (!success) revert Errors.UnableToSendValue();

            unchecked {
                ++i;
            }
        }
    }

    function setMintContract(uint16 phaseId, IERC721Pledge mintContract_)
        external
        onlyAdminOrOwner(phaseId)
    {
        phases[phaseId].mintContract = mintContract_;
    }

    function setFee(uint16 phaseId, uint16 fee)
        external
        onlyOwner
    {
        phases[phaseId].fee = fee;
    }

    function setStartTime(uint16 phaseId, uint256 startTime)
        external
        onlyAdminOrOwner(phaseId)
    {
        phases[phaseId].startTime = startTime;   
    }

    function setEndTime(uint16 phaseId, uint256 endTime)
        external
        onlyAdminOrOwner(phaseId)
    {
        phases[phaseId].endTime = endTime;   
    }

    function setPrice(uint16 phaseId, uint256 price)
        external
        onlyAdminOrOwner(phaseId)
    {
        phases[phaseId].mintPrice = price;   
    }

    function setCap(uint16 phaseId, uint16 cap)
        external
        onlyAdminOrOwner(phaseId)
    {
        phases[phaseId].cap = cap;   
    }

    function setAdmin(uint16 phaseId, address admin)
        external
        onlyAdminOrOwner(phaseId)
    {
        phases[phaseId].admin = admin;
    }

    function setMaxPerWallet(uint16 phaseId, uint8 maxPerWallet)
        external
        onlyAdminOrOwner(phaseId)
    {
        phases[phaseId].maxPerWallet = maxPerWallet;   
    }

    function withdrawRevenue() 
        external
        onlyOwner
    {
        (bool success, ) = msg.sender.call{value: pledgeMintRevenue}("");
        require(success, "Transfer failed.");
        pledgeMintRevenue = 0;
    }
}

File 2 of 5 : Errors.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.8.4;

library Errors {
    // PledgeMint.sol
    error CallerIsContract();
    error CallerIsNotOwner();
    error NFTAmountNotAllowed();
    error PhaseNotActive();
    error OverPhaseCap();
    error AmountNeedsToBeGreaterThanZero();
    error AmountMismatch();
    error AlreadyPledged();
    error PledgesAreLocked();
    error NothingWasPledged();
    error UnableToSendValue();
    error CannotLockPledgeWithoutLockingMint();
    error CannotLaunchMintWithoutLockingContract();
    error ContractCannotBeChanged();
}

File 3 of 5 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 4 of 5 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 5 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "london",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyPledged","type":"error"},{"inputs":[],"name":"AmountMismatch","type":"error"},{"inputs":[],"name":"AmountNeedsToBeGreaterThanZero","type":"error"},{"inputs":[],"name":"CallerIsContract","type":"error"},{"inputs":[],"name":"CallerIsNotOwner","type":"error"},{"inputs":[],"name":"CannotLaunchMintWithoutLockingContract","type":"error"},{"inputs":[],"name":"CannotLockPledgeWithoutLockingMint","type":"error"},{"inputs":[],"name":"NFTAmountNotAllowed","type":"error"},{"inputs":[],"name":"NothingWasPledged","type":"error"},{"inputs":[],"name":"OverPhaseCap","type":"error"},{"inputs":[],"name":"PhaseNotActive","type":"error"},{"inputs":[],"name":"PledgesAreLocked","type":"error"},{"inputs":[],"name":"UnableToSendValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"contract IERC721Pledge","name":"mintContract","type":"address"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint8","name":"maxPerWallet","type":"uint8"},{"internalType":"uint16","name":"fee","type":"uint16"},{"internalType":"uint16","name":"cap","type":"uint16"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"addPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"address[]","name":"allowlist_","type":"address[]"}],"name":"allowAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"allowlists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"currentPhaseStats","outputs":[{"internalType":"uint256","name":"nbPledges","type":"uint256"},{"internalType":"uint256","name":"nbNFTsPledged","type":"uint256"},{"internalType":"uint256","name":"amountPledged","type":"uint256"},{"internalType":"uint256","name":"nbAllowedPledges","type":"uint256"},{"internalType":"uint256","name":"nbNAllowedFTsPledged","type":"uint256"},{"internalType":"uint256","name":"allowedAmountPledged","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint256","name":"startIdx","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"emergencyRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"lockPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"mintAllPledgesInPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint256","name":"startIdx","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"mintPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"address[]","name":"selectPledgers","type":"address[]"}],"name":"mintPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"mintPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"phases","outputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"contract IERC721Pledge","name":"mintContract","type":"address"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint8","name":"maxPerWallet","type":"uint8"},{"internalType":"bool","name":"mintContractLocked","type":"bool"},{"internalType":"bool","name":"pledgesLocked","type":"bool"},{"internalType":"uint16","name":"fee","type":"uint16"},{"internalType":"uint16","name":"cap","type":"uint16"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint8","name":"number","type":"uint8"}],"name":"pledge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pledgeMintRevenue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint8","name":"number","type":"uint8"}],"name":"pledgeWithCap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pledgers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"pledges","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"refundPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"address","name":"pledger","type":"address"}],"name":"refundPhasePledger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"address","name":"admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint16","name":"cap","type":"uint16"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint16","name":"fee","type":"uint16"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint8","name":"maxPerWallet","type":"uint8"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"contract IERC721Pledge","name":"mintContract_","type":"address"}],"name":"setMintContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"unlockPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"unpledge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRevenue","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5062000032620000266200003f60201b60201c565b6200004760201b60201c565b600180819055506200010b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61529f806200011b6000396000f3fe6080604052600436106101ee5760003560e01c806390911e371161010d578063d1a0e7a2116100a0578063dcfa832c1161006f578063dcfa832c14610681578063dfbf9f1d146106be578063f2fde38b146106e7578063f746923d14610710578063ffb9a1b514610739576101ee565b8063d1a0e7a2146105ae578063d4342d38146105d9578063d4c099c214610616578063d563e72514610658576101ee565b8063a7bfd041116100dc578063a7bfd0411461050a578063ae5220f914610533578063bbc2986c1461055c578063cb26d94214610585576101ee565b806390911e371461046657806399b64de11461048f5780639ac95dee146104b8578063a6d25102146104e1576101ee565b80633cdf3d23116101855780637767faed116101545780637767faed146103c057806383c56b0e146103e9578063852c6413146104125780638da5cb5b1461043b576101ee565b80633cdf3d231461032c5780634f573cb214610369578063531c509a14610380578063715018a6146103a9576101ee565b80632e16225d116101c15780632e16225d1461027d5780632e37eef6146102a65780633084a42f146102ec57806338e771ab14610315576101ee565b80630165f612146101f357806310291a591461021c57806310e11bb41461023857806320f9453e14610261575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906147e8565b610762565b005b61023660048036038101906102319190614874565b610919565b005b34801561024457600080fd5b5061025f600480360381019061025a9190614950565b610e44565b005b61027b60048036038101906102769190614874565b6110cf565b005b34801561028957600080fd5b506102a4600480360381019061029f9190614a06565b611587565b005b3480156102b257600080fd5b506102cd60048036038101906102c89190614a33565b61173e565b6040516102e39a99989796959493929190614b16565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190614bb2565b611825565b005b34801561032157600080fd5b5061032a611990565b005b34801561033857600080fd5b50610353600480360381019061034e9190614bb2565b611a8d565b6040516103609190614bf2565b60405180910390f35b34801561037557600080fd5b5061037e611abc565b005b34801561038c57600080fd5b506103a760048036038101906103a29190614c72565b611bf1565b005b3480156103b557600080fd5b506103be611dad565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190614874565b611e35565b005b3480156103f557600080fd5b50610410600480360381019061040b91906147e8565b611f7a565b005b34801561041e57600080fd5b5061043960048036038101906104349190614cd2565b612327565b005b34801561044757600080fd5b50610450612458565b60405161045d9190614d12565b60405180910390f35b34801561047257600080fd5b5061048d60048036038101906104889190614a06565b612481565b005b34801561049b57600080fd5b506104b660048036038101906104b19190614d2d565b612639565b005b3480156104c457600080fd5b506104df60048036038101906104da9190614a06565b6126fd565b005b3480156104ed57600080fd5b5061050860048036038101906105039190614c72565b612a20565b005b34801561051657600080fd5b50610531600480360381019061052c9190614cd2565b612b77565b005b34801561053f57600080fd5b5061055a60048036038101906105559190614bb2565b612ca8565b005b34801561056857600080fd5b50610583600480360381019061057e9190614cd2565b612fb7565b005b34801561059157600080fd5b506105ac60048036038101906105a79190614a06565b6130e8565b005b3480156105ba57600080fd5b506105c3613247565b6040516105d09190614d6d565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190614cd2565b61324d565b60405161060d9190614d12565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190614a06565b61329b565b60405161064f96959493929190614d88565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a9190614a06565b61362f565b005b34801561068d57600080fd5b506106a860048036038101906106a39190614bb2565b613773565b6040516106b59190614de9565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190614e04565b6137a2565b005b3480156106f357600080fd5b5061070e60048036038101906107099190614e44565b61390d565b005b34801561071c57600080fd5b5061073760048036038101906107329190614d2d565b613a04565b005b34801561074557600080fd5b50610760600480360381019061075b9190614a06565b613b4b565b005b8261076b613d02565b73ffffffffffffffffffffffffffffffffffffffff16610789612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561082957506107b0613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106107de576107dd614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610860576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600260008661ffff1661ffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156108fd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108b3575b50505050509050610912858286866000613d0a565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461097e576040517f7df1f81700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060068361ffff168154811061099857610997614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff168152602001600482015481526020016005820154815250509050806101000151421080610b3957506000816101200151118015610b38575080610120015142115b5b15610b70576040517f21094a9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610b7b84614157565b50905060008260e0015161ffff16118015610bab57508160e0015161ffff168360ff1682610ba99190614ecf565b115b15610be2576040517f8afc21f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816060015160ff168360ff161115610c26576040517f62a85d4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018360ff161015610c64576040517f8fe1565900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260ff168260400151610c779190614f25565b3414610caf576040517f55e97b0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008661ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610d51576040517fb0ca2ff500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008561ffff1661ffff168152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600460008661ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555050505050565b610e4c613d02565b73ffffffffffffffffffffffffffffffffffffffff16610e6a612458565b73ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790614fdc565b60405180910390fd5b60066040518061014001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018760ff1681526020016000151581526020016000151581526020018661ffff1681526020018561ffff16815260200184815260200183815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff021916908360ff16021790555060808201518160030160016101000a81548160ff02191690831515021790555060a08201518160030160026101000a81548160ff02191690831515021790555060c08201518160030160036101000a81548161ffff021916908361ffff16021790555060e08201518160030160056101000a81548161ffff021916908361ffff1602179055506101008201518160040155610120820151816005015550505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611134576040517f7df1f81700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060068361ffff168154811061114e5761114d614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016004820154815260200160058201548152505090508061010001514210806112ef575060008161012001511180156112ee575080610120015142115b5b15611326576040517f21094a9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015160ff168260ff16111561136a576040517f62a85d4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260ff1610156113a8576040517f8fe1565900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160ff1681604001516113bb9190614f25565b34146113f3576040517f55e97b0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008561ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611495576040517fb0ca2ff500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008461ffff1661ffff168152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460008561ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550505050565b80611590613d02565b73ffffffffffffffffffffffffffffffffffffffff166115ae612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561164e57506115d5613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff168154811061160357611602614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611685576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600260008461ffff1661ffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561172257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116d8575b505050505090506117398382600084516001613d0a565b505050565b6006818154811061174e57600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16908060030160029054906101000a900460ff16908060030160039054906101000a900461ffff16908060030160059054906101000a900461ffff1690806004015490806005015490508a565b8161182e613d02565b73ffffffffffffffffffffffffffffffffffffffff1661184c612458565b73ffffffffffffffffffffffffffffffffffffffff16141580156118ec5750611873613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106118a1576118a0614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611923576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff168154811061193c5761193b614e71565b5b906000526020600020906006020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b611998613d02565b73ffffffffffffffffffffffffffffffffffffffff166119b6612458565b73ffffffffffffffffffffffffffffffffffffffff1614611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390614fdc565b60405180910390fd5b600260015403611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890615048565b60405180910390fd5b600260018190555060005b6006805490508160ff161015611a8357611a788160ff166142ef565b806001019050611a5c565b5060018081905550565b60036020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b611ac4613d02565b73ffffffffffffffffffffffffffffffffffffffff16611ae2612458565b73ffffffffffffffffffffffffffffffffffffffff1614611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90614fdc565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600554604051611b6090615099565b60006040518083038185875af1925050503d8060008114611b9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ba2565b606091505b5050905080611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906150fa565b60405180910390fd5b600060058190555050565b82611bfa613d02565b73ffffffffffffffffffffffffffffffffffffffff16611c18612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015611cb85750611c3f613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110611c6d57611c6c614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611cef576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008661ffff1661ffff168152602001908152602001600020905060005b84849050811015611da5576001826000878785818110611d3457611d33614e71565b5b9050602002016020810190611d499190614e44565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550806001019050611d11565b505050505050565b611db5613d02565b73ffffffffffffffffffffffffffffffffffffffff16611dd3612458565b73ffffffffffffffffffffffffffffffffffffffff1614611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2090614fdc565b60405180910390fd5b611e3360006146aa565b565b81611e3e613d02565b73ffffffffffffffffffffffffffffffffffffffff16611e5c612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015611efc5750611e83613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110611eb157611eb0614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611f33576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff1681548110611f4c57611f4b614e71565b5b906000526020600020906006020160030160006101000a81548160ff021916908360ff160217905550505050565b611f82613d02565b73ffffffffffffffffffffffffffffffffffffffff16611fa0612458565b73ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614fdc565b60405180910390fd5b600060068461ffff16815481106120105761200f614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff16815260200160048201548152602001600582015481525050905060008390505b82811015612320576000600260008761ffff1661ffff16815260200190815260200160002082815481106121c6576121c5614e71565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460008861ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008273ffffffffffffffffffffffffffffffffffffffff168260ff1686604001516122899190614f25565b60405161229590615099565b60006040518083038185875af1925050503d80600081146122d2576040519150601f19603f3d011682016040523d82523d6000602084013e6122d7565b606091505b5050905080612312576040517fd8c8dd5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600101935050505061218f565b5050505050565b81612330613d02565b73ffffffffffffffffffffffffffffffffffffffff1661234e612458565b73ffffffffffffffffffffffffffffffffffffffff16141580156123ee5750612375613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106123a3576123a2614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612425576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff168154811061243e5761243d614e71565b5b906000526020600020906006020160040181905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8061248a613d02565b73ffffffffffffffffffffffffffffffffffffffff166124a8612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561254857506124cf613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106124fd576124fc614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561257f576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000151560068361ffff168154811061259b5761259a614e71565b5b906000526020600020906006020160030160019054906101000a900460ff161515036125f3576040517f35b08eb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160068361ffff168154811061260d5761260c614e71565b5b906000526020600020906006020160030160026101000a81548160ff0219169083151502179055505050565b612641613d02565b73ffffffffffffffffffffffffffffffffffffffff1661265f612458565b73ffffffffffffffffffffffffffffffffffffffff16146126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90614fdc565b60405180910390fd5b8060068361ffff16815481106126ce576126cd614e71565b5b906000526020600020906006020160030160036101000a81548161ffff021916908361ffff1602179055505050565b600260015403612742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273990615048565b60405180910390fd5b60026001819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146127af576040517f7df1f81700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001151560068261ffff16815481106127cb576127ca614e71565b5b906000526020600020906006020160030160029054906101000a900460ff16151503612823576040517f4d93e11100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008361ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16905060018110156128cb576040517fcacb095400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008461ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060003373ffffffffffffffffffffffffffffffffffffffff168260068561ffff168154811061296f5761296e614e71565b5b90600052602060002090600602016002015461298b9190614f25565b60405161299790615099565b60006040518083038185875af1925050503d80600081146129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b5050905080612a14576040517fd8c8dd5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506001808190555050565b82612a29613d02565b73ffffffffffffffffffffffffffffffffffffffff16612a47612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015612ae75750612a6e613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110612a9c57612a9b614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612b1e576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b7184848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506000868690506000613d0a565b50505050565b81612b80613d02565b73ffffffffffffffffffffffffffffffffffffffff16612b9e612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015612c3e5750612bc5613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110612bf357612bf2614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612c75576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff1681548110612c8e57612c8d614e71565b5b906000526020600020906006020160050181905550505050565b81612cb1613d02565b73ffffffffffffffffffffffffffffffffffffffff16612ccf612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015612d6f5750612cf6613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110612d2457612d23614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612da6576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260015403612deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de290615048565b60405180910390fd5b6002600181905550600060068461ffff1681548110612e0d57612e0c614e71565b5b906000526020600020906006020160020154600460008661ffff1661ffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16612e929190614f25565b90506000600460008661ffff1661ffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060008373ffffffffffffffffffffffffffffffffffffffff1682604051612f2c90615099565b60006040518083038185875af1925050503d8060008114612f69576040519150601f19603f3d011682016040523d82523d6000602084013e612f6e565b606091505b5050905080612fa9576040517fd8c8dd5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505060018081905550505050565b81612fc0613d02565b73ffffffffffffffffffffffffffffffffffffffff16612fde612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561307e5750613005613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff168154811061303357613032614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156130b5576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff16815481106130ce576130cd614e71565b5b906000526020600020906006020160020181905550505050565b806130f1613d02565b73ffffffffffffffffffffffffffffffffffffffff1661310f612458565b73ffffffffffffffffffffffffffffffffffffffff16141580156131af5750613136613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff168154811061316457613163614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156131e6576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001540361322b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322290615048565b60405180910390fd5b600260018190555061323c826142ef565b600180819055505050565b60055481565b6002602052816000526040600020818154811061326957600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600060068861ffff16815481106132be576132bd614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016004820154815260200160058201548152505090506000600460008a61ffff1661ffff16815260200190815260200160002090506000600360008b61ffff1661ffff16815260200190815260200160002090506000600260008c61ffff1661ffff168152602001908152602001600020905060005b81805490508110156136215760008282815481106134b8576134b7614e71565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008160ff1611156136145760018d61354e9190614ecf565b9c508060ff168c61355f9190614ecf565b9b5086604001518160ff166135749190614f25565b8b61357f9190614ecf565b9a508460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156136135760018a6135df9190614ecf565b99508060ff16896135f09190614ecf565b985086604001518160ff166136059190614f25565b886136109190614ecf565b97505b5b8260010192505050613497565b505050505091939550919395565b80613638613d02565b73ffffffffffffffffffffffffffffffffffffffff16613656612458565b73ffffffffffffffffffffffffffffffffffffffff16141580156136f6575061367d613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106136ab576136aa614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561372d576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060068361ffff168154811061374757613746614e71565b5b906000526020600020906006020160030160026101000a81548160ff0219169083151502179055505050565b60046020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b816137ab613d02565b73ffffffffffffffffffffffffffffffffffffffff166137c9612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561386957506137f0613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff168154811061381e5761381d614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156138a0576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff16815481106138b9576138b8614e71565b5b906000526020600020906006020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b613915613d02565b73ffffffffffffffffffffffffffffffffffffffff16613933612458565b73ffffffffffffffffffffffffffffffffffffffff1614613989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398090614fdc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036139f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ef9061518c565b60405180910390fd5b613a01816146aa565b50565b81613a0d613d02565b73ffffffffffffffffffffffffffffffffffffffff16613a2b612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015613acb5750613a52613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110613a8057613a7f614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613b02576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff1681548110613b1b57613b1a614e71565b5b906000526020600020906006020160030160056101000a81548161ffff021916908361ffff160217905550505050565b80613b54613d02565b73ffffffffffffffffffffffffffffffffffffffff16613b72612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015613c125750613b99613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110613bc757613bc6614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613c49576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600260008461ffff1661ffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015613ce657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613c9c575b50505050509050613cfd8382600084516000613d0a565b505050565b600033905090565b600060068661ffff1681548110613d2457613d23614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff168152602001600482015481526020016005820154815250509050600015158160800151151503613edf576040517f1a0a9aaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008861ffff1661ffff16815260200190815260200160002090506000600360008961ffff1661ffff16815260200190815260200160002090506000808790505b86811015614132576000898281518110613f4157613f40614e71565b5b6020026020010151905060008560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690508780613fef57508460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015613ffe575060008160ff16115b156141255760008660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060008160ff1688604001516140709190614f25565b905060006127108960c0015161ffff168361408b9190614f25565b61409591906151db565b905080866140a39190614ecf565b9550886020015173ffffffffffffffffffffffffffffffffffffffff1663fb0f4a7f82846140d1919061520c565b86866040518463ffffffff1660e01b81526004016140f0929190615240565b6000604051808303818588803b15801561410957600080fd5b505af115801561411d573d6000803e3d6000fd5b505050505050505b8260010192505050613f24565b5080600560008282546141459190614ecf565b92505081905550505050505050505050565b6000806000600460008561ffff1661ffff16815260200190815260200160002090506000600360008661ffff1661ffff16815260200190815260200160002090506000600260008761ffff1661ffff168152602001908152602001600020905060005b81805490508110156142e65760008282815481106141db576141da614e71565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008160ff1611156142d9578060ff16886142739190614ecf565b97508460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156142d8578060ff16876142d59190614ecf565b96505b5b82600101925050506141ba565b50505050915091565b600060068261ffff168154811061430957614308614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016004820154815260200160058201548152505090506000600260008461ffff1661ffff168152602001908152602001600020905060005b81805490508160ff1610156146a4576000828260ff16815481106144cb576144ca614e71565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460008761ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008160ff161115614697576000600460008861ffff1661ffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060008273ffffffffffffffffffffffffffffffffffffffff168260ff16876040015161460c9190614f25565b60405161461890615099565b60006040518083038185875af1925050503d8060008114614655576040519150601f19603f3d011682016040523d82523d6000602084013e61465a565b606091505b5050905080614695576040517fd8c8dd5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b82600101925050506144a4565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600080fd5b600061ffff82169050919050565b61478f81614778565b811461479a57600080fd5b50565b6000813590506147ac81614786565b92915050565b6000819050919050565b6147c5816147b2565b81146147d057600080fd5b50565b6000813590506147e2816147bc565b92915050565b6000806000606084860312156148015761480061476e565b5b600061480f8682870161479d565b9350506020614820868287016147d3565b9250506040614831868287016147d3565b9150509250925092565b600060ff82169050919050565b6148518161483b565b811461485c57600080fd5b50565b60008135905061486e81614848565b92915050565b6000806040838503121561488b5761488a61476e565b5b60006148998582860161479d565b92505060206148aa8582860161485f565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148df826148b4565b9050919050565b6148ef816148d4565b81146148fa57600080fd5b50565b60008135905061490c816148e6565b92915050565b600061491d826148d4565b9050919050565b61492d81614912565b811461493857600080fd5b50565b60008135905061494a81614924565b92915050565b600080600080600080600080610100898b0312156149715761497061476e565b5b600061497f8b828c016148fd565b98505060206149908b828c0161493b565b97505060406149a18b828c016147d3565b96505060606149b28b828c0161485f565b95505060806149c38b828c0161479d565b94505060a06149d48b828c0161479d565b93505060c06149e58b828c016147d3565b92505060e06149f68b828c016147d3565b9150509295985092959890939650565b600060208284031215614a1c57614a1b61476e565b5b6000614a2a8482850161479d565b91505092915050565b600060208284031215614a4957614a4861476e565b5b6000614a57848285016147d3565b91505092915050565b614a69816148d4565b82525050565b6000819050919050565b6000614a94614a8f614a8a846148b4565b614a6f565b6148b4565b9050919050565b6000614aa682614a79565b9050919050565b6000614ab882614a9b565b9050919050565b614ac881614aad565b82525050565b614ad7816147b2565b82525050565b614ae68161483b565b82525050565b60008115159050919050565b614b0181614aec565b82525050565b614b1081614778565b82525050565b600061014082019050614b2c600083018d614a60565b614b39602083018c614abf565b614b46604083018b614ace565b614b53606083018a614add565b614b606080830189614af8565b614b6d60a0830188614af8565b614b7a60c0830187614b07565b614b8760e0830186614b07565b614b95610100830185614ace565b614ba3610120830184614ace565b9b9a5050505050505050505050565b60008060408385031215614bc957614bc861476e565b5b6000614bd78582860161479d565b9250506020614be8858286016148fd565b9150509250929050565b6000602082019050614c076000830184614af8565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112614c3257614c31614c0d565b5b8235905067ffffffffffffffff811115614c4f57614c4e614c12565b5b602083019150836020820283011115614c6b57614c6a614c17565b5b9250929050565b600080600060408486031215614c8b57614c8a61476e565b5b6000614c998682870161479d565b935050602084013567ffffffffffffffff811115614cba57614cb9614773565b5b614cc686828701614c1c565b92509250509250925092565b60008060408385031215614ce957614ce861476e565b5b6000614cf78582860161479d565b9250506020614d08858286016147d3565b9150509250929050565b6000602082019050614d276000830184614a60565b92915050565b60008060408385031215614d4457614d4361476e565b5b6000614d528582860161479d565b9250506020614d638582860161479d565b9150509250929050565b6000602082019050614d826000830184614ace565b92915050565b600060c082019050614d9d6000830189614ace565b614daa6020830188614ace565b614db76040830187614ace565b614dc46060830186614ace565b614dd16080830185614ace565b614dde60a0830184614ace565b979650505050505050565b6000602082019050614dfe6000830184614add565b92915050565b60008060408385031215614e1b57614e1a61476e565b5b6000614e298582860161479d565b9250506020614e3a8582860161493b565b9150509250929050565b600060208284031215614e5a57614e5961476e565b5b6000614e68848285016148fd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614eda826147b2565b9150614ee5836147b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f1a57614f19614ea0565b5b828201905092915050565b6000614f30826147b2565b9150614f3b836147b2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f7457614f73614ea0565b5b828202905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fc6602083614f7f565b9150614fd182614f90565b602082019050919050565b60006020820190508181036000830152614ff581614fb9565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615032601f83614f7f565b915061503d82614ffc565b602082019050919050565b6000602082019050818103600083015261506181615025565b9050919050565b600081905092915050565b50565b6000615083600083615068565b915061508e82615073565b600082019050919050565b60006150a482615076565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006150e4601083614f7f565b91506150ef826150ae565b602082019050919050565b60006020820190508181036000830152615113816150d7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615176602683614f7f565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151e6826147b2565b91506151f1836147b2565b925082615201576152006151ac565b5b828204905092915050565b6000615217826147b2565b9150615222836147b2565b92508282101561523557615234614ea0565b5b828203905092915050565b60006040820190506152556000830185614a60565b6152626020830184614add565b939250505056fea2646970667358221220586822246003ca4379c72e81414948dc93e91111470897a2a00cb23f4e2da70a64736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806390911e371161010d578063d1a0e7a2116100a0578063dcfa832c1161006f578063dcfa832c14610681578063dfbf9f1d146106be578063f2fde38b146106e7578063f746923d14610710578063ffb9a1b514610739576101ee565b8063d1a0e7a2146105ae578063d4342d38146105d9578063d4c099c214610616578063d563e72514610658576101ee565b8063a7bfd041116100dc578063a7bfd0411461050a578063ae5220f914610533578063bbc2986c1461055c578063cb26d94214610585576101ee565b806390911e371461046657806399b64de11461048f5780639ac95dee146104b8578063a6d25102146104e1576101ee565b80633cdf3d23116101855780637767faed116101545780637767faed146103c057806383c56b0e146103e9578063852c6413146104125780638da5cb5b1461043b576101ee565b80633cdf3d231461032c5780634f573cb214610369578063531c509a14610380578063715018a6146103a9576101ee565b80632e16225d116101c15780632e16225d1461027d5780632e37eef6146102a65780633084a42f146102ec57806338e771ab14610315576101ee565b80630165f612146101f357806310291a591461021c57806310e11bb41461023857806320f9453e14610261575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906147e8565b610762565b005b61023660048036038101906102319190614874565b610919565b005b34801561024457600080fd5b5061025f600480360381019061025a9190614950565b610e44565b005b61027b60048036038101906102769190614874565b6110cf565b005b34801561028957600080fd5b506102a4600480360381019061029f9190614a06565b611587565b005b3480156102b257600080fd5b506102cd60048036038101906102c89190614a33565b61173e565b6040516102e39a99989796959493929190614b16565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190614bb2565b611825565b005b34801561032157600080fd5b5061032a611990565b005b34801561033857600080fd5b50610353600480360381019061034e9190614bb2565b611a8d565b6040516103609190614bf2565b60405180910390f35b34801561037557600080fd5b5061037e611abc565b005b34801561038c57600080fd5b506103a760048036038101906103a29190614c72565b611bf1565b005b3480156103b557600080fd5b506103be611dad565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190614874565b611e35565b005b3480156103f557600080fd5b50610410600480360381019061040b91906147e8565b611f7a565b005b34801561041e57600080fd5b5061043960048036038101906104349190614cd2565b612327565b005b34801561044757600080fd5b50610450612458565b60405161045d9190614d12565b60405180910390f35b34801561047257600080fd5b5061048d60048036038101906104889190614a06565b612481565b005b34801561049b57600080fd5b506104b660048036038101906104b19190614d2d565b612639565b005b3480156104c457600080fd5b506104df60048036038101906104da9190614a06565b6126fd565b005b3480156104ed57600080fd5b5061050860048036038101906105039190614c72565b612a20565b005b34801561051657600080fd5b50610531600480360381019061052c9190614cd2565b612b77565b005b34801561053f57600080fd5b5061055a60048036038101906105559190614bb2565b612ca8565b005b34801561056857600080fd5b50610583600480360381019061057e9190614cd2565b612fb7565b005b34801561059157600080fd5b506105ac60048036038101906105a79190614a06565b6130e8565b005b3480156105ba57600080fd5b506105c3613247565b6040516105d09190614d6d565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190614cd2565b61324d565b60405161060d9190614d12565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190614a06565b61329b565b60405161064f96959493929190614d88565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a9190614a06565b61362f565b005b34801561068d57600080fd5b506106a860048036038101906106a39190614bb2565b613773565b6040516106b59190614de9565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190614e04565b6137a2565b005b3480156106f357600080fd5b5061070e60048036038101906107099190614e44565b61390d565b005b34801561071c57600080fd5b5061073760048036038101906107329190614d2d565b613a04565b005b34801561074557600080fd5b50610760600480360381019061075b9190614a06565b613b4b565b005b8261076b613d02565b73ffffffffffffffffffffffffffffffffffffffff16610789612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561082957506107b0613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106107de576107dd614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610860576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600260008661ffff1661ffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156108fd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108b3575b50505050509050610912858286866000613d0a565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461097e576040517f7df1f81700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060068361ffff168154811061099857610997614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff168152602001600482015481526020016005820154815250509050806101000151421080610b3957506000816101200151118015610b38575080610120015142115b5b15610b70576040517f21094a9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610b7b84614157565b50905060008260e0015161ffff16118015610bab57508160e0015161ffff168360ff1682610ba99190614ecf565b115b15610be2576040517f8afc21f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816060015160ff168360ff161115610c26576040517f62a85d4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018360ff161015610c64576040517f8fe1565900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260ff168260400151610c779190614f25565b3414610caf576040517f55e97b0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008661ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610d51576040517fb0ca2ff500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008561ffff1661ffff168152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600460008661ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555050505050565b610e4c613d02565b73ffffffffffffffffffffffffffffffffffffffff16610e6a612458565b73ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790614fdc565b60405180910390fd5b60066040518061014001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018760ff1681526020016000151581526020016000151581526020018661ffff1681526020018561ffff16815260200184815260200183815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff021916908360ff16021790555060808201518160030160016101000a81548160ff02191690831515021790555060a08201518160030160026101000a81548160ff02191690831515021790555060c08201518160030160036101000a81548161ffff021916908361ffff16021790555060e08201518160030160056101000a81548161ffff021916908361ffff1602179055506101008201518160040155610120820151816005015550505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611134576040517f7df1f81700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060068361ffff168154811061114e5761114d614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016004820154815260200160058201548152505090508061010001514210806112ef575060008161012001511180156112ee575080610120015142115b5b15611326576040517f21094a9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015160ff168260ff16111561136a576040517f62a85d4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260ff1610156113a8576040517f8fe1565900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160ff1681604001516113bb9190614f25565b34146113f3576040517f55e97b0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008561ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611495576040517fb0ca2ff500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008461ffff1661ffff168152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460008561ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550505050565b80611590613d02565b73ffffffffffffffffffffffffffffffffffffffff166115ae612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561164e57506115d5613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff168154811061160357611602614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611685576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600260008461ffff1661ffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561172257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116d8575b505050505090506117398382600084516001613d0a565b505050565b6006818154811061174e57600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16908060030160029054906101000a900460ff16908060030160039054906101000a900461ffff16908060030160059054906101000a900461ffff1690806004015490806005015490508a565b8161182e613d02565b73ffffffffffffffffffffffffffffffffffffffff1661184c612458565b73ffffffffffffffffffffffffffffffffffffffff16141580156118ec5750611873613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106118a1576118a0614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611923576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff168154811061193c5761193b614e71565b5b906000526020600020906006020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b611998613d02565b73ffffffffffffffffffffffffffffffffffffffff166119b6612458565b73ffffffffffffffffffffffffffffffffffffffff1614611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390614fdc565b60405180910390fd5b600260015403611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890615048565b60405180910390fd5b600260018190555060005b6006805490508160ff161015611a8357611a788160ff166142ef565b806001019050611a5c565b5060018081905550565b60036020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b611ac4613d02565b73ffffffffffffffffffffffffffffffffffffffff16611ae2612458565b73ffffffffffffffffffffffffffffffffffffffff1614611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90614fdc565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600554604051611b6090615099565b60006040518083038185875af1925050503d8060008114611b9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ba2565b606091505b5050905080611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906150fa565b60405180910390fd5b600060058190555050565b82611bfa613d02565b73ffffffffffffffffffffffffffffffffffffffff16611c18612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015611cb85750611c3f613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110611c6d57611c6c614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611cef576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008661ffff1661ffff168152602001908152602001600020905060005b84849050811015611da5576001826000878785818110611d3457611d33614e71565b5b9050602002016020810190611d499190614e44565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550806001019050611d11565b505050505050565b611db5613d02565b73ffffffffffffffffffffffffffffffffffffffff16611dd3612458565b73ffffffffffffffffffffffffffffffffffffffff1614611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2090614fdc565b60405180910390fd5b611e3360006146aa565b565b81611e3e613d02565b73ffffffffffffffffffffffffffffffffffffffff16611e5c612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015611efc5750611e83613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110611eb157611eb0614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611f33576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff1681548110611f4c57611f4b614e71565b5b906000526020600020906006020160030160006101000a81548160ff021916908360ff160217905550505050565b611f82613d02565b73ffffffffffffffffffffffffffffffffffffffff16611fa0612458565b73ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614fdc565b60405180910390fd5b600060068461ffff16815481106120105761200f614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff16815260200160048201548152602001600582015481525050905060008390505b82811015612320576000600260008761ffff1661ffff16815260200190815260200160002082815481106121c6576121c5614e71565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460008861ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008273ffffffffffffffffffffffffffffffffffffffff168260ff1686604001516122899190614f25565b60405161229590615099565b60006040518083038185875af1925050503d80600081146122d2576040519150601f19603f3d011682016040523d82523d6000602084013e6122d7565b606091505b5050905080612312576040517fd8c8dd5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600101935050505061218f565b5050505050565b81612330613d02565b73ffffffffffffffffffffffffffffffffffffffff1661234e612458565b73ffffffffffffffffffffffffffffffffffffffff16141580156123ee5750612375613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106123a3576123a2614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612425576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff168154811061243e5761243d614e71565b5b906000526020600020906006020160040181905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8061248a613d02565b73ffffffffffffffffffffffffffffffffffffffff166124a8612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561254857506124cf613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106124fd576124fc614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561257f576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000151560068361ffff168154811061259b5761259a614e71565b5b906000526020600020906006020160030160019054906101000a900460ff161515036125f3576040517f35b08eb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160068361ffff168154811061260d5761260c614e71565b5b906000526020600020906006020160030160026101000a81548160ff0219169083151502179055505050565b612641613d02565b73ffffffffffffffffffffffffffffffffffffffff1661265f612458565b73ffffffffffffffffffffffffffffffffffffffff16146126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90614fdc565b60405180910390fd5b8060068361ffff16815481106126ce576126cd614e71565b5b906000526020600020906006020160030160036101000a81548161ffff021916908361ffff1602179055505050565b600260015403612742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273990615048565b60405180910390fd5b60026001819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146127af576040517f7df1f81700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001151560068261ffff16815481106127cb576127ca614e71565b5b906000526020600020906006020160030160029054906101000a900460ff16151503612823576040517f4d93e11100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008361ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16905060018110156128cb576040517fcacb095400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008461ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060003373ffffffffffffffffffffffffffffffffffffffff168260068561ffff168154811061296f5761296e614e71565b5b90600052602060002090600602016002015461298b9190614f25565b60405161299790615099565b60006040518083038185875af1925050503d80600081146129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b5050905080612a14576040517fd8c8dd5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506001808190555050565b82612a29613d02565b73ffffffffffffffffffffffffffffffffffffffff16612a47612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015612ae75750612a6e613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110612a9c57612a9b614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612b1e576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b7184848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506000868690506000613d0a565b50505050565b81612b80613d02565b73ffffffffffffffffffffffffffffffffffffffff16612b9e612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015612c3e5750612bc5613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110612bf357612bf2614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612c75576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff1681548110612c8e57612c8d614e71565b5b906000526020600020906006020160050181905550505050565b81612cb1613d02565b73ffffffffffffffffffffffffffffffffffffffff16612ccf612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015612d6f5750612cf6613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110612d2457612d23614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612da6576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260015403612deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de290615048565b60405180910390fd5b6002600181905550600060068461ffff1681548110612e0d57612e0c614e71565b5b906000526020600020906006020160020154600460008661ffff1661ffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16612e929190614f25565b90506000600460008661ffff1661ffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060008373ffffffffffffffffffffffffffffffffffffffff1682604051612f2c90615099565b60006040518083038185875af1925050503d8060008114612f69576040519150601f19603f3d011682016040523d82523d6000602084013e612f6e565b606091505b5050905080612fa9576040517fd8c8dd5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505060018081905550505050565b81612fc0613d02565b73ffffffffffffffffffffffffffffffffffffffff16612fde612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561307e5750613005613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff168154811061303357613032614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156130b5576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff16815481106130ce576130cd614e71565b5b906000526020600020906006020160020181905550505050565b806130f1613d02565b73ffffffffffffffffffffffffffffffffffffffff1661310f612458565b73ffffffffffffffffffffffffffffffffffffffff16141580156131af5750613136613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff168154811061316457613163614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156131e6576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001540361322b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322290615048565b60405180910390fd5b600260018190555061323c826142ef565b600180819055505050565b60055481565b6002602052816000526040600020818154811061326957600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600060068861ffff16815481106132be576132bd614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016004820154815260200160058201548152505090506000600460008a61ffff1661ffff16815260200190815260200160002090506000600360008b61ffff1661ffff16815260200190815260200160002090506000600260008c61ffff1661ffff168152602001908152602001600020905060005b81805490508110156136215760008282815481106134b8576134b7614e71565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008160ff1611156136145760018d61354e9190614ecf565b9c508060ff168c61355f9190614ecf565b9b5086604001518160ff166135749190614f25565b8b61357f9190614ecf565b9a508460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156136135760018a6135df9190614ecf565b99508060ff16896135f09190614ecf565b985086604001518160ff166136059190614f25565b886136109190614ecf565b97505b5b8260010192505050613497565b505050505091939550919395565b80613638613d02565b73ffffffffffffffffffffffffffffffffffffffff16613656612458565b73ffffffffffffffffffffffffffffffffffffffff16141580156136f6575061367d613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff16815481106136ab576136aa614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561372d576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060068361ffff168154811061374757613746614e71565b5b906000526020600020906006020160030160026101000a81548160ff0219169083151502179055505050565b60046020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b816137ab613d02565b73ffffffffffffffffffffffffffffffffffffffff166137c9612458565b73ffffffffffffffffffffffffffffffffffffffff161415801561386957506137f0613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff168154811061381e5761381d614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156138a0576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff16815481106138b9576138b8614e71565b5b906000526020600020906006020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b613915613d02565b73ffffffffffffffffffffffffffffffffffffffff16613933612458565b73ffffffffffffffffffffffffffffffffffffffff1614613989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398090614fdc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036139f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ef9061518c565b60405180910390fd5b613a01816146aa565b50565b81613a0d613d02565b73ffffffffffffffffffffffffffffffffffffffff16613a2b612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015613acb5750613a52613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110613a8057613a7f614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613b02576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160068461ffff1681548110613b1b57613b1a614e71565b5b906000526020600020906006020160030160056101000a81548161ffff021916908361ffff160217905550505050565b80613b54613d02565b73ffffffffffffffffffffffffffffffffffffffff16613b72612458565b73ffffffffffffffffffffffffffffffffffffffff1614158015613c125750613b99613d02565b73ffffffffffffffffffffffffffffffffffffffff1660068261ffff1681548110613bc757613bc6614e71565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613c49576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600260008461ffff1661ffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015613ce657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613c9c575b50505050509050613cfd8382600084516000613d0a565b505050565b600033905090565b600060068661ffff1681548110613d2457613d23614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff168152602001600482015481526020016005820154815250509050600015158160800151151503613edf576040517f1a0a9aaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460008861ffff1661ffff16815260200190815260200160002090506000600360008961ffff1661ffff16815260200190815260200160002090506000808790505b86811015614132576000898281518110613f4157613f40614e71565b5b6020026020010151905060008560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690508780613fef57508460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015613ffe575060008160ff16115b156141255760008660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060008160ff1688604001516140709190614f25565b905060006127108960c0015161ffff168361408b9190614f25565b61409591906151db565b905080866140a39190614ecf565b9550886020015173ffffffffffffffffffffffffffffffffffffffff1663fb0f4a7f82846140d1919061520c565b86866040518463ffffffff1660e01b81526004016140f0929190615240565b6000604051808303818588803b15801561410957600080fd5b505af115801561411d573d6000803e3d6000fd5b505050505050505b8260010192505050613f24565b5080600560008282546141459190614ecf565b92505081905550505050505050505050565b6000806000600460008561ffff1661ffff16815260200190815260200160002090506000600360008661ffff1661ffff16815260200190815260200160002090506000600260008761ffff1661ffff168152602001908152602001600020905060005b81805490508110156142e65760008282815481106141db576141da614e71565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008160ff1611156142d9578060ff16886142739190614ecf565b97508460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156142d8578060ff16876142d59190614ecf565b96505b5b82600101925050506141ba565b50505050915091565b600060068261ffff168154811061430957614308614e71565b5b9060005260206000209060060201604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900460ff161515151581526020016003820160029054906101000a900460ff161515151581526020016003820160039054906101000a900461ffff1661ffff1661ffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016004820154815260200160058201548152505090506000600260008461ffff1661ffff168152602001908152602001600020905060005b81805490508160ff1610156146a4576000828260ff16815481106144cb576144ca614e71565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460008761ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008160ff161115614697576000600460008861ffff1661ffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060008273ffffffffffffffffffffffffffffffffffffffff168260ff16876040015161460c9190614f25565b60405161461890615099565b60006040518083038185875af1925050503d8060008114614655576040519150601f19603f3d011682016040523d82523d6000602084013e61465a565b606091505b5050905080614695576040517fd8c8dd5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b82600101925050506144a4565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600080fd5b600061ffff82169050919050565b61478f81614778565b811461479a57600080fd5b50565b6000813590506147ac81614786565b92915050565b6000819050919050565b6147c5816147b2565b81146147d057600080fd5b50565b6000813590506147e2816147bc565b92915050565b6000806000606084860312156148015761480061476e565b5b600061480f8682870161479d565b9350506020614820868287016147d3565b9250506040614831868287016147d3565b9150509250925092565b600060ff82169050919050565b6148518161483b565b811461485c57600080fd5b50565b60008135905061486e81614848565b92915050565b6000806040838503121561488b5761488a61476e565b5b60006148998582860161479d565b92505060206148aa8582860161485f565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148df826148b4565b9050919050565b6148ef816148d4565b81146148fa57600080fd5b50565b60008135905061490c816148e6565b92915050565b600061491d826148d4565b9050919050565b61492d81614912565b811461493857600080fd5b50565b60008135905061494a81614924565b92915050565b600080600080600080600080610100898b0312156149715761497061476e565b5b600061497f8b828c016148fd565b98505060206149908b828c0161493b565b97505060406149a18b828c016147d3565b96505060606149b28b828c0161485f565b95505060806149c38b828c0161479d565b94505060a06149d48b828c0161479d565b93505060c06149e58b828c016147d3565b92505060e06149f68b828c016147d3565b9150509295985092959890939650565b600060208284031215614a1c57614a1b61476e565b5b6000614a2a8482850161479d565b91505092915050565b600060208284031215614a4957614a4861476e565b5b6000614a57848285016147d3565b91505092915050565b614a69816148d4565b82525050565b6000819050919050565b6000614a94614a8f614a8a846148b4565b614a6f565b6148b4565b9050919050565b6000614aa682614a79565b9050919050565b6000614ab882614a9b565b9050919050565b614ac881614aad565b82525050565b614ad7816147b2565b82525050565b614ae68161483b565b82525050565b60008115159050919050565b614b0181614aec565b82525050565b614b1081614778565b82525050565b600061014082019050614b2c600083018d614a60565b614b39602083018c614abf565b614b46604083018b614ace565b614b53606083018a614add565b614b606080830189614af8565b614b6d60a0830188614af8565b614b7a60c0830187614b07565b614b8760e0830186614b07565b614b95610100830185614ace565b614ba3610120830184614ace565b9b9a5050505050505050505050565b60008060408385031215614bc957614bc861476e565b5b6000614bd78582860161479d565b9250506020614be8858286016148fd565b9150509250929050565b6000602082019050614c076000830184614af8565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112614c3257614c31614c0d565b5b8235905067ffffffffffffffff811115614c4f57614c4e614c12565b5b602083019150836020820283011115614c6b57614c6a614c17565b5b9250929050565b600080600060408486031215614c8b57614c8a61476e565b5b6000614c998682870161479d565b935050602084013567ffffffffffffffff811115614cba57614cb9614773565b5b614cc686828701614c1c565b92509250509250925092565b60008060408385031215614ce957614ce861476e565b5b6000614cf78582860161479d565b9250506020614d08858286016147d3565b9150509250929050565b6000602082019050614d276000830184614a60565b92915050565b60008060408385031215614d4457614d4361476e565b5b6000614d528582860161479d565b9250506020614d638582860161479d565b9150509250929050565b6000602082019050614d826000830184614ace565b92915050565b600060c082019050614d9d6000830189614ace565b614daa6020830188614ace565b614db76040830187614ace565b614dc46060830186614ace565b614dd16080830185614ace565b614dde60a0830184614ace565b979650505050505050565b6000602082019050614dfe6000830184614add565b92915050565b60008060408385031215614e1b57614e1a61476e565b5b6000614e298582860161479d565b9250506020614e3a8582860161493b565b9150509250929050565b600060208284031215614e5a57614e5961476e565b5b6000614e68848285016148fd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614eda826147b2565b9150614ee5836147b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f1a57614f19614ea0565b5b828201905092915050565b6000614f30826147b2565b9150614f3b836147b2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f7457614f73614ea0565b5b828202905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fc6602083614f7f565b9150614fd182614f90565b602082019050919050565b60006020820190508181036000830152614ff581614fb9565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615032601f83614f7f565b915061503d82614ffc565b602082019050919050565b6000602082019050818103600083015261506181615025565b9050919050565b600081905092915050565b50565b6000615083600083615068565b915061508e82615073565b600082019050919050565b60006150a482615076565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006150e4601083614f7f565b91506150ef826150ae565b602082019050919050565b60006020820190508181036000830152615113816150d7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615176602683614f7f565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151e6826147b2565b91506151f1836147b2565b925082615201576152006151ac565b5b828204905092915050565b6000615217826147b2565b9150615222836147b2565b92508282101561523557615234614ea0565b5b828203905092915050565b60006040820190506152556000830185614a60565b6152626020830184614add565b939250505056fea2646970667358221220586822246003ca4379c72e81414948dc93e91111470897a2a00cb23f4e2da70a64736f6c634300080e0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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