ETH Price: $2,632.65 (+0.70%)

Contract

0x720D601dF07B17503e8D66CF5F520Bc4cA895C4a
 
Transaction Hash
Method
Block
From
To
Refund173392432023-05-25 22:52:59510 days ago1685055179IN
0x720D601d...4cA895C4a
0 ETH0.0011523527.81920695
Refund170253292023-04-11 14:05:23554 days ago1681221923IN
0x720D601d...4cA895C4a
0 ETH0.0016500739.83482101
Refund170107862023-04-09 12:36:59556 days ago1681043819IN
0x720D601d...4cA895C4a
0 ETH0.0008787321.21367712
Refund169977322023-04-07 16:16:23558 days ago1680884183IN
0x720D601d...4cA895C4a
0 ETH0.0013232931.94583345
Refund169965802023-04-07 12:22:11558 days ago1680870131IN
0x720D601d...4cA895C4a
0 ETH0.0010122324.43646232
Refund169950762023-04-07 7:13:11558 days ago1680851591IN
0x720D601d...4cA895C4a
0 ETH0.0010608325.60976193
Refund169950702023-04-07 7:11:47558 days ago1680851507IN
0x720D601d...4cA895C4a
0 ETH0.0010373425.04261544
Refund169945762023-04-07 5:31:23558 days ago1680845483IN
0x720D601d...4cA895C4a
0 ETH0.0008807521.26240353
Refund169943962023-04-07 4:55:11558 days ago1680843311IN
0x720D601d...4cA895C4a
0 ETH0.0009230122.28258378
Refund169923492023-04-06 21:57:59559 days ago1680818279IN
0x720D601d...4cA895C4a
0 ETH0.0010034924.22547738
Refund169917142023-04-06 19:48:35559 days ago1680810515IN
0x720D601d...4cA895C4a
0 ETH0.0011226727.10269229
Refund169917072023-04-06 19:47:11559 days ago1680810431IN
0x720D601d...4cA895C4a
0 ETH0.0010723725.88840731
Refund169915922023-04-06 19:23:35559 days ago1680809015IN
0x720D601d...4cA895C4a
0 ETH0.0014986236.17847874
Refund169915742023-04-06 19:19:59559 days ago1680808799IN
0x720D601d...4cA895C4a
0 ETH0.0014047633.91262618
Refund169915352023-04-06 19:11:59559 days ago1680808319IN
0x720D601d...4cA895C4a
0 ETH0.0015022936.26726988
Refund169914732023-04-06 18:59:35559 days ago1680807575IN
0x720D601d...4cA895C4a
0 ETH0.0010373625.04309552
Refund169914162023-04-06 18:48:11559 days ago1680806891IN
0x720D601d...4cA895C4a
0 ETH0.0011101326.7999938
Refund169913732023-04-06 18:38:59559 days ago1680806339IN
0x720D601d...4cA895C4a
0 ETH0.0017416142.04468559
Refund169913562023-04-06 18:35:23559 days ago1680806123IN
0x720D601d...4cA895C4a
0 ETH0.0012650430.53960848
Refund169913362023-04-06 18:30:59559 days ago1680805859IN
0x720D601d...4cA895C4a
0 ETH0.0016675540.25663814
Refund169913322023-04-06 18:30:11559 days ago1680805811IN
0x720D601d...4cA895C4a
0 ETH0.001700941.06196162
Refund169913082023-04-06 18:25:23559 days ago1680805523IN
0x720D601d...4cA895C4a
0 ETH0.0010220624.67378165
Refund169912902023-04-06 18:21:47559 days ago1680805307IN
0x720D601d...4cA895C4a
0 ETH0.0010182424.58154985
Refund169912892023-04-06 18:21:35559 days ago1680805295IN
0x720D601d...4cA895C4a
0 ETH0.0009752923.54479786
Refund169912822023-04-06 18:20:11559 days ago1680805211IN
0x720D601d...4cA895C4a
0 ETH0.0010435225.19196686
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
173392432023-05-25 22:52:59510 days ago1685055179
0x720D601d...4cA895C4a
0.1 ETH
170253292023-04-11 14:05:23554 days ago1681221923
0x720D601d...4cA895C4a
3.5 ETH
170107862023-04-09 12:36:59556 days ago1681043819
0x720D601d...4cA895C4a
1.1 ETH
169977322023-04-07 16:16:23558 days ago1680884183
0x720D601d...4cA895C4a
0.14 ETH
169965802023-04-07 12:22:11558 days ago1680870131
0x720D601d...4cA895C4a
2.66 ETH
169950762023-04-07 7:13:11558 days ago1680851591
0x720D601d...4cA895C4a
0.7 ETH
169950702023-04-07 7:11:47558 days ago1680851507
0x720D601d...4cA895C4a
0.32 ETH
169945762023-04-07 5:31:23558 days ago1680845483
0x720D601d...4cA895C4a
4.04 ETH
169943962023-04-07 4:55:11558 days ago1680843311
0x720D601d...4cA895C4a
0.6 ETH
169923492023-04-06 21:57:59559 days ago1680818279
0x720D601d...4cA895C4a
0.52 ETH
169917142023-04-06 19:48:35559 days ago1680810515
0x720D601d...4cA895C4a
0.46 ETH
169917072023-04-06 19:47:11559 days ago1680810431
0x720D601d...4cA895C4a
0.16 ETH
169915922023-04-06 19:23:35559 days ago1680809015
0x720D601d...4cA895C4a
1.04 ETH
169915742023-04-06 19:19:59559 days ago1680808799
0x720D601d...4cA895C4a
0.5 ETH
169915352023-04-06 19:11:59559 days ago1680808319
0x720D601d...4cA895C4a
1.14 ETH
169914732023-04-06 18:59:35559 days ago1680807575
0x720D601d...4cA895C4a
0.9 ETH
169914162023-04-06 18:48:11559 days ago1680806891
0x720D601d...4cA895C4a
0.36 ETH
169913732023-04-06 18:38:59559 days ago1680806339
0x720D601d...4cA895C4a
1.4 ETH
169913562023-04-06 18:35:23559 days ago1680806123
0x720D601d...4cA895C4a
0.08 ETH
169913362023-04-06 18:30:59559 days ago1680805859
0x720D601d...4cA895C4a
0.1 ETH
169913322023-04-06 18:30:11559 days ago1680805811
0x720D601d...4cA895C4a
4.84 ETH
169913082023-04-06 18:25:23559 days ago1680805523
0x720D601d...4cA895C4a
0.46 ETH
169912902023-04-06 18:21:47559 days ago1680805307
0x720D601d...4cA895C4a
7.7 ETH
169912892023-04-06 18:21:35559 days ago1680805295
0x720D601d...4cA895C4a
2.04 ETH
169912822023-04-06 18:20:11559 days ago1680805211
0x720D601d...4cA895C4a
0.38 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PPPArtworkAuction

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 13 : PPPArtworkAuction.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022-2023 Fellowship

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "./Delegation.sol";
import "./EarlyAccessSale.sol";
import "./MintableById.sol";
import "./Shuffler.sol";

struct AuctionStage {
    /// @notice Amount that the price drops (in wei) every slot (every 12 seconds)
    uint256 priceDropPerSlot;
    /// @notice Price where this auction stage ends (in wei)
    uint256 endPrice;
    /// @notice The duration of time that this stage will last, in seconds
    uint256 duration;
}

struct AuctionStageConfiguration {
    /// @notice Amount that the price drops (in wei) every slot (every 12 seconds)
    uint256 priceDropPerSlot;
    /// @notice Price where this auction stage ends (in wei)
    uint256 endPrice;
}

contract PPPArtworkAuction is EarlyAccessSale, Shuffler {
    string private publicLimitRevertMessage;

    /// @notice The number of mints available for each pass
    uint256 public passLimit;

    /// @notice The number of mints available without a pass (per address), after the early access period
    uint256 public publicLimit;

    /// @notice The total number of mints available until the auction is sold out
    uint256 public mintLimit;

    /// @notice ERC-721 contract whose tokens are minted by this auction
    /// @dev Must implement MintableById and allow minting out of order
    MintableById public tokenContract;

    /// @notice Starting price for the Dutch auction (in wei)
    uint256 public startPrice;

    /// @notice Lowest price at which a token was minted (in wei)
    uint256 public lowestPrice;

    /// @notice Stages for this auction, in order
    AuctionStage[] public auctionStages;

    /// @notice Number of reserveTokens that have been minted
    uint256 public reserveCount = 0;

    /// @notice Number of tokens that have been minted per address
    mapping(address => uint256) public mintCount;
    /// @notice Total amount paid to mint per address
    mapping(address => uint256) public mintPayment;

    /// @notice Number of tokens that have been minted without a pass, per address
    /// @dev May over count public mints on the final sale transaction, so not publicly exposed
    mapping(address => uint256) private publicMintCount;

    uint256 private previousPayment = 0;

    /// @notice An event emitted upon purchases
    event Purchase(address purchaser, uint256 mintId, uint256 tokenId, uint256 price, bool passMint);

    /// @notice An event emitted when reserve tokens are minted
    event Reservation(address recipient, uint256 quantity, uint256 totalReserved);

    /// @notice An event emitted when a refund is sent to a minter
    event Refund(address recipient, uint256 amount);

    /// @notice An error returned when the auction has reached its `mintLimit`
    error SoldOut();

    error FailedWithdraw(uint256 amount, bytes data);

    constructor(
        MintableById tokenContract_,
        uint256 startTime_,
        uint256 startPrice_,
        uint256 earlyPriceDrop,
        uint256 transitionPrice,
        uint256 latePriceDrop,
        uint256 restPrice,
        uint256 mintLimit_,
        uint256 publicLimit_,
        uint256 passLimit_,
        uint256 earlyAccessDuration_
    ) EarlyAccessSale(startTime_, earlyAccessDuration_) Shuffler(mintLimit_) {
        // CHECKS inputs
        require(address(tokenContract_) != address(0), "Token contract must not be the zero address");

        require(restPrice > 1e15, "Rest price too low: check that prices are in wei");
        require(startPrice_ >= transitionPrice, "Start price must not be lower than transition price");
        require(transitionPrice >= restPrice, "Transition price must not be lower than rest price");

        uint256 earlyPriceDifference;
        uint256 latePriceDifference;
        unchecked {
            earlyPriceDifference = startPrice_ - transitionPrice;
            latePriceDifference = transitionPrice - restPrice;
        }
        require(earlyPriceDrop * 25 <= earlyPriceDifference, "Initial stage must last at least 5 minutes");
        require(latePriceDrop * 25 <= latePriceDifference, "Final stage must last at least 5 minutes");
        require(earlyPriceDifference % earlyPriceDrop == 0, "Transition price must be reachable by earlyPriceDrop");
        require(latePriceDifference % latePriceDrop == 0, "Resting price must be reachable by latePriceDrop");
        require(
            earlyPriceDrop * (5 * 60 * 12) >= earlyPriceDifference,
            "Initial stage must not last longer than 12 hours"
        );
        require(latePriceDrop * (5 * 60 * 12) >= latePriceDifference, "Final stage must not last longer than 12 hours");

        require(mintLimit_ >= 10, "Mint limit too low");
        require(passLimit_ != 0, "Pass limit must not be zero");
        require(publicLimit_ != 0, "Public limit must not be zero");
        require(passLimit_ < mintLimit_, "Pass limit must be lower than mint limit");
        require(publicLimit_ < mintLimit_, "Public limit must be lower than mint limit");

        // EFFECTS
        tokenContract = tokenContract_;
        lowestPrice = startPrice = startPrice_;

        unchecked {
            AuctionStage storage earlyStage = auctionStages.push();
            earlyStage.priceDropPerSlot = earlyPriceDrop;
            earlyStage.endPrice = transitionPrice;
            earlyStage.duration = (12 * earlyPriceDifference) / earlyPriceDrop;

            AuctionStage storage lateStage = auctionStages.push();
            lateStage.priceDropPerSlot = latePriceDrop;
            lateStage.endPrice = restPrice;
            lateStage.duration = (12 * latePriceDifference) / latePriceDrop;
        }

        mintLimit = mintLimit_;
        passLimit = passLimit_;
        publicLimit = publicLimit_;

        publicLimitRevertMessage = publicLimit_ == 1
            ? "Limited to one purchase without a pass"
            : string.concat("Limited to ", Strings.toString(publicLimit_), " purchases without a pass");
    }

    // PUBLIC FUNCTIONS

    /// @notice Mint a token on the `tokenContract` contract. Must include at least `currentPrice`.
    function mint() external payable publicMint {
        // CHECKS
        require(publicMintCount[msg.sender] < publicLimit, publicLimitRevertMessage);

        // EFFECTS
        unchecked {
            // Unchecked arithmetic: publicMintCount cannot exceed publicLimit
            publicMintCount[msg.sender]++;
        }

        // Proceed to core mint logic (including all CHECKS + EFFECTS + INTERACTIONS)
        _mint(false);
    }

    /// @notice Mint multiple tokens on the `tokenContract` contract. Must pay at least `currentPrice` * `quantity`.
    /// @param quantity The number of tokens to mint: must not be greater than `publicLimit`
    function mintMultiple(uint256 quantity) public payable virtual publicMint whenNotPaused {
        // CHECKS state and inputs
        uint256 remaining = remainingValueCount;
        if (remaining == 0) revert SoldOut();
        uint256 alreadyMinted = mintCount[msg.sender];
        require(quantity > 0, "Must mint at least one token");

        uint256 publicMinted = publicMintCount[msg.sender];
        require(publicMinted < publicLimit && quantity <= publicLimit, publicLimitRevertMessage);

        uint256 price = msg.value / quantity;
        uint256 slotPrice = currentPrice();
        require(price >= slotPrice, "Insufficient payment");

        // EFFECTS
        if (quantity > remaining) {
            quantity = remaining;
        }

        unchecked {
            if (publicMinted + quantity > publicLimit) {
                quantity = publicLimit - publicMinted;
            }

            // Unchecked arithmetic: mintCount cannot exceed mintLimit
            mintCount[msg.sender] = alreadyMinted + quantity;
            // Unchecked arithmetic: publicMintCount cannot exceed publicLimit
            publicMintCount[msg.sender] += quantity;
            // Unchecked arithmetic: can't exceed total existing wei; not expected to exceed mintLimit * startPrice
            mintPayment[msg.sender] += msg.value;
        }

        if (slotPrice < lowestPrice) {
            lowestPrice = slotPrice;
        }

        // INTERACTIONS: call mint on known contract (tokenContract.mint contains no external interactions)
        unchecked {
            uint256 startMintId = mintLimit - remainingValueCount;
            for (uint256 i = 0; i < quantity; i++) {
                uint256 tokenId = drawNext();
                emit Purchase(msg.sender, startMintId + i, tokenId, price, false);
                tokenContract.mint(msg.sender, tokenId);
            }
        }
    }

    /// @notice Send any available refund to the message sender
    function refund() external returns (uint256) {
        // CHECK available refund
        uint256 refundAmount = refundAvailable(msg.sender);
        require(refundAmount > 0, "No refund available");

        // EFFECTS
        unchecked {
            // Unchecked arithmetic: refundAmount will always be less than mintPayment
            mintPayment[msg.sender] -= refundAmount;
        }

        emit Refund(msg.sender, refundAmount);

        // INTERACTIONS
        (bool refunded, ) = msg.sender.call{value: refundAmount}("");
        require(refunded, "Refund transfer was reverted");

        return refundAmount;
    }

    // PASS HOLDER FUNCTIONS

    /// @notice Mint a token on the `tokenContract` to the caller, using a pass
    /// @param passId The pass token ID: caller must be owner or operator and pass must have at least one mint remaining
    function mintFromPass(uint256 passId) external payable started {
        // CHECKS that the caller has permissions and the pass can be used
        require(passAllowance(passId) > 0, "No mints remaining for provided pass");

        // INTERACTIONS: mark the pass as used (known contract with no external interactions)
        passes.logPassUse(passId, passProjectId);

        // Proceed to core mint logic (including all CHECKS + EFFECTS + INTERACTIONS)
        _mint(true);
    }

    /// @notice Mint multiple tokens on the `tokenContract` to the caller, using passes
    /// @param passIds The pass token IDs: caller must be owner or operator and passes must have mints remaining
    function mintMultipleFromPasses(
        uint256 quantity,
        uint256[] calldata passIds
    ) external payable started whenNotPaused {
        // CHECKS state and inputs
        uint256 remaining = remainingValueCount;
        if (remaining == 0) revert SoldOut();
        require(quantity > 0, "Must mint at least one token");
        require(quantity <= mintLimit, "Quantity exceeds auction size");

        uint256 price = msg.value / quantity;
        uint256 slotPrice = currentPrice();
        require(price >= slotPrice, "Insufficient payment");

        uint256 passCount = passIds.length;
        require(passCount > 0, "Must include at least one pass");

        // EFFECTS
        if (quantity > remaining) {
            quantity = remaining;
        }

        // CHECKS: check passes and log their usages
        uint256 passUses = 0;
        for (uint256 i = 0; i < passCount; i++) {
            uint256 passId = passIds[i];

            // CHECKS
            uint256 allowance = passAllowance(passId);

            // INTERACTIONS
            for (uint256 j = 0; j < allowance && passUses < quantity; j++) {
                passes.logPassUse(passId, passProjectId);
                passUses++;
            }

            // Don't check more passes than needed
            if (passUses == quantity) break;
        }

        require(passUses > 0, "No mints remaining for provided passes");
        quantity = passUses;

        // EFFECTS
        unchecked {
            // Unchecked arithmetic: mintCount cannot exceed passLimit * number of existing passes
            mintCount[msg.sender] += quantity;
            // Unchecked arithmetic: can't exceed total existing wei; not expected to exceed mintLimit * startPrice
            mintPayment[msg.sender] += msg.value;
        }

        if (slotPrice < lowestPrice) {
            lowestPrice = slotPrice;
        }

        // INTERACTIONS: call mint on known contract (tokenContract.mint contains no external interactions)
        unchecked {
            uint256 startMintId = mintLimit - remainingValueCount;
            for (uint256 i = 0; i < quantity; i++) {
                uint256 tokenId = drawNext();
                emit Purchase(msg.sender, startMintId + i, tokenId, price, true);
                tokenContract.mint(msg.sender, tokenId);
            }
        }
    }

    // OWNER FUNCTIONS

    /// @notice Mint reserve tokens to the designated `recipient`
    /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started.
    function reserve(address recipient, uint256 quantity) external unstarted onlyOwner {
        // CHECKS contract state
        uint256 remaining = remainingValueCount;
        if (remaining == 0) revert SoldOut();

        // EFFECTS
        if (quantity > remaining) {
            quantity = remaining;
        }

        unchecked {
            // Unchecked arithmetic: neither value can exceed mintLimit
            reserveCount += quantity;
        }

        emit Reservation(recipient, quantity, reserveCount);

        // INTERACTIONS
        unchecked {
            for (uint256 i = 0; i < quantity; i++) {
                tokenContract.mint(recipient, drawNext());
            }
        }
    }

    /// @notice withdraw auction proceeds
    /// @dev Can only be called by the contract `owner`. Reverts if the final price is unknown, if proceeds have already
    ///  been withdrawn, or if the fund transfer fails.
    function withdraw(address recipient) external onlyOwner {
        // CHECKS contract state
        uint256 remaining = remainingValueCount;
        bool soldOut = remaining == 0;
        uint256 finalPrice = lowestPrice;
        if (!soldOut) {
            finalPrice = auctionStages[auctionStages.length - 1].endPrice;

            // Only allow a withdraw before the auction is sold out if the price has finished falling
            require(currentPrice() == finalPrice, "Price is still falling");
        }

        uint256 totalPayment = (mintLimit - remaining - reserveCount) * finalPrice;
        require(totalPayment > previousPayment, "All funds have been withdrawn");

        // EFFECTS
        uint256 outstandingPayment = totalPayment - previousPayment;
        uint256 balance = address(this).balance;
        if (outstandingPayment > balance) {
            // Escape hatch to prevent stuck funds, but this shouldn't happen
            require(balance > 0, "All funds have been withdrawn");
            outstandingPayment = balance;
        }

        previousPayment += outstandingPayment;
        (bool success, bytes memory data) = recipient.call{value: outstandingPayment}("");
        if (!success) revert FailedWithdraw(outstandingPayment, data);
    }

    /// @notice Update the tokenContract contract address
    /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started.
    function setMintable(MintableById tokenContract_) external unstarted onlyOwner {
        // CHECKS inputs
        require(address(tokenContract_) != address(0), "Token contract must not be the zero address");
        // EFFECTS
        tokenContract = tokenContract_;
    }

    /// @notice Update the auction price ranges and rates of decrease
    /// @dev Since the values are validated against each other, they are all set together. Can only be called by the
    ///  contract `owner`. Reverts if the auction has already started.
    function setPricing(
        uint256 startPrice_,
        AuctionStageConfiguration[] calldata stages_
    ) external unstarted onlyOwner {
        // CHECKS inputs
        uint256 stageCount = stages_.length;
        require(stageCount > 0, "Must specify at least one auction stage");

        // EFFECTS + additional CHECKS
        uint256 previousPrice = startPrice = startPrice_;
        delete auctionStages;

        for (uint256 i; i < stageCount; i++) {
            AuctionStageConfiguration calldata config = stages_[i];
            require(config.endPrice < previousPrice, "Each stage price must be lower than the previous price");
            require(config.endPrice > 1e15, "Stage price too low: check that prices are in wei");

            uint256 priceDifference = previousPrice - config.endPrice;
            require(config.priceDropPerSlot * 25 <= priceDifference, "Each stage must last at least 5 minutes");
            require(
                priceDifference % config.priceDropPerSlot == 0,
                "Stage end price must be reachable by slot price drop"
            );
            require(
                config.priceDropPerSlot * (5 * 60 * 12) >= priceDifference,
                "Stage must not last longer than 12 hours"
            );

            AuctionStage storage newStage = auctionStages.push();
            newStage.duration = (12 * priceDifference) / config.priceDropPerSlot;
            newStage.priceDropPerSlot = config.priceDropPerSlot;
            newStage.endPrice = previousPrice = config.endPrice;
        }
    }

    /// @notice Update the number of total mints
    function setMintLimit(uint256 mintLimit_) external unstarted onlyOwner {
        // CHECKS inputs
        require(reserveCount == 0, 'Cannot change the mint limit once tokens have been reserved');
        require(mintLimit_ >= 10, "Mint limit too low");
        require(passLimit < mintLimit_, "Mint limit must be higher than pass limit");
        require(publicLimit < mintLimit_, "Mint limit must be higher than public limit");

        // EFFECTS
        mintLimit = remainingValueCount = mintLimit_;
    }

    /// @notice Update the per-pass mint limit
    function setPassLimit(uint256 passLimit_) external onlyOwner {
        // CHECKS inputs
        require(passLimit_ != 0, "Pass limit must not be zero");
        require(passLimit_ < mintLimit, "Pass limit must be lower than mint limit");

        // EFFECTS
        passLimit = passLimit_;
    }

    /// @notice Update the public per-wallet mint limit
    function setPublicLimit(uint256 publicLimit_) external onlyOwner {
        // CHECKS inputs
        require(publicLimit_ != 0, "Public limit must not be zero");
        require(publicLimit_ < mintLimit, "Public limit must be lower than mint limit");

        // EFFECTS
        publicLimit = publicLimit_;
        publicLimitRevertMessage = publicLimit_ == 1
            ? "Limited to one purchase without a pass"
            : string.concat("Limited to ", Strings.toString(publicLimit_), " purchases without a pass");
    }

    // VIEW FUNCTIONS

    /// @notice Query the current price
    function currentPrice() public view returns (uint256 price) {
        uint256 time = timeElapsed();

        price = startPrice;
        uint256 stageCount = auctionStages.length;
        uint256 stageDuration;
        AuctionStage storage stage;
        for (uint256 i = 0; i < stageCount; i++) {
            stage = auctionStages[i];
            stageDuration = stage.duration;
            if (time < stageDuration) {
                unchecked {
                    uint256 drop = stage.priceDropPerSlot * (time / 12);
                    return price - drop;
                }
            }

            // Proceed to the next stage
            unchecked {
                time -= stageDuration;
            }
            price = auctionStages[i].endPrice;
        }

        // Auction has reached resting price
        return price;
    }

    /// @notice Query the refund available for the specified `minter`
    function refundAvailable(address minter) public view returns (uint256) {
        uint256 minted = mintCount[minter];
        if (minted == 0) return 0;

        uint256 refundPrice = remainingValueCount == 0 ? lowestPrice : currentPrice();

        uint256 payment = mintPayment[minter];
        uint256 newPayment;
        uint256 refundAmount;
        unchecked {
            // Unchecked arithmetic: newPayment cannot exceed mintLimit * startPrice
            newPayment = minted * refundPrice;
            // Unchecked arithmetic: value only used if newPayment < payment
            refundAmount = payment - newPayment;
        }

        return (newPayment < payment) ? refundAmount : 0;
    }

    // INTERNAL FUNCTIONS

    function _mint(bool passMint) internal whenNotPaused {
        // CHECKS state and inputs
        uint256 remaining = remainingValueCount;
        if (remaining == 0) revert SoldOut();
        uint256 slotPrice = currentPrice();
        require(msg.value >= slotPrice, "Insufficient payment");

        // EFFECTS
        unchecked {
            // Unchecked arithmetic: mintCount cannot exceed mintLimit
            mintCount[msg.sender]++;
            // Unchecked arithmetic: can't exceed this.balance; not expected to exceed mintLimit * startPrice
            mintPayment[msg.sender] += msg.value;
        }

        if (slotPrice < lowestPrice) {
            lowestPrice = slotPrice;
        }

        uint256 mintId = mintLimit - remainingValueCount;
        uint256 tokenId = drawNext();
        emit Purchase(msg.sender, mintId, tokenId, msg.value, passMint);

        // INTERACTIONS: call mint on known contract (tokenContract.mint contains no external interactions)
        tokenContract.mint(msg.sender, tokenId);
    }

    // INTERNAL VIEW FUNCTIONS

    function passAllowance(uint256 passId) internal view returns (uint256) {
        // Uses view functions of the passes contract
        require(Delegation.check(msg.sender, passes, passId), "Caller is not pass owner or approved");

        uint256 uses = passes.passUses(passId, passProjectId);
        unchecked {
            return uses >= passLimit ? 0 : passLimit - uses;
        }
    }
}

File 2 of 13 : LICENSE.sol
// Copyright (c) 2022-2023 Fellowship
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies
// or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

File 3 of 13 : Delegation.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2023 Fellowship

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

interface IDelegationRegistry {
    function checkDelegateForToken(
        address delegate,
        address vault,
        address contract_,
        uint256 tokenId
    ) external view returns (bool);
}

library Delegation {
    IDelegationRegistry public constant DELEGATION_REGISTRY =
        IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B);

    function check(address operator, IERC721 contract_, uint256 tokenId) internal view returns (bool) {
        address owner = contract_.ownerOf(tokenId);
        return (operator == owner ||
            contract_.isApprovedForAll(owner, operator) ||
            contract_.getApproved(tokenId) == operator ||
            (address(DELEGATION_REGISTRY).code.length > 0 &&
                DELEGATION_REGISTRY.checkDelegateForToken(operator, owner, address(contract_), tokenId)));
    }
}

File 4 of 13 : EarlyAccessSale.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 - 2023 Fellowship

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

abstract contract PatronPass is IERC721 {
    function logPassUse(uint256 tokenId, uint256 projectId) external virtual;

    function passUses(uint256 tokenId, uint256 projectId) external view virtual returns (uint256);

    function projectInfo(uint256 projectId) external view virtual returns (address, address, string memory);
}

contract EarlyAccessSale is Ownable {
    /// @notice Timestamp when this auction starts allowing minting
    uint256 public startTime;

    /// @notice Duration of the early access period where minting is limited to pass holders
    uint256 public earlyAccessDuration;

    /// @notice The contract that is used to gate minting during the early access period
    PatronPass public passes;

    /// @notice The project id for this auction in `passes`
    uint256 internal passProjectId;

    /// @notice Whether or not this contract is paused
    /// @dev The exact meaning of "paused" will vary by contract, but in general paused contracts should prevent most
    ///  interactions from non-owners
    bool public isPaused = false;
    uint256 private pauseStart;
    uint256 internal pastPauseDelay;

    event Paused();
    event Unpaused();

    /// @notice An error returned when the auction has already started
    error AlreadyStarted();
    /// @notice An error returned when the auction has not yet started
    error NotYetStarted();

    /// @notice An error returned when minting during early access without a pass
    error EarlyAccessWithoutPass();

    error ContractIsPaused();
    error ContractNotPaused();

    constructor(uint256 startTime_, uint256 earlyAccessDuration_) {
        // CHECKS inputs
        require(startTime_ >= block.timestamp, "Start time cannot be in the past");
        require(earlyAccessDuration_ >= 60 * 5, "Early access must last at least 5 minutes");
        require(earlyAccessDuration_ <= 60 * 60 * 24, "Early access must not last longer than 24 hours");

        // EFFECTS
        startTime = startTime_;
        earlyAccessDuration = earlyAccessDuration_;
    }

    modifier started() {
        if (!isStarted()) revert NotYetStarted();
        _;
    }
    modifier unstarted() {
        if (isStarted()) revert AlreadyStarted();
        _;
    }

    modifier publicMint() {
        if (!isPublic()) revert EarlyAccessWithoutPass();
        _;
    }

    modifier whenPaused() {
        if (!isPaused) revert ContractNotPaused();
        _;
    }

    modifier whenNotPaused() {
        if (isPaused) revert ContractIsPaused();
        _;
    }

    // OWNER FUNCTIONS

    /// @notice Pause this contract
    /// @dev Can only be called by the contract `owner`
    function pause() public virtual whenNotPaused onlyOwner {
        // EFFECTS (checks already handled by modifiers)
        isPaused = true;
        pauseStart = block.timestamp;
        emit Paused();
    }

    /// @notice Resume this contract
    /// @dev Can only be called by the contract `owner`
    function unpause() public virtual whenPaused onlyOwner {
        // EFFECTS (checks already handled by modifiers)
        isPaused = false;
        emit Unpaused();

        // See if pastPauseDelay needs updated
        if (block.timestamp <= startTime) {
            return;
        }
        // Find the amount time the auction should have been live, but was paused
        unchecked {
            // Unchecked arithmetic: computed value will be < block.timestamp and >= 0
            if (pauseStart < startTime) {
                pastPauseDelay = block.timestamp - startTime;
            } else {
                pastPauseDelay += (block.timestamp - pauseStart);
            }
        }
    }

    /// @notice Update the auction start time
    /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started.
    function setStartTime(uint256 startTime_) external unstarted onlyOwner {
        // CHECKS inputs
        require(startTime_ >= block.timestamp, "New start time cannot be in the past");
        // EFFECTS
        startTime = startTime_;
    }

    /// @notice Update the duration of the early access period
    /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started.
    function setEarlyAccessDuration(uint256 duration) external unstarted onlyOwner {
        // CHECKS inputs
        require(duration >= 60 * 5, "Early access must last at least 5 minutes");
        require(duration <= 60 * 60 * 24, "Early access must not last longer than 24 hours");

        // EFFECTS
        earlyAccessDuration = duration;
    }

    /// @notice Update the pass contract for the early access period
    /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started.
    function setPassContract(PatronPass passContract, uint256 projectId) external unstarted onlyOwner {
        // CHECKS inputs
        (address projectMinter, , ) = passContract.projectInfo(projectId);
        require(projectMinter == address(this), "Specified pass project is not configured for this auction");

        // EFFECTS
        passes = passContract;
        passProjectId = projectId;

        if (isStarted()) {
            // If setting the contract started the auction, then we need to pretend we were paused up to this point
            unchecked {
                // Unchecked arithmetic: startTime <= block.timestamp because the auction has started
                pastPauseDelay = block.timestamp - startTime;
            }
        }
    }

    // VIEW FUNCTIONS

    /// @notice Query if the early access period has ended
    function isPublic() public view returns (bool) {
        return isStarted() && block.timestamp >= (startTime + pastPauseDelay + earlyAccessDuration);
    }

    /// @notice Query if this contract implements an interface
    /// @param interfaceId The interface identifier, as specified in ERC-165
    /// @return `true` if `interfaceID` is implemented and is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
        return
            interfaceId == 0x7f5828d0 || // ERC-173 Contract Ownership Standard
            interfaceId == 0x01ffc9a7; // ERC-165 Standard Interface Detection
    }

    // INTERNAL FUNCTIONS

    function isStarted() internal view virtual returns (bool) {
        return address(passes) != address(0) && (isPaused ? pauseStart : block.timestamp) >= startTime;
    }

    function timeElapsed() internal view returns (uint256) {
        if (!isStarted()) return 0;
        unchecked {
            // pastPauseDelay cannot be greater than the time passed since startTime
            if (!isPaused) {
                return block.timestamp - startTime - pastPauseDelay;
            }

            // pastPauseDelay cannot be greater than the time between startTime and pauseStart
            return pauseStart - startTime - pastPauseDelay;
        }
    }
}

File 5 of 13 : MintableById.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2023 Fellowship

pragma solidity ^0.8.7;

abstract contract MintableById {
    function mint(address to, uint256 tokenId) external virtual;
}

File 6 of 13 : Shuffler.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2023 Fellowship

pragma solidity ^0.8.7;

/// @notice A contract that draws (without replacement) pseudorandom shuffled values
/// @dev Uses prevrandao and Fisher-Yates shuffle to return values one at a time
contract Shuffler {
    uint256 internal remainingValueCount;
    /// @notice Mapping that lets `drawNext` find values that are still available
    /// @dev This is effectively the Fisher-Yates in-place array. Zero values stand in for their key to avoid costly
    ///  initialization. All other values are off-by-one so that zero can be represented. Keys from remainingValueCount
    ///  onward have their values set back to zero since they aren't needed once they've been drawn.
    mapping(uint256 => uint256) private shuffleValues;

    constructor(uint256 shuffleSize) {
        // CHECKS
        require(shuffleSize <= type(uint16).max, "Shuffle size is too large");

        // EFFECTS
        remainingValueCount = shuffleSize;
    }

    function drawNext() internal returns (uint256) {
        // CHECKS
        require(remainingValueCount > 0, "Shuffled values have been exhausted");

        // EFFECTS
        uint256 swapValue;
        unchecked {
            // Unchecked arithmetic: remainingValueCount is nonzero
            swapValue = shuffleValues[remainingValueCount - 1];
        }
        if (swapValue == 0) {
            swapValue = remainingValueCount;
        } else {
            shuffleValues[remainingValueCount - 1] = 0;
        }

        if (remainingValueCount == 1) {
            // swapValue is the last value left; just return it
            remainingValueCount = 0;
            unchecked {
                return swapValue - 1;
            }
        }

        uint256 randomIndex = uint256(keccak256(abi.encodePacked(remainingValueCount, block.difficulty))) %
            remainingValueCount;
        unchecked {
            // Unchecked arithmetic: remainingValueCount is nonzero
            remainingValueCount--;
            // Check if swapValue was drawn
            // Unchecked arithmetic: swapValue is nonzero
            if (randomIndex == remainingValueCount) return swapValue - 1;
        }

        // Draw the value at randomIndex and put swapValue in its place
        uint256 drawnValue = shuffleValues[randomIndex];
        shuffleValues[randomIndex] = swapValue;

        unchecked {
            // Unchecked arithmetic: only subtract if drawnValue is nonzero
            return drawnValue > 0 ? drawnValue - 1 : randomIndex;
        }
    }
}

File 7 of 13 : OPENZEPPELIN_LICENSE.sol
// OpenZeppelin Contracts
//
// Copyright (c) 2016-2023 zOS Global Limited and contributors
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
// Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

File 8 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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);
    }
}

File 9 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 10 of 13 : 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 11 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 12 of 13 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 13 of 13 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract MintableById","name":"tokenContract_","type":"address"},{"internalType":"uint256","name":"startTime_","type":"uint256"},{"internalType":"uint256","name":"startPrice_","type":"uint256"},{"internalType":"uint256","name":"earlyPriceDrop","type":"uint256"},{"internalType":"uint256","name":"transitionPrice","type":"uint256"},{"internalType":"uint256","name":"latePriceDrop","type":"uint256"},{"internalType":"uint256","name":"restPrice","type":"uint256"},{"internalType":"uint256","name":"mintLimit_","type":"uint256"},{"internalType":"uint256","name":"publicLimit_","type":"uint256"},{"internalType":"uint256","name":"passLimit_","type":"uint256"},{"internalType":"uint256","name":"earlyAccessDuration_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyStarted","type":"error"},{"inputs":[],"name":"ContractIsPaused","type":"error"},{"inputs":[],"name":"ContractNotPaused","type":"error"},{"inputs":[],"name":"EarlyAccessWithoutPass","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"FailedWithdraw","type":"error"},{"inputs":[],"name":"NotYetStarted","type":"error"},{"inputs":[],"name":"SoldOut","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"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"passMint","type":"bool"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalReserved","type":"uint256"}],"name":"Reservation","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionStages","outputs":[{"internalType":"uint256","name":"priceDropPerSlot","type":"uint256"},{"internalType":"uint256","name":"endPrice","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyAccessDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passId","type":"uint256"}],"name":"mintFromPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256[]","name":"passIds","type":"uint256[]"}],"name":"mintMultipleFromPasses","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"passLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"passes","outputs":[{"internalType":"contract PatronPass","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"refundAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setEarlyAccessDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintLimit_","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MintableById","name":"tokenContract_","type":"address"}],"name":"setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract PatronPass","name":"passContract","type":"address"},{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"setPassContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passLimit_","type":"uint256"}],"name":"setPassLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startPrice_","type":"uint256"},{"components":[{"internalType":"uint256","name":"priceDropPerSlot","type":"uint256"},{"internalType":"uint256","name":"endPrice","type":"uint256"}],"internalType":"struct AuctionStageConfiguration[]","name":"stages_","type":"tuple[]"}],"name":"setPricing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicLimit_","type":"uint256"}],"name":"setPublicLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime_","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"contract MintableById","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526005805460ff19169055600060128190556016553480156200002557600080fd5b5060405162003f9e38038062003f9e833981016040819052620000489162000b68565b838a8262000056336200098a565b42821015620000ac5760405162461bcd60e51b815260206004820181905260248201527f53746172742074696d652063616e6e6f7420626520696e20746865207061737460448201526064015b60405180910390fd5b61012c811015620001125760405162461bcd60e51b815260206004820152602960248201527f4561726c7920616363657373206d757374206c617374206174206c656173742060448201526835206d696e7574657360b81b6064820152608401620000a3565b620151808111156200017f5760405162461bcd60e51b815260206004820152602f60248201527f4561726c7920616363657373206d757374206e6f74206c617374206c6f6e676560448201526e72207468616e20323420686f75727360881b6064820152608401620000a3565b60019190915560025561ffff811115620001dc5760405162461bcd60e51b815260206004820152601960248201527f53687566666c652073697a6520697320746f6f206c61726765000000000000006044820152606401620000a3565b6008556001600160a01b038b166200024b5760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e20636f6e7472616374206d757374206e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401620000a3565b66038d7ea4c680008511620002bc5760405162461bcd60e51b815260206004820152603060248201527f5265737420707269636520746f6f206c6f773a20636865636b2074686174207060448201526f72696365732061726520696e2077656960801b6064820152608401620000a3565b86891015620003345760405162461bcd60e51b815260206004820152603360248201527f5374617274207072696365206d757374206e6f74206265206c6f77657220746860448201527f616e207472616e736974696f6e207072696365000000000000000000000000006064820152608401620000a3565b84871015620003a15760405162461bcd60e51b815260206004820152603260248201527f5472616e736974696f6e207072696365206d757374206e6f74206265206c6f776044820152716572207468616e207265737420707269636560701b6064820152608401620000a3565b86890385880381620003b58b601962000c00565b1115620004185760405162461bcd60e51b815260206004820152602a60248201527f496e697469616c207374616765206d757374206c617374206174206c656173746044820152692035206d696e7574657360b01b6064820152608401620000a3565b806200042689601962000c00565b1115620004875760405162461bcd60e51b815260206004820152602860248201527f46696e616c207374616765206d757374206c617374206174206c656173742035604482015267206d696e7574657360c01b6064820152608401620000a3565b620004938a8362000c3c565b15620005085760405162461bcd60e51b815260206004820152603460248201527f5472616e736974696f6e207072696365206d757374206265207265616368616260448201527f6c65206279206561726c79507269636544726f700000000000000000000000006064820152608401620000a3565b62000514888262000c3c565b156200057c5760405162461bcd60e51b815260206004820152603060248201527f52657374696e67207072696365206d75737420626520726561636861626c652060448201526f06279206c617465507269636544726f760841b6064820152608401620000a3565b816200058b8b610e1062000c00565b1015620005f45760405162461bcd60e51b815260206004820152603060248201527f496e697469616c207374616765206d757374206e6f74206c617374206c6f6e6760448201526f6572207468616e20313220686f75727360801b6064820152608401620000a3565b806200060389610e1062000c00565b10156200066a5760405162461bcd60e51b815260206004820152602e60248201527f46696e616c207374616765206d757374206e6f74206c617374206c6f6e67657260448201526d207468616e20313220686f75727360901b6064820152608401620000a3565b600a861015620006b25760405162461bcd60e51b81526020600482015260126024820152714d696e74206c696d697420746f6f206c6f7760701b6044820152606401620000a3565b83600003620007045760405162461bcd60e51b815260206004820152601b60248201527f50617373206c696d6974206d757374206e6f74206265207a65726f00000000006044820152606401620000a3565b84600003620007565760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963206c696d6974206d757374206e6f74206265207a65726f0000006044820152606401620000a3565b858410620007b85760405162461bcd60e51b815260206004820152602860248201527f50617373206c696d6974206d757374206265206c6f776572207468616e206d696044820152671b9d081b1a5b5a5d60c21b6064820152608401620000a3565b8585106200081c5760405162461bcd60e51b815260206004820152602a60248201527f5075626c6963206c696d6974206d757374206265206c6f776572207468616e206044820152691b5a5b9d081b1a5b5a5d60b21b6064820152608401620000a3565b600e80546001600160a01b038f166001600160a01b0319909116179055600f8b905560108b90556011805460018101825560009190915260030260008051602062003f3883398151915281018b815560008051602062003f588339815191529091018a90558a600c84028162000896576200089662000c26565b0460028201556011805460018101825560009190915260030260008051602062003f3883398151915281018a815560008051602062003f5883398151915290910189905589600c840281620008ef57620008ef62000c26565b0460029091015550600d869055600b849055600c859055600185146200094c576200092585620009da60201b620021611760201c565b60405160200162000937919062000c5f565b60405160208183030381529060405262000967565b60405180606001604052806026815260200162003f78602691395b600a9062000976908262000d70565b505050505050505050505050505062000e3c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60606000620009f48362000a7e60201b620021f41760201c565b60010190506000816001600160401b0381111562000a165762000a1662000ccb565b6040519080825280601f01601f19166020018201604052801562000a41576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508462000a4b57509392505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831062000ac8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831062000af5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831062000b1457662386f26fc10000830492506010015b6305f5e100831062000b2d576305f5e100830492506008015b612710831062000b4257612710830492506004015b6064831062000b55576064830492506002015b600a831062000b62576001015b92915050565b60008060008060008060008060008060006101608c8e03121562000b8b57600080fd5b8b516001600160a01b038116811462000ba357600080fd5b809b505060208c0151995060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015193506101008c015192506101208c015191506101408c015190509295989b509295989b9093969950565b808202811582820484141762000b6257634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60008262000c5a57634e487b7160e01b600052601260045260246000fd5b500690565b6a02634b6b4ba32b2103a37960ad1b81526000825160005b8181101562000c96576020818601810151600b86840101520162000c77565b507f2070757263686173657320776974686f75742061207061737300000000000000600b939091019283015250602401919050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000cf657607f821691505b60208210810362000d1757634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000d6b57600081815260208120601f850160051c8101602086101562000d465750805b601f850160051c820191505b8181101562000d675782815560010162000d52565b5050505b505050565b81516001600160401b0381111562000d8c5762000d8c62000ccb565b62000da48162000d9d845462000ce1565b8462000d1d565b602080601f83116001811462000ddc576000841562000dc35750858301515b600019600386901b1c1916600185901b17855562000d67565b600085815260208120601f198616915b8281101562000e0d5788860151825594840194600190910190840162000dec565b508582101562000e2c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6130ec8062000e4c6000396000f3fe6080604052600436106102255760003560e01c80638456cb5911610123578063b8ee5289116100ab578063dc9a15351161006f578063dc9a1535146105eb578063ed9ec88814610600578063f1a9af891461062d578063f1ac434714610643578063f2fde38b1461066357600080fd5b8063b8ee52891461055f578063be29b0561461057f578063c4315d8714610595578063cc47a40b146105b5578063cdcca20e146105d557600080fd5b80639d1b464a116100f25780639d1b464a146104e75780639e6a1d7d146104fc578063a4331d2d1461051c578063abbb5a5514610532578063b187bd261461054557600080fd5b80638456cb591461047e5780638da5cb5b146104935780638ea85979146104b1578063996517cf146104d157600080fd5b80633e0a322d116101b1578063590e1ae311610175578063590e1ae3146103fe5780635fc65727146104135780636a9412bd14610433578063715018a61461045357806378e979251461046857600080fd5b80633e0a322d1461035e5780633f4ba83a1461037e57806351cff8d914610393578063552da523146103b357806355a373d6146103c657600080fd5b806316f5f9a2116101f857806316f5f9a2146102ba57806317c5fee5146102cd5780631940d8df146103085780632363761714610328578063344a6bee1461034857600080fd5b806301ffc9a71461022a5780631249c58b1461025f57806316317c211461026957806316acf1751461028d575b600080fd5b34801561023657600080fd5b5061024a610245366004612a25565b610683565b60405190151581526020015b60405180910390f35b6102676106ba565b005b34801561027557600080fd5b5061027f60125481565b604051908152602001610256565b34801561029957600080fd5b5061027f6102a8366004612a64565b60146020526000908152604090205481565b6102676102c8366004612a81565b61073e565b3480156102d957600080fd5b506102ed6102e8366004612b00565b610b50565b60408051938452602084019290925290820152606001610256565b34801561031457600080fd5b50610267610323366004612b19565b610b83565b34801561033457600080fd5b50610267610343366004612b00565b610f0c565b34801561035457600080fd5b5061027f600b5481565b34801561036a57600080fd5b50610267610379366004612b00565b61102d565b34801561038a57600080fd5b506102676110bc565b34801561039f57600080fd5b506102676103ae366004612a64565b61114d565b6102676103c1366004612b00565b61136b565b3480156103d257600080fd5b50600e546103e6906001600160a01b031681565b6040516001600160a01b039091168152602001610256565b34801561040a57600080fd5b5061027f611467565b34801561041f57600080fd5b5061026761042e366004612b85565b6115a8565b34801561043f57600080fd5b5061027f61044e366004612a64565b611704565b34801561045f57600080fd5b50610267611787565b34801561047457600080fd5b5061027f60015481565b34801561048a57600080fd5b50610267611799565b34801561049f57600080fd5b506000546001600160a01b03166103e6565b3480156104bd57600080fd5b506102676104cc366004612a64565b611801565b3480156104dd57600080fd5b5061027f600d5481565b3480156104f357600080fd5b5061027f6118bb565b34801561050857600080fd5b50610267610517366004612b00565b61196b565b34801561052857600080fd5b5061027f600c5481565b610267610540366004612b00565b611b27565b34801561055157600080fd5b5060055461024a9060ff1681565b34801561056b57600080fd5b506003546103e6906001600160a01b031681565b34801561058b57600080fd5b5061027f60105481565b3480156105a157600080fd5b506102676105b0366004612b00565b611dac565b3480156105c157600080fd5b506102676105d0366004612b85565b611eae565b3480156105e157600080fd5b5061027f60025481565b3480156105f757600080fd5b5061024a611ff5565b34801561060c57600080fd5b5061027f61061b366004612a64565b60136020526000908152604090205481565b34801561063957600080fd5b5061027f600f5481565b34801561064f57600080fd5b5061026761065e366004612b00565b61202c565b34801561066f57600080fd5b5061026761067e366004612a64565b6120eb565b60006307f5828d60e41b6001600160e01b0319831614806106b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106c2611ff5565b6106df5760405163a611c2c160e01b815260040160405180910390fd5b600c5433600090815260156020526040902054600a911161071c5760405162461bcd60e51b81526004016107139190612be5565b60405180910390fd5b503360009081526015602052604081208054600101905561073c906122cc565b565b610746612436565b610763576040516303bdb9df60e61b815260040160405180910390fd5b60055460ff1615610787576040516306d39fcd60e41b815260040160405180910390fd5b60085460008190036107ac576040516352df9fe560e01b815260040160405180910390fd5b600084116107fc5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610713565b600d5484111561084e5760405162461bcd60e51b815260206004820152601d60248201527f5175616e7469747920657863656564732061756374696f6e2073697a650000006044820152606401610713565b600061085a8534612c9c565b905060006108666118bb565b9050808210156108885760405162461bcd60e51b815260040161071390612cb0565b83806108d65760405162461bcd60e51b815260206004820152601e60248201527f4d75737420696e636c756465206174206c65617374206f6e65207061737300006044820152606401610713565b838711156108e2578396505b6000805b828110156109d957600088888381811061090257610902612cde565b90506020020135905060006109168261246c565b905060005b818110801561092957508b85105b156109b55760035460048054604051638c6c4d2d60e01b815291820186905260248201526001600160a01b0390911690638c6c4d2d90604401600060405180830381600087803b15801561097c57600080fd5b505af1158015610990573d6000803e3d6000fd5b50505050848061099f90612cf4565b95505080806109ad90612cf4565b91505061091b565b508a84036109c45750506109d9565b505080806109d190612cf4565b9150506108e6565b5060008111610a395760405162461bcd60e51b815260206004820152602660248201527f4e6f206d696e74732072656d61696e696e6720666f722070726f76696465642060448201526570617373657360d01b6064820152608401610713565b336000908152601360209081526040808320805485019055601490915290208054340190556010549097508790831015610a735760108390555b600854600d540360005b89811015610b44576000610a8f612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec233838501838a6001604051610acb959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610b1f57600080fd5b505af1158015610b33573d6000803e3d6000fd5b505060019093019250610a7d915050565b50505050505050505050565b60118181548110610b6057600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b610b8b612436565b15610ba957604051631fbde44560e01b815260040160405180910390fd5b610bb16126ce565b8080610c0f5760405162461bcd60e51b815260206004820152602760248201527f4d7573742073706563696679206174206c65617374206f6e652061756374696f6044820152666e20737461676560c81b6064820152608401610713565b600f84905583610c21601160006129e3565b60005b82811015610f045736858583818110610c3f57610c3f612cde565b905060400201905082816020013510610cb95760405162461bcd60e51b815260206004820152603660248201527f45616368207374616765207072696365206d757374206265206c6f776572207460448201527568616e207468652070726576696f757320707269636560501b6064820152608401610713565b66038d7ea4c68000816020013511610d2d5760405162461bcd60e51b815260206004820152603160248201527f537461676520707269636520746f6f206c6f773a20636865636b2074686174206044820152707072696365732061726520696e2077656960781b6064820152608401610713565b6000610d3d602083013585612d3d565b905080610d4c83356019612d50565b1115610daa5760405162461bcd60e51b815260206004820152602760248201527f45616368207374616765206d757374206c617374206174206c656173742035206044820152666d696e7574657360c81b6064820152608401610713565b610db5823582612d67565b15610e1f5760405162461bcd60e51b815260206004820152603460248201527f537461676520656e64207072696365206d75737420626520726561636861626c60448201527306520627920736c6f742070726963652064726f760641b6064820152608401610713565b80610e2d8335610e10612d50565b1015610e8c5760405162461bcd60e51b815260206004820152602860248201527f5374616765206d757374206e6f74206c617374206c6f6e676572207468616e20604482015267313220686f75727360c01b6064820152608401610713565b601180546001810182556000919091526003027f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68018235610ece83600c612d50565b610ed89190612c9c565b600282015582358155602090920135600190920182905550915080610efc81612cf4565b915050610c24565b505050505050565b610f146126ce565b80600003610f645760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963206c696d6974206d757374206e6f74206265207a65726f0000006044820152606401610713565b600d548110610fc85760405162461bcd60e51b815260206004820152602a60248201527f5075626c6963206c696d6974206d757374206265206c6f776572207468616e206044820152691b5a5b9d081b1a5b5a5d60b21b6064820152608401610713565b600c8190556001811461100257610fde81612161565b604051602001610fee9190612d9f565b60405160208183030381529060405261101c565b604051806060016040528060268152602001613091602691395b600a906110299082612e55565b5050565b611035612436565b1561105357604051631fbde44560e01b815260040160405180910390fd5b61105b6126ce565b428110156110b75760405162461bcd60e51b8152602060048201526024808201527f4e65772073746172742074696d652063616e6e6f7420626520696e20746865206044820152631c185cdd60e21b6064820152608401610713565b600155565b60055460ff166110df5760405163dcdde9dd60e01b815260040160405180910390fd5b6110e76126ce565b6005805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a160015442111561073c57600154600654101561113a576001544203600755565b6006546007805442929092039091019055565b6111556126ce565b600854601054811590816111e6576011805461117390600190612d3d565b8154811061118357611183612cde565b9060005260206000209060030201600101549050806111a06118bb565b146111e65760405162461bcd60e51b81526020600482015260166024820152755072696365206973207374696c6c2066616c6c696e6760501b6044820152606401610713565b60008160125485600d546111fa9190612d3d565b6112049190612d3d565b61120e9190612d50565b905060165481116112615760405162461bcd60e51b815260206004820152601d60248201527f416c6c2066756e64732068617665206265656e2077697468647261776e0000006044820152606401610713565b6000601654826112719190612d3d565b905047808211156112d057600081116112cc5760405162461bcd60e51b815260206004820152601d60248201527f416c6c2066756e64732068617665206265656e2077697468647261776e0000006044820152606401610713565b8091505b81601660008282546112e29190612f15565b909155505060405160009081906001600160a01b038a169085908381818185875af1925050503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b509150915081611360578381604051637e4c7d7b60e01b8152600401610713929190612f28565b505050505050505050565b611373612436565b611390576040516303bdb9df60e61b815260040160405180910390fd5b600061139b8261246c565b116113f45760405162461bcd60e51b8152602060048201526024808201527f4e6f206d696e74732072656d61696e696e6720666f722070726f7669646564206044820152637061737360e01b6064820152608401610713565b60035460048054604051638c6c4d2d60e01b815291820184905260248201526001600160a01b0390911690638c6c4d2d90604401600060405180830381600087803b15801561144257600080fd5b505af1158015611456573d6000803e3d6000fd5b5050505061146460016122cc565b50565b60008061147333611704565b9050600081116114bb5760405162461bcd60e51b81526020600482015260136024820152724e6f20726566756e6420617661696c61626c6560681b6044820152606401610713565b3360008181526014602090815260409182902080548590039055815192835282018390527fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d910160405180910390a1604051600090339083908381818185875af1925050503d806000811461154c576040519150601f19603f3d011682016040523d82523d6000602084013e611551565b606091505b50509050806115a25760405162461bcd60e51b815260206004820152601c60248201527f526566756e64207472616e7366657220776173207265766572746564000000006044820152606401610713565b50919050565b6115b0612436565b156115ce57604051631fbde44560e01b815260040160405180910390fd5b6115d66126ce565b60405163c9acbcf160e01b8152600481018290526000906001600160a01b0384169063c9acbcf190602401600060405180830381865afa15801561161e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116469190810190612f62565b50909150506001600160a01b03811630146116c95760405162461bcd60e51b815260206004820152603960248201527f53706563696669656420706173732070726f6a656374206973206e6f7420636f60448201527f6e6669677572656420666f7220746869732061756374696f6e000000000000006064820152608401610713565b600380546001600160a01b0319166001600160a01b03851617905560048290556116f1612436565b156116ff5760015442036007555b505050565b6001600160a01b03811660009081526013602052604081205480820361172d5750600092915050565b6000600854600014611746576117416118bb565b61174a565b6010545b6001600160a01b03851660009081526014602052604090205490915082820280820382821061177a57600061177c565b805b979650505050505050565b61178f6126ce565b61073c6000612728565b60055460ff16156117bd576040516306d39fcd60e41b815260040160405180910390fd5b6117c56126ce565b6005805460ff19166001179055426006556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b611809612436565b1561182757604051631fbde44560e01b815260040160405180910390fd5b61182f6126ce565b6001600160a01b0381166118995760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e20636f6e7472616374206d757374206e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610713565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000806118c6612778565b600f54601154909350909150600080805b8381101561196357601181815481106118f2576118f2612cde565b906000526020600020906003020191508160020154925082851015611924575054600c90930490920290920392915050565b82850394506011818154811061193c5761193c612cde565b9060005260206000209060030201600101549550808061195b90612cf4565b9150506118d7565b505050505090565b611973612436565b1561199157604051631fbde44560e01b815260040160405180910390fd5b6119996126ce565b60125415611a0f5760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f74206368616e676520746865206d696e74206c696d6974206f6e6360448201527f6520746f6b656e732068617665206265656e20726573657276656400000000006064820152608401610713565b600a811015611a555760405162461bcd60e51b81526020600482015260126024820152714d696e74206c696d697420746f6f206c6f7760701b6044820152606401610713565b80600b5410611ab85760405162461bcd60e51b815260206004820152602960248201527f4d696e74206c696d6974206d75737420626520686967686572207468616e2070604482015268185cdcc81b1a5b5a5d60ba1b6064820152608401610713565b80600c5410611b1d5760405162461bcd60e51b815260206004820152602b60248201527f4d696e74206c696d6974206d75737420626520686967686572207468616e207060448201526a1d589b1a58c81b1a5b5a5d60aa1b6064820152608401610713565b6008819055600d55565b611b2f611ff5565b611b4c5760405163a611c2c160e01b815260040160405180910390fd5b60055460ff1615611b70576040516306d39fcd60e41b815260040160405180910390fd5b6008546000819003611b95576040516352df9fe560e01b815260040160405180910390fd5b3360009081526013602052604090205482611bf25760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610713565b33600090815260156020526040902054600c5481108015611c155750600c548411155b600a90611c355760405162461bcd60e51b81526004016107139190612be5565b506000611c428534612c9c565b90506000611c4e6118bb565b905080821015611c705760405162461bcd60e51b815260040161071390612cb0565b84861115611c7c578495505b600c548684011115611c905782600c540395505b336000908152601360209081526040808320878a0190556015825280832080548a01905560149091529020805434019055601054811015611cd15760108190555b600854600d540360005b87811015611da2576000611ced612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec23383850183886000604051611d29959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505060019093019250611cdb915050565b5050505050505050565b611db4612436565b15611dd257604051631fbde44560e01b815260040160405180910390fd5b611dda6126ce565b61012c811015611e3e5760405162461bcd60e51b815260206004820152602960248201527f4561726c7920616363657373206d757374206c617374206174206c656173742060448201526835206d696e7574657360b81b6064820152608401610713565b62015180811115611ea95760405162461bcd60e51b815260206004820152602f60248201527f4561726c7920616363657373206d757374206e6f74206c617374206c6f6e676560448201526e72207468616e20323420686f75727360881b6064820152608401610713565b600255565b611eb6612436565b15611ed457604051631fbde44560e01b815260040160405180910390fd5b611edc6126ce565b6008546000819003611f01576040516352df9fe560e01b815260040160405180910390fd5b80821115611f0d578091505b60128054830190819055604080516001600160a01b03861681526020810185905280820192909252517fd4f5ef8b5c5c845e4bb3a6bcbe0af0716d1a796eb1cd6996bae76e5d3515493c9181900360600190a160005b82811015611fef57600e546001600160a01b03166340c10f1985611f85612575565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611fcb57600080fd5b505af1158015611fdf573d6000803e3d6000fd5b505060019092019150611f639050565b50505050565b6000611fff612436565b801561202757506002546007546001546120199190612f15565b6120239190612f15565b4210155b905090565b6120346126ce565b806000036120845760405162461bcd60e51b815260206004820152601b60248201527f50617373206c696d6974206d757374206e6f74206265207a65726f00000000006044820152606401610713565b600d5481106120e65760405162461bcd60e51b815260206004820152602860248201527f50617373206c696d6974206d757374206265206c6f776572207468616e206d696044820152671b9d081b1a5b5a5d60c21b6064820152608401610713565b600b55565b6120f36126ce565b6001600160a01b0381166121585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610713565b61146481612728565b6060600061216e836121f4565b600101905060008167ffffffffffffffff81111561218e5761218e612df9565b6040519080825280601f01601f1916602001820160405280156121b8576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846121c257509392505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106122335772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061225f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061227d57662386f26fc10000830492506010015b6305f5e1008310612295576305f5e100830492506008015b61271083106122a957612710830492506004015b606483106122bb576064830492506002015b600a83106106b45760010192915050565b60055460ff16156122f0576040516306d39fcd60e41b815260040160405180910390fd5b6008546000819003612315576040516352df9fe560e01b815260040160405180910390fd5b600061231f6118bb565b9050803410156123415760405162461bcd60e51b815260040161071390612cb0565b33600090815260136020908152604080832080546001019055601490915290208054340190556010548110156123775760108190555b6000600854600d546123899190612d3d565b90506000612395612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec233838334896040516123ce959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561242257600080fd5b505af1158015611360573d6000803e3d6000fd5b6003546000906001600160a01b031615801590612027575060015460055460ff166124615742612465565b6006545b1015905090565b6003546000906124879033906001600160a01b0316846127b2565b6124df5760405162461bcd60e51b8152602060048201526024808201527f43616c6c6572206973206e6f742070617373206f776e6572206f7220617070726044820152631bdd995960e21b6064820152608401610713565b60035460048054604051636017d14160e11b815291820185905260248201526000916001600160a01b03169063c02fa28290604401602060405180830381865afa158015612531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125559190613038565b9050600b5481101561256b5780600b540361256e565b60005b9392505050565b600080600854116125d45760405162461bcd60e51b815260206004820152602360248201527f53687566666c65642076616c7565732068617665206265656e206578686175736044820152621d195960ea1b6064820152608401610713565b60085460001901600090815260096020526040812054908190036125fb5750600854612622565b60006009600060016008546126109190612d3d565b81526020810191909152604001600020555b60085460010361263a57600060085560001901919050565b60006008546008544460405160200161265d929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c6126809190612d67565b60088054600019810190915590915081036001016126a2575060001901919050565b6000818152600960205260409020805490839055806126c157816126c6565b600181035b935050505090565b6000546001600160a01b0316331461073c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610713565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612782612436565b61278c5750600090565b60055460ff166127a3575060075460015442030390565b50600754600154600654030390565b6040516331a9108f60e11b81526004810182905260009081906001600160a01b03851690636352211e90602401602060405180830381865afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190613051565b9050806001600160a01b0316856001600160a01b031614806128af575060405163e985e9c560e01b81526001600160a01b038281166004830152868116602483015285169063e985e9c590604401602060405180830381865afa15801561288b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128af919061306e565b8061292e575060405163020604bf60e21b8152600481018490526001600160a01b03808716919086169063081812fc90602401602060405180830381865afa1580156128ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129239190613051565b6001600160a01b0316145b806129da57506d76a84fef008cdabe6409d2fe638b3b158015906129da5750604051631574d39f60e31b81526001600160a01b038087166004830152808316602483015285166044820152606481018490526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da919061306e565b95945050505050565b508054600082556003029060005260206000209081019061146491905b80821115612a21576000808255600182018190556002820155600301612a00565b5090565b600060208284031215612a3757600080fd5b81356001600160e01b03198116811461256e57600080fd5b6001600160a01b038116811461146457600080fd5b600060208284031215612a7657600080fd5b813561256e81612a4f565b600080600060408486031215612a9657600080fd5b83359250602084013567ffffffffffffffff80821115612ab557600080fd5b818601915086601f830112612ac957600080fd5b813581811115612ad857600080fd5b8760208260051b8501011115612aed57600080fd5b6020830194508093505050509250925092565b600060208284031215612b1257600080fd5b5035919050565b600080600060408486031215612b2e57600080fd5b83359250602084013567ffffffffffffffff80821115612b4d57600080fd5b818601915086601f830112612b6157600080fd5b813581811115612b7057600080fd5b8760208260061b8501011115612aed57600080fd5b60008060408385031215612b9857600080fd5b8235612ba381612a4f565b946020939093013593505050565b600181811c90821680612bc557607f821691505b6020821081036115a257634e487b7160e01b600052602260045260246000fd5b6000602080835260008454612bf981612bb1565b80848701526040600180841660008114612c1a5760018114612c3457612c62565b60ff1985168984015283151560051b890183019550612c62565b896000528660002060005b85811015612c5a5781548b8201860152908301908801612c3f565b8a0184019650505b509398975050505050505050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082612cab57612cab612c70565b500490565b602080825260149082015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612d0657612d06612c86565b5060010190565b6001600160a01b039590951685526020850193909352604084019190915260608301521515608082015260a00190565b818103818111156106b4576106b4612c86565b80820281158282048414176106b4576106b4612c86565b600082612d7657612d76612c70565b500690565b60005b83811015612d96578181015183820152602001612d7e565b50506000910152565b6a02634b6b4ba32b2103a37960ad1b815260008251612dc581600b850160208701612d7b565b7f2070757263686173657320776974686f75742061207061737300000000000000600b939091019283015250602401919050565b634e487b7160e01b600052604160045260246000fd5b601f8211156116ff57600081815260208120601f850160051c81016020861015612e365750805b601f850160051c820191505b81811015610f0457828155600101612e42565b815167ffffffffffffffff811115612e6f57612e6f612df9565b612e8381612e7d8454612bb1565b84612e0f565b602080601f831160018114612eb85760008415612ea05750858301515b600019600386901b1c1916600185901b178555610f04565b600085815260208120601f198616915b82811015612ee757888601518255948401946001909101908401612ec8565b5085821015612f055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156106b4576106b4612c86565b8281526040602082015260008251806040840152612f4d816060850160208701612d7b565b601f01601f1916919091016060019392505050565b600080600060608486031215612f7757600080fd5b8351612f8281612a4f565b6020850151909350612f9381612a4f565b604085015190925067ffffffffffffffff80821115612fb157600080fd5b818601915086601f830112612fc557600080fd5b815181811115612fd757612fd7612df9565b604051601f8201601f19908116603f01168101908382118183101715612fff57612fff612df9565b8160405282815289602084870101111561301857600080fd5b613029836020830160208801612d7b565b80955050505050509250925092565b60006020828403121561304a57600080fd5b5051919050565b60006020828403121561306357600080fd5b815161256e81612a4f565b60006020828403121561308057600080fd5b8151801515811461256e57600080fdfe4c696d6974656420746f206f6e6520707572636861736520776974686f757420612070617373a264697066735822122020d652ac76530a8232b2bf57dadfc053564335cb5251986e9fe6d28123edd5b164736f6c6343000812003331ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6831ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c694c696d6974656420746f206f6e6520707572636861736520776974686f75742061207061737300000000000000000000000066bcf059b2d8db6cd10615cdd781828db58268cf00000000000000000000000000000000000000000000000000000000642efa900000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000834

Deployed Bytecode

0x6080604052600436106102255760003560e01c80638456cb5911610123578063b8ee5289116100ab578063dc9a15351161006f578063dc9a1535146105eb578063ed9ec88814610600578063f1a9af891461062d578063f1ac434714610643578063f2fde38b1461066357600080fd5b8063b8ee52891461055f578063be29b0561461057f578063c4315d8714610595578063cc47a40b146105b5578063cdcca20e146105d557600080fd5b80639d1b464a116100f25780639d1b464a146104e75780639e6a1d7d146104fc578063a4331d2d1461051c578063abbb5a5514610532578063b187bd261461054557600080fd5b80638456cb591461047e5780638da5cb5b146104935780638ea85979146104b1578063996517cf146104d157600080fd5b80633e0a322d116101b1578063590e1ae311610175578063590e1ae3146103fe5780635fc65727146104135780636a9412bd14610433578063715018a61461045357806378e979251461046857600080fd5b80633e0a322d1461035e5780633f4ba83a1461037e57806351cff8d914610393578063552da523146103b357806355a373d6146103c657600080fd5b806316f5f9a2116101f857806316f5f9a2146102ba57806317c5fee5146102cd5780631940d8df146103085780632363761714610328578063344a6bee1461034857600080fd5b806301ffc9a71461022a5780631249c58b1461025f57806316317c211461026957806316acf1751461028d575b600080fd5b34801561023657600080fd5b5061024a610245366004612a25565b610683565b60405190151581526020015b60405180910390f35b6102676106ba565b005b34801561027557600080fd5b5061027f60125481565b604051908152602001610256565b34801561029957600080fd5b5061027f6102a8366004612a64565b60146020526000908152604090205481565b6102676102c8366004612a81565b61073e565b3480156102d957600080fd5b506102ed6102e8366004612b00565b610b50565b60408051938452602084019290925290820152606001610256565b34801561031457600080fd5b50610267610323366004612b19565b610b83565b34801561033457600080fd5b50610267610343366004612b00565b610f0c565b34801561035457600080fd5b5061027f600b5481565b34801561036a57600080fd5b50610267610379366004612b00565b61102d565b34801561038a57600080fd5b506102676110bc565b34801561039f57600080fd5b506102676103ae366004612a64565b61114d565b6102676103c1366004612b00565b61136b565b3480156103d257600080fd5b50600e546103e6906001600160a01b031681565b6040516001600160a01b039091168152602001610256565b34801561040a57600080fd5b5061027f611467565b34801561041f57600080fd5b5061026761042e366004612b85565b6115a8565b34801561043f57600080fd5b5061027f61044e366004612a64565b611704565b34801561045f57600080fd5b50610267611787565b34801561047457600080fd5b5061027f60015481565b34801561048a57600080fd5b50610267611799565b34801561049f57600080fd5b506000546001600160a01b03166103e6565b3480156104bd57600080fd5b506102676104cc366004612a64565b611801565b3480156104dd57600080fd5b5061027f600d5481565b3480156104f357600080fd5b5061027f6118bb565b34801561050857600080fd5b50610267610517366004612b00565b61196b565b34801561052857600080fd5b5061027f600c5481565b610267610540366004612b00565b611b27565b34801561055157600080fd5b5060055461024a9060ff1681565b34801561056b57600080fd5b506003546103e6906001600160a01b031681565b34801561058b57600080fd5b5061027f60105481565b3480156105a157600080fd5b506102676105b0366004612b00565b611dac565b3480156105c157600080fd5b506102676105d0366004612b85565b611eae565b3480156105e157600080fd5b5061027f60025481565b3480156105f757600080fd5b5061024a611ff5565b34801561060c57600080fd5b5061027f61061b366004612a64565b60136020526000908152604090205481565b34801561063957600080fd5b5061027f600f5481565b34801561064f57600080fd5b5061026761065e366004612b00565b61202c565b34801561066f57600080fd5b5061026761067e366004612a64565b6120eb565b60006307f5828d60e41b6001600160e01b0319831614806106b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106c2611ff5565b6106df5760405163a611c2c160e01b815260040160405180910390fd5b600c5433600090815260156020526040902054600a911161071c5760405162461bcd60e51b81526004016107139190612be5565b60405180910390fd5b503360009081526015602052604081208054600101905561073c906122cc565b565b610746612436565b610763576040516303bdb9df60e61b815260040160405180910390fd5b60055460ff1615610787576040516306d39fcd60e41b815260040160405180910390fd5b60085460008190036107ac576040516352df9fe560e01b815260040160405180910390fd5b600084116107fc5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610713565b600d5484111561084e5760405162461bcd60e51b815260206004820152601d60248201527f5175616e7469747920657863656564732061756374696f6e2073697a650000006044820152606401610713565b600061085a8534612c9c565b905060006108666118bb565b9050808210156108885760405162461bcd60e51b815260040161071390612cb0565b83806108d65760405162461bcd60e51b815260206004820152601e60248201527f4d75737420696e636c756465206174206c65617374206f6e65207061737300006044820152606401610713565b838711156108e2578396505b6000805b828110156109d957600088888381811061090257610902612cde565b90506020020135905060006109168261246c565b905060005b818110801561092957508b85105b156109b55760035460048054604051638c6c4d2d60e01b815291820186905260248201526001600160a01b0390911690638c6c4d2d90604401600060405180830381600087803b15801561097c57600080fd5b505af1158015610990573d6000803e3d6000fd5b50505050848061099f90612cf4565b95505080806109ad90612cf4565b91505061091b565b508a84036109c45750506109d9565b505080806109d190612cf4565b9150506108e6565b5060008111610a395760405162461bcd60e51b815260206004820152602660248201527f4e6f206d696e74732072656d61696e696e6720666f722070726f76696465642060448201526570617373657360d01b6064820152608401610713565b336000908152601360209081526040808320805485019055601490915290208054340190556010549097508790831015610a735760108390555b600854600d540360005b89811015610b44576000610a8f612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec233838501838a6001604051610acb959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610b1f57600080fd5b505af1158015610b33573d6000803e3d6000fd5b505060019093019250610a7d915050565b50505050505050505050565b60118181548110610b6057600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b610b8b612436565b15610ba957604051631fbde44560e01b815260040160405180910390fd5b610bb16126ce565b8080610c0f5760405162461bcd60e51b815260206004820152602760248201527f4d7573742073706563696679206174206c65617374206f6e652061756374696f6044820152666e20737461676560c81b6064820152608401610713565b600f84905583610c21601160006129e3565b60005b82811015610f045736858583818110610c3f57610c3f612cde565b905060400201905082816020013510610cb95760405162461bcd60e51b815260206004820152603660248201527f45616368207374616765207072696365206d757374206265206c6f776572207460448201527568616e207468652070726576696f757320707269636560501b6064820152608401610713565b66038d7ea4c68000816020013511610d2d5760405162461bcd60e51b815260206004820152603160248201527f537461676520707269636520746f6f206c6f773a20636865636b2074686174206044820152707072696365732061726520696e2077656960781b6064820152608401610713565b6000610d3d602083013585612d3d565b905080610d4c83356019612d50565b1115610daa5760405162461bcd60e51b815260206004820152602760248201527f45616368207374616765206d757374206c617374206174206c656173742035206044820152666d696e7574657360c81b6064820152608401610713565b610db5823582612d67565b15610e1f5760405162461bcd60e51b815260206004820152603460248201527f537461676520656e64207072696365206d75737420626520726561636861626c60448201527306520627920736c6f742070726963652064726f760641b6064820152608401610713565b80610e2d8335610e10612d50565b1015610e8c5760405162461bcd60e51b815260206004820152602860248201527f5374616765206d757374206e6f74206c617374206c6f6e676572207468616e20604482015267313220686f75727360c01b6064820152608401610713565b601180546001810182556000919091526003027f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68018235610ece83600c612d50565b610ed89190612c9c565b600282015582358155602090920135600190920182905550915080610efc81612cf4565b915050610c24565b505050505050565b610f146126ce565b80600003610f645760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963206c696d6974206d757374206e6f74206265207a65726f0000006044820152606401610713565b600d548110610fc85760405162461bcd60e51b815260206004820152602a60248201527f5075626c6963206c696d6974206d757374206265206c6f776572207468616e206044820152691b5a5b9d081b1a5b5a5d60b21b6064820152608401610713565b600c8190556001811461100257610fde81612161565b604051602001610fee9190612d9f565b60405160208183030381529060405261101c565b604051806060016040528060268152602001613091602691395b600a906110299082612e55565b5050565b611035612436565b1561105357604051631fbde44560e01b815260040160405180910390fd5b61105b6126ce565b428110156110b75760405162461bcd60e51b8152602060048201526024808201527f4e65772073746172742074696d652063616e6e6f7420626520696e20746865206044820152631c185cdd60e21b6064820152608401610713565b600155565b60055460ff166110df5760405163dcdde9dd60e01b815260040160405180910390fd5b6110e76126ce565b6005805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a160015442111561073c57600154600654101561113a576001544203600755565b6006546007805442929092039091019055565b6111556126ce565b600854601054811590816111e6576011805461117390600190612d3d565b8154811061118357611183612cde565b9060005260206000209060030201600101549050806111a06118bb565b146111e65760405162461bcd60e51b81526020600482015260166024820152755072696365206973207374696c6c2066616c6c696e6760501b6044820152606401610713565b60008160125485600d546111fa9190612d3d565b6112049190612d3d565b61120e9190612d50565b905060165481116112615760405162461bcd60e51b815260206004820152601d60248201527f416c6c2066756e64732068617665206265656e2077697468647261776e0000006044820152606401610713565b6000601654826112719190612d3d565b905047808211156112d057600081116112cc5760405162461bcd60e51b815260206004820152601d60248201527f416c6c2066756e64732068617665206265656e2077697468647261776e0000006044820152606401610713565b8091505b81601660008282546112e29190612f15565b909155505060405160009081906001600160a01b038a169085908381818185875af1925050503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b509150915081611360578381604051637e4c7d7b60e01b8152600401610713929190612f28565b505050505050505050565b611373612436565b611390576040516303bdb9df60e61b815260040160405180910390fd5b600061139b8261246c565b116113f45760405162461bcd60e51b8152602060048201526024808201527f4e6f206d696e74732072656d61696e696e6720666f722070726f7669646564206044820152637061737360e01b6064820152608401610713565b60035460048054604051638c6c4d2d60e01b815291820184905260248201526001600160a01b0390911690638c6c4d2d90604401600060405180830381600087803b15801561144257600080fd5b505af1158015611456573d6000803e3d6000fd5b5050505061146460016122cc565b50565b60008061147333611704565b9050600081116114bb5760405162461bcd60e51b81526020600482015260136024820152724e6f20726566756e6420617661696c61626c6560681b6044820152606401610713565b3360008181526014602090815260409182902080548590039055815192835282018390527fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d910160405180910390a1604051600090339083908381818185875af1925050503d806000811461154c576040519150601f19603f3d011682016040523d82523d6000602084013e611551565b606091505b50509050806115a25760405162461bcd60e51b815260206004820152601c60248201527f526566756e64207472616e7366657220776173207265766572746564000000006044820152606401610713565b50919050565b6115b0612436565b156115ce57604051631fbde44560e01b815260040160405180910390fd5b6115d66126ce565b60405163c9acbcf160e01b8152600481018290526000906001600160a01b0384169063c9acbcf190602401600060405180830381865afa15801561161e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116469190810190612f62565b50909150506001600160a01b03811630146116c95760405162461bcd60e51b815260206004820152603960248201527f53706563696669656420706173732070726f6a656374206973206e6f7420636f60448201527f6e6669677572656420666f7220746869732061756374696f6e000000000000006064820152608401610713565b600380546001600160a01b0319166001600160a01b03851617905560048290556116f1612436565b156116ff5760015442036007555b505050565b6001600160a01b03811660009081526013602052604081205480820361172d5750600092915050565b6000600854600014611746576117416118bb565b61174a565b6010545b6001600160a01b03851660009081526014602052604090205490915082820280820382821061177a57600061177c565b805b979650505050505050565b61178f6126ce565b61073c6000612728565b60055460ff16156117bd576040516306d39fcd60e41b815260040160405180910390fd5b6117c56126ce565b6005805460ff19166001179055426006556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b611809612436565b1561182757604051631fbde44560e01b815260040160405180910390fd5b61182f6126ce565b6001600160a01b0381166118995760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e20636f6e7472616374206d757374206e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610713565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000806118c6612778565b600f54601154909350909150600080805b8381101561196357601181815481106118f2576118f2612cde565b906000526020600020906003020191508160020154925082851015611924575054600c90930490920290920392915050565b82850394506011818154811061193c5761193c612cde565b9060005260206000209060030201600101549550808061195b90612cf4565b9150506118d7565b505050505090565b611973612436565b1561199157604051631fbde44560e01b815260040160405180910390fd5b6119996126ce565b60125415611a0f5760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f74206368616e676520746865206d696e74206c696d6974206f6e6360448201527f6520746f6b656e732068617665206265656e20726573657276656400000000006064820152608401610713565b600a811015611a555760405162461bcd60e51b81526020600482015260126024820152714d696e74206c696d697420746f6f206c6f7760701b6044820152606401610713565b80600b5410611ab85760405162461bcd60e51b815260206004820152602960248201527f4d696e74206c696d6974206d75737420626520686967686572207468616e2070604482015268185cdcc81b1a5b5a5d60ba1b6064820152608401610713565b80600c5410611b1d5760405162461bcd60e51b815260206004820152602b60248201527f4d696e74206c696d6974206d75737420626520686967686572207468616e207060448201526a1d589b1a58c81b1a5b5a5d60aa1b6064820152608401610713565b6008819055600d55565b611b2f611ff5565b611b4c5760405163a611c2c160e01b815260040160405180910390fd5b60055460ff1615611b70576040516306d39fcd60e41b815260040160405180910390fd5b6008546000819003611b95576040516352df9fe560e01b815260040160405180910390fd5b3360009081526013602052604090205482611bf25760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610713565b33600090815260156020526040902054600c5481108015611c155750600c548411155b600a90611c355760405162461bcd60e51b81526004016107139190612be5565b506000611c428534612c9c565b90506000611c4e6118bb565b905080821015611c705760405162461bcd60e51b815260040161071390612cb0565b84861115611c7c578495505b600c548684011115611c905782600c540395505b336000908152601360209081526040808320878a0190556015825280832080548a01905560149091529020805434019055601054811015611cd15760108190555b600854600d540360005b87811015611da2576000611ced612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec23383850183886000604051611d29959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505060019093019250611cdb915050565b5050505050505050565b611db4612436565b15611dd257604051631fbde44560e01b815260040160405180910390fd5b611dda6126ce565b61012c811015611e3e5760405162461bcd60e51b815260206004820152602960248201527f4561726c7920616363657373206d757374206c617374206174206c656173742060448201526835206d696e7574657360b81b6064820152608401610713565b62015180811115611ea95760405162461bcd60e51b815260206004820152602f60248201527f4561726c7920616363657373206d757374206e6f74206c617374206c6f6e676560448201526e72207468616e20323420686f75727360881b6064820152608401610713565b600255565b611eb6612436565b15611ed457604051631fbde44560e01b815260040160405180910390fd5b611edc6126ce565b6008546000819003611f01576040516352df9fe560e01b815260040160405180910390fd5b80821115611f0d578091505b60128054830190819055604080516001600160a01b03861681526020810185905280820192909252517fd4f5ef8b5c5c845e4bb3a6bcbe0af0716d1a796eb1cd6996bae76e5d3515493c9181900360600190a160005b82811015611fef57600e546001600160a01b03166340c10f1985611f85612575565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611fcb57600080fd5b505af1158015611fdf573d6000803e3d6000fd5b505060019092019150611f639050565b50505050565b6000611fff612436565b801561202757506002546007546001546120199190612f15565b6120239190612f15565b4210155b905090565b6120346126ce565b806000036120845760405162461bcd60e51b815260206004820152601b60248201527f50617373206c696d6974206d757374206e6f74206265207a65726f00000000006044820152606401610713565b600d5481106120e65760405162461bcd60e51b815260206004820152602860248201527f50617373206c696d6974206d757374206265206c6f776572207468616e206d696044820152671b9d081b1a5b5a5d60c21b6064820152608401610713565b600b55565b6120f36126ce565b6001600160a01b0381166121585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610713565b61146481612728565b6060600061216e836121f4565b600101905060008167ffffffffffffffff81111561218e5761218e612df9565b6040519080825280601f01601f1916602001820160405280156121b8576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846121c257509392505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106122335772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061225f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061227d57662386f26fc10000830492506010015b6305f5e1008310612295576305f5e100830492506008015b61271083106122a957612710830492506004015b606483106122bb576064830492506002015b600a83106106b45760010192915050565b60055460ff16156122f0576040516306d39fcd60e41b815260040160405180910390fd5b6008546000819003612315576040516352df9fe560e01b815260040160405180910390fd5b600061231f6118bb565b9050803410156123415760405162461bcd60e51b815260040161071390612cb0565b33600090815260136020908152604080832080546001019055601490915290208054340190556010548110156123775760108190555b6000600854600d546123899190612d3d565b90506000612395612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec233838334896040516123ce959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561242257600080fd5b505af1158015611360573d6000803e3d6000fd5b6003546000906001600160a01b031615801590612027575060015460055460ff166124615742612465565b6006545b1015905090565b6003546000906124879033906001600160a01b0316846127b2565b6124df5760405162461bcd60e51b8152602060048201526024808201527f43616c6c6572206973206e6f742070617373206f776e6572206f7220617070726044820152631bdd995960e21b6064820152608401610713565b60035460048054604051636017d14160e11b815291820185905260248201526000916001600160a01b03169063c02fa28290604401602060405180830381865afa158015612531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125559190613038565b9050600b5481101561256b5780600b540361256e565b60005b9392505050565b600080600854116125d45760405162461bcd60e51b815260206004820152602360248201527f53687566666c65642076616c7565732068617665206265656e206578686175736044820152621d195960ea1b6064820152608401610713565b60085460001901600090815260096020526040812054908190036125fb5750600854612622565b60006009600060016008546126109190612d3d565b81526020810191909152604001600020555b60085460010361263a57600060085560001901919050565b60006008546008544460405160200161265d929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c6126809190612d67565b60088054600019810190915590915081036001016126a2575060001901919050565b6000818152600960205260409020805490839055806126c157816126c6565b600181035b935050505090565b6000546001600160a01b0316331461073c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610713565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612782612436565b61278c5750600090565b60055460ff166127a3575060075460015442030390565b50600754600154600654030390565b6040516331a9108f60e11b81526004810182905260009081906001600160a01b03851690636352211e90602401602060405180830381865afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190613051565b9050806001600160a01b0316856001600160a01b031614806128af575060405163e985e9c560e01b81526001600160a01b038281166004830152868116602483015285169063e985e9c590604401602060405180830381865afa15801561288b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128af919061306e565b8061292e575060405163020604bf60e21b8152600481018490526001600160a01b03808716919086169063081812fc90602401602060405180830381865afa1580156128ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129239190613051565b6001600160a01b0316145b806129da57506d76a84fef008cdabe6409d2fe638b3b158015906129da5750604051631574d39f60e31b81526001600160a01b038087166004830152808316602483015285166044820152606481018490526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da919061306e565b95945050505050565b508054600082556003029060005260206000209081019061146491905b80821115612a21576000808255600182018190556002820155600301612a00565b5090565b600060208284031215612a3757600080fd5b81356001600160e01b03198116811461256e57600080fd5b6001600160a01b038116811461146457600080fd5b600060208284031215612a7657600080fd5b813561256e81612a4f565b600080600060408486031215612a9657600080fd5b83359250602084013567ffffffffffffffff80821115612ab557600080fd5b818601915086601f830112612ac957600080fd5b813581811115612ad857600080fd5b8760208260051b8501011115612aed57600080fd5b6020830194508093505050509250925092565b600060208284031215612b1257600080fd5b5035919050565b600080600060408486031215612b2e57600080fd5b83359250602084013567ffffffffffffffff80821115612b4d57600080fd5b818601915086601f830112612b6157600080fd5b813581811115612b7057600080fd5b8760208260061b8501011115612aed57600080fd5b60008060408385031215612b9857600080fd5b8235612ba381612a4f565b946020939093013593505050565b600181811c90821680612bc557607f821691505b6020821081036115a257634e487b7160e01b600052602260045260246000fd5b6000602080835260008454612bf981612bb1565b80848701526040600180841660008114612c1a5760018114612c3457612c62565b60ff1985168984015283151560051b890183019550612c62565b896000528660002060005b85811015612c5a5781548b8201860152908301908801612c3f565b8a0184019650505b509398975050505050505050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082612cab57612cab612c70565b500490565b602080825260149082015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612d0657612d06612c86565b5060010190565b6001600160a01b039590951685526020850193909352604084019190915260608301521515608082015260a00190565b818103818111156106b4576106b4612c86565b80820281158282048414176106b4576106b4612c86565b600082612d7657612d76612c70565b500690565b60005b83811015612d96578181015183820152602001612d7e565b50506000910152565b6a02634b6b4ba32b2103a37960ad1b815260008251612dc581600b850160208701612d7b565b7f2070757263686173657320776974686f75742061207061737300000000000000600b939091019283015250602401919050565b634e487b7160e01b600052604160045260246000fd5b601f8211156116ff57600081815260208120601f850160051c81016020861015612e365750805b601f850160051c820191505b81811015610f0457828155600101612e42565b815167ffffffffffffffff811115612e6f57612e6f612df9565b612e8381612e7d8454612bb1565b84612e0f565b602080601f831160018114612eb85760008415612ea05750858301515b600019600386901b1c1916600185901b178555610f04565b600085815260208120601f198616915b82811015612ee757888601518255948401946001909101908401612ec8565b5085821015612f055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156106b4576106b4612c86565b8281526040602082015260008251806040840152612f4d816060850160208701612d7b565b601f01601f1916919091016060019392505050565b600080600060608486031215612f7757600080fd5b8351612f8281612a4f565b6020850151909350612f9381612a4f565b604085015190925067ffffffffffffffff80821115612fb157600080fd5b818601915086601f830112612fc557600080fd5b815181811115612fd757612fd7612df9565b604051601f8201601f19908116603f01168101908382118183101715612fff57612fff612df9565b8160405282815289602084870101111561301857600080fd5b613029836020830160208801612d7b565b80955050505050509250925092565b60006020828403121561304a57600080fd5b5051919050565b60006020828403121561306357600080fd5b815161256e81612a4f565b60006020828403121561308057600080fd5b8151801515811461256e57600080fdfe4c696d6974656420746f206f6e6520707572636861736520776974686f757420612070617373a264697066735822122020d652ac76530a8232b2bf57dadfc053564335cb5251986e9fe6d28123edd5b164736f6c63430008120033

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

00000000000000000000000066bcf059b2d8db6cd10615cdd781828db58268cf00000000000000000000000000000000000000000000000000000000642efa900000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000834

-----Decoded View---------------
Arg [0] : tokenContract_ (address): 0x66bcf059B2D8dB6cD10615Cdd781828db58268cF
Arg [1] : startTime_ (uint256): 1680800400
Arg [2] : startPrice_ (uint256): 10000000000000000000
Arg [3] : earlyPriceDrop (uint256): 80000000000000000
Arg [4] : transitionPrice (uint256): 4000000000000000000
Arg [5] : latePriceDrop (uint256): 20000000000000000
Arg [6] : restPrice (uint256): 2000000000000000000
Arg [7] : mintLimit_ (uint256): 500
Arg [8] : publicLimit_ (uint256): 5
Arg [9] : passLimit_ (uint256): 2
Arg [10] : earlyAccessDuration_ (uint256): 2100

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000066bcf059b2d8db6cd10615cdd781828db58268cf
Arg [1] : 00000000000000000000000000000000000000000000000000000000642efa90
Arg [2] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [3] : 000000000000000000000000000000000000000000000000011c37937e080000
Arg [4] : 0000000000000000000000000000000000000000000000003782dace9d900000
Arg [5] : 00000000000000000000000000000000000000000000000000470de4df820000
Arg [6] : 0000000000000000000000000000000000000000000000001bc16d674ec80000
Arg [7] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000834


Deployed Bytecode Sourcemap

868:21219:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6194:263:7;;;;;;;;;;-1:-1:-1;6194:263:7;;;;;:::i;:::-;;:::i;:::-;;;470:14:13;;463:22;445:41;;433:2;418:18;6194:263:7;;;;;;;;6236:436:11;;;:::i;:::-;;1851:31;;;;;;;;;;;;;;;;;;;643:25:13;;;631:2;616:18;1851:31:11;497:177:13;2060:46:11;;;;;;;;;;-1:-1:-1;2060:46:11;;;;;:::i;:::-;;;;;;;;;;;;;;10399:2351;;;;;;:::i;:::-;;:::i;1747:35::-;;;;;;;;;;-1:-1:-1;1747:35:11;;;;;:::i;:::-;;:::i;:::-;;;;2142:25:13;;;2198:2;2183:18;;2176:34;;;;2226:18;;;2219:34;2130:2;2115:18;1747:35:11;1940:319:13;15847:1561:11;;;;;;;;;;-1:-1:-1;15847:1561:11;;;;;:::i;:::-;;:::i;18382:524::-;;;;;;;;;;-1:-1:-1;18382:524:11;;;;;:::i;:::-;;:::i;1036:24::-;;;;;;;;;;;;;;;;4017:242:7;;;;;;;;;;-1:-1:-1;4017:242:7;;;;;:::i;:::-;;:::i;3168:696::-;;;;;;;;;;;;;:::i;13874:1271:11:-;;;;;;;;;;-1:-1:-1;13874:1271:11;;;;;:::i;:::-;;:::i;9710:482::-;;;;;;:::i;:::-;;:::i;1464:33::-;;;;;;;;;;-1:-1:-1;1464:33:11;;;;-1:-1:-1;;;;;1464:33:11;;;;;;-1:-1:-1;;;;;3182:32:13;;;3164:51;;3152:2;3137:18;1464:33:11;2997:224:13;8847:626:11;;;;;;;;;;;;;:::i;4952:757:7:-;;;;;;;;;;-1:-1:-1;4952:757:7;;;;;:::i;:::-;;:::i;19894:698:11:-;;;;;;;;;;-1:-1:-1;19894:698:11;;;;;:::i;:::-;;:::i;1831:101:0:-;;;;;;;;;;;;;:::i;654:24:7:-;;;;;;;;;;;;;;;;2863:206;;;;;;;;;;;;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1247:7:0;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;15310:273:11;;;;;;;;;;-1:-1:-1;15310:273:11;;;;;:::i;:::-;;:::i;1288:24::-;;;;;;;;;;;;;;;;18975:843;;;;;;;;;;;;;:::i;17463:509::-;;;;;;;;;;-1:-1:-1;17463:509:11;;;;;:::i;:::-;;:::i;1173:26::-;;;;;;;;;;;;;;;;6888:1889;;;;;;:::i;:::-;;:::i;1247:28:7:-;;;;;;;;;;-1:-1:-1;1247:28:7;;;;;;;;908:24;;;;;;;;;;-1:-1:-1;908:24:7;;;;-1:-1:-1;;;;;908:24:7;;;1664:26:11;;;;;;;;;;;;;;;;4429:347:7;;;;;;;;;;-1:-1:-1;4429:347:7;;;;;:::i;:::-;;:::i;12947:702:11:-;;;;;;;;;;-1:-1:-1;12947:702:11;;;;;:::i;:::-;;:::i;778:34:7:-;;;;;;;;;;;;;;;;5797:155;;;;;;;;;;;;;:::i;1956:44:11:-;;;;;;;;;;-1:-1:-1;1956:44:11;;;;;:::i;:::-;;;;;;;;;;;;;;1566:25;;;;;;;;;;;;;;;;18025:295;;;;;;;;;;-1:-1:-1;18025:295:11;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;6194:263:7:-;6270:4;-1:-1:-1;;;;;;;;;6305:25:7;;;;:105;;-1:-1:-1;;;;;;;;;;6385:25:7;;;6305:105;6286:124;6194:263;-1:-1:-1;;6194:263:7:o;6236:436:11:-;2485:10:7;:8;:10::i;:::-;2480:48;;2504:24;;-1:-1:-1;;;2504:24:7;;;;;;;;;;;2480:48;6346:11:11::1;::::0;6332:10:::1;6316:27;::::0;;;:15:::1;:27;::::0;;;;;6359:24:::1;::::0;-1:-1:-1;6308:76:11::1;;;;-1:-1:-1::0;;;6308:76:11::1;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1::0;6533:10:11::1;6517:27;::::0;;;:15:::1;:27;::::0;;;;:29;;::::1;;::::0;;6653:12:::1;::::0;:5:::1;:12::i;:::-;6236:436::o:0;10399:2351::-;2295:11:7;:9;:11::i;:::-;2290:40;;2315:15;;-1:-1:-1;;;2315:15:7;;;;;;;;;;;2290:40;2688:8:::1;::::0;::::1;;2684:39;;;2705:18;;-1:-1:-1::0;;;2705:18:7::1;;;;;;;;;;;2684:39;10603:19:11::2;::::0;10583:17:::2;10636:14:::0;;;10632:36:::2;;10659:9;;-1:-1:-1::0;;;10659:9:11::2;;;;;;;;;;;10632:36;10697:1;10686:8;:12;10678:53;;;::::0;-1:-1:-1;;;10678:53:11;;6274:2:13;10678:53:11::2;::::0;::::2;6256:21:13::0;6313:2;6293:18;;;6286:30;6352;6332:18;;;6325:58;6400:18;;10678:53:11::2;6072:352:13::0;10678:53:11::2;10761:9;;10749:8;:21;;10741:63;;;::::0;-1:-1:-1;;;10741:63:11;;6631:2:13;10741:63:11::2;::::0;::::2;6613:21:13::0;6670:2;6650:18;;;6643:30;6709:31;6689:18;;;6682:59;6758:18;;10741:63:11::2;6429:353:13::0;10741:63:11::2;10815:13;10831:20;10843:8:::0;10831:9:::2;:20;:::i;:::-;10815:36;;10861:17;10881:14;:12;:14::i;:::-;10861:34;;10922:9;10913:5;:18;;10905:51;;;;-1:-1:-1::0;;;10905:51:11::2;;;;;;;:::i;:::-;10987:7:::0;11019:13;11011:56:::2;;;::::0;-1:-1:-1;;;11011:56:11;;7727:2:13;11011:56:11::2;::::0;::::2;7709:21:13::0;7766:2;7746:18;;;7739:30;7805:32;7785:18;;;7778:60;7855:18;;11011:56:11::2;7525:354:13::0;11011:56:11::2;11112:9;11101:8;:20;11097:71;;;11148:9;11137:20;;11097:71;11231:16;11266:9:::0;11261:473:::2;11285:9;11281:1;:13;11261:473;;;11315:14;11332:7;;11340:1;11332:10;;;;;;;:::i;:::-;;;;;;;11315:27;;11379:17;11399:21;11413:6;11399:13;:21::i;:::-;11379:41;;11468:9;11463:164;11487:9;11483:1;:13;:36;;;;;11511:8;11500;:19;11483:36;11463:164;;;11544:6;::::0;11570:13:::2;::::0;;11544:40:::2;::::0;-1:-1:-1;;;11544:40:11;;;;::::2;8190:25:13::0;;;8231:18;;;8224:34;-1:-1:-1;;;;;11544:6:11;;::::2;::::0;:17:::2;::::0;8163:18:13;;11544:40:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11602:10;;;;;:::i;:::-;;;;11521:3;;;;;:::i;:::-;;;;11463:164;;;;11708:8;11696;:20:::0;11692:31:::2;;11718:5;;;;11692:31;11301:433;;11296:3;;;;;:::i;:::-;;;;11261:473;;;;11763:1;11752:8;:12;11744:63;;;::::0;-1:-1:-1;;;11744:63:11;;8611:2:13;11744:63:11::2;::::0;::::2;8593:21:13::0;8650:2;8630:18;;;8623:30;8689:34;8669:18;;;8662:62;-1:-1:-1;;;8740:18:13;;;8733:36;8786:19;;11744:63:11::2;8409:402:13::0;11744:63:11::2;11999:10;11989:21;::::0;;;:9:::2;:21;::::0;;;;;;;:33;;;::::2;::::0;;12152:11:::2;:23:::0;;;;;:36;;12179:9:::2;12152:36;::::0;;12225:11:::2;::::0;11828:8;;-1:-1:-1;11828:8:11;;12213:23;::::2;12209:77;;;12252:11;:23:::0;;;12209:77:::2;12462:19;::::0;12450:9:::2;::::0;:31:::2;12428:19;12495:239;12519:8;12515:1;:12;12495:239;;;12552:15;12570:10;:8;:10::i;:::-;12552:28;;12603:59;12612:10;12638:1;12624:11;:15;12641:7;12650:5;12657:4;12603:59;;;;;;;;;;:::i;:::-;;;;;;;;12680:13;::::0;:39:::2;::::0;-1:-1:-1;;;12680:39:11;;12699:10:::2;12680:39;::::0;::::2;9494:51:13::0;9561:18;;;9554:34;;;-1:-1:-1;;;;;12680:13:11;;::::2;::::0;:18:::2;::::0;9467::13;;12680:39:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;12529:3:11::2;::::0;;::::2;::::0;-1:-1:-1;12495:239:11::2;::::0;-1:-1:-1;;12495:239:11::2;;;12404:340;10538:2212;;;;;10399:2351:::0;;;:::o;1747:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1747:35:11;:::o;15847:1561::-;2388:11:7;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;16041:7:11::0;16073:14;16065:66:::2;;;::::0;-1:-1:-1;;;16065:66:11;;9801:2:13;16065:66:11::2;::::0;::::2;9783:21:13::0;9840:2;9820:18;;;9813:30;9879:34;9859:18;;;9852:62;-1:-1:-1;;;9930:18:13;;;9923:37;9977:19;;16065:66:11::2;9599:403:13::0;16065:66:11::2;16205:10;:24:::0;;;16218:11;16239:20:::2;16246:13;16181:21;16239:20;:::i;:::-;16275:9;16270:1132;16290:10;16286:1;:14;16270:1132;;;16321:41;16365:7;;16373:1;16365:10;;;;;;;:::i;:::-;;;;;;16321:54;;16415:13;16397:6;:15;;;:31;16389:98;;;::::0;-1:-1:-1;;;16389:98:11;;10209:2:13;16389:98:11::2;::::0;::::2;10191:21:13::0;10248:2;10228:18;;;10221:30;10287:34;10267:18;;;10260:62;-1:-1:-1;;;10338:18:13;;;10331:52;10400:19;;16389:98:11::2;10007:418:13::0;16389:98:11::2;16527:4;16509:6;:15;;;:22;16501:84;;;::::0;-1:-1:-1;;;16501:84:11;;10632:2:13;16501:84:11::2;::::0;::::2;10614:21:13::0;10671:2;10651:18;;;10644:30;10710:34;10690:18;;;10683:62;-1:-1:-1;;;10761:18:13;;;10754:47;10818:19;;16501:84:11::2;10430:413:13::0;16501:84:11::2;16600:23;16626:31;16642:15;::::0;::::2;;16626:13:::0;:31:::2;:::i;:::-;16600:57:::0;-1:-1:-1;16600:57:11;16679:28:::2;:23:::0;::::2;16705:2;16679:28;:::i;:::-;:47;;16671:99;;;::::0;-1:-1:-1;;;16671:99:11;;11356:2:13;16671:99:11::2;::::0;::::2;11338:21:13::0;11395:2;11375:18;;;11368:30;11434:34;11414:18;;;11407:62;-1:-1:-1;;;11485:18:13;;;11478:37;11532:19;;16671:99:11::2;11154:403:13::0;16671:99:11::2;16809:41;16827:23:::0;::::2;16809:15:::0;:41:::2;:::i;:::-;:46:::0;16784:157:::2;;;::::0;-1:-1:-1;;;16784:157:11;;11881:2:13;16784:157:11::2;::::0;::::2;11863:21:13::0;11920:2;11900:18;;;11893:30;11959:34;11939:18;;;11932:62;-1:-1:-1;;;12010:18:13;;;12003:50;12070:19;;16784:157:11::2;11679:416:13::0;16784:157:11::2;17023:15:::0;16980:39:::2;:23:::0;::::2;17007:11;16980:39;:::i;:::-;:58;;16955:157;;;::::0;-1:-1:-1;;;16955:157:11;;12302:2:13;16955:157:11::2;::::0;::::2;12284:21:13::0;12341:2;12321:18;;;12314:30;12380:34;12360:18;;;12353:62;-1:-1:-1;;;12431:18:13;;;12424:38;12479:19;;16955:157:11::2;12100:404:13::0;16955:157:11::2;17159:13;:20:::0;;::::2;::::0;::::2;::::0;;17127:29:::2;17159:20:::0;;;;::::2;;::::0;::::2;17238:23:::0;::::2;17214:20;17219:15:::0;17214:2:::2;:20;:::i;:::-;17213:48;;;;:::i;:::-;17193:17;::::0;::::2;:68:::0;17303:23;::::2;17275:51:::0;;17376:15:::2;::::0;;::::2;;17340:17;::::0;;::::2;:51:::0;;;-1:-1:-1;17376:15:11;-1:-1:-1;16302:3:11;::::2;::::0;::::2;:::i;:::-;;;;16270:1132;;;;15985:1423;;15847:1561:::0;;;:::o;18382:524::-;1094:13:0;:11;:13::i;:::-;18490:12:11::1;18506:1;18490:17:::0;18482:59:::1;;;::::0;-1:-1:-1;;;18482:59:11;;12711:2:13;18482:59:11::1;::::0;::::1;12693:21:13::0;12750:2;12730:18;;;12723:30;12789:31;12769:18;;;12762:59;12838:18;;18482:59:11::1;12509:353:13::0;18482:59:11::1;18574:9;;18559:12;:24;18551:79;;;::::0;-1:-1:-1;;;18551:79:11;;13069:2:13;18551:79:11::1;::::0;::::1;13051:21:13::0;13108:2;13088:18;;;13081:30;13147:34;13127:18;;;13120:62;-1:-1:-1;;;13198:18:13;;;13191:40;13248:19;;18551:79:11::1;12867:406:13::0;18551:79:11::1;18660:11;:26:::0;;;18739:1:::1;18723:17:::0;::::1;:176;;18839:30;18856:12;18839:16;:30::i;:::-;18810:89;;;;;;;;:::i;:::-;;;;;;;;;;;;;18723:176;;;;;;;;;;;;;;;;;;;;;18696:24;::::0;:203:::1;::::0;:24;:203:::1;:::i;:::-;;18382:524:::0;:::o;4017:242:7:-;2388:11;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;4145:15:7::2;4131:10;:29;;4123:78;;;::::0;-1:-1:-1;;;4123:78:7;;16552:2:13;4123:78:7::2;::::0;::::2;16534:21:13::0;16591:2;16571:18;;;16564:30;16630:34;16610:18;;;16603:62;-1:-1:-1;;;16681:18:13;;;16674:34;16725:19;;4123:78:7::2;16350:400:13::0;4123:78:7::2;4230:9;:22:::0;4017:242::o;3168:696::-;2589:8;;;;2584:41;;2606:19;;-1:-1:-1;;;2606:19:7;;;;;;;;;;;2584:41;1094:13:0::1;:11;:13::i;:::-;3290:8:7::2;:16:::0;;-1:-1:-1;;3290:16:7::2;::::0;;3321:10:::2;::::0;::::2;::::0;3301:5:::2;::::0;3321:10:::2;3412:9;;3393:15;:28;3389:65:::0;3437:7:::2;3389:65;3673:9;;3660:10;;:22;3656:192;;;3737:9;::::0;3719:15:::2;:27;3702:14;:44:::0;6236:436:11:o;3656:192:7:-:2;3822:10;::::0;3785:14:::2;:48:::0;;3804:15:::2;:28:::0;;;::::2;3785:48:::0;;::::2;::::0;;3168:696::o;13874:1271:11:-;1094:13:0;:11;:13::i;:::-;13993:19:11::1;::::0;14082:11:::1;::::0;14037:14;;;;14103:280:::1;;14144:13;14158:20:::0;;:24:::1;::::0;14181:1:::1;::::0;14158:24:::1;:::i;:::-;14144:39;;;;;;;;:::i;:::-;;;;;;;;;;;:48;;;14131:61;;14335:10;14317:14;:12;:14::i;:::-;:28;14309:63;;;::::0;-1:-1:-1;;;14309:63:11;;16957:2:13;14309:63:11::1;::::0;::::1;16939:21:13::0;16996:2;16976:18;;;16969:30;-1:-1:-1;;;17015:18:13;;;17008:52;17077:18;;14309:63:11::1;16755:346:13::0;14309:63:11::1;14393:20;14457:10;14441:12;;14429:9;14417;;:21;;;;:::i;:::-;:36;;;;:::i;:::-;14416:51;;;;:::i;:::-;14393:74;;14500:15;;14485:12;:30;14477:72;;;::::0;-1:-1:-1;;;14477:72:11;;17308:2:13;14477:72:11::1;::::0;::::1;17290:21:13::0;17347:2;17327:18;;;17320:30;17386:31;17366:18;;;17359:59;17435:18;;14477:72:11::1;17106:353:13::0;14477:72:11::1;14579:26;14623:15;;14608:12;:30;;;;:::i;:::-;14579:59:::0;-1:-1:-1;14666:21:11::1;14701:28:::0;;::::1;14697:232;;;14841:1;14831:7;:11;14823:53;;;::::0;-1:-1:-1;;;14823:53:11;;17308:2:13;14823:53:11::1;::::0;::::1;17290:21:13::0;17347:2;17327:18;;;17320:30;17386:31;17366:18;;;17359:59;17435:18;;14823:53:11::1;17106:353:13::0;14823:53:11::1;14911:7;14890:28;;14697:232;14958:18;14939:15;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15022:45:11::1;::::0;14987:12:::1;::::0;;;-1:-1:-1;;;;;15022:14:11;::::1;::::0;15044:18;;14987:12;15022:45;14987:12;15022:45;15044:18;15022:14;:45:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14986:81;;;;15082:7;15077:61;;15113:18;15133:4;15098:40;;-1:-1:-1::0;;;15098:40:11::1;;;;;;;;;:::i;15077:61::-;13930:1215;;;;;;;;13874:1271:::0;:::o;9710:482::-;2295:11:7;:9;:11::i;:::-;2290:40;;2315:15;;-1:-1:-1;;;2315:15:7;;;;;;;;;;;2290:40;9890:1:11::1;9866:21;9880:6;9866:13;:21::i;:::-;:25;9858:74;;;::::0;-1:-1:-1;;;9858:74:11;;18476:2:13;9858:74:11::1;::::0;::::1;18458:21:13::0;18515:2;18495:18;;;18488:30;18554:34;18534:18;;;18527:62;-1:-1:-1;;;18605:18:13;;;18598:34;18649:19;;9858:74:11::1;18274:400:13::0;9858:74:11::1;10037:6;::::0;10063:13:::1;::::0;;10037:40:::1;::::0;-1:-1:-1;;;10037:40:11;;;;::::1;8190:25:13::0;;;8231:18;;;8224:34;-1:-1:-1;;;;;10037:6:11;;::::1;::::0;:17:::1;::::0;8163:18:13;;10037:40:11::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10174:11;10180:4;10174:5;:11::i;:::-;9710:482:::0;:::o;8847:626::-;8883:7;8936:20;8959:27;8975:10;8959:15;:27::i;:::-;8936:50;;9019:1;9004:12;:16;8996:48;;;;-1:-1:-1;;;8996:48:11;;18881:2:13;8996:48:11;;;18863:21:13;18920:2;18900:18;;;18893:30;-1:-1:-1;;;18939:18:13;;;18932:49;18998:18;;8996:48:11;18679:343:13;8996:48:11;9197:10;9185:23;;;;:11;:23;;;;;;;;;:39;;;;;;;9250:32;;9494:51:13;;;9561:18;;9554:34;;;9250:32:11;;9467:18:13;9250:32:11;;;;;;;9337:40;;9318:13;;9337:10;;9360:12;;9318:13;9337:40;9318:13;9337:40;9360:12;9337:10;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9317:60;;;9395:8;9387:49;;;;-1:-1:-1;;;9387:49:11;;19229:2:13;9387:49:11;;;19211:21:13;19268:2;19248:18;;;19241:30;19307;19287:18;;;19280:58;19355:18;;9387:49:11;19027:352:13;9387:49:11;-1:-1:-1;9454:12:11;8847:626;-1:-1:-1;8847:626:11:o;4952:757:7:-;2388:11;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;5115:35:7::2;::::0;-1:-1:-1;;;5115:35:7;;::::2;::::0;::::2;643:25:13::0;;;5086:21:7::2;::::0;-1:-1:-1;;;;;5115:24:7;::::2;::::0;::::2;::::0;616:18:13;;5115:35:7::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;5115:35:7::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;5085:65:7;;-1:-1:-1;;;;;;;5168:30:7;::::2;5193:4;5168:30;5160:100;;;::::0;-1:-1:-1;;;5160:100:7;;20750:2:13;5160:100:7::2;::::0;::::2;20732:21:13::0;20789:2;20769:18;;;20762:30;20828:34;20808:18;;;20801:62;20899:27;20879:18;;;20872:55;20944:19;;5160:100:7::2;20548:421:13::0;5160:100:7::2;5290:6;:21:::0;;-1:-1:-1;;;;;;5290:21:7::2;-1:-1:-1::0;;;;;5290:21:7;::::2;;::::0;;5321:13:::2;:25:::0;;;5361:11:::2;:9;:11::i;:::-;5357:346;;;5669:9;::::0;5651:15:::2;:27;5634:14;:44:::0;5357:346:::2;5050:659;4952:757:::0;;:::o;19894:698:11:-;-1:-1:-1;;;;;19992:17:11;;19956:7;19992:17;;;:9;:17;;;;;;20023:11;;;20019:25;;-1:-1:-1;20043:1:11;;19894:698;-1:-1:-1;;19894:698:11:o;20019:25::-;20055:19;20077;;20100:1;20077:24;:55;;20118:14;:12;:14::i;:::-;20077:55;;;20104:11;;20077:55;-1:-1:-1;;;;;20161:19:11;;20143:15;20161:19;;;:11;:19;;;;;;20055:77;;-1:-1:-1;20370:20:11;;;20496;;;20545;;;20544:41;;20584:1;20544:41;;;20569:12;20544:41;20537:48;19894:698;-1:-1:-1;;;;;;;19894:698:11:o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;2863:206:7:-:0;2688:8;;;;2684:39;;;2705:18;;-1:-1:-1;;;2705:18:7;;;;;;;;;;;2684:39;1094:13:0::1;:11;:13::i;:::-;2986:8:7::2;:15:::0;;-1:-1:-1;;2986:15:7::2;2997:4;2986:15;::::0;;3024::::2;3011:10;:28:::0;3054:8:::2;::::0;::::2;::::0;2986::::2;::::0;3054::::2;2863:206::o:0;15310:273:11:-;2388:11:7;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;-1:-1:-1::0;;;;;15432:37:11;::::2;15424:93;;;::::0;-1:-1:-1;;;15424:93:11;;21176:2:13;15424:93:11::2;::::0;::::2;21158:21:13::0;21215:2;21195:18;;;21188:30;21254:34;21234:18;;;21227:62;-1:-1:-1;;;21305:18:13;;;21298:41;21356:19;;15424:93:11::2;20974:407:13::0;15424:93:11::2;15546:13;:30:::0;;-1:-1:-1;;;;;;15546:30:11::2;-1:-1:-1::0;;;;;15546:30:11;;;::::2;::::0;;;::::2;::::0;;15310:273::o;18975:843::-;19020:13;19045:12;19060:13;:11;:13::i;:::-;19092:10;;19133:13;:20;19092:10;;-1:-1:-1;19045:28:11;;-1:-1:-1;19112:18:11;;;19230:514;19254:10;19250:1;:14;19230:514;;;19293:13;19307:1;19293:16;;;;;;;;:::i;:::-;;;;;;;;;;;19285:24;;19339:5;:14;;;19323:30;;19378:13;19371:4;:20;19367:201;;;-1:-1:-1;19458:22:11;19491:2;19484:9;;;19458:36;;;19523:12;;;;;-1:-1:-1;;18975:843:11:o;19367:201::-;19659:13;19651:21;;;;19708:13;19722:1;19708:16;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;19700:33;;19266:3;;;;;:::i;:::-;;;;19230:514;;;;19799:12;;;;18975:843;:::o;17463:509::-;2388:11:7;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;17577:12:11::2;::::0;:17;17569:89:::2;;;::::0;-1:-1:-1;;;17569:89:11;;21588:2:13;17569:89:11::2;::::0;::::2;21570:21:13::0;21627:2;21607:18;;;21600:30;21666:34;21646:18;;;21639:62;21737:29;21717:18;;;21710:57;21784:19;;17569:89:11::2;21386:423:13::0;17569:89:11::2;17690:2;17676:10;:16;;17668:47;;;::::0;-1:-1:-1;;;17668:47:11;;22016:2:13;17668:47:11::2;::::0;::::2;21998:21:13::0;22055:2;22035:18;;;22028:30;-1:-1:-1;;;22074:18:13;;;22067:48;22132:18;;17668:47:11::2;21814:342:13::0;17668:47:11::2;17745:10;17733:9;;:22;17725:76;;;::::0;-1:-1:-1;;;17725:76:11;;22363:2:13;17725:76:11::2;::::0;::::2;22345:21:13::0;22402:2;22382:18;;;22375:30;22441:34;22421:18;;;22414:62;-1:-1:-1;;;22492:18:13;;;22485:39;22541:19;;17725:76:11::2;22161:405:13::0;17725:76:11::2;17833:10;17819:11;;:24;17811:80;;;::::0;-1:-1:-1;;;17811:80:11;;22773:2:13;17811:80:11::2;::::0;::::2;22755:21:13::0;22812:2;22792:18;;;22785:30;22851:34;22831:18;;;22824:62;-1:-1:-1;;;22902:18:13;;;22895:41;22953:19;;17811:80:11::2;22571:407:13::0;17811:80:11::2;17933:19;:32:::0;;;17921:9:::2;:44:::0;17463:509::o;6888:1889::-;2485:10:7;:8;:10::i;:::-;2480:48;;2504:24;;-1:-1:-1;;;2504:24:7;;;;;;;;;;;2480:48;2688:8:::1;::::0;::::1;;2684:39;;;2705:18;;-1:-1:-1::0;;;2705:18:7::1;;;;;;;;;;;2684:39;7041:19:11::2;::::0;7021:17:::2;7074:14:::0;;;7070:36:::2;;7097:9;;-1:-1:-1::0;;;7097:9:11::2;;;;;;;;;;;7070:36;7150:10;7116:21;7140::::0;;;:9:::2;:21;::::0;;;;;7179:12;7171:53:::2;;;::::0;-1:-1:-1;;;7171:53:11;;6274:2:13;7171:53:11::2;::::0;::::2;6256:21:13::0;6313:2;6293:18;;;6286:30;6352;6332:18;;;6325:58;6400:18;;7171:53:11::2;6072:352:13::0;7171:53:11::2;7274:10;7235:20;7258:27:::0;;;:15:::2;:27;::::0;;;;;7318:11:::2;::::0;7303:26;::::2;:53:::0;::::2;;;;7345:11;;7333:8;:23;;7303:53;7358:24;7295:88;;;;;-1:-1:-1::0;;;7295:88:11::2;;;;;;;;:::i;:::-;-1:-1:-1::0;7394:13:11::2;7410:20;7422:8:::0;7410:9:::2;:20;:::i;:::-;7394:36;;7440:17;7460:14;:12;:14::i;:::-;7440:34;;7501:9;7492:5;:18;;7484:51;;;;-1:-1:-1::0;;;7484:51:11::2;;;;;;;:::i;:::-;7580:9;7569:8;:20;7565:71;;;7616:9;7605:20;;7565:71;7700:11;;7689:8;7674:12;:23;:37;7670:113;;;7756:12;7742:11;;:26;7731:37;;7670:113;7878:10;7868:21;::::0;;;:9:::2;:21;::::0;;;;;;;7892:24;;::::2;7868:48:::0;;8009:15:::2;:27:::0;;;;;:39;;;::::2;::::0;;8178:11:::2;:23:::0;;;;;:36;;8205:9:::2;8178:36;::::0;;8251:11:::2;::::0;8239:23;::::2;8235:77;;;8278:11;:23:::0;;;8235:77:::2;8488:19;::::0;8476:9:::2;::::0;:31:::2;8454:19;8521:240;8545:8;8541:1;:12;8521:240;;;8578:15;8596:10;:8;:10::i;:::-;8578:28;;8629:60;8638:10;8664:1;8650:11;:15;8667:7;8676:5;8683;8629:60;;;;;;;;;;:::i;:::-;;;;;;;;8707:13;::::0;:39:::2;::::0;-1:-1:-1;;;8707:39:11;;8726:10:::2;8707:39;::::0;::::2;9494:51:13::0;9561:18;;;9554:34;;;-1:-1:-1;;;;;8707:13:11;;::::2;::::0;:18:::2;::::0;9467::13;;8707:39:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;8555:3:11::2;::::0;;::::2;::::0;-1:-1:-1;8521:240:11::2;::::0;-1:-1:-1;;8521:240:11::2;;;8430:341;6976:1801;;;;;6888:1889:::0;:::o;4429:347:7:-;2388:11;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;4563:6:7::2;4551:8;:18;;4543:72;;;::::0;-1:-1:-1;;;4543:72:7;;23185:2:13;4543:72:7::2;::::0;::::2;23167:21:13::0;23224:2;23204:18;;;23197:30;23263:34;23243:18;;;23236:62;-1:-1:-1;;;23314:18:13;;;23307:39;23363:19;;4543:72:7::2;22983:405:13::0;4543:72:7::2;4645:12;4633:8;:24;;4625:84;;;::::0;-1:-1:-1;;;4625:84:7;;23595:2:13;4625:84:7::2;::::0;::::2;23577:21:13::0;23634:2;23614:18;;;23607:30;23673:34;23653:18;;;23646:62;-1:-1:-1;;;23724:18:13;;;23717:45;23779:19;;4625:84:7::2;23393:411:13::0;4625:84:7::2;4739:19;:30:::0;4429:347::o;12947:702:11:-;2388:11:7;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;13093:19:11::2;::::0;13073:17:::2;13126:14:::0;;;13122:36:::2;;13149:9;;-1:-1:-1::0;;;13149:9:11::2;;;;;;;;;;;13122:36;13203:9;13192:8;:20;13188:71;;;13239:9;13228:20;;13188:71;13365:12;:24:::0;;;::::2;::::0;;;;13415:46:::2;::::0;;-1:-1:-1;;;;;24029:32:13;;24011:51;;24093:2;24078:18;;24071:34;;;24121:18;;;24114:34;;;;13415:46:11;::::2;::::0;;;;23999:2:13;13415:46:11;;::::2;13525:9;13520:113;13544:8;13540:1;:12;13520:113;;;13577:13;::::0;-1:-1:-1;;;;;13577:13:11::2;:18;13596:9:::0;13607:10:::2;:8;:10::i;:::-;13577:41;::::0;-1:-1:-1;;;;;;13577:41:11::2;::::0;;;;;;-1:-1:-1;;;;;9512:32:13;;;13577:41:11::2;::::0;::::2;9494:51:13::0;9561:18;;;9554:34;9467:18;;13577:41:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;13554:3:11::2;::::0;;::::2;::::0;-1:-1:-1;13520:113:11::2;::::0;-1:-1:-1;13520:113:11::2;;;13030:619;12947:702:::0;;:::o;5797:155:7:-;5838:4;5861:11;:9;:11::i;:::-;:84;;;;;5925:19;;5908:14;;5896:9;;:26;;;;:::i;:::-;:48;;;;:::i;:::-;5876:15;:69;;5861:84;5854:91;;5797:155;:::o;18025:295:11:-;1094:13:0;:11;:13::i;:::-;18129:10:11::1;18143:1;18129:15:::0;18121:55:::1;;;::::0;-1:-1:-1;;;18121:55:11;;24361:2:13;18121:55:11::1;::::0;::::1;24343:21:13::0;24400:2;24380:18;;;24373:30;24439:29;24419:18;;;24412:57;24486:18;;18121:55:11::1;24159:351:13::0;18121:55:11::1;18207:9;;18194:10;:22;18186:75;;;::::0;-1:-1:-1;;;18186:75:11;;24717:2:13;18186:75:11::1;::::0;::::1;24699:21:13::0;24756:2;24736:18;;;24729:30;24795:34;24775:18;;;24768:62;-1:-1:-1;;;24846:18:13;;;24839:38;24894:19;;18186:75:11::1;24515:404:13::0;18186:75:11::1;18291:9;:22:::0;18025:295::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;25126:2:13;2161:73:0::1;::::0;::::1;25108:21:13::0;25165:2;25145:18;;;25138:30;25204:34;25184:18;;;25177:62;-1:-1:-1;;;25255:18:13;;;25248:36;25301:19;;2161:73:0::1;24924:402:13::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;415:696:3:-:0;471:13;520:14;537:17;548:5;537:10;:17::i;:::-;557:1;537:21;520:38;;572:20;606:6;595:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;595:18:3;-1:-1:-1;572:41:3;-1:-1:-1;733:28:3;;;749:2;733:28;788:280;-1:-1:-1;;819:5:3;-1:-1:-1;;;953:2:3;942:14;;937:30;819:5;924:44;1012:2;1003:11;;;-1:-1:-1;1032:21:3;788:280;1032:21;-1:-1:-1;1088:6:3;415:696;-1:-1:-1;;;415:696:3:o;9889:890:5:-;9942:7;;-1:-1:-1;;;10017:15:5;;10013:99;;-1:-1:-1;;;10052:15:5;;;-1:-1:-1;10095:2:5;10085:12;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;-1:-1:-1;10207:2:5;10197:12;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;-1:-1:-1;10319:2:5;10309:12;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;-1:-1:-1;10429:1:5;10419:11;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;-1:-1:-1;10538:1:5;10528:11;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;-1:-1:-1;10647:1:5;10637:11;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;10766:6;9889:890;-1:-1:-1;;9889:890:5:o;20625:1032:11:-;2688:8:7;;;;2684:39;;;2705:18;;-1:-1:-1;;;2705:18:7;;;;;;;;;;;2684:39;20743:19:11::1;::::0;20723:17:::1;20776:14:::0;;;20772:36:::1;;20799:9;;-1:-1:-1::0;;;20799:9:11::1;;;;;;;;;;;20772:36;20818:17;20838:14;:12;:14::i;:::-;20818:34;;20883:9;20870;:22;;20862:55;;;;-1:-1:-1::0;;;20862:55:11::1;;;;;;;:::i;:::-;21052:10;21042:21;::::0;;;:9:::1;:21;::::0;;;;;;;:23;;::::1;;::::0;;21189:11:::1;:23:::0;;;;;:36;;21216:9:::1;21189:36;::::0;;21262:11:::1;::::0;21250:23;::::1;21246:77;;;21289:11;:23:::0;;;21246:77:::1;21333:14;21362:19;;21350:9;;:31;;;;:::i;:::-;21333:48;;21391:15;21409:10;:8;:10::i;:::-;21391:28;;21434:58;21443:10;21455:6;21463:7;21472:9;21483:8;21434:58;;;;;;;;;;:::i;:::-;;;;;;;;21611:13;::::0;:39:::1;::::0;-1:-1:-1;;;21611:39:11;;21630:10:::1;21611:39;::::0;::::1;9494:51:13::0;9561:18;;;9554:34;;;-1:-1:-1;;;;;21611:13:11;;::::1;::::0;:18:::1;::::0;9467::13;;21611:39:11::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;6490:169:7::0;6573:6;;6542:4;;-1:-1:-1;;;;;6573:6:7;6565:29;;;;:87;;-1:-1:-1;6643:9:7;;6599:8;;;;:39;;6623:15;6599:39;;;6610:10;;6599:39;6598:54;;6558:94;;6490:169;:::o;21695:390:11:-;21867:6;;21757:7;;21838:44;;21855:10;;-1:-1:-1;;;;;21867:6:11;21875;21838:16;:44::i;:::-;21830:93;;;;-1:-1:-1;;;21830:93:11;;25533:2:13;21830:93:11;;;25515:21:13;25572:2;25552:18;;;25545:30;25611:34;25591:18;;;25584:62;-1:-1:-1;;;25662:18:13;;;25655:34;25706:19;;21830:93:11;25331:400:13;21830:93:11;21949:6;;21973:13;;;21949:38;;-1:-1:-1;;;21949:38:11;;;;;8190:25:13;;;8231:18;;;8224:34;21934:12:11;;-1:-1:-1;;;;;21949:6:11;;:15;;8163:18:13;;21949:38:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21934:53;;22036:9;;22028:4;:17;;:40;;22064:4;22052:9;;:16;22028:40;;;22048:1;22028:40;22021:47;21695:390;-1:-1:-1;;;21695:390:11:o;1005:1550:12:-;1043:7;1110:1;1088:19;;:23;1080:71;;;;-1:-1:-1;;;1080:71:12;;26127:2:13;1080:71:12;;;26109:21:13;26166:2;26146:18;;;26139:30;26205:34;26185:18;;;26178:62;-1:-1:-1;;;26256:18:13;;;26249:33;26299:19;;1080:71:12;25925:399:13;1080:71:12;1326:19;;-1:-1:-1;;1326:23:12;1181:17;1312:38;;;:13;:38;;;;;;;1374:14;;;1370:149;;-1:-1:-1;1416:19:12;;1370:149;;;1507:1;1466:13;:38;1502:1;1480:19;;:23;;;;:::i;:::-;1466:38;;;;;;;;;;;-1:-1:-1;1466:38:12;:42;1370:149;1533:19;;1556:1;1533:24;1529:218;;1659:1;1637:19;:23;-1:-1:-1;;1709:13:12;;1005:1550;-1:-1:-1;1005:1550:12:o;1529:218::-;1757:19;1869;;1814;;1835:16;1797:55;;;;;;;;26486:19:13;;;26530:2;26521:12;;26514:28;26567:2;26558:12;;26329:247;1797:55:12;;;;;;;;;;;;;1787:66;;;;;;1779:75;;:109;;;;:::i;:::-;1990:19;:21;;-1:-1:-1;;1990:21:12;;;;;1757:131;;-1:-1:-1;2131:34:12;;1990:21;2131:34;2127:60;;-1:-1:-1;;;2174:13:12;;1005:1550;-1:-1:-1;1005:1550:12:o;2127:60::-;2280:18;2301:26;;;:13;:26;;;;;;;2337:38;;;;2493:14;:45;;2527:11;2493:45;;;2523:1;2510:10;:14;2493:45;2486:52;;;;;1005:1550;:::o;1359:130:0:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:2;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;26783:2:13;1414:68:0;;;26765:21:13;;;26802:18;;;26795:30;26861:34;26841:18;;;26834:62;26913:18;;1414:68:0;26581:356:13;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;6665:481:7:-;6711:7;6735:11;:9;:11::i;:::-;6730:26;;-1:-1:-1;6755:1:7;;6665:481::o;6730:26::-;6880:8;;;;6875:99;;-1:-1:-1;6945:14:7;;6933:9;;6915:15;:27;:44;;6665:481::o;6875:99::-;-1:-1:-1;7115:14:7;;7103:9;;7090:10;;:22;:39;;6665:481::o;519:479:6:-;643:26;;-1:-1:-1;;;643:26:6;;;;;:25:13;;;611:4:6;;;;-1:-1:-1;;;;;643:17:6;;;;;616:18:13;;643:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;627:42;;699:5;-1:-1:-1;;;;;687:17:6;:8;-1:-1:-1;;;;;687:17:6;;:76;;;-1:-1:-1;720:43:6;;-1:-1:-1;;;720:43:6;;-1:-1:-1;;;;;27428:15:13;;;720:43:6;;;27410:34:13;27480:15;;;27460:18;;;27453:43;720:26:6;;;;;27345:18:13;;720:43:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;687:134;;;-1:-1:-1;779:30:6;;-1:-1:-1;;;779:30:6;;;;;643:25:13;;;-1:-1:-1;;;;;779:42:6;;;;:21;;;;;;616:18:13;;779:30:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;779:42:6;;687:134;:303;;;-1:-1:-1;469:42:6;838:40;:44;;;;:151;;-1:-1:-1;902:87:6;;-1:-1:-1;;;902:87:6;;-1:-1:-1;;;;;28076:15:13;;;902:87:6;;;28058:34:13;28128:15;;;28108:18;;;28101:43;28180:15;;28160:18;;;28153:43;28212:18;;;28205:34;;;469:42:6;;902:41;;27992:19:13;;902:87:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;679:312;519:479;-1:-1:-1;;;;;519:479:6:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:13:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:13;;209:43;;199:71;;266:1;263;256:12;679:131;-1:-1:-1;;;;;754:31:13;;744:42;;734:70;;800:1;797;790:12;815:247;874:6;927:2;915:9;906:7;902:23;898:32;895:52;;;943:1;940;933:12;895:52;982:9;969:23;1001:31;1026:5;1001:31;:::i;1067:683::-;1162:6;1170;1178;1231:2;1219:9;1210:7;1206:23;1202:32;1199:52;;;1247:1;1244;1237:12;1199:52;1283:9;1270:23;1260:33;;1344:2;1333:9;1329:18;1316:32;1367:18;1408:2;1400:6;1397:14;1394:34;;;1424:1;1421;1414:12;1394:34;1462:6;1451:9;1447:22;1437:32;;1507:7;1500:4;1496:2;1492:13;1488:27;1478:55;;1529:1;1526;1519:12;1478:55;1569:2;1556:16;1595:2;1587:6;1584:14;1581:34;;;1611:1;1608;1601:12;1581:34;1664:7;1659:2;1649:6;1646:1;1642:14;1638:2;1634:23;1630:32;1627:45;1624:65;;;1685:1;1682;1675:12;1624:65;1716:2;1712;1708:11;1698:21;;1738:6;1728:16;;;;;1067:683;;;;;:::o;1755:180::-;1814:6;1867:2;1855:9;1846:7;1842:23;1838:32;1835:52;;;1883:1;1880;1873:12;1835:52;-1:-1:-1;1906:23:13;;1755:180;-1:-1:-1;1755:180:13:o;2264:728::-;2404:6;2412;2420;2473:2;2461:9;2452:7;2448:23;2444:32;2441:52;;;2489:1;2486;2479:12;2441:52;2525:9;2512:23;2502:33;;2586:2;2575:9;2571:18;2558:32;2609:18;2650:2;2642:6;2639:14;2636:34;;;2666:1;2663;2656:12;2636:34;2704:6;2693:9;2689:22;2679:32;;2749:7;2742:4;2738:2;2734:13;2730:27;2720:55;;2771:1;2768;2761:12;2720:55;2811:2;2798:16;2837:2;2829:6;2826:14;2823:34;;;2853:1;2850;2843:12;2823:34;2906:7;2901:2;2891:6;2888:1;2884:14;2880:2;2876:23;2872:32;2869:45;2866:65;;;2927:1;2924;2917:12;3226:334;3313:6;3321;3374:2;3362:9;3353:7;3349:23;3345:32;3342:52;;;3390:1;3387;3380:12;3342:52;3429:9;3416:23;3448:31;3473:5;3448:31;:::i;:::-;3498:5;3550:2;3535:18;;;;3522:32;;-1:-1:-1;;;3226:334:13:o;4593:380::-;4672:1;4668:12;;;;4715;;;4736:61;;4790:4;4782:6;4778:17;4768:27;;4736:61;4843:2;4835:6;4832:14;4812:18;4809:38;4806:161;;4889:10;4884:3;4880:20;4877:1;4870:31;4924:4;4921:1;4914:15;4952:4;4949:1;4942:15;5104:963;5213:4;5242:2;5271;5260:9;5253:21;5294:1;5327:6;5321:13;5357:36;5383:9;5357:36;:::i;:::-;5429:6;5424:2;5413:9;5409:18;5402:34;5455:2;5476:1;5508:2;5497:9;5493:18;5525:1;5520:158;;;;5692:1;5687:354;;;;5486:555;;5520:158;-1:-1:-1;;5568:24:13;;5548:18;;;5541:52;5646:14;;5639:22;5636:1;5632:30;5617:46;;5613:55;;;-1:-1:-1;5520:158:13;;5687:354;5718:6;5715:1;5708:17;5766:2;5763:1;5753:16;5791:1;5805:180;5819:6;5816:1;5813:13;5805:180;;;5912:14;;5888:17;;;5884:26;;5877:50;5955:16;;;;5834:10;;5805:180;;;6009:17;;6005:26;;;-1:-1:-1;;5486:555:13;-1:-1:-1;6058:3:13;;5104:963;-1:-1:-1;;;;;;;;5104:963:13:o;6787:127::-;6848:10;6843:3;6839:20;6836:1;6829:31;6879:4;6876:1;6869:15;6903:4;6900:1;6893:15;6919:127;6980:10;6975:3;6971:20;6968:1;6961:31;7011:4;7008:1;7001:15;7035:4;7032:1;7025:15;7051:120;7091:1;7117;7107:35;;7122:18;;:::i;:::-;-1:-1:-1;7156:9:13;;7051:120::o;7176:344::-;7378:2;7360:21;;;7417:2;7397:18;;;7390:30;-1:-1:-1;;;7451:2:13;7436:18;;7429:50;7511:2;7496:18;;7176:344::o;7884:127::-;7945:10;7940:3;7936:20;7933:1;7926:31;7976:4;7973:1;7966:15;8000:4;7997:1;7990:15;8269:135;8308:3;8329:17;;;8326:43;;8349:18;;:::i;:::-;-1:-1:-1;8396:1:13;8385:13;;8269:135::o;8816:499::-;-1:-1:-1;;;;;9087:32:13;;;;9069:51;;9151:2;9136:18;;9129:34;;;;9194:2;9179:18;;9172:34;;;;9237:2;9222:18;;9215:34;9293:14;9286:22;9280:3;9265:19;;9258:51;9056:3;9041:19;;8816:499::o;10848:128::-;10915:9;;;10936:11;;;10933:37;;;10950:18;;:::i;10981:168::-;11054:9;;;11085;;11102:15;;;11096:22;;11082:37;11072:71;;11123:18;;:::i;11562:112::-;11594:1;11620;11610:35;;11625:18;;:::i;:::-;-1:-1:-1;11659:9:13;;11562:112::o;13278:250::-;13363:1;13373:113;13387:6;13384:1;13381:13;13373:113;;;13463:11;;;13457:18;13444:11;;;13437:39;13409:2;13402:10;13373:113;;;-1:-1:-1;;13520:1:13;13502:16;;13495:27;13278:250::o;13533:602::-;-1:-1:-1;;;13871:3:13;13864:26;13846:3;13919:6;13913:13;13935:75;14003:6;13998:2;13993:3;13989:12;13982:4;13974:6;13970:17;13935:75;:::i;:::-;14074:27;14069:2;14029:16;;;;14061:11;;;14054:48;-1:-1:-1;14126:2:13;14118:11;;13533:602;-1:-1:-1;13533:602:13:o;14140:127::-;14201:10;14196:3;14192:20;14189:1;14182:31;14232:4;14229:1;14222:15;14256:4;14253:1;14246:15;14272:545;14374:2;14369:3;14366:11;14363:448;;;14410:1;14435:5;14431:2;14424:17;14480:4;14476:2;14466:19;14550:2;14538:10;14534:19;14531:1;14527:27;14521:4;14517:38;14586:4;14574:10;14571:20;14568:47;;;-1:-1:-1;14609:4:13;14568:47;14664:2;14659:3;14655:12;14652:1;14648:20;14642:4;14638:31;14628:41;;14719:82;14737:2;14730:5;14727:13;14719:82;;;14782:17;;;14763:1;14752:13;14719:82;;14993:1352;15119:3;15113:10;15146:18;15138:6;15135:30;15132:56;;;15168:18;;:::i;:::-;15197:97;15287:6;15247:38;15279:4;15273:11;15247:38;:::i;:::-;15241:4;15197:97;:::i;:::-;15349:4;;15413:2;15402:14;;15430:1;15425:663;;;;16132:1;16149:6;16146:89;;;-1:-1:-1;16201:19:13;;;16195:26;16146:89;-1:-1:-1;;14950:1:13;14946:11;;;14942:24;14938:29;14928:40;14974:1;14970:11;;;14925:57;16248:81;;15395:944;;15425:663;5051:1;5044:14;;;5088:4;5075:18;;-1:-1:-1;;15461:20:13;;;15579:236;15593:7;15590:1;15587:14;15579:236;;;15682:19;;;15676:26;15661:42;;15774:27;;;;15742:1;15730:14;;;;15609:19;;15579:236;;;15583:3;15843:6;15834:7;15831:19;15828:201;;;15904:19;;;15898:26;-1:-1:-1;;15987:1:13;15983:14;;;15999:3;15979:24;15975:37;15971:42;15956:58;15941:74;;15828:201;-1:-1:-1;;;;;16075:1:13;16059:14;;;16055:22;16042:36;;-1:-1:-1;14993:1352:13:o;17464:125::-;17529:9;;;17550:10;;;17547:36;;;17563:18;;:::i;17804:465::-;17979:6;17968:9;17961:25;18022:2;18017;18006:9;18002:18;17995:30;17942:4;18054:6;18048:13;18097:6;18092:2;18081:9;18077:18;18070:34;18113:79;18185:6;18180:2;18169:9;18165:18;18160:2;18152:6;18148:15;18113:79;:::i;:::-;18253:2;18232:15;-1:-1:-1;;18228:29:13;18213:45;;;;18260:2;18209:54;;17804:465;-1:-1:-1;;;17804:465:13:o;19384:1159::-;19482:6;19490;19498;19551:2;19539:9;19530:7;19526:23;19522:32;19519:52;;;19567:1;19564;19557:12;19519:52;19599:9;19593:16;19618:31;19643:5;19618:31;:::i;:::-;19718:2;19703:18;;19697:25;19668:5;;-1:-1:-1;19731:33:13;19697:25;19731:33;:::i;:::-;19834:2;19819:18;;19813:25;19783:7;;-1:-1:-1;19857:18:13;19887:14;;;19884:34;;;19914:1;19911;19904:12;19884:34;19952:6;19941:9;19937:22;19927:32;;19997:7;19990:4;19986:2;19982:13;19978:27;19968:55;;20019:1;20016;20009:12;19968:55;20048:2;20042:9;20070:2;20066;20063:10;20060:36;;;20076:18;;:::i;:::-;20151:2;20145:9;20119:2;20205:13;;-1:-1:-1;;20201:22:13;;;20225:2;20197:31;20193:40;20181:53;;;20249:18;;;20269:22;;;20246:46;20243:72;;;20295:18;;:::i;:::-;20335:10;20331:2;20324:22;20370:2;20362:6;20355:18;20410:7;20405:2;20400;20396;20392:11;20388:20;20385:33;20382:53;;;20431:1;20428;20421:12;20382:53;20444:68;20509:2;20504;20496:6;20492:15;20487:2;20483;20479:11;20444:68;:::i;:::-;20531:6;20521:16;;;;;;;19384:1159;;;;;:::o;25736:184::-;25806:6;25859:2;25847:9;25838:7;25834:23;25830:32;25827:52;;;25875:1;25872;25865:12;25827:52;-1:-1:-1;25898:16:13;;25736:184;-1:-1:-1;25736:184:13:o;26942:251::-;27012:6;27065:2;27053:9;27044:7;27040:23;27036:32;27033:52;;;27081:1;27078;27071:12;27033:52;27113:9;27107:16;27132:31;27157:5;27132:31;:::i;27507:277::-;27574:6;27627:2;27615:9;27606:7;27602:23;27598:32;27595:52;;;27643:1;27640;27633:12;27595:52;27675:9;27669:16;27728:5;27721:13;27714:21;27707:5;27704:32;27694:60;;27750:1;27747;27740:12

Swarm Source

ipfs://20d652ac76530a8232b2bf57dadfc053564335cb5251986e9fe6d28123edd5b1

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  ]

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.