ETH Price: $2,081.27 (-3.04%)

Contract

0xdEB8eA6Aa3214EEEDFC86FF0eB12b9CD08e97678
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Emergency Withdr...246277002026-03-10 14:35:5912 days ago1773153359IN
0xdEB8eA6A...D08e97678
0 ETH0.000044220.80322677
Safe_deploy_Synt...246276982026-03-10 14:35:3512 days ago1773153335IN
0xdEB8eA6A...D08e97678
0 ETH0.000041120.8087471
Purchase Token205615282024-08-19 8:37:59580 days ago1724056679IN
0xdEB8eA6A...D08e97678
0.00764818 ETH0.000195181.35140839
Add Advisor205615172024-08-19 8:35:47580 days ago1724056547IN
0xdEB8eA6A...D08e97678
0 ETH0.000134181.46086702
Purchase Token205613642024-08-19 8:04:47580 days ago1724054687IN
0xdEB8eA6A...D08e97678
0.00382409 ETH0.000489651.80365339

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer246277002026-03-10 14:35:5912 days ago1773153359
0xdEB8eA6A...D08e97678
0.00856596 ETH
Transfer205615282024-08-19 8:37:59580 days ago1724056679
0xdEB8eA6A...D08e97678
0.00061185 ETH
Transfer205615282024-08-19 8:37:59580 days ago1724056679
0xdEB8eA6A...D08e97678
0xdEB8eA6A...D08e97678
0.00550669 ETH
Transfer205615282024-08-19 8:37:59580 days ago1724056679
0xdEB8eA6A...D08e97678
0.00152963 ETH
Transfer205613642024-08-19 8:04:47580 days ago1724054687
0xdEB8eA6A...D08e97678
0xdEB8eA6A...D08e97678
0.00305927 ETH
Transfer205613642024-08-19 8:04:47580 days ago1724054687
0xdEB8eA6A...D08e97678
0.00076481 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PresaleContract

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2024-08-18
*/

// Sources flattened with hardhat v2.22.6 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol@v1.1.1

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;

// solhint-disable-next-line interface-starts-with-i
interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}


// File openzeppelin-contracts-release-v4.9/contracts/utils/Context.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File openzeppelin-contracts-release-v4.9/contracts/access/Ownable.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 openzeppelin-contracts-release-v4.9/contracts/security/ReentrancyGuard.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}


// File contracts/PresaleContract.sol

/**
 * @dev The `PresaleContract` is a comprehensive smart contract designed to manage the presale of SyntraCoin, a custom ERC20 token.
 * The contract facilitates multiple rounds of token sales, distributes tokens to participants, manages advisor commissions,
 * and handles the deployment of a Uniswap V3 liquidity pool upon the presale's conclusion. It also includes robust mechanisms
 * for emergency handling, participant refunds, and owner-controlled operations.
 *
 * **Key Features:**
 * 
 * 1. **Token Sale Management:**
 *    - The presale is divided into four rounds, each with increasing token prices and specific token limits.
 *    - Participants can purchase tokens using ETH, and the contract automatically handles ETH-to-USD conversions using Chainlink price feeds.
 *    - The contract tracks token purchases and ETH contributions per participant, ensuring correct token distribution once the presale ends.
 *    - The presale process is time-bound with a global timer, and it automatically progresses through the rounds as tokens are sold.
 * 
 * 2. **Discount Management:**
 *    - The contract includes a refund mechanism where participants can receive a 10% refund of their ETH contribution if they are referred by a valid advisor.
 *    - This discount is applied automatically during the purchase process, reducing the total ETH collected by the contract.
 * 
 * 3. **Investor Rights:**
 *    - Participants are entitled to receive the tokens they purchased once the presale concludes.
 *    - If the presale fails or is canceled, participants have the right to claim a refund of 80% of their ETH contributions.
 *    - Investors can monitor their spending and token allocation via the contract's public functions.
 * 
 * 4. **Advisor Rights:**
 *    - Advisors can refer participants to the presale and earn a 10% commission on the ETH contributions made by their referred participants.
 *    - Advisors must be added by the contract owner to be eligible for commissions.
 *    - The contract automatically distributes the advisor’s commission during the purchase process.
 * 
 * 5. **Team Rights:**
 *    - The team (represented by the contract owner) receives 20% of the ETH collected from token sales and computer purchases as compensation.
 *    - The contract ensures that the team's share is transferred immediately during each purchase transaction.
 *    - The team has the right to withdraw remaining funds after the presale concludes, provided the withdrawal conditions are met.
 * 
 * 6. **Ownership and Control (OnlyOwner Functions):**
 *    - The contract is owned by a single entity (the owner), who has the authority to perform critical actions:
 *      - Add or remove advisors.
 *      - Initiate emergency withdrawals if the presale encounters issues.
 *      - Deploy the SyntraCoin token and create the Uniswap V3 liquidity pool.
 *      - Manage the transition from the presale to the post-sale phase, including token minting and fund management.
 *    - The `onlyOwner` modifier restricts sensitive functions to the contract owner, ensuring that only authorized personnel can execute these functions.
 * 
 * 7. **Emergency Handling and Refunds:**
 *    - The contract includes mechanisms to handle emergencies and ensure the safety of participant funds.
 *    - If the contract fails to safely deploy the SyntraCoin token and liquidity pool, it enters an emergency withdrawal mode.
 *    - In emergency mode, the owner can withdraw the remaining funds to prevent loss.
 *    - Participants can request a full refund of their ETH contributions if the presale fails, ensuring investor protection.
 *
 * The `PresaleContract` is a versatile and secure solution for managing the complexities of a token presale, offering various roles and rights 
 * to participants, advisors, and the project team while ensuring that funds are handled securely and transparently.
 */

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.15;



/// @custom:security-contact admin@syntralink.net

interface IUniswapAndCoinManager {
    function deployCoinAndPool(uint256 ethForPool) external payable;
    function mintTokens(address participant, uint256 amount) external;
    function coinAddress() external view returns (address);
}

contract PresaleContract is Ownable, ReentrancyGuard {
    IUniswapAndCoinManager public _uniswapAndCoinManager; // Interface for the Uniswap and Coin Manager contract
    AggregatorV3Interface internal _priceFeed; // Interface for the Chainlink price feed contract
    uint256 public constant DECIMALS = 1e18; // The number of decimal places for the tokens
    uint256 public constant TOTAL_TOKENS = 40e6 * DECIMALS; // Total supply of tokens for the presale
    uint256 public constant BASE_TRITON_PRICE = 5.7e5; // Base price for the Triton computer in USD cents
    uint256 public constant BASE_HYPERION_PRICE = 7.7e5; // Base price for the Hyperion computer in USD cents
    uint256 public constant BASE_NYX_PRICE = 4.2e5; // Base price for the Nyx computer in USD cents
    uint256 public constant BASE_HECATE_PRICE = 2.2e5; // Base price for the Hecate computer in USD cents
    uint256 public constant GLOBAL_TIMER = 604800 * 26; // Total duration of the presale, calculated as 26 weeks
    uint256 public constant MAX_ROUND = 3; // Maximum number of rounds in the presale
    uint256 public constant ADVISOR_PERCENTAGE = 10; // Percentage of ETH that advisors receive from their referrals
    uint256 public constant REFUND_PERCENTAGE = 10; // Percentage of ETH that discount received
    uint256 public constant TEAM_PERCENTAGE = 20; // Percentage of ETH for the team
    uint256 public constant PERCENTAGE_BASE = 100; // Base value used for percentage calculations
    uint256[4] public _roundPrices = [10, 15, 20, 25]; // Prices per token for each presale round in USD cents
    uint256[4] public _roundTokenLimits = [
        4e6 * DECIMALS, // Token limit for round 1
        8e6 * DECIMALS, // Token limit for round 2
        12e6 * DECIMALS, // Token limit for round 3
        16e6 * DECIMALS // Token limit for round 4
    ];
    uint256 public _currentRound = 0; // Tracks the current presale round
    uint256 public _totalTokensSold = 0; // Total number of tokens sold during the presale
    uint256 public _totalEthSpentInComputers = 0; // Total ETH spent on purchasing computers
    uint256 public _presaleStartedAt = 0; // Timestamp marking the start of the presale      
    mapping(address => uint256) public nonces; //nonces for protection against replay attacks                 
    mapping(address => uint256) public _computerTritonPurchases;
    mapping(address => uint256) public _computerHyperionPurchases;
    mapping(address => uint256) public _computerNyxPurchases;
    mapping(address => uint256) public _computerHecatePurchases;
    mapping(address => uint256) public _tokenPurchases; // Tracks total tokens purchased by each participant
    mapping(uint256 => uint256) public _tokensSoldPerRound; // Tracks total tokens sold per round
    mapping(address => uint256) public _totalEthSpentByAddress; // Tracks total ETH spent by each participant
    mapping(uint256 => mapping(address => uint256))
    public _tokensSoldPerRoundByAddress; // Tracks tokens sold per round by each participant
    mapping(address => address[]) public _investorsByAdvisorAddress; // Maps advisors to their referred investors
    mapping(address => uint256) public _ethAmountByAdvisorAddress; // Tracks ETH owed to each advisor
    mapping(address => uint256) public totalSpent;
    address[] public _participants; // List of all participants in the presale
    address[] public _advisors; // List of all advisors in the presale
    mapping(address => bool) private _validAdvisors;
    event AdvisorAdded(address indexed advisor);
    event AdvisorRemoved(address indexed advisor);
    event TransferCompleted(address indexed advisor, uint256 indexed amount);
    event ComputerPurchased(
        address indexed buyer,
        uint256 indexed amount,
        uint256 indexed ethSpent,
        string computerType
    );
    event TokenPurchased(
        address indexed buyer,
        uint256 indexed amount,
        uint256 indexed ethSpent
    );
    event RoundAdvanced(uint256 indexed newRound);
    event AddressRefunded(address indexed purchaser, uint256 indexed amount);
    event AdvisorAddressesAdded(
        address indexed advisor,
        address[] indexed investorsAddresses
    );
    bool public _isInEmergencyWithdraw = false; // Indicates if the contract is in emergency withdrawal mode
    receive() external payable {}
    fallback() external payable {}

    /**
     * @notice Function to add an advisor, only callable by the contract owner
     * @param advisor - The address of the advisor to be added
     */
     function addAdvisor(address advisor) external onlyOwner {
        require(advisor != address(0), "Invalid address"); // @dev Ensures the advisor address is not the zero address
        require(!_validAdvisors[advisor], "Advisor already added"); // @dev Checks that the advisor is not already added
        _validAdvisors[advisor] = true; // @dev Marks the advisor as valid
        _advisors.push(advisor); // @dev Adds the advisor to the list of advisors
        emit AdvisorAdded(advisor); // @dev Emits an event signaling the advisor has been added
    }

    /**
     * @notice Function to remove an advisor, only callable by the contract owner
     * @param advisor - The address of the advisor to be removed
     */
    function removeAdvisor(address advisor) external onlyOwner {
        require(advisor != address(0), "Invalid address"); // @dev Ensures the advisor address is not the zero address
        require(_validAdvisors[advisor], "Advisor not found"); // @dev Checks that the advisor exists in the list
        _validAdvisors[advisor] = false; // @dev Marks the advisor as invalid
        emit AdvisorRemoved(advisor); // @dev Emits an event signaling the advisor has been removed
    }

    /*
     * @notice Constructor for initializing the PresaleContract
     * @param uniswapAndCoinManager_ - Address of the Uniswap and Coin Manager contract
     */
    constructor(address uniswapAndCoinManager_) Ownable() {
        require(uniswapAndCoinManager_ != address(0), "Invalid address");
        _uniswapAndCoinManager = IUniswapAndCoinManager(uniswapAndCoinManager_);
        _priceFeed = AggregatorV3Interface(
            0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
        );
        _presaleStartedAt = block.timestamp; // Record the start time of the presale
    }

    /*
     * @dev Internal function to handle the purchase of computers
     * @param amount - The number of computers being purchased
     * @param totalPrice - The total ETH value for the purchase
     * @param purchases - The mapping that tracks purchases by address
     * @param computerType - The type of computer being purchased
     * @param advisor - The address of the advisor
     */
     function _purchaseComputer(
        uint256 amount,
        uint256 totalPrice,
        mapping(address => uint256) storage purchases,
        string memory computerType,
        address advisor
    ) internal {
        require(amount > 0, "Amount must be greater than 0");
        require(msg.value == totalPrice, "Incorrect ETH sent");
        nonces[msg.sender]++;
        uint256 teamShare = totalPrice;  // Start by assuming the team gets the full amount
        uint256 advisorShare = 0;
        uint256 refundToSender = 0;
        if (advisor != address(0) && _validAdvisors[advisor]) {
            refundToSender = (totalPrice * REFUND_PERCENTAGE) / PERCENTAGE_BASE; // Calculate a 10% refund to the sender
            advisorShare = (totalPrice * ADVISOR_PERCENTAGE) / PERCENTAGE_BASE; // Calculate 10% for the advisor
            teamShare = totalPrice - refundToSender - advisorShare; // Calculate the remaining share for the team
        } else if (advisor != address(0) && !_validAdvisors[advisor]) {
            revert("Invalid advisor address");
        }
        purchases[msg.sender] += amount; // Update the purchase record for the sender
        _totalEthSpentByAddress[msg.sender] += msg.value; // Update the total ETH spent by the sender
        _totalEthSpentInComputers += msg.value; // Update the total ETH spent on computers
        totalSpent[msg.sender] += msg.value;  // Update the total spent by the participant
        _participants.push(msg.sender); // Update the leaderboard with the sender's address
        (bool successTeam, ) = payable(owner()).call{value: teamShare}("");
        require(successTeam, "Transfer to team failed");
        if (advisorShare > 0) {
            (bool successAdvisor, ) = payable(advisor).call{value: advisorShare}("");
            require(successAdvisor, "Transfer to advisor failed");
        }
        if (refundToSender > 0) {
            (bool successRefund, ) = payable(msg.sender).call{value: refundToSender}("");
            require(successRefund, "Refund to sender failed");
        }
        emit ComputerPurchased(msg.sender, amount, msg.value, computerType); // Emit an event for the purchase
    }

    /*
     * @notice Function to purchase Triton computers during the presale
     * @param amount - The number of Triton computers to purchase
     */
    function purchaseTriton(uint256 amount, address advisor) external payable nonReentrant {
        _purchaseComputer(
            amount,
            purchaseTriton_price(amount),
            _computerTritonPurchases,
            "Triton",
            advisor
        );
    }

    /*
     * @notice Function to purchase Hyperion computers during the presale
     * @param amount - The number of Hyperion computers to purchase
     */
    function purchaseHyperion(uint256 amount, address advisor) external payable nonReentrant {
        _purchaseComputer(
            amount,
            purchaseHyperion_price(amount),
            _computerHyperionPurchases,
            "Hyperion",
            advisor
        );
    }

    /*
     * @notice Function to purchase Nyx computers during the presale
     * @param amount - The number of Nyx computers to purchase
     */
    function purchaseNyx(uint256 amount, address advisor) external payable nonReentrant {
        _purchaseComputer(
            amount,
            purchaseNyx_price(amount),
            _computerNyxPurchases,
            "Nyx",
            advisor
        );
    }

    /*
     * @notice Function to purchase Hecate computers during the presale
     * @param amount - The number of Hecate computers to purchase
     */
    function purchaseHecate(uint256 amount, address advisor) external payable nonReentrant {
        _purchaseComputer(
            amount,
            purchaseHecate_price(amount),
            _computerHecatePurchases,
            "Hecate",
            advisor
        );
    }

    /*
     * @dev View function to calculate the ETH price for purchasing Triton computers
     * @param amount - The number of Triton computers to purchase
     * @return The total ETH required to purchase the specified number of Triton computers
     */
    function purchaseTriton_price(uint256 amount) public view returns (uint256) {
        return _convertUSDtoETH(BASE_TRITON_PRICE) * amount;
    }

    /*
     * @dev View function to calculate the ETH price for purchasing Hyperion computers
     * @param amount - The number of Hyperion computers to purchase
     * @return The total ETH required to purchase the specified number of Hyperion computers
     */
    function purchaseHyperion_price(uint256 amount) public view returns (uint256) {
        return _convertUSDtoETH(BASE_HYPERION_PRICE) * amount;
    }

    /*
     * @dev View function to calculate the ETH price for purchasing Nyx computers
     * @param amount - The number of Nyx computers to purchase
     * @return The total ETH required to purchase the specified number of Nyx computers
     */
    function purchaseNyx_price(uint256 amount) public view returns (uint256) {
        return _convertUSDtoETH(BASE_NYX_PRICE) * amount;
    }

    /*
     * @dev View function to calculate the ETH price for purchasing Hecate computers
     * @param amount - The number of Hecate computers to purchase
     * @return The total ETH required to purchase the specified number of Hecate computers
     */
    function purchaseHecate_price(uint256 amount) public view returns (uint256) {
        return _convertUSDtoETH(BASE_HECATE_PRICE) * amount;
    }

    /*
     * @dev View function to get the latest ETH/USD price from the Chainlink price feed
     * @return The latest ETH/USD price in USD
     */
    function _getLatestETHUSDPrice() public view returns (int) {
        (, int answer, , , ) = _priceFeed.latestRoundData();
        return answer / 1e8;
    }

    /*
     * @dev View function to convert a USD amount to ETH based on the latest price feed data
     * @param amountInUSDCents - The amount in USD cents to convert
     * @return The equivalent amount in ETH
     */
    function _convertUSDtoETH(uint256 amountInUSDCents) public view returns (uint256) {
        uint256 currentETHPrice = uint256(_getLatestETHUSDPrice());
        uint256 result = ((amountInUSDCents * 1e16) / currentETHPrice);
        return result;
    }

    /*
     * @notice Function to purchase tokens during the presale
     * @param amount - The number of tokens to purchase
     */
     function purchaseToken(uint256 amount, address advisor) external payable nonReentrant {
        uint256 price = purchaseToken_price(amount);
        uint256 teamShare = (price * TEAM_PERCENTAGE) / PERCENTAGE_BASE;
        uint256 advisorShare = 0;
        uint256 refundToSender = 0;
        uint256 amountToContract = price - teamShare;
        require(amount > 0, "Amount must be greater than 0");
        require(_totalTokensSold + amount <= TOTAL_TOKENS, "Exceeds total token supply");
        require(msg.value == price, "Incorrect ETH sent");
        nonces[msg.sender]++;
        if (advisor != address(0) && _validAdvisors[advisor] ) {
            refundToSender = (amountToContract * REFUND_PERCENTAGE) / PERCENTAGE_BASE; // Calculate 10% refund to the sender
            amountToContract = amountToContract - refundToSender; // Reduce the contract amount by the refund
            advisorShare = (amountToContract * ADVISOR_PERCENTAGE) / PERCENTAGE_BASE; // Calculate 10% for the advisor
        } 
        _tokenPurchases[msg.sender] += amount;
        _tokensSoldPerRound[_currentRound] += amount;
        _tokensSoldPerRoundByAddress[_currentRound][msg.sender] += amount;
        _totalEthSpentByAddress[msg.sender] += msg.value;
        totalSpent[msg.sender] += msg.value;
        _updateRoundProgress(amount);
        _participants.push(msg.sender);
        (bool successTeam, ) = payable(owner()).call{value: teamShare}("");
        require(successTeam, "Transfer to team failed");
        (bool successContract, ) = address(this).call{value: amountToContract}("");
        require(successContract, "Transfer to contract failed");
        if (refundToSender > 0) {
            (bool successRefund, ) = payable(msg.sender).call{value: refundToSender}("");
            require(successRefund, "Refund to sender failed");
        }
        emit TokenPurchased(msg.sender, amount, msg.value);
    }
    
    /*
     * @dev View function to calculate the ETH price for purchasing tokens
     * @param amount - The number of tokens to purchase
     * @return The total ETH required to purchase the specified number of tokens
     */
    function purchaseToken_price(uint256 amount) public view returns (uint256) {
        return _getCurrentRoundPrice() * (amount / DECIMALS);
    }

    /**
     * @dev Returns the top `topN` participants based on their total spending.
     * Iterates through the list of participants and selects the top spenders.
     * @param topN The number of top participants to return.
     * @return An array of addresses representing the top `topN` participants by spending.
     */
     function getTopParticipants(uint256 topN) public view returns (address[] memory) {
        require(topN > 0 && topN <= _participants.length, "Invalid topN value");
        address[] memory topParticipants = new address[](topN);
        uint256[] memory topAmounts = new uint256[](topN);
        for (uint256 i = 0; i < topN; i++) {
            topParticipants[i] = _participants[i];
            topAmounts[i] = totalSpent[_participants[i]];
        }
        for (uint256 i = topN / 2; i > 0; i--) {
            heapifyDown(topAmounts, topParticipants, i - 1, topN);
        }
        for (uint256 i = topN; i < _participants.length; i++) {
            uint256 spent = totalSpent[_participants[i]];
            if (spent > topAmounts[0]) {
                topAmounts[0] = spent;
                topParticipants[0] = _participants[i];
                heapifyDown(topAmounts, topParticipants, 0, topN);
            }
        }
        for (uint256 i = topN - 1; i > 0; i--) {
            (topAmounts[0], topAmounts[i]) = (topAmounts[i], topAmounts[0]);
            (topParticipants[0], topParticipants[i]) = (topParticipants[i], topParticipants[0]);
            heapifyDown(topAmounts, topParticipants, 0, i);
        }
        return topParticipants;
    }

    /**
     * @dev Heapifies down the element at index `start` in the min-heap.
     * @param topAmounts Array of the top spending amounts.
     * @param topParticipants Array of the top participant addresses.
     * @param start The starting index to heapify down.
     * @param size The size of the heap.
     */
    function heapifyDown(
        uint256[] memory topAmounts,
        address[] memory topParticipants,
        uint256 start,
        uint256 size
    ) internal pure {
        uint256 left = 2 * start + 1;
        uint256 right = 2 * start + 2;
        uint256 smallest = start;
        if (left < size && topAmounts[left] < topAmounts[smallest]) {
            smallest = left;
        }
        if (right < size && topAmounts[right] < topAmounts[smallest]) {
            smallest = right;
        }
        if (smallest != start) {
            (topAmounts[start], topAmounts[smallest]) = (topAmounts[smallest], topAmounts[start]);
            (topParticipants[start], topParticipants[smallest]) = (topParticipants[smallest], topParticipants[start]);
            heapifyDown(topAmounts, topParticipants, smallest, size);
        }
    }


    /**
     * @dev Returns the ranking of the caller based on their total spending.
     * @return The 1-based ranking of the caller among all participants. Returns 0 if the caller is not in the list.
     */
    function getRanking() external view returns (uint256) {
        address[] memory sortedParticipants = getTopParticipants(_participants.length);
        for (uint256 i = 0; i < sortedParticipants.length; i++) {
            if (sortedParticipants[i] == msg.sender) {
                return i + 1;
            }
        }
        return 0; // Return 0 if the caller is not in the participants list.
    }

    /**
     * @dev Returns the address of the top spender.
     * @return The address of the participant who has spent the most. Returns address(0) if there are no participants.
     */
    function getTopSpender() public view returns (address) {
        if (_participants.length == 0) return address(0); // Return address(0) if no participants exist.
        return getTopParticipants(1)[0]; // Return the address of the top spender.
    }

    /**
     * @dev Returns the address of the second top spender.
     * @return The address of the participant who has spent the second most. Returns address(0) if there are less than 2 participants.
     */
    function getSecondTopSpender() public view returns (address) {
        if (_participants.length < 2) return address(0); // Return address(0) if there are less than 2 participants.
        return getTopParticipants(2)[1]; // Return the address of the second top spender.
    }

    /**
     * @dev Returns the address of the third top spender.
     * @return The address of the participant who has spent the third most. Returns address(0) if there are less than 3 participants.
     */
    function getThirdTopSpender() public view returns (address) {
        if (_participants.length < 3) return address(0); // Return address(0) if there are less than 3 participants.
        return getTopParticipants(3)[2]; // Return the address of the third top spender.
    }

    /**
     * @dev Returns the amount spent by the top spender.
     * @return The total amount spent by the top spender. Returns 0 if there are no participants.
     */
    function getTopSpenderAmount() external view returns (uint256) {
        address topSpender = getTopSpender(); // Get the address of the top spender.
        if (topSpender == address(0)) return 0; // Return 0 if there is no top spender.
        return totalSpent[topSpender]; // Return the total amount spent by the top spender.
    }

    /**
     * @dev Returns the amount spent by the second top spender.
     * @return The total amount spent by the second top spender. Returns 0 if there are less than 2 participants.
     */
    function getSecondTopSpenderAmount() external view returns (uint256) {
        address secondTopSpender = getSecondTopSpender(); // Get the address of the second top spender.
        if (secondTopSpender == address(0)) return 0; // Return 0 if there is no second top spender.
        return totalSpent[secondTopSpender]; // Return the total amount spent by the second top spender.
    }

    /**
     * @dev Returns the amount spent by the third top spender.
     * @return The total amount spent by the third top spender. Returns 0 if there are less than 3 participants.
     */
    function getThirdTopSpenderAmount() external view returns (uint256) {
        address thirdTopSpender = getThirdTopSpender(); // Get the address of the third top spender.
        if (thirdTopSpender == address(0)) return 0; // Return 0 if there is no third top spender.
        return totalSpent[thirdTopSpender]; // Return the total amount spent by the third top spender.
    }


    /*
     * @dev View function to get the price of tokens for the current round
     * @return The price of tokens in ETH for the current round
     */
    function _getCurrentRoundPrice() public view returns (uint256) {
        return _convertUSDtoETH(_roundPrices[_currentRound]);
    }

    /*
     * @dev View function to get the remaining tokens available for purchase in the current round
     * @return The number of tokens still available for purchase in the current round
     */
    function _getCurrentRoundTokensRemaining() public view returns (uint256) {
        return
            _roundTokenLimits[_currentRound] -
            _tokensSoldPerRound[_currentRound];
    }

    /*
     * @dev Internal function to update the progress of the current round and handle token distribution across rounds
     * @param amount - The number of tokens purchased in the current transaction
     */
    function _updateRoundProgress(uint256 amount) internal {
        uint256 remainingTokensCurrentRound = _getCurrentRoundTokensRemaining();
        if (remainingTokensCurrentRound >= amount) {
            _totalTokensSold += amount;
        } else {
            uint256 excessTokens = amount - remainingTokensCurrentRound;
            _totalTokensSold += remainingTokensCurrentRound;
            if (_currentRound < MAX_ROUND) {
                _currentRound++;
                emit RoundAdvanced(_currentRound);
                _updateRoundProgress(excessTokens);
            } else {
                _totalTokensSold += excessTokens;
            }
        }
    }

    /*
     * @notice Function to withdraw funds from the contract upon presale completion
     */
    function deploy_SyntraCoin() external {
        require(msg.sender == address(this), "Only contract can call this function");
        require(_currentRound == MAX_ROUND, "Presale not finished");
        uint256 ethForPool = address(this).balance;
        _uniswapAndCoinManager.deployCoinAndPool{value: ethForPool}(ethForPool - 6789788);
    }

    /*
     * @notice Function for participants to mint the tokens they bought in the presale
     */
     function mintMyTokens() external nonReentrant {
        require(_uniswapAndCoinManager.coinAddress() != address(0), "Coin not deployed yet");
        uint256 amountToMint = _tokenPurchases[msg.sender];
        require(amountToMint > 0, "No tokens to mint"); 
        nonces[msg.sender]++;
        _tokenPurchases[msg.sender] = 0;
        _uniswapAndCoinManager.mintTokens(msg.sender, amountToMint);
    }

    /*
     * @notice Function to attempt to withdraw funds safely; enters emergency mode if it fails
     */
    function safe_deploy_SyntraCoin() external nonReentrant onlyOwner {
        try this.deploy_SyntraCoin() {} catch {
            _isInEmergencyWithdraw = true;
        }
    }

    /*
     * @notice Function to perform an emergency withdrawal if safe withdrawal fails
     */
    function emergencyWithdraw() external onlyOwner {
        require(_isInEmergencyWithdraw, "Emergency withdraw is not active");
        uint256 amountToWithdraw = address(this).balance;
        require(amountToWithdraw > 0, "No funds to withdraw");
        nonces[owner()]++;
        (bool success, ) = payable(owner()).call{
            value: amountToWithdraw,
            gas: 500000
        }("");
        require(success, "Transfer failed");
    }

    /*
     * @notice Function to allow participants to request a full refund if the presale fails
     */
    function failedPresaleFullRefundMe() external nonReentrant {
        require(block.timestamp > _presaleStartedAt + GLOBAL_TIMER,"Global timer is not ended yet");
        address payable purchaser = payable(msg.sender);
        uint256 totalEth = _totalEthSpentByAddress[purchaser];
        uint256 refundEth = (totalEth * (PERCENTAGE_BASE - TEAM_PERCENTAGE)) / PERCENTAGE_BASE; // Refund only 80%
        require(totalEth > 0, "You have no ETH available to withdraw");
        nonces[msg.sender]++;
        _tokensSoldPerRoundByAddress[_currentRound][purchaser] = 0;
        _tokenPurchases[purchaser] = 0;
        _totalEthSpentByAddress[purchaser] = 0;
        (bool success, ) = purchaser.call{value: refundEth}("");
        require(success, "Transfer failed");
        emit AddressRefunded(purchaser, refundEth);
    }

    /*
     * @notice Function to allow participants to request a refund if certain conditions are met
     */
     function refundMe() external nonReentrant {
        address payable purchaser = payable(msg.sender);
        uint256 tokensAmount = _tokensSoldPerRoundByAddress[_currentRound][purchaser];
        uint256 totalAmountInEth = purchaseToken_price(tokensAmount);
        uint256 refundAmountInEth = (totalAmountInEth * (PERCENTAGE_BASE - TEAM_PERCENTAGE)) / PERCENTAGE_BASE; // Refund only 80%
        require(tokensAmount > 0, "You have not deposited ETH in this round");
        nonces[msg.sender]++;
        _totalTokensSold -= tokensAmount;
        _tokensSoldPerRound[_currentRound] -= tokensAmount;
        _tokensSoldPerRoundByAddress[_currentRound][purchaser] -= tokensAmount;
        _tokenPurchases[purchaser] -= tokensAmount;
        _totalEthSpentByAddress[purchaser] -= totalAmountInEth;
        (bool success, ) = purchaser.call{value: refundAmountInEth}("");
        require(success, "Transfer failed");
        emit AddressRefunded(purchaser, tokensAmount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"uniswapAndCoinManager_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddressRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"advisor","type":"address"}],"name":"AdvisorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"advisor","type":"address"},{"indexed":true,"internalType":"address[]","name":"investorsAddresses","type":"address[]"}],"name":"AdvisorAddressesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"advisor","type":"address"}],"name":"AdvisorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"string","name":"computerType","type":"string"}],"name":"ComputerPurchased","type":"event"},{"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":[{"indexed":true,"internalType":"uint256","name":"newRound","type":"uint256"}],"name":"RoundAdvanced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"ethSpent","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"advisor","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferCompleted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ADVISOR_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_HECATE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_HYPERION_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_NYX_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TRITON_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GLOBAL_TIMER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ROUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFUND_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_advisors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_computerHecatePurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_computerHyperionPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_computerNyxPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_computerTritonPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInUSDCents","type":"uint256"}],"name":"_convertUSDtoETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_ethAmountByAdvisorAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getCurrentRoundPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getCurrentRoundTokensRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getLatestETHUSDPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_investorsByAdvisorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isInEmergencyWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_participants","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleStartedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_roundPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_roundTokenLimits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_tokenPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokensSoldPerRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_tokensSoldPerRoundByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_totalEthSpentByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalEthSpentInComputers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapAndCoinManager","outputs":[{"internalType":"contract IUniswapAndCoinManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"advisor","type":"address"}],"name":"addAdvisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deploy_SyntraCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"failedPresaleFullRefundMe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRanking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondTopSpender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondTopSpenderAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThirdTopSpender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThirdTopSpenderAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"topN","type":"uint256"}],"name":"getTopParticipants","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTopSpender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTopSpenderAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMyTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseHecate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseHecate_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseHyperion","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseHyperion_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseNyx","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseNyx_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseToken_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseTriton","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseTriton_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundMe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"advisor","type":"address"}],"name":"removeAdvisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safe_deploy_SyntraCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalSpent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610100604052600a6080908152600f60a052601460c052601960e0526200002a9060049081620001f7565b506040518060800160405280670de0b6b3a7640000623d09006200004f919062000287565b81526020016200006b670de0b6b3a7640000627a120062000287565b815260200162000087670de0b6b3a764000062b71b0062000287565b8152602001620000a3670de0b6b3a764000062f4240062000287565b9052620000b59060089060046200023f565b506000600c819055600d819055600e819055600f55601f805460ff19169055348015620000e157600080fd5b5060405162003385380380620033858339810160408190526200010491620002b5565b6200010f33620001a7565b600180556001600160a01b038116620001605760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b600280546001600160a01b039092166001600160a01b031992831617905560038054909116735f4ec3df9cbd43714fe2740f5e3616155c5b841917905542600f55620002e7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82600481019282156200022d579160200282015b828111156200022d578251829060ff169055916020019190600101906200020b565b506200023b92915062000270565b5090565b82600481019282156200022d579160200282015b828111156200022d57825182559160200191906001019062000253565b5b808211156200023b576000815560010162000271565b6000816000190483118215151615620002b057634e487b7160e01b600052601160045260246000fd5b500290565b600060208284031215620002c857600080fd5b81516001600160a01b0381168114620002e057600080fd5b9392505050565b61308e80620002f76000396000f3fe6080604052600436106103b75760003560e01c80639685ee95116101f0578063cb8d36231161010c578063f196f824116100a5578063f3f11bc311610077578063f3f11bc314610aa8578063f46c858a14610abb578063f89c0fcc14610adb578063fe9edf2e14610af0578063ff5d2a5714610b1d57005b8063f196f82414610a33578063f1b32ad614610a53578063f2840e0214610a68578063f2fde38b14610a8857005b8063db2e21bc116100de578063db2e21bc146109f4578063e1211c4b14610a09578063e451968414610a1e578063eb3690e91461084457005b8063cb8d362314610995578063cdbc760d146109aa578063cfd74cde146109c1578063d1172ea6146109d457005b8063b1af52b111610189578063b6e3a20b1161015b578063b6e3a20b146108f3578063b6ec022114610920578063bd9690ea14610935578063c2b1f60314610955578063c5b0766b1461096857005b8063b1af52b114610879578063b3b427b7146108b1578063b4ac62c5146108c7578063b551b6dc146108dc57005b8063a4b4b771116101c2578063a4b4b77114610802578063a8949b4614610817578063ae06cfd314610844578063b0c1389c1461085957005b80639685ee9514610775578063978cc0d5146107955780639c4a84db146107c25780639d02a9ed146107e257005b80635a9e426b116102df5780637bbf71791161027857806384d9390a1161024a57806384d9390a146106e257806387c13943146106f75780638b048f911461070c5780638da5cb5b146107235780638f3e1e7a1461075557005b80637bbf7179146106635780637cfbc1bd146106765780637ecebe001461068b5780638170823e146106b857005b806372ee14c6116102b157806372ee14c614610603578063757ae291146106185780637714a7e21461062e5780637745b6b41461064e57005b80635a9e426b146105a3578063639e0aaa146105b85780636cc1fa96146105d8578063715018a6146105ee57005b80632e0f26251161035157806344a4062f1161032357806344a4062f1461052857806346fcf18a1461053f5780634730864c1461056c5780634c0318901461058357005b80632e0f2625146104b5578063323a3762146104d157806333bd034d146104e657806343974411146104fb57005b80630eeccb841161038a5780630eeccb84146104585780631398bbf71461047857806322bd6bc21461048d57806326c84cc4146104a057005b80622b55fd146103c057806303fac1061461040057806304f8722e146104165780630b7abf771461044357005b366103be57005b005b3480156103cc57600080fd5b506103ed6103db366004612d50565b60146020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561040c57600080fd5b506103ed600c5481565b34801561042257600080fd5b506103ed610431366004612d50565b60176020526000908152604090205481565b34801561044f57600080fd5b506103ed610b4a565b34801561046457600080fd5b506103be610473366004612d50565b610b63565b34801561048457600080fd5b506103ed610c5d565b6103be61049b366004612d74565b610cdb565b3480156104ac57600080fd5b506103ed610d26565b3480156104c157600080fd5b506103ed670de0b6b3a764000081565b3480156104dd57600080fd5b506103ed610dbc565b3480156104f257600080fd5b506103ed610dfc565b34801561050757600080fd5b5061051b610516366004612da4565b610e34565b6040516103f79190612dbd565b34801561053457600080fd5b506103ed62eff10081565b34801561054b57600080fd5b506103ed61055a366004612d50565b60136020526000908152604090205481565b34801561057857600080fd5b506103ed62035b6081565b34801561058f57600080fd5b506103ed61059e366004612da4565b611265565b3480156105af57600080fd5b506103be611284565b3480156105c457600080fd5b506103ed6105d3366004612da4565b6114e4565b3480156105e457600080fd5b506103ed600d5481565b3480156105fa57600080fd5b506103be6114f3565b34801561060f57600080fd5b506103ed611505565b34801561062457600080fd5b506103ed600e5481565b34801561063a57600080fd5b506103ed610649366004612da4565b611510565b34801561065a57600080fd5b506103be611543565b6103be610671366004612d74565b61165b565b34801561068257600080fd5b506103be611697565b34801561069757600080fd5b506103ed6106a6366004612d50565b60106020526000908152604090205481565b3480156106c457600080fd5b50601f546106d29060ff1681565b60405190151581526020016103f7565b3480156106ee57600080fd5b506103ed601481565b34801561070357600080fd5b506103ed606481565b34801561071857600080fd5b506103ed620668a081565b34801561072f57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103f7565b34801561076157600080fd5b5061073d610770366004612da4565b61170e565b34801561078157600080fd5b506103ed610790366004612da4565b611738565b3480156107a157600080fd5b506103ed6107b0366004612d50565b60156020526000908152604090205481565b3480156107ce57600080fd5b506103ed6107dd366004612da4565b611754565b3480156107ee57600080fd5b506103ed6107fd366004612da4565b611763565b34801561080e57600080fd5b506103ed611772565b34801561082357600080fd5b506103ed610832366004612d50565b601b6020526000908152604090205481565b34801561085057600080fd5b506103ed600a81565b34801561086557600080fd5b506103ed610874366004612da4565b61177d565b34801561088557600080fd5b506103ed610894366004612d74565b601860209081526000928352604080842090915290825290205481565b3480156108bd57600080fd5b506103ed600f5481565b3480156108d357600080fd5b506103ed600381565b3480156108e857600080fd5b506103ed6208b29081565b3480156108ff57600080fd5b506103ed61090e366004612d50565b601a6020526000908152604090205481565b34801561092c57600080fd5b506103ed611794565b34801561094157600080fd5b506103ed610950366004612da4565b6117b5565b6103be610963366004612d74565b6117c5565b34801561097457600080fd5b506103ed610983366004612d50565b60126020526000908152604090205481565b3480156109a157600080fd5b506103be611801565b3480156109b657600080fd5b506103ed620bbfd081565b6103be6109cf366004612d74565b6119b7565b3480156109e057600080fd5b5061073d6109ef366004612e0a565b6119f0565b348015610a0057600080fd5b506103be611a28565b348015610a1557600080fd5b5061073d611b82565b348015610a2a57600080fd5b506103be611bbf565b348015610a3f57600080fd5b5061073d610a4e366004612da4565b611dbb565b348015610a5f57600080fd5b5061073d611dcb565b348015610a7457600080fd5b5060025461073d906001600160a01b031681565b348015610a9457600080fd5b506103be610aa3366004612d50565b611dfb565b6103be610ab6366004612d74565b611e74565b348015610ac757600080fd5b506103be610ad6366004612d50565b612379565b348015610ae757600080fd5b5061073d6124b6565b348015610afc57600080fd5b506103ed610b0b366004612da4565b60166020526000908152604090205481565b348015610b2957600080fd5b506103ed610b38366004612d50565b60116020526000908152604090205481565b610b60670de0b6b3a76400006302625a00612e4c565b81565b610b6b6124e4565b6001600160a01b038116610bb85760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b6001600160a01b0381166000908152601e602052604090205460ff16610c145760405162461bcd60e51b815260206004820152601160248201527010591d9a5cdbdc881b9bdd08199bdd5b99607a1b6044820152606401610baf565b6001600160a01b0381166000818152601e6020526040808220805460ff19169055517fd4a6ffced9053f299bd4faabab08c87e208109894dd8437522c15f656a73ffc89190a250565b600080610c6e601c80549050610e34565b905060005b8151811015610cd257336001600160a01b0316828281518110610c9857610c98612e6b565b60200260200101516001600160a01b031603610cc057610cb9816001612e81565b9250505090565b80610cca81612e99565b915050610c73565b50600091505090565b610ce361253e565b610d1982610cf084611763565b601260405180604001604052806008815260200167243cb832b934b7b760c11b81525085612597565b610d2260018055565b5050565b600080600360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190612ed1565b5050509150506305f5e10081610db69190612f37565b91505090565b600080610dc7611b82565b90506001600160a01b038116610ddf57600091505090565b6001600160a01b03166000908152601b6020526040902054919050565b600c54600081815260166020526040812054909160089060048110610e2357610e23612e6b565b0154610e2f9190612f65565b905090565b6060600082118015610e485750601c548211155b610e895760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f704e2076616c756560701b6044820152606401610baf565b60008267ffffffffffffffff811115610ea457610ea4612f7c565b604051908082528060200260200182016040528015610ecd578160200160208202803683370190505b50905060008367ffffffffffffffff811115610eeb57610eeb612f7c565b604051908082528060200260200182016040528015610f14578160200160208202803683370190505b50905060005b84811015610ff257601c8181548110610f3557610f35612e6b565b9060005260206000200160009054906101000a90046001600160a01b0316838281518110610f6557610f65612e6b565b60200260200101906001600160a01b031690816001600160a01b031681525050601b6000601c8381548110610f9c57610f9c612e6b565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610fd557610fd5612e6b565b602090810291909101015280610fea81612e99565b915050610f1a565b506000611000600286612f92565b90505b80156110315761101f8284611019600185612f65565b88612a56565b8061102981612fa6565b915050611003565b50835b601c54811015611139576000601b6000601c848154811061105757611057612e6b565b60009182526020808320909101546001600160a01b03168352820192909252604001812054845190925084919061109057611090612e6b565b60200260200101518111156111265780836000815181106110b3576110b3612e6b565b602002602001018181525050601c82815481106110d2576110d2612e6b565b600091825260208220015485516001600160a01b039091169186916110f9576110f9612e6b565b60200260200101906001600160a01b031690816001600160a01b0316815250506111268385600089612a56565b508061113181612e99565b915050611034565b506000611147600186612f65565b90505b801561125c5781818151811061116257611162612e6b565b60200260200101518260008151811061117d5761117d612e6b565b60200260200101518360008151811061119857611198612e6b565b602002602001018484815181106111b1576111b1612e6b565b60200260200101828152508281525050508281815181106111d4576111d4612e6b565b6020026020010151836000815181106111ef576111ef612e6b565b60200260200101518460008151811061120a5761120a612e6b565b6020026020010185848151811061122357611223612e6b565b6001600160a01b0393841660209182029290920101529116905261124a8284600084612a56565b8061125481612fa6565b91505061114a565b50909392505050565b600081611274620668a0611510565b61127e9190612e4c565b92915050565b61128c61253e565b600c54600090815260186020908152604080832033808552925282205490916112b482611738565b9050600060646112c5601482612f65565b6112cf9084612e4c565b6112d99190612f92565b90506000831161133c5760405162461bcd60e51b815260206004820152602860248201527f596f752068617665206e6f74206465706f73697465642045544820696e2074686044820152671a5cc81c9bdd5b9960c21b6064820152608401610baf565b33600090815260106020526040812080549161135783612e99565b919050555082600d600082825461136e9190612f65565b9091555050600c5460009081526016602052604081208054859290611394908490612f65565b9091555050600c5460009081526018602090815260408083206001600160a01b0388168452909152812080548592906113ce908490612f65565b90915550506001600160a01b038416600090815260156020526040812080548592906113fb908490612f65565b90915550506001600160a01b03841660009081526017602052604081208054849290611428908490612f65565b90915550506040516000906001600160a01b0386169083908381818185875af1925050503d8060008114611478576040519150601f19603f3d011682016040523d82523d6000602084013e61147d565b606091505b505090508061149e5760405162461bcd60e51b8152600401610baf90612fbd565b60405184906001600160a01b038716907fb94c59e5f451678a47808bbdbce1a8d09619d3f2b545399e8870820292834e4390600090a350505050506114e260018055565b565b6000816112746208b290611510565b6114fb6124e4565b6114e26000612c20565b600080610dc7611dcb565b60008061151b610d26565b905060008161153185662386f26fc10000612e4c565b61153b9190612f92565b949350505050565b33301461159e5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920636f6e74726163742063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608401610baf565b6003600c54146115e75760405162461bcd60e51b8152602060048201526014602482015273141c995cd85b19481b9bdd08199a5b9a5cda195960621b6044820152606401610baf565b60025447906001600160a01b0316635e9352978261160862679a9c82612f65565b6040518363ffffffff1660e01b815260040161162691815260200190565b6000604051808303818588803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050505050565b61166361253e565b610d198261167084611754565b60146040518060400160405280600681526020016548656361746560d01b81525085612597565b61169f61253e565b6116a76124e4565b306001600160a01b0316637745b6b46040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e257600080fd5b505af19250505080156116f3575060015b61170557601f805460ff191660011790555b6114e260018055565b601d818154811061171e57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061174c670de0b6b3a764000083612f92565b611274611794565b60008161127462035b60611510565b600081611274620bbfd0611510565b600080610dc76124b6565b6004816004811061178d57600080fd5b0154905081565b6000610e2f6004600c54600481106117ae576117ae612e6b565b0154611510565b6008816004811061178d57600080fd5b6117cd61253e565b610d19826117da846114e4565b6011604051806040016040528060068152602001652a3934ba37b760d11b81525085612597565b61180961253e565b6002546040805163fdc61dd160e01b815290516000926001600160a01b03169163fdc61dd19160048083019260209291908290030181865afa158015611853573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118779190612fe6565b6001600160a01b0316036118c55760405162461bcd60e51b815260206004820152601560248201527410dbda5b881b9bdd0819195c1b1bde5959081e595d605a1b6044820152606401610baf565b33600090815260156020526040902054806119165760405162461bcd60e51b8152602060048201526011602482015270139bc81d1bdad95b9cc81d1bc81b5a5b9d607a1b6044820152606401610baf565b33600090815260106020526040812080549161193183612e99565b909155505033600081815260156020526040808220919091556002549051633c37699760e21b81526004810192909252602482018390526001600160a01b03169063f0dda65c90604401600060405180830381600087803b15801561199557600080fd5b505af11580156119a9573d6000803e3d6000fd5b50505050506114e260018055565b6119bf61253e565b610d19826119cc84611265565b60136040518060400160405280600381526020016209cf2f60eb1b81525085612597565b60196020528160005260406000208181548110611a0c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b611a306124e4565b601f5460ff16611a825760405162461bcd60e51b815260206004820181905260248201527f456d657267656e6379207769746864726177206973206e6f74206163746976656044820152606401610baf565b4780611ac75760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b6044820152606401610baf565b60106000611add6000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120805491611b0483612e99565b9091555050600080546040516001600160a01b03909116906207a12090849084818181858888f193505050503d8060008114611b5c576040519150601f19603f3d011682016040523d82523d6000602084013e611b61565b606091505b5050905080610d225760405162461bcd60e51b8152600401610baf90612fbd565b601c5460009060031115611b965750600090565b611ba06003610e34565b600281518110611bb257611bb2612e6b565b6020026020010151905090565b611bc761253e565b62eff100600f54611bd89190612e81565b4211611c265760405162461bcd60e51b815260206004820152601d60248201527f476c6f62616c2074696d6572206973206e6f7420656e646564207965740000006044820152606401610baf565b33600081815260176020526040812054906064611c44601482612f65565b611c4e9084612e4c565b611c589190612f92565b905060008211611cb85760405162461bcd60e51b815260206004820152602560248201527f596f752068617665206e6f2045544820617661696c61626c6520746f20776974604482015264686472617760d81b6064820152608401610baf565b336000908152601060205260408120805491611cd383612e99565b9091555050600c5460009081526018602090815260408083206001600160a01b0387168085529083528184208490556015835281842084905560179092528083208390555183908381818185875af1925050503d8060008114611d52576040519150601f19603f3d011682016040523d82523d6000602084013e611d57565b606091505b5050905080611d785760405162461bcd60e51b8152600401610baf90612fbd565b60405182906001600160a01b038616907fb94c59e5f451678a47808bbdbce1a8d09619d3f2b545399e8870820292834e4390600090a3505050506114e260018055565b601c818154811061171e57600080fd5b601c5460009060021115611ddf5750600090565b611de96002610e34565b600181518110611bb257611bb2612e6b565b611e036124e4565b6001600160a01b038116611e685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610baf565b611e7181612c20565b50565b611e7c61253e565b6000611e8783611738565b905060006064611e98601484612e4c565b611ea29190612f92565b905060008080611eb28486612f65565b905060008711611f045760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610baf565b611f1a670de0b6b3a76400006302625a00612e4c565b87600d54611f289190612e81565b1115611f765760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746f74616c20746f6b656e20737570706c790000000000006044820152606401610baf565b843414611fba5760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c9958dd08115512081cd95b9d60721b6044820152606401610baf565b336000908152601060205260408120805491611fd583612e99565b90915550506001600160a01b0386161580159061200a57506001600160a01b0386166000908152601e602052604090205460ff165b1561204e57606461201c600a83612e4c565b6120269190612f92565b91506120328282612f65565b90506064612041600a83612e4c565b61204b9190612f92565b92505b336000908152601560205260408120805489929061206d908490612e81565b9091555050600c5460009081526016602052604081208054899290612093908490612e81565b9091555050600c546000908152601860209081526040808320338452909152812080548992906120c4908490612e81565b909155505033600090815260176020526040812080543492906120e8908490612e81565b9091555050336000908152601b60205260408120805434929061210c908490612e81565b9091555061211b905087612c70565b601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319163317905561216e6000546001600160a01b031690565b6001600160a01b03168560405160006040518083038185875af1925050503d80600081146121b8576040519150601f19603f3d011682016040523d82523d6000602084013e6121bd565b606091505b50509050806122085760405162461bcd60e51b8152602060048201526017602482015276151c985b9cd9995c881d1bc81d19585b4819985a5b1959604a1b6044820152606401610baf565b604051600090309084908381818185875af1925050503d806000811461224a576040519150601f19603f3d011682016040523d82523d6000602084013e61224f565b606091505b50509050806122a05760405162461bcd60e51b815260206004820152601b60248201527f5472616e7366657220746f20636f6e7472616374206661696c656400000000006044820152606401610baf565b831561233a57604051600090339086908381818185875af1925050503d80600081146122e8576040519150601f19603f3d011682016040523d82523d6000602084013e6122ed565b606091505b50509050806123385760405162461bcd60e51b81526020600482015260176024820152761499599d5b99081d1bc81cd95b99195c8819985a5b1959604a1b6044820152606401610baf565b505b60405134908a9033907f3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee61790600090a450505050505050610d2260018055565b6123816124e4565b6001600160a01b0381166123c95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610baf565b6001600160a01b0381166000908152601e602052604090205460ff161561242a5760405162461bcd60e51b815260206004820152601560248201527410591d9a5cdbdc88185b1c9958591e481859191959605a1b6044820152606401610baf565b6001600160a01b0381166000818152601e6020526040808220805460ff19166001908117909155601d8054918201815583527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b03191684179055517f750baf29cae521cdaad55df39e53298f98cc651ff7462166004f4d6df4e3aa499190a250565b601c5460009081036124c85750600090565b6124d26001610e34565b600081518110611bb257611bb2612e6b565b6000546001600160a01b031633146114e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610baf565b6002600154036125905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610baf565b6002600155565b600085116125e75760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610baf565b83341461262b5760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c9958dd08115512081cd95b9d60721b6044820152606401610baf565b33600090815260106020526040812080549161264683612e99565b909155508490506000806001600160a01b0384161580159061268057506001600160a01b0384166000908152601e602052604090205460ff165b156126d3576064612692600a89612e4c565b61269c9190612f92565b905060646126ab600a89612e4c565b6126b59190612f92565b9150816126c28289612f65565b6126cc9190612f65565b9250612751565b6001600160a01b0384161580159061270457506001600160a01b0384166000908152601e602052604090205460ff16155b156127515760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642061647669736f7220616464726573730000000000000000006044820152606401610baf565b33600090815260208790526040812080548a9290612770908490612e81565b90915550503360009081526017602052604081208054349290612794908490612e81565b9250508190555034600e60008282546127ad9190612e81565b9091555050336000908152601b6020526040812080543492906127d1908490612e81565b9091555050601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b031916331790556128296000546001600160a01b031690565b6001600160a01b03168460405160006040518083038185875af1925050503d8060008114612873576040519150601f19603f3d011682016040523d82523d6000602084013e612878565b606091505b50509050806128c35760405162461bcd60e51b8152602060048201526017602482015276151c985b9cd9995c881d1bc81d19585b4819985a5b1959604a1b6044820152606401610baf565b821561296e576000856001600160a01b03168460405160006040518083038185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b505090508061296c5760405162461bcd60e51b815260206004820152601a60248201527f5472616e7366657220746f2061647669736f72206661696c65640000000000006044820152606401610baf565b505b8115612a0857604051600090339084908381818185875af1925050503d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b5050905080612a065760405162461bcd60e51b81526020600482015260176024820152761499599d5b99081d1bc81cd95b99195c8819985a5b1959604a1b6044820152606401610baf565b505b3489336001600160a01b03167fb9f9b5dbd785c981fe440f66a245e5fbf580a67f965da5fa353e63bb37d5368589604051612a439190613003565b60405180910390a4505050505050505050565b6000612a63836002612e4c565b612a6e906001612e81565b90506000612a7d846002612e4c565b612a88906002612e81565b9050838383108015612acb5750868181518110612aa757612aa7612e6b565b6020026020010151878481518110612ac157612ac1612e6b565b6020026020010151105b15612ad35750815b8382108015612b135750868181518110612aef57612aef612e6b565b6020026020010151878381518110612b0957612b09612e6b565b6020026020010151105b15612b1b5750805b848114612c1757868181518110612b3457612b34612e6b565b6020026020010151878681518110612b4e57612b4e612e6b565b6020026020010151888781518110612b6857612b68612e6b565b60200260200101898481518110612b8157612b81612e6b565b6020026020010182815250828152505050858181518110612ba457612ba4612e6b565b6020026020010151868681518110612bbe57612bbe612e6b565b6020026020010151878781518110612bd857612bd8612e6b565b60200260200101888481518110612bf157612bf1612e6b565b6001600160a01b03938416602091820292909201015291169052612c1787878387612a56565b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612c7a610dfc565b9050818110612ca05781600d6000828254612c959190612e81565b90915550610d229050565b6000612cac8284612f65565b905081600d6000828254612cc09190612e81565b9091555050600c5460031115612d1f57600c8054906000612ce083612e99565b9091555050600c546040517f023811fd72d20a3eb734785eed809172b5c9c24019d493039c70ef9c276d4d9790600090a2612d1a81612c70565b505050565b80600d6000828254612d319190612e81565b9091555050505050565b6001600160a01b0381168114611e7157600080fd5b600060208284031215612d6257600080fd5b8135612d6d81612d3b565b9392505050565b60008060408385031215612d8757600080fd5b823591506020830135612d9981612d3b565b809150509250929050565b600060208284031215612db657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612dfe5783516001600160a01b031683529284019291840191600101612dd9565b50909695505050505050565b60008060408385031215612e1d57600080fd5b8235612e2881612d3b565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612e6657612e66612e36565b500290565b634e487b7160e01b600052603260045260246000fd5b60008219821115612e9457612e94612e36565b500190565b600060018201612eab57612eab612e36565b5060010190565b805169ffffffffffffffffffff81168114612ecc57600080fd5b919050565b600080600080600060a08688031215612ee957600080fd5b612ef286612eb2565b9450602086015193506040860151925060608601519150612f1560808701612eb2565b90509295509295909350565b634e487b7160e01b600052601260045260246000fd5b600082612f4657612f46612f21565b600160ff1b821460001984141615612f6057612f60612e36565b500590565b600082821015612f7757612f77612e36565b500390565b634e487b7160e01b600052604160045260246000fd5b600082612fa157612fa1612f21565b500490565b600081612fb557612fb5612e36565b506000190190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b600060208284031215612ff857600080fd5b8151612d6d81612d3b565b600060208083528351808285015260005b8181101561303057858101830151858201604001528201613014565b81811115613042576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220146ccdac3e7236cefd5185910cccd65c9f74919cd2a6b07d43b016b80d9b5d0664736f6c634300080f00330000000000000000000000009b027d11717f68b55424a9bf4461933062e07ddb

Deployed Bytecode

0x6080604052600436106103b75760003560e01c80639685ee95116101f0578063cb8d36231161010c578063f196f824116100a5578063f3f11bc311610077578063f3f11bc314610aa8578063f46c858a14610abb578063f89c0fcc14610adb578063fe9edf2e14610af0578063ff5d2a5714610b1d57005b8063f196f82414610a33578063f1b32ad614610a53578063f2840e0214610a68578063f2fde38b14610a8857005b8063db2e21bc116100de578063db2e21bc146109f4578063e1211c4b14610a09578063e451968414610a1e578063eb3690e91461084457005b8063cb8d362314610995578063cdbc760d146109aa578063cfd74cde146109c1578063d1172ea6146109d457005b8063b1af52b111610189578063b6e3a20b1161015b578063b6e3a20b146108f3578063b6ec022114610920578063bd9690ea14610935578063c2b1f60314610955578063c5b0766b1461096857005b8063b1af52b114610879578063b3b427b7146108b1578063b4ac62c5146108c7578063b551b6dc146108dc57005b8063a4b4b771116101c2578063a4b4b77114610802578063a8949b4614610817578063ae06cfd314610844578063b0c1389c1461085957005b80639685ee9514610775578063978cc0d5146107955780639c4a84db146107c25780639d02a9ed146107e257005b80635a9e426b116102df5780637bbf71791161027857806384d9390a1161024a57806384d9390a146106e257806387c13943146106f75780638b048f911461070c5780638da5cb5b146107235780638f3e1e7a1461075557005b80637bbf7179146106635780637cfbc1bd146106765780637ecebe001461068b5780638170823e146106b857005b806372ee14c6116102b157806372ee14c614610603578063757ae291146106185780637714a7e21461062e5780637745b6b41461064e57005b80635a9e426b146105a3578063639e0aaa146105b85780636cc1fa96146105d8578063715018a6146105ee57005b80632e0f26251161035157806344a4062f1161032357806344a4062f1461052857806346fcf18a1461053f5780634730864c1461056c5780634c0318901461058357005b80632e0f2625146104b5578063323a3762146104d157806333bd034d146104e657806343974411146104fb57005b80630eeccb841161038a5780630eeccb84146104585780631398bbf71461047857806322bd6bc21461048d57806326c84cc4146104a057005b80622b55fd146103c057806303fac1061461040057806304f8722e146104165780630b7abf771461044357005b366103be57005b005b3480156103cc57600080fd5b506103ed6103db366004612d50565b60146020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561040c57600080fd5b506103ed600c5481565b34801561042257600080fd5b506103ed610431366004612d50565b60176020526000908152604090205481565b34801561044f57600080fd5b506103ed610b4a565b34801561046457600080fd5b506103be610473366004612d50565b610b63565b34801561048457600080fd5b506103ed610c5d565b6103be61049b366004612d74565b610cdb565b3480156104ac57600080fd5b506103ed610d26565b3480156104c157600080fd5b506103ed670de0b6b3a764000081565b3480156104dd57600080fd5b506103ed610dbc565b3480156104f257600080fd5b506103ed610dfc565b34801561050757600080fd5b5061051b610516366004612da4565b610e34565b6040516103f79190612dbd565b34801561053457600080fd5b506103ed62eff10081565b34801561054b57600080fd5b506103ed61055a366004612d50565b60136020526000908152604090205481565b34801561057857600080fd5b506103ed62035b6081565b34801561058f57600080fd5b506103ed61059e366004612da4565b611265565b3480156105af57600080fd5b506103be611284565b3480156105c457600080fd5b506103ed6105d3366004612da4565b6114e4565b3480156105e457600080fd5b506103ed600d5481565b3480156105fa57600080fd5b506103be6114f3565b34801561060f57600080fd5b506103ed611505565b34801561062457600080fd5b506103ed600e5481565b34801561063a57600080fd5b506103ed610649366004612da4565b611510565b34801561065a57600080fd5b506103be611543565b6103be610671366004612d74565b61165b565b34801561068257600080fd5b506103be611697565b34801561069757600080fd5b506103ed6106a6366004612d50565b60106020526000908152604090205481565b3480156106c457600080fd5b50601f546106d29060ff1681565b60405190151581526020016103f7565b3480156106ee57600080fd5b506103ed601481565b34801561070357600080fd5b506103ed606481565b34801561071857600080fd5b506103ed620668a081565b34801561072f57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103f7565b34801561076157600080fd5b5061073d610770366004612da4565b61170e565b34801561078157600080fd5b506103ed610790366004612da4565b611738565b3480156107a157600080fd5b506103ed6107b0366004612d50565b60156020526000908152604090205481565b3480156107ce57600080fd5b506103ed6107dd366004612da4565b611754565b3480156107ee57600080fd5b506103ed6107fd366004612da4565b611763565b34801561080e57600080fd5b506103ed611772565b34801561082357600080fd5b506103ed610832366004612d50565b601b6020526000908152604090205481565b34801561085057600080fd5b506103ed600a81565b34801561086557600080fd5b506103ed610874366004612da4565b61177d565b34801561088557600080fd5b506103ed610894366004612d74565b601860209081526000928352604080842090915290825290205481565b3480156108bd57600080fd5b506103ed600f5481565b3480156108d357600080fd5b506103ed600381565b3480156108e857600080fd5b506103ed6208b29081565b3480156108ff57600080fd5b506103ed61090e366004612d50565b601a6020526000908152604090205481565b34801561092c57600080fd5b506103ed611794565b34801561094157600080fd5b506103ed610950366004612da4565b6117b5565b6103be610963366004612d74565b6117c5565b34801561097457600080fd5b506103ed610983366004612d50565b60126020526000908152604090205481565b3480156109a157600080fd5b506103be611801565b3480156109b657600080fd5b506103ed620bbfd081565b6103be6109cf366004612d74565b6119b7565b3480156109e057600080fd5b5061073d6109ef366004612e0a565b6119f0565b348015610a0057600080fd5b506103be611a28565b348015610a1557600080fd5b5061073d611b82565b348015610a2a57600080fd5b506103be611bbf565b348015610a3f57600080fd5b5061073d610a4e366004612da4565b611dbb565b348015610a5f57600080fd5b5061073d611dcb565b348015610a7457600080fd5b5060025461073d906001600160a01b031681565b348015610a9457600080fd5b506103be610aa3366004612d50565b611dfb565b6103be610ab6366004612d74565b611e74565b348015610ac757600080fd5b506103be610ad6366004612d50565b612379565b348015610ae757600080fd5b5061073d6124b6565b348015610afc57600080fd5b506103ed610b0b366004612da4565b60166020526000908152604090205481565b348015610b2957600080fd5b506103ed610b38366004612d50565b60116020526000908152604090205481565b610b60670de0b6b3a76400006302625a00612e4c565b81565b610b6b6124e4565b6001600160a01b038116610bb85760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b6001600160a01b0381166000908152601e602052604090205460ff16610c145760405162461bcd60e51b815260206004820152601160248201527010591d9a5cdbdc881b9bdd08199bdd5b99607a1b6044820152606401610baf565b6001600160a01b0381166000818152601e6020526040808220805460ff19169055517fd4a6ffced9053f299bd4faabab08c87e208109894dd8437522c15f656a73ffc89190a250565b600080610c6e601c80549050610e34565b905060005b8151811015610cd257336001600160a01b0316828281518110610c9857610c98612e6b565b60200260200101516001600160a01b031603610cc057610cb9816001612e81565b9250505090565b80610cca81612e99565b915050610c73565b50600091505090565b610ce361253e565b610d1982610cf084611763565b601260405180604001604052806008815260200167243cb832b934b7b760c11b81525085612597565b610d2260018055565b5050565b600080600360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190612ed1565b5050509150506305f5e10081610db69190612f37565b91505090565b600080610dc7611b82565b90506001600160a01b038116610ddf57600091505090565b6001600160a01b03166000908152601b6020526040902054919050565b600c54600081815260166020526040812054909160089060048110610e2357610e23612e6b565b0154610e2f9190612f65565b905090565b6060600082118015610e485750601c548211155b610e895760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f704e2076616c756560701b6044820152606401610baf565b60008267ffffffffffffffff811115610ea457610ea4612f7c565b604051908082528060200260200182016040528015610ecd578160200160208202803683370190505b50905060008367ffffffffffffffff811115610eeb57610eeb612f7c565b604051908082528060200260200182016040528015610f14578160200160208202803683370190505b50905060005b84811015610ff257601c8181548110610f3557610f35612e6b565b9060005260206000200160009054906101000a90046001600160a01b0316838281518110610f6557610f65612e6b565b60200260200101906001600160a01b031690816001600160a01b031681525050601b6000601c8381548110610f9c57610f9c612e6b565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610fd557610fd5612e6b565b602090810291909101015280610fea81612e99565b915050610f1a565b506000611000600286612f92565b90505b80156110315761101f8284611019600185612f65565b88612a56565b8061102981612fa6565b915050611003565b50835b601c54811015611139576000601b6000601c848154811061105757611057612e6b565b60009182526020808320909101546001600160a01b03168352820192909252604001812054845190925084919061109057611090612e6b565b60200260200101518111156111265780836000815181106110b3576110b3612e6b565b602002602001018181525050601c82815481106110d2576110d2612e6b565b600091825260208220015485516001600160a01b039091169186916110f9576110f9612e6b565b60200260200101906001600160a01b031690816001600160a01b0316815250506111268385600089612a56565b508061113181612e99565b915050611034565b506000611147600186612f65565b90505b801561125c5781818151811061116257611162612e6b565b60200260200101518260008151811061117d5761117d612e6b565b60200260200101518360008151811061119857611198612e6b565b602002602001018484815181106111b1576111b1612e6b565b60200260200101828152508281525050508281815181106111d4576111d4612e6b565b6020026020010151836000815181106111ef576111ef612e6b565b60200260200101518460008151811061120a5761120a612e6b565b6020026020010185848151811061122357611223612e6b565b6001600160a01b0393841660209182029290920101529116905261124a8284600084612a56565b8061125481612fa6565b91505061114a565b50909392505050565b600081611274620668a0611510565b61127e9190612e4c565b92915050565b61128c61253e565b600c54600090815260186020908152604080832033808552925282205490916112b482611738565b9050600060646112c5601482612f65565b6112cf9084612e4c565b6112d99190612f92565b90506000831161133c5760405162461bcd60e51b815260206004820152602860248201527f596f752068617665206e6f74206465706f73697465642045544820696e2074686044820152671a5cc81c9bdd5b9960c21b6064820152608401610baf565b33600090815260106020526040812080549161135783612e99565b919050555082600d600082825461136e9190612f65565b9091555050600c5460009081526016602052604081208054859290611394908490612f65565b9091555050600c5460009081526018602090815260408083206001600160a01b0388168452909152812080548592906113ce908490612f65565b90915550506001600160a01b038416600090815260156020526040812080548592906113fb908490612f65565b90915550506001600160a01b03841660009081526017602052604081208054849290611428908490612f65565b90915550506040516000906001600160a01b0386169083908381818185875af1925050503d8060008114611478576040519150601f19603f3d011682016040523d82523d6000602084013e61147d565b606091505b505090508061149e5760405162461bcd60e51b8152600401610baf90612fbd565b60405184906001600160a01b038716907fb94c59e5f451678a47808bbdbce1a8d09619d3f2b545399e8870820292834e4390600090a350505050506114e260018055565b565b6000816112746208b290611510565b6114fb6124e4565b6114e26000612c20565b600080610dc7611dcb565b60008061151b610d26565b905060008161153185662386f26fc10000612e4c565b61153b9190612f92565b949350505050565b33301461159e5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920636f6e74726163742063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608401610baf565b6003600c54146115e75760405162461bcd60e51b8152602060048201526014602482015273141c995cd85b19481b9bdd08199a5b9a5cda195960621b6044820152606401610baf565b60025447906001600160a01b0316635e9352978261160862679a9c82612f65565b6040518363ffffffff1660e01b815260040161162691815260200190565b6000604051808303818588803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050505050565b61166361253e565b610d198261167084611754565b60146040518060400160405280600681526020016548656361746560d01b81525085612597565b61169f61253e565b6116a76124e4565b306001600160a01b0316637745b6b46040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e257600080fd5b505af19250505080156116f3575060015b61170557601f805460ff191660011790555b6114e260018055565b601d818154811061171e57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061174c670de0b6b3a764000083612f92565b611274611794565b60008161127462035b60611510565b600081611274620bbfd0611510565b600080610dc76124b6565b6004816004811061178d57600080fd5b0154905081565b6000610e2f6004600c54600481106117ae576117ae612e6b565b0154611510565b6008816004811061178d57600080fd5b6117cd61253e565b610d19826117da846114e4565b6011604051806040016040528060068152602001652a3934ba37b760d11b81525085612597565b61180961253e565b6002546040805163fdc61dd160e01b815290516000926001600160a01b03169163fdc61dd19160048083019260209291908290030181865afa158015611853573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118779190612fe6565b6001600160a01b0316036118c55760405162461bcd60e51b815260206004820152601560248201527410dbda5b881b9bdd0819195c1b1bde5959081e595d605a1b6044820152606401610baf565b33600090815260156020526040902054806119165760405162461bcd60e51b8152602060048201526011602482015270139bc81d1bdad95b9cc81d1bc81b5a5b9d607a1b6044820152606401610baf565b33600090815260106020526040812080549161193183612e99565b909155505033600081815260156020526040808220919091556002549051633c37699760e21b81526004810192909252602482018390526001600160a01b03169063f0dda65c90604401600060405180830381600087803b15801561199557600080fd5b505af11580156119a9573d6000803e3d6000fd5b50505050506114e260018055565b6119bf61253e565b610d19826119cc84611265565b60136040518060400160405280600381526020016209cf2f60eb1b81525085612597565b60196020528160005260406000208181548110611a0c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b611a306124e4565b601f5460ff16611a825760405162461bcd60e51b815260206004820181905260248201527f456d657267656e6379207769746864726177206973206e6f74206163746976656044820152606401610baf565b4780611ac75760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b6044820152606401610baf565b60106000611add6000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120805491611b0483612e99565b9091555050600080546040516001600160a01b03909116906207a12090849084818181858888f193505050503d8060008114611b5c576040519150601f19603f3d011682016040523d82523d6000602084013e611b61565b606091505b5050905080610d225760405162461bcd60e51b8152600401610baf90612fbd565b601c5460009060031115611b965750600090565b611ba06003610e34565b600281518110611bb257611bb2612e6b565b6020026020010151905090565b611bc761253e565b62eff100600f54611bd89190612e81565b4211611c265760405162461bcd60e51b815260206004820152601d60248201527f476c6f62616c2074696d6572206973206e6f7420656e646564207965740000006044820152606401610baf565b33600081815260176020526040812054906064611c44601482612f65565b611c4e9084612e4c565b611c589190612f92565b905060008211611cb85760405162461bcd60e51b815260206004820152602560248201527f596f752068617665206e6f2045544820617661696c61626c6520746f20776974604482015264686472617760d81b6064820152608401610baf565b336000908152601060205260408120805491611cd383612e99565b9091555050600c5460009081526018602090815260408083206001600160a01b0387168085529083528184208490556015835281842084905560179092528083208390555183908381818185875af1925050503d8060008114611d52576040519150601f19603f3d011682016040523d82523d6000602084013e611d57565b606091505b5050905080611d785760405162461bcd60e51b8152600401610baf90612fbd565b60405182906001600160a01b038616907fb94c59e5f451678a47808bbdbce1a8d09619d3f2b545399e8870820292834e4390600090a3505050506114e260018055565b601c818154811061171e57600080fd5b601c5460009060021115611ddf5750600090565b611de96002610e34565b600181518110611bb257611bb2612e6b565b611e036124e4565b6001600160a01b038116611e685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610baf565b611e7181612c20565b50565b611e7c61253e565b6000611e8783611738565b905060006064611e98601484612e4c565b611ea29190612f92565b905060008080611eb28486612f65565b905060008711611f045760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610baf565b611f1a670de0b6b3a76400006302625a00612e4c565b87600d54611f289190612e81565b1115611f765760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746f74616c20746f6b656e20737570706c790000000000006044820152606401610baf565b843414611fba5760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c9958dd08115512081cd95b9d60721b6044820152606401610baf565b336000908152601060205260408120805491611fd583612e99565b90915550506001600160a01b0386161580159061200a57506001600160a01b0386166000908152601e602052604090205460ff165b1561204e57606461201c600a83612e4c565b6120269190612f92565b91506120328282612f65565b90506064612041600a83612e4c565b61204b9190612f92565b92505b336000908152601560205260408120805489929061206d908490612e81565b9091555050600c5460009081526016602052604081208054899290612093908490612e81565b9091555050600c546000908152601860209081526040808320338452909152812080548992906120c4908490612e81565b909155505033600090815260176020526040812080543492906120e8908490612e81565b9091555050336000908152601b60205260408120805434929061210c908490612e81565b9091555061211b905087612c70565b601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319163317905561216e6000546001600160a01b031690565b6001600160a01b03168560405160006040518083038185875af1925050503d80600081146121b8576040519150601f19603f3d011682016040523d82523d6000602084013e6121bd565b606091505b50509050806122085760405162461bcd60e51b8152602060048201526017602482015276151c985b9cd9995c881d1bc81d19585b4819985a5b1959604a1b6044820152606401610baf565b604051600090309084908381818185875af1925050503d806000811461224a576040519150601f19603f3d011682016040523d82523d6000602084013e61224f565b606091505b50509050806122a05760405162461bcd60e51b815260206004820152601b60248201527f5472616e7366657220746f20636f6e7472616374206661696c656400000000006044820152606401610baf565b831561233a57604051600090339086908381818185875af1925050503d80600081146122e8576040519150601f19603f3d011682016040523d82523d6000602084013e6122ed565b606091505b50509050806123385760405162461bcd60e51b81526020600482015260176024820152761499599d5b99081d1bc81cd95b99195c8819985a5b1959604a1b6044820152606401610baf565b505b60405134908a9033907f3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee61790600090a450505050505050610d2260018055565b6123816124e4565b6001600160a01b0381166123c95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610baf565b6001600160a01b0381166000908152601e602052604090205460ff161561242a5760405162461bcd60e51b815260206004820152601560248201527410591d9a5cdbdc88185b1c9958591e481859191959605a1b6044820152606401610baf565b6001600160a01b0381166000818152601e6020526040808220805460ff19166001908117909155601d8054918201815583527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b03191684179055517f750baf29cae521cdaad55df39e53298f98cc651ff7462166004f4d6df4e3aa499190a250565b601c5460009081036124c85750600090565b6124d26001610e34565b600081518110611bb257611bb2612e6b565b6000546001600160a01b031633146114e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610baf565b6002600154036125905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610baf565b6002600155565b600085116125e75760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610baf565b83341461262b5760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c9958dd08115512081cd95b9d60721b6044820152606401610baf565b33600090815260106020526040812080549161264683612e99565b909155508490506000806001600160a01b0384161580159061268057506001600160a01b0384166000908152601e602052604090205460ff165b156126d3576064612692600a89612e4c565b61269c9190612f92565b905060646126ab600a89612e4c565b6126b59190612f92565b9150816126c28289612f65565b6126cc9190612f65565b9250612751565b6001600160a01b0384161580159061270457506001600160a01b0384166000908152601e602052604090205460ff16155b156127515760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642061647669736f7220616464726573730000000000000000006044820152606401610baf565b33600090815260208790526040812080548a9290612770908490612e81565b90915550503360009081526017602052604081208054349290612794908490612e81565b9250508190555034600e60008282546127ad9190612e81565b9091555050336000908152601b6020526040812080543492906127d1908490612e81565b9091555050601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b031916331790556128296000546001600160a01b031690565b6001600160a01b03168460405160006040518083038185875af1925050503d8060008114612873576040519150601f19603f3d011682016040523d82523d6000602084013e612878565b606091505b50509050806128c35760405162461bcd60e51b8152602060048201526017602482015276151c985b9cd9995c881d1bc81d19585b4819985a5b1959604a1b6044820152606401610baf565b821561296e576000856001600160a01b03168460405160006040518083038185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b505090508061296c5760405162461bcd60e51b815260206004820152601a60248201527f5472616e7366657220746f2061647669736f72206661696c65640000000000006044820152606401610baf565b505b8115612a0857604051600090339084908381818185875af1925050503d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b5050905080612a065760405162461bcd60e51b81526020600482015260176024820152761499599d5b99081d1bc81cd95b99195c8819985a5b1959604a1b6044820152606401610baf565b505b3489336001600160a01b03167fb9f9b5dbd785c981fe440f66a245e5fbf580a67f965da5fa353e63bb37d5368589604051612a439190613003565b60405180910390a4505050505050505050565b6000612a63836002612e4c565b612a6e906001612e81565b90506000612a7d846002612e4c565b612a88906002612e81565b9050838383108015612acb5750868181518110612aa757612aa7612e6b565b6020026020010151878481518110612ac157612ac1612e6b565b6020026020010151105b15612ad35750815b8382108015612b135750868181518110612aef57612aef612e6b565b6020026020010151878381518110612b0957612b09612e6b565b6020026020010151105b15612b1b5750805b848114612c1757868181518110612b3457612b34612e6b565b6020026020010151878681518110612b4e57612b4e612e6b565b6020026020010151888781518110612b6857612b68612e6b565b60200260200101898481518110612b8157612b81612e6b565b6020026020010182815250828152505050858181518110612ba457612ba4612e6b565b6020026020010151868681518110612bbe57612bbe612e6b565b6020026020010151878781518110612bd857612bd8612e6b565b60200260200101888481518110612bf157612bf1612e6b565b6001600160a01b03938416602091820292909201015291169052612c1787878387612a56565b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612c7a610dfc565b9050818110612ca05781600d6000828254612c959190612e81565b90915550610d229050565b6000612cac8284612f65565b905081600d6000828254612cc09190612e81565b9091555050600c5460031115612d1f57600c8054906000612ce083612e99565b9091555050600c546040517f023811fd72d20a3eb734785eed809172b5c9c24019d493039c70ef9c276d4d9790600090a2612d1a81612c70565b505050565b80600d6000828254612d319190612e81565b9091555050505050565b6001600160a01b0381168114611e7157600080fd5b600060208284031215612d6257600080fd5b8135612d6d81612d3b565b9392505050565b60008060408385031215612d8757600080fd5b823591506020830135612d9981612d3b565b809150509250929050565b600060208284031215612db657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612dfe5783516001600160a01b031683529284019291840191600101612dd9565b50909695505050505050565b60008060408385031215612e1d57600080fd5b8235612e2881612d3b565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612e6657612e66612e36565b500290565b634e487b7160e01b600052603260045260246000fd5b60008219821115612e9457612e94612e36565b500190565b600060018201612eab57612eab612e36565b5060010190565b805169ffffffffffffffffffff81168114612ecc57600080fd5b919050565b600080600080600060a08688031215612ee957600080fd5b612ef286612eb2565b9450602086015193506040860151925060608601519150612f1560808701612eb2565b90509295509295909350565b634e487b7160e01b600052601260045260246000fd5b600082612f4657612f46612f21565b600160ff1b821460001984141615612f6057612f60612e36565b500590565b600082821015612f7757612f77612e36565b500390565b634e487b7160e01b600052604160045260246000fd5b600082612fa157612fa1612f21565b500490565b600081612fb557612fb5612e36565b506000190190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b600060208284031215612ff857600080fd5b8151612d6d81612d3b565b600060208083528351808285015260005b8181101561303057858101830151858201604001528201613014565b81811115613042576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220146ccdac3e7236cefd5185910cccd65c9f74919cd2a6b07d43b016b80d9b5d0664736f6c634300080f0033

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

0000000000000000000000009b027d11717f68b55424a9bf4461933062e07ddb

-----Decoded View---------------
Arg [0] : uniswapAndCoinManager_ (address): 0x9B027d11717F68b55424a9bf4461933062e07DDB

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009b027d11717f68b55424a9bf4461933062e07ddb


Deployed Bytecode Sourcemap

12425:27915:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14959:59;;;;;;;;;;-1:-1:-1;14959:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;548:25:1;;;536:2;521:18;14959:59:0;;;;;;;;14294:32;;;;;;;;;;;;;;;;15234:58;;;;;;;;;;-1:-1:-1;15234:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;12791:54;;;;;;;;;;;;;:::i;17786:482::-;;;;;;;;;;-1:-1:-1;17786:482:0;;;;;:::i;:::-;;:::i;31247:409::-;;;;;;;;;;;;;:::i;22104:290::-;;;;;;:::i;:::-;;:::i;25091:159::-;;;;;;;;;;;;;:::i;12698:39::-;;;;;;;;;;;;12733:4;12698:39;;34426:382;;;;;;;;;;;;;:::i;35321:194::-;;;;;;;;;;;;;:::i;28557:1280::-;;;;;;;;;;-1:-1:-1;28557:1280:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13320:50::-;;;;;;;;;;;;13359:11;13320:50;;14896:56;;;;;;;;;;-1:-1:-1;14896:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;13213:49;;;;;;;;;;;;13257:5;13213:49;;24373:140;;;;;;;;;;-1:-1:-1;24373:140:0;;;;;:::i;:::-;;:::i;39348:989::-;;;;;;;;;;;;;:::i;23540:146::-;;;;;;;;;;-1:-1:-1;23540:146:0;;;;;:::i;:::-;;:::i;14369:35::-;;;;;;;;;;;;;;;;3910:103;;;;;;;;;;;;;:::i;33832:390::-;;;;;;;;;;;;;:::i;14461:44::-;;;;;;;;;;;;;;;;25483:256;;;;;;;;;;-1:-1:-1;25483:256:0;;;;;:::i;:::-;;:::i;36529:348::-;;;;;;;;;;;;;:::i;22988:282::-;;;;;;:::i;:::-;;:::i;37523:178::-;;;;;;;;;;;;;:::i;14650:41::-;;;;;;;;;;-1:-1:-1;14650:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;16703:42;;;;;;;;;;-1:-1:-1;16703:42:0;;;;;;;;;;;2097:14:1;;2090:22;2072:41;;2060:2;2045:18;16703:42:0;1932:187:1;13736:44:0;;;;;;;;;;;;13778:2;13736:44;;13821:45;;;;;;;;;;;;13863:3;13821:45;;13112:46;;;;;;;;;;;;13153:5;13112:46;;3269:87;;;;;;;;;;-1:-1:-1;3315:7:0;3342:6;-1:-1:-1;;;;;3342:6:0;3269:87;;;-1:-1:-1;;;;;2288:32:1;;;2270:51;;2258:2;2243:18;3269:87:0;2124:203:1;15842:26:0;;;;;;;;;;-1:-1:-1;15842:26:0;;;;;:::i;:::-;;:::i;28070:146::-;;;;;;;;;;-1:-1:-1;28070:146:0;;;;;:::i;:::-;;:::i;15025:50::-;;;;;;;;;;-1:-1:-1;15025:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;24783:146;;;;;;;;;;-1:-1:-1;24783:146:0;;;;;:::i;:::-;;:::i;23962:150::-;;;;;;;;;;-1:-1:-1;23962:150:0;;;;;:::i;:::-;;:::i;33287:339::-;;;;;;;;;;;;;:::i;15710:45::-;;;;;;;;;;-1:-1:-1;15710:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;13521:47;;;;;;;;;;;;13566:2;13521:47;;13920:49;;;;;;;;;;-1:-1:-1;13920:49:0;;;;;:::i;:::-;;:::i;15345:88::-;;;;;;;;;;-1:-1:-1;15345:88:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;14555:36;;;;;;;;;;;;;;;;13434:37;;;;;;;;;;;;13470:1;13434:37;;12894:49;;;;;;;;;;;;12938:5;12894:49;;15607:61;;;;;;;;;;-1:-1:-1;15607:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;34976:134;;;;;;;;;;;;;:::i;14032:255::-;;;;;;;;;;-1:-1:-1;14032:255:0;;;;;:::i;:::-;;:::i;21653:282::-;;;;;;:::i;:::-;;:::i;14828:61::-;;;;;;;;;;-1:-1:-1;14828:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;36991:411;;;;;;;;;;;;;:::i;13001:51::-;;;;;;;;;;;;13047:5;13001:51;;22553:270;;;;;;:::i;:::-;;:::i;15492:63::-;;;;;;;;;;-1:-1:-1;15492:63:0;;;;;:::i;:::-;;:::i;37811:461::-;;;;;;;;;;;;;:::i;32828:276::-;;;;;;;;;;;;;:::i;38390:835::-;;;;;;;;;;;;;:::i;15762:30::-;;;;;;;;;;-1:-1:-1;15762:30:0;;;;;:::i;:::-;;:::i;32330:278::-;;;;;;;;;;;;;:::i;12485:52::-;;;;;;;;;;-1:-1:-1;12485:52:0;;;;-1:-1:-1;;;;;12485:52:0;;;4168:201;;;;;;;;;;-1:-1:-1;4168:201:0;;;;;:::i;:::-;;:::i;25885:1941::-;;;;;;:::i;:::-;;:::i;17049:562::-;;;;;;;;;;-1:-1:-1;17049:562:0;;;;;:::i;:::-;;:::i;31855:253::-;;;;;;;;;;;;;:::i;15135:54::-;;;;;;;;;;-1:-1:-1;15135:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;14762:59;;;;;;;;;;-1:-1:-1;14762:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;12791:54;12830:15;12733:4;12830;:15;:::i;:::-;12791:54;:::o;17786:482::-;3155:13;:11;:13::i;:::-;-1:-1:-1;;;;;17864:21:0;::::1;17856:49;;;::::0;-1:-1:-1;;;17856:49:0;;3397:2:1;17856:49:0::1;::::0;::::1;3379:21:1::0;3436:2;3416:18;;;3409:30;-1:-1:-1;;;3455:18:1;;;3448:45;3510:18;;17856:49:0::1;;;;;;;;;-1:-1:-1::0;;;;;17984:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;17976:53;;;::::0;-1:-1:-1;;;17976:53:0;;3741:2:1;17976:53:0::1;::::0;::::1;3723:21:1::0;3780:2;3760:18;;;3753:30;-1:-1:-1;;;3799:18:1;;;3792:47;3856:18;;17976:53:0::1;3539:341:1::0;17976:53:0::1;-1:-1:-1::0;;;;;18091:23:0;::::1;18117:5;18091:23:::0;;;:14:::1;:23;::::0;;;;;:31;;-1:-1:-1;;18091:31:0::1;::::0;;18175:23;::::1;::::0;18117:5;18175:23:::1;17786:482:::0;:::o;31247:409::-;31292:7;31312:35;31350:40;31369:13;:20;;;;31350:18;:40::i;:::-;31312:78;;31406:9;31401:170;31425:18;:25;31421:1;:29;31401:170;;;31501:10;-1:-1:-1;;;;;31476:35:0;:18;31495:1;31476:21;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31476:35:0;;31472:88;;31539:5;:1;31543;31539:5;:::i;:::-;31532:12;;;;31247:409;:::o;31472:88::-;31452:3;;;;:::i;:::-;;;;31401:170;;;;31588:1;31581:8;;;31247:409;:::o;22104:290::-;7144:21;:19;:21::i;:::-;22204:182:::1;22236:6;22257:30;22280:6;22257:22;:30::i;:::-;22302:26;22204:182;;;;;;;;;;;;;-1:-1:-1::0;;;22204:182:0::1;;::::0;22368:7:::1;22204:17;:182::i;:::-;7188:20:::0;6582:1;7708:22;;7525:213;7188:20;22104:290;;:::o;25091:159::-;25145:3;25164:10;25184;;;;;;;;;-1:-1:-1;;;;;25184:10:0;-1:-1:-1;;;;;25184:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25161:51;;;;;;25239:3;25230:6;:12;;;;:::i;:::-;25223:19;;;25091:159;:::o;34426:382::-;34485:7;34505:23;34531:20;:18;:20::i;:::-;34505:46;-1:-1:-1;;;;;;34611:29:0;;34607:43;;34649:1;34642:8;;;34426:382;:::o;34607:43::-;-1:-1:-1;;;;;34714:27:0;;;;;:10;:27;;;;;;;34426:382;-1:-1:-1;34426:382:0:o;35321:194::-;35493:13;;35385:7;35473:34;;;:19;:34;;;;;;35385:7;;35425:17;;:32;;;;;;;:::i;:::-;;;:82;;;;:::i;:::-;35405:102;;35321:194;:::o;28557:1280::-;28620:16;28664:1;28657:4;:8;:40;;;;-1:-1:-1;28677:13:0;:20;28669:28;;;28657:40;28649:71;;;;-1:-1:-1;;;28649:71:0;;5614:2:1;28649:71:0;;;5596:21:1;5653:2;5633:18;;;5626:30;-1:-1:-1;;;5672:18:1;;;5665:48;5730:18;;28649:71:0;5412:342:1;28649:71:0;28731:32;28780:4;28766:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28766:19:0;;28731:54;;28796:27;28840:4;28826:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28826:19:0;;28796:49;;28861:9;28856:158;28880:4;28876:1;:8;28856:158;;;28927:13;28941:1;28927:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28927:16:0;28906:15;28922:1;28906:18;;;;;;;;:::i;:::-;;;;;;:37;-1:-1:-1;;;;;28906:37:0;;;-1:-1:-1;;;;;28906:37:0;;;;;28974:10;:28;28985:13;28999:1;28985:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28985:16:0;28974:28;;;;;;;;;;;;;28958:13;;:10;;28969:1;;28958:13;;;;;;:::i;:::-;;;;;;;;;;:44;28886:3;;;;:::i;:::-;;;;28856:158;;;-1:-1:-1;29029:9:0;29041:8;29048:1;29041:4;:8;:::i;:::-;29029:20;;29024:119;29051:5;;29024:119;;29078:53;29090:10;29102:15;29119:5;29123:1;29119;:5;:::i;:::-;29126:4;29078:11;:53::i;:::-;29058:3;;;;:::i;:::-;;;;29024:119;;;-1:-1:-1;29170:4:0;29153:346;29180:13;:20;29176:24;;29153:346;;;29222:13;29238:10;:28;29249:13;29263:1;29249:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29249:16:0;29238:28;;;;;;;;;;;;;29293:13;;29238:28;;-1:-1:-1;29293:10:0;;29249:16;29293:13;;;;:::i;:::-;;;;;;;29285:5;:21;29281:207;;;29343:5;29327:10;29338:1;29327:13;;;;;;;;:::i;:::-;;;;;;:21;;;;;29388:13;29402:1;29388:16;;;;;;;;:::i;:::-;;;;;;;;;;29367:18;;-1:-1:-1;;;;;29388:16:0;;;;29367:15;;:18;;;;:::i;:::-;;;;;;:37;-1:-1:-1;;;;;29367:37:0;;;-1:-1:-1;;;;;29367:37:0;;;;;29423:49;29435:10;29447:15;29464:1;29467:4;29423:11;:49::i;:::-;-1:-1:-1;29202:3:0;;;;:::i;:::-;;;;29153:346;;;-1:-1:-1;29514:9:0;29526:8;29533:1;29526:4;:8;:::i;:::-;29514:20;;29509:288;29536:5;;29509:288;;29597:10;29608:1;29597:13;;;;;;;;:::i;:::-;;;;;;;29612:10;29623:1;29612:13;;;;;;;;:::i;:::-;;;;;;;29564:10;29575:1;29564:13;;;;;;;;:::i;:::-;;;;;;29579:10;29590:1;29579:13;;;;;;;;:::i;:::-;;;;;;29563:63;;;;;;;;;;29685:15;29701:1;29685:18;;;;;;;;:::i;:::-;;;;;;;29705:15;29721:1;29705:18;;;;;;;;:::i;:::-;;;;;;;29642:15;29658:1;29642:18;;;;;;;;:::i;:::-;;;;;;29662:15;29678:1;29662:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29641:83:0;;;29662:18;;;;;;;;;29641:83;;;;;29739:46;29751:10;29763:15;29780:1;29783;29739:11;:46::i;:::-;29543:3;;;;:::i;:::-;;;;29509:288;;;-1:-1:-1;29814:15:0;;28557:1280;-1:-1:-1;;;28557:1280:0:o;24373:140::-;24437:7;24499:6;24464:32;13153:5;24464:16;:32::i;:::-;:41;;;;:::i;:::-;24457:48;24373:140;-1:-1:-1;;24373:140:0:o;39348:989::-;7144:21;:19;:21::i;:::-;39511:13:::1;::::0;39401:25:::1;39482:43:::0;;;:28:::1;:43;::::0;;;;;;;39437:10:::1;39482:54:::0;;;;;;;;39437:10;;39574:33:::1;39482:54:::0;39574:19:::1;:33::i;:::-;39547:60:::0;-1:-1:-1;39618:25:0::1;13863:3;39667:33;13778:2;13863:3:::0;39667:33:::1;:::i;:::-;39647:54;::::0;:16;:54:::1;:::i;:::-;39646:74;;;;:::i;:::-;39618:102;;39773:1;39758:12;:16;39750:69;;;::::0;-1:-1:-1;;;39750:69:0;;6359:2:1;39750:69:0::1;::::0;::::1;6341:21:1::0;6398:2;6378:18;;;6371:30;6437:34;6417:18;;;6410:62;-1:-1:-1;;;6488:18:1;;;6481:38;6536:19;;39750:69:0::1;6157:404:1::0;39750:69:0::1;39837:10;39830:18;::::0;;;:6:::1;:18;::::0;;;;:20;;;::::1;::::0;::::1;:::i;:::-;;;;;;39881:12;39861:16;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39924:13:0::1;::::0;39904:34:::1;::::0;;;:19:::1;:34;::::0;;;;:50;;39942:12;;39904:34;:50:::1;::::0;39942:12;;39904:50:::1;:::i;:::-;::::0;;;-1:-1:-1;;39994:13:0::1;::::0;39965:43:::1;::::0;;;:28:::1;:43;::::0;;;;;;;-1:-1:-1;;;;;39965:54:0;::::1;::::0;;;;;;;:70;;40023:12;;39965:43;:70:::1;::::0;40023:12;;39965:70:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;40046:26:0;::::1;;::::0;;;:15:::1;:26;::::0;;;;:42;;40076:12;;40046:26;:42:::1;::::0;40076:12;;40046:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;40099:34:0;::::1;;::::0;;;:23:::1;:34;::::0;;;;:54;;40137:16;;40099:34;:54:::1;::::0;40137:16;;40099:54:::1;:::i;:::-;::::0;;;-1:-1:-1;;40183:44:0::1;::::0;40165:12:::1;::::0;-1:-1:-1;;;;;40183:14:0;::::1;::::0;40205:17;;40165:12;40183:44;40165:12;40183:44;40205:17;40183:14;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40164:63;;;40246:7;40238:35;;;;-1:-1:-1::0;;;40238:35:0::1;;;;;;;:::i;:::-;40289:40;::::0;40316:12;;-1:-1:-1;;;;;40289:40:0;::::1;::::0;::::1;::::0;;;::::1;39390:947;;;;;7188:20:::0;6582:1;7708:22;;7525:213;7188:20;39348:989::o;23540:146::-;23607:7;23672:6;23634:35;12938:5;23634:16;:35::i;3910:103::-;3155:13;:11;:13::i;:::-;3975:30:::1;4002:1;3975:18;:30::i;33832:390::-:0;33892:7;33912:24;33939:21;:19;:21::i;25483:256::-;25556:7;25576:23;25610;:21;:23::i;:::-;25576:58;-1:-1:-1;25645:14:0;25576:58;25664:23;:16;25683:4;25664:23;:::i;:::-;25663:43;;;;:::i;:::-;25645:62;25483:256;-1:-1:-1;;;;25483:256:0:o;36529:348::-;36586:10;36608:4;36586:27;36578:76;;;;-1:-1:-1;;;36578:76:0;;7322:2:1;36578:76:0;;;7304:21:1;7361:2;7341:18;;;7334:30;7400:34;7380:18;;;7373:62;-1:-1:-1;;;7451:18:1;;;7444:34;7495:19;;36578:76:0;7120:400:1;36578:76:0;13470:1;36673:13;;:26;36665:59;;;;-1:-1:-1;;;36665:59:0;;7727:2:1;36665:59:0;;;7709:21:1;7766:2;7746:18;;;7739:30;-1:-1:-1;;;7785:18:1;;;7778:50;7845:18;;36665:59:0;7525:344:1;36665:59:0;36788:22;;36756:21;;-1:-1:-1;;;;;36788:22:0;:40;36756:21;36848:20;36861:7;36756:21;36848:20;:::i;:::-;36788:81;;;;;;;;;;;;;548:25:1;;536:2;521:18;;402:177;36788:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36567:310;36529:348::o;22988:282::-;7144:21;:19;:21::i;:::-;23086:176:::1;23118:6;23139:28;23160:6;23139:20;:28::i;:::-;23182:24;23086:176;;;;;;;;;;;;;-1:-1:-1::0;;;23086:176:0::1;;::::0;23244:7:::1;23086:17;:176::i;37523:178::-:0;7144:21;:19;:21::i;:::-;3155:13:::1;:11;:13::i;:::-;37604:4:::2;-1:-1:-1::0;;;;;37604:22:0::2;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;37600:94;;37653:22;:29:::0;;-1:-1:-1;;37653:29:0::2;37678:4;37653:29;::::0;;37600:94:::2;7188:20:::0;6582:1;7708:22;;7525:213;15842:26;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15842:26:0;;-1:-1:-1;15842:26:0;:::o;28070:146::-;28136:7;28190:17;12733:4;28190:6;:17;:::i;:::-;28163:23;:21;:23::i;24783:146::-;24850:7;24915:6;24877:35;13257:5;24877:16;:35::i;23962:150::-;24031:7;24098:6;24058:37;13047:5;24058:16;:37::i;33287:339::-;33341:7;33361:18;33382:15;:13;:15::i;13920:49::-;;;;;;;;;;;;;;;-1:-1:-1;13920:49:0;:::o;34976:134::-;35030:7;35057:45;35074:12;35087:13;;35074:27;;;;;;;:::i;:::-;;;35057:16;:45::i;14032:255::-;;;;;;;;;;;21653:282;7144:21;:19;:21::i;:::-;21751:176:::1;21783:6;21804:28;21825:6;21804:20;:28::i;:::-;21847:24;21751:176;;;;;;;;;;;;;-1:-1:-1::0;;;21751:176:0::1;;::::0;21909:7:::1;21751:17;:176::i;36991:411::-:0;7144:21;:19;:21::i;:::-;37056:22:::1;::::0;:36:::1;::::0;;-1:-1:-1;;;37056:36:0;;;;37104:1:::1;::::0;-1:-1:-1;;;;;37056:22:0::1;::::0;:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:22;:36:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37056:50:0::1;::::0;37048:84:::1;;;::::0;-1:-1:-1;;;37048:84:0;;8332:2:1;37048:84:0::1;::::0;::::1;8314:21:1::0;8371:2;8351:18;;;8344:30;-1:-1:-1;;;8390:18:1;;;8383:51;8451:18;;37048:84:0::1;8130:345:1::0;37048:84:0::1;37182:10;37143:20;37166:27:::0;;;:15:::1;:27;::::0;;;;;37212:16;37204:46:::1;;;::::0;-1:-1:-1;;;37204:46:0;;8682:2:1;37204:46:0::1;::::0;::::1;8664:21:1::0;8721:2;8701:18;;;8694:30;-1:-1:-1;;;8740:18:1;;;8733:47;8797:18;;37204:46:0::1;8480:341:1::0;37204:46:0::1;37269:10;37262:18;::::0;;;:6:::1;:18;::::0;;;;:20;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;37309:10:0::1;37323:1;37293:27:::0;;;:15:::1;:27;::::0;;;;;:31;;;;37335:22:::1;::::0;:59;;-1:-1:-1;;;37335:59:0;;::::1;::::0;::::1;9000:51:1::0;;;;9067:18;;;9060:34;;;-1:-1:-1;;;;;37335:22:0::1;::::0;:33:::1;::::0;8973:18:1;;37335:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37037:365;7188:20:::0;6582:1;7708:22;;7525:213;22553:270;7144:21;:19;:21::i;:::-;22648:167:::1;22680:6;22701:25;22719:6;22701:17;:25::i;:::-;22741:21;22648:167;;;;;;;;;;;;;-1:-1:-1::0;;;22648:167:0::1;;::::0;22797:7:::1;22648:17;:167::i;15492:63::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15492:63:0;;-1:-1:-1;15492:63:0;;-1:-1:-1;15492:63:0:o;37811:461::-;3155:13;:11;:13::i;:::-;37878:22:::1;::::0;::::1;;37870:67;;;::::0;-1:-1:-1;;;37870:67:0;;9307:2:1;37870:67:0::1;::::0;::::1;9289:21:1::0;;;9326:18;;;9319:30;9385:34;9365:18;;;9358:62;9437:18;;37870:67:0::1;9105:356:1::0;37870:67:0::1;37975:21;38015:20:::0;38007:53:::1;;;::::0;-1:-1:-1;;;38007:53:0;;9668:2:1;38007:53:0::1;::::0;::::1;9650:21:1::0;9707:2;9687:18;;;9680:30;-1:-1:-1;;;9726:18:1;;;9719:50;9786:18;;38007:53:0::1;9466:344:1::0;38007:53:0::1;38071:6;:15;38078:7;3315::::0;3342:6;-1:-1:-1;;;;;3342:6:0;;3269:87;38078:7:::1;-1:-1:-1::0;;;;;38071:15:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;38071:15:0;;;:17;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;38100:12:0::1;3342:6:::0;;38118:100:::1;::::0;-1:-1:-1;;;;;3342:6:0;;;;38197::::1;::::0;38161:16;;38100:12;38118:100;38100:12;38118:100;38161:16;3342:6;38197;38118:100:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38099:119;;;38237:7;38229:35;;;;-1:-1:-1::0;;;38229:35:0::1;;;;;;;:::i;32828:276::-:0;32903:13;:20;32879:7;;32926:1;-1:-1:-1;32899:47:0;;;-1:-1:-1;32944:1:0;;32828:276::o;32899:47::-;33024:21;33043:1;33024:18;:21::i;:::-;33046:1;33024:24;;;;;;;;:::i;:::-;;;;;;;33017:31;;32828:276;:::o;38390:835::-;7144:21;:19;:21::i;:::-;13359:11:::1;38486:17;;:32;;;;:::i;:::-;38468:15;:50;38460:91;;;::::0;-1:-1:-1;;;38460:91:0;;10017:2:1;38460:91:0::1;::::0;::::1;9999:21:1::0;10056:2;10036:18;;;10029:30;10095:31;10075:18;;;10068:59;10144:18;;38460:91:0::1;9815:353:1::0;38460:91:0::1;38598:10;38562:25;38639:34:::0;;;:23:::1;:34;::::0;;;;;;13863:3:::1;38717:33;13778:2;13863:3:::0;38717:33:::1;:::i;:::-;38705:46;::::0;:8;:46:::1;:::i;:::-;38704:66;;;;:::i;:::-;38684:86;;38819:1;38808:8;:12;38800:62;;;::::0;-1:-1:-1;;;38800:62:0;;10375:2:1;38800:62:0::1;::::0;::::1;10357:21:1::0;10414:2;10394:18;;;10387:30;10453:34;10433:18;;;10426:62;-1:-1:-1;;;10504:18:1;;;10497:35;10549:19;;38800:62:0::1;10173:401:1::0;38800:62:0::1;38880:10;38873:18;::::0;;;:6:::1;:18;::::0;;;;:20;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;38933:13:0::1;::::0;38961:1:::1;38904:43:::0;;;:28:::1;:43;::::0;;;;;;;-1:-1:-1;;;;;38904:54:0;::::1;::::0;;;;;;;;;:58;;;38973:15:::1;:26:::0;;;;;:30;;;39014:23:::1;:34:::0;;;;;;:38;;;39082:36;39104:9;;38961:1;39082:36;38961:1;39082:36;39104:9;38904:54;39082:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39063:55;;;39137:7;39129:35;;;;-1:-1:-1::0;;;39129:35:0::1;;;;;;;:::i;:::-;39180:37;::::0;39207:9;;-1:-1:-1;;;;;39180:37:0;::::1;::::0;::::1;::::0;;;::::1;38449:776;;;;7188:20:::0;6582:1;7708:22;;7525:213;15762:30;;;;;;;;;;;;32330:278;32406:13;:20;32382:7;;32429:1;-1:-1:-1;32402:47:0;;;-1:-1:-1;32447:1:0;;32330:278::o;32402:47::-;32527:21;32546:1;32527:18;:21::i;:::-;32549:1;32527:24;;;;;;;;:::i;4168:201::-;3155:13;:11;:13::i;:::-;-1:-1:-1;;;;;4257:22:0;::::1;4249:73;;;::::0;-1:-1:-1;;;4249:73:0;;10781:2:1;4249:73:0::1;::::0;::::1;10763:21:1::0;10820:2;10800:18;;;10793:30;10859:34;10839:18;;;10832:62;-1:-1:-1;;;10910:18:1;;;10903:36;10956:19;;4249:73:0::1;10579:402:1::0;4249:73:0::1;4333:28;4352:8;4333:18;:28::i;:::-;4168:201:::0;:::o;25885:1941::-;7144:21;:19;:21::i;:::-;25982:13:::1;25998:27;26018:6;25998:19;:27::i;:::-;25982:43:::0;-1:-1:-1;26036:17:0::1;13863:3;26057:23;13778:2;25982:43:::0;26057:23:::1;:::i;:::-;26056:43;;;;:::i;:::-;26036:63:::0;-1:-1:-1;26110:20:0::1;::::0;;26209:17:::1;26036:63:::0;26209:5;:17:::1;:::i;:::-;26182:44;;26254:1;26245:6;:10;26237:52;;;::::0;-1:-1:-1;;;26237:52:0;;11188:2:1;26237:52:0::1;::::0;::::1;11170:21:1::0;11227:2;11207:18;;;11200:30;11266:31;11246:18;;;11239:59;11315:18;;26237:52:0::1;10986:353:1::0;26237:52:0::1;12830:15;12733:4;12830;:15;:::i;:::-;26327:6;26308:16;;:25;;;;:::i;:::-;:41;;26300:80;;;::::0;-1:-1:-1;;;26300:80:0;;11546:2:1;26300:80:0::1;::::0;::::1;11528:21:1::0;11585:2;11565:18;;;11558:30;11624:28;11604:18;;;11597:56;11670:18;;26300:80:0::1;11344:350:1::0;26300:80:0::1;26412:5;26399:9;:18;26391:49;;;::::0;-1:-1:-1;;;26391:49:0;;11901:2:1;26391:49:0::1;::::0;::::1;11883:21:1::0;11940:2;11920:18;;;11913:30;-1:-1:-1;;;11959:18:1;;;11952:48;12017:18;;26391:49:0::1;11699:342:1::0;26391:49:0::1;26458:10;26451:18;::::0;;;:6:::1;:18;::::0;;;;:20;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;26486:21:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;26511:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;26486:48;26482:424;;;13863:3;26570:36;13683:2;26570:16:::0;:36:::1;:::i;:::-;26569:56;;;;:::i;:::-;26552:73:::0;-1:-1:-1;26697:33:0::1;26552:73:::0;26697:16;:33:::1;:::i;:::-;26678:52:::0;-1:-1:-1;13863:3:0::1;26805:37;13566:2;26678:52:::0;26805:37:::1;:::i;:::-;26804:57;;;;:::i;:::-;26789:72;;26482:424;26933:10;26917:27;::::0;;;:15:::1;:27;::::0;;;;:37;;26948:6;;26917:27;:37:::1;::::0;26948:6;;26917:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;26985:13:0::1;::::0;26965:34:::1;::::0;;;:19:::1;:34;::::0;;;;:44;;27003:6;;26965:34;:44:::1;::::0;27003:6;;26965:44:::1;:::i;:::-;::::0;;;-1:-1:-1;;27049:13:0::1;::::0;27020:43:::1;::::0;;;:28:::1;:43;::::0;;;;;;;27064:10:::1;27020:55:::0;;;;;;;:65;;27079:6;;27020:43;:65:::1;::::0;27079:6;;27020:65:::1;:::i;:::-;::::0;;;-1:-1:-1;;27120:10:0::1;27096:35;::::0;;;:23:::1;:35;::::0;;;;:48;;27135:9:::1;::::0;27096:35;:48:::1;::::0;27135:9;;27096:48:::1;:::i;:::-;::::0;;;-1:-1:-1;;27166:10:0::1;27155:22;::::0;;;:10:::1;:22;::::0;;;;:35;;27181:9:::1;::::0;27155:22;:35:::1;::::0;27181:9;;27155:35:::1;:::i;:::-;::::0;;;-1:-1:-1;27201:28:0::1;::::0;-1:-1:-1;27222:6:0;27201:20:::1;:28::i;:::-;27240:13;:30:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;27240:30:0;;;;::::1;::::0;;-1:-1:-1;;;;;;27240:30:0::1;27259:10;27240:30;::::0;;27312:7:::1;3315::::0;3342:6;-1:-1:-1;;;;;3342:6:0;;3269:87;27312:7:::1;-1:-1:-1::0;;;;;27304:21:0::1;27333:9;27304:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27281:66;;;27366:11;27358:47;;;::::0;-1:-1:-1;;;27358:47:0;;12248:2:1;27358:47:0::1;::::0;::::1;12230:21:1::0;12287:2;12267:18;;;12260:30;-1:-1:-1;;;12306:18:1;;;12299:53;12369:18;;27358:47:0::1;12046:347:1::0;27358:47:0::1;27443;::::0;27417:20:::1;::::0;27451:4:::1;::::0;27469:16;;27417:20;27443:47;27417:20;27443:47;27469:16;27451:4;27443:47:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27416:74;;;27509:15;27501:55;;;::::0;-1:-1:-1;;;27501:55:0;;12600:2:1;27501:55:0::1;::::0;::::1;12582:21:1::0;12639:2;12619:18;;;12612:30;12678:29;12658:18;;;12651:57;12725:18;;27501:55:0::1;12398:351:1::0;27501:55:0::1;27571:18:::0;;27567:191:::1;;27631:51;::::0;27607:18:::1;::::0;27639:10:::1;::::0;27663:14;;27607:18;27631:51;27607:18;27631:51;27663:14;27639:10;27631:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27606:76;;;27705:13;27697:49;;;::::0;-1:-1:-1;;;27697:49:0;;12956:2:1;27697:49:0::1;::::0;::::1;12938:21:1::0;12995:2;12975:18;;;12968:30;-1:-1:-1;;;13014:18:1;;;13007:53;13077:18;;27697:49:0::1;12754:347:1::0;27697:49:0::1;27591:167;27567:191;27773:45;::::0;27808:9:::1;::::0;27800:6;;27788:10:::1;::::0;27773:45:::1;::::0;;;::::1;25971:1855;;;;;;;7188:20:::0;6582:1;7708:22;;7525:213;17049:562;3155:13;:11;:13::i;:::-;-1:-1:-1;;;;;17124:21:0;::::1;17116:49;;;::::0;-1:-1:-1;;;17116:49:0;;3397:2:1;17116:49:0::1;::::0;::::1;3379:21:1::0;3436:2;3416:18;;;3409:30;-1:-1:-1;;;3455:18:1;;;3448:45;3510:18;;17116:49:0::1;3195:339:1::0;17116:49:0::1;-1:-1:-1::0;;;;;17245:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;17244:24;17236:58;;;::::0;-1:-1:-1;;;17236:58:0;;13308:2:1;17236:58:0::1;::::0;::::1;13290:21:1::0;13347:2;13327:18;;;13320:30;-1:-1:-1;;;13366:18:1;;;13359:51;13427:18;;17236:58:0::1;13106:345:1::0;17236:58:0::1;-1:-1:-1::0;;;;;17358:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:30;;-1:-1:-1;;17358:30:0::1;17384:4;17358:30:::0;;::::1;::::0;;;17434:9:::1;:23:::0;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;17434:23:0::1;::::0;::::1;::::0;;17522:21;::::1;::::0;17358:23;17522:21:::1;17049:562:::0;:::o;31855:253::-;31925:13;:20;31901:7;;31925:25;;31921:48;;-1:-1:-1;31967:1:0;;31855:253::o;31921:48::-;32034:21;32053:1;32034:18;:21::i;:::-;32056:1;32034:24;;;;;;;;:::i;3434:132::-;3315:7;3342:6;-1:-1:-1;;;;;3342:6:0;1723:10;3498:23;3490:68;;;;-1:-1:-1;;;3490:68:0;;13658:2:1;3490:68:0;;;13640:21:1;;;13677:18;;;13670:30;13736:34;13716:18;;;13709:62;13788:18;;3490:68:0;13456:356:1;7224:293:0;6626:1;7358:7;;:19;7350:63;;;;-1:-1:-1;;;7350:63:0;;14019:2:1;7350:63:0;;;14001:21:1;14058:2;14038:18;;;14031:30;14097:33;14077:18;;;14070:61;14148:18;;7350:63:0;13817:355:1;7350:63:0;6626:1;7491:7;:18;7224:293::o;19278:2210::-;19522:1;19513:6;:10;19505:52;;;;-1:-1:-1;;;19505:52:0;;11188:2:1;19505:52:0;;;11170:21:1;11227:2;11207:18;;;11200:30;11266:31;11246:18;;;11239:59;11315:18;;19505:52:0;10986:353:1;19505:52:0;19589:10;19576:9;:23;19568:54;;;;-1:-1:-1;;;19568:54:0;;11901:2:1;19568:54:0;;;11883:21:1;11940:2;11920:18;;;11913:30;-1:-1:-1;;;11959:18:1;;;11952:48;12017:18;;19568:54:0;11699:342:1;19568:54:0;19640:10;19633:18;;;;:6;:18;;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;19684:10:0;;-1:-1:-1;19664:17:0;;-1:-1:-1;;;;;19833:21:0;;;;;;:48;;-1:-1:-1;;;;;;19858:23:0;;;;;;:14;:23;;;;;;;;19833:48;19829:538;;;13863:3;19916:30;13683:2;19916:10;:30;:::i;:::-;19915:50;;;;:::i;:::-;19898:67;-1:-1:-1;13863:3:0;20036:31;13566:2;20036:10;:31;:::i;:::-;20035:51;;;;:::i;:::-;20020:66;-1:-1:-1;20020:66:0;20146:27;20159:14;20146:10;:27;:::i;:::-;:42;;;;:::i;:::-;20134:54;;19829:538;;;-1:-1:-1;;;;;20256:21:0;;;;;;:49;;-1:-1:-1;;;;;;20282:23:0;;;;;;:14;:23;;;;;;;;20281:24;20256:49;20252:115;;;20322:33;;-1:-1:-1;;;20322:33:0;;14379:2:1;20322:33:0;;;14361:21:1;14418:2;14398:18;;;14391:30;14457:25;14437:18;;;14430:53;14500:18;;20322:33:0;14177:347:1;20252:115:0;20387:10;20377:21;;;;;;;;;;;:31;;20402:6;;20377:21;:31;;20402:6;;20377:31;:::i;:::-;;;;-1:-1:-1;;20488:10:0;20464:35;;;;:23;:35;;;;;:48;;20503:9;;20464:35;:48;;20503:9;;20464:48;:::i;:::-;;;;;;;;20596:9;20567:25;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;20670:10:0;20659:22;;;;:10;:22;;;;;:35;;20685:9;;20659:22;:35;;20685:9;;20659:35;:::i;:::-;;;;-1:-1:-1;;20751:13:0;:30;;;;;;;-1:-1:-1;20751:30:0;;;;;;;-1:-1:-1;;;;;;20751:30:0;20770:10;20751:30;;;20875:7;3315;3342:6;-1:-1:-1;;;;;3342:6:0;;3269:87;20875:7;-1:-1:-1;;;;;20867:21:0;20896:9;20867:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20844:66;;;20929:11;20921:47;;;;-1:-1:-1;;;20921:47:0;;12248:2:1;20921:47:0;;;12230:21:1;12287:2;12267:18;;;12260:30;-1:-1:-1;;;12306:18:1;;;12299:53;12369:18;;20921:47:0;12046:347:1;20921:47:0;20983:16;;20979:189;;21017:19;21050:7;-1:-1:-1;;;;;21042:21:0;21071:12;21042:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21016:72;;;21111:14;21103:53;;;;-1:-1:-1;;;21103:53:0;;14731:2:1;21103:53:0;;;14713:21:1;14770:2;14750:18;;;14743:30;14809:28;14789:18;;;14782:56;14855:18;;21103:53:0;14529:350:1;21103:53:0;21001:167;20979:189;21182:18;;21178:191;;21242:51;;21218:18;;21250:10;;21274:14;;21218:18;21242:51;21218:18;21242:51;21274:14;21250:10;21242:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21217:76;;;21316:13;21308:49;;;;-1:-1:-1;;;21308:49:0;;12956:2:1;21308:49:0;;;12938:21:1;12995:2;12975:18;;;12968:30;-1:-1:-1;;;13014:18:1;;;13007:53;13077:18;;21308:49:0;12754:347:1;21308:49:0;21202:167;21178:191;21422:9;21414:6;21402:10;-1:-1:-1;;;;;21384:62:0;;21433:12;21384:62;;;;;;:::i;:::-;;;;;;;;19494:1994;;;;19278:2210;;;;;:::o;30168:855::-;30349:12;30364:9;30368:5;30364:1;:9;:::i;:::-;:13;;30376:1;30364:13;:::i;:::-;30349:28;-1:-1:-1;30388:13:0;30404:9;30408:5;30404:1;:9;:::i;:::-;:13;;30416:1;30404:13;:::i;:::-;30388:29;-1:-1:-1;30447:5:0;30467:11;;;:54;;;;;30501:10;30512:8;30501:20;;;;;;;;:::i;:::-;;;;;;;30482:10;30493:4;30482:16;;;;;;;;:::i;:::-;;;;;;;:39;30467:54;30463:102;;;-1:-1:-1;30549:4:0;30463:102;30587:4;30579:5;:12;:56;;;;;30615:10;30626:8;30615:20;;;;;;;;:::i;:::-;;;;;;;30595:10;30606:5;30595:17;;;;;;;;:::i;:::-;;;;;;;:40;30579:56;30575:105;;;-1:-1:-1;30663:5:0;30575:105;30706:5;30694:8;:17;30690:326;;30773:10;30784:8;30773:20;;;;;;;;:::i;:::-;;;;;;;30795:10;30806:5;30795:17;;;;;;;;:::i;:::-;;;;;;;30729:10;30740:5;30729:17;;;;;;;;:::i;:::-;;;;;;30748:10;30759:8;30748:20;;;;;;;;:::i;:::-;;;;;;30728:85;;;;;;;;;;30883:15;30899:8;30883:25;;;;;;;;:::i;:::-;;;;;;;30910:15;30926:5;30910:22;;;;;;;;:::i;:::-;;;;;;;30829:15;30845:5;30829:22;;;;;;;;:::i;:::-;;;;;;30853:15;30869:8;30853:25;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30828:105:0;;;30853:25;;;;;;;;;30828:105;;;;;30948:56;30960:10;30972:15;30989:8;30999:4;30948:11;:56::i;:::-;30338:685;;;30168:855;;;;:::o;4529:191::-;4603:16;4622:6;;-1:-1:-1;;;;;4639:17:0;;;-1:-1:-1;;;;;;4639:17:0;;;;;;4672:40;;4622:6;;;;;;;4672:40;;4603:16;4672:40;4592:128;4529:191;:::o;35741:678::-;35807:35;35845:33;:31;:33::i;:::-;35807:71;;35924:6;35893:27;:37;35889:523;;35967:6;35947:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;35889:523:0;;-1:-1:-1;35889:523:0;;36006:20;36029:36;36038:27;36029:6;:36;:::i;:::-;36006:59;;36100:27;36080:16;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;36146:13:0;;13470:1;-1:-1:-1;36142:259:0;;;36192:13;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;36245:13:0;;36231:28;;;;;;;36278:34;36299:12;36278:20;:34::i;:::-;35991:421;35796:623;35741:678;:::o;36142:259::-;36373:12;36353:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;35991:421:0;35796:623;35741:678;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;584:315::-;652:6;660;713:2;701:9;692:7;688:23;684:32;681:52;;;729:1;726;719:12;681:52;765:9;752:23;742:33;;825:2;814:9;810:18;797:32;838:31;863:5;838:31;:::i;:::-;888:5;878:15;;;584:315;;;;;:::o;1084:180::-;1143:6;1196:2;1184:9;1175:7;1171:23;1167:32;1164:52;;;1212:1;1209;1202:12;1164:52;-1:-1:-1;1235:23:1;;1084:180;-1:-1:-1;1084:180:1:o;1269:658::-;1440:2;1492:21;;;1562:13;;1465:18;;;1584:22;;;1411:4;;1440:2;1663:15;;;;1637:2;1622:18;;;1411:4;1706:195;1720:6;1717:1;1714:13;1706:195;;;1785:13;;-1:-1:-1;;;;;1781:39:1;1769:52;;1876:15;;;;1841:12;;;;1817:1;1735:9;1706:195;;;-1:-1:-1;1918:3:1;;1269:658;-1:-1:-1;;;;;;1269:658:1:o;2332:315::-;2400:6;2408;2461:2;2449:9;2440:7;2436:23;2432:32;2429:52;;;2477:1;2474;2467:12;2429:52;2516:9;2503:23;2535:31;2560:5;2535:31;:::i;:::-;2585:5;2637:2;2622:18;;;;2609:32;;-1:-1:-1;;;2332:315:1:o;2890:127::-;2951:10;2946:3;2942:20;2939:1;2932:31;2982:4;2979:1;2972:15;3006:4;3003:1;2996:15;3022:168;3062:7;3128:1;3124;3120:6;3116:14;3113:1;3110:21;3105:1;3098:9;3091:17;3087:45;3084:71;;;3135:18;;:::i;:::-;-1:-1:-1;3175:9:1;;3022:168::o;3885:127::-;3946:10;3941:3;3937:20;3934:1;3927:31;3977:4;3974:1;3967:15;4001:4;3998:1;3991:15;4017:128;4057:3;4088:1;4084:6;4081:1;4078:13;4075:39;;;4094:18;;:::i;:::-;-1:-1:-1;4130:9:1;;4017:128::o;4150:135::-;4189:3;4210:17;;;4207:43;;4230:18;;:::i;:::-;-1:-1:-1;4277:1:1;4266:13;;4150:135::o;4290:179::-;4368:13;;4421:22;4410:34;;4400:45;;4390:73;;4459:1;4456;4449:12;4390:73;4290:179;;;:::o;4474:473::-;4577:6;4585;4593;4601;4609;4662:3;4650:9;4641:7;4637:23;4633:33;4630:53;;;4679:1;4676;4669:12;4630:53;4702:39;4731:9;4702:39;:::i;:::-;4692:49;;4781:2;4770:9;4766:18;4760:25;4750:35;;4825:2;4814:9;4810:18;4804:25;4794:35;;4869:2;4858:9;4854:18;4848:25;4838:35;;4892:49;4936:3;4925:9;4921:19;4892:49;:::i;:::-;4882:59;;4474:473;;;;;;;;:::o;4952:127::-;5013:10;5008:3;5004:20;5001:1;4994:31;5044:4;5041:1;5034:15;5068:4;5065:1;5058:15;5084:193;5123:1;5149;5139:35;;5154:18;;:::i;:::-;-1:-1:-1;;;5190:18:1;;-1:-1:-1;;5210:13:1;;5186:38;5183:64;;;5227:18;;:::i;:::-;-1:-1:-1;5261:10:1;;5084:193::o;5282:125::-;5322:4;5350:1;5347;5344:8;5341:34;;;5355:18;;:::i;:::-;-1:-1:-1;5392:9:1;;5282:125::o;5759:127::-;5820:10;5815:3;5811:20;5808:1;5801:31;5851:4;5848:1;5841:15;5875:4;5872:1;5865:15;5891:120;5931:1;5957;5947:35;;5962:18;;:::i;:::-;-1:-1:-1;5996:9:1;;5891:120::o;6016:136::-;6055:3;6083:5;6073:39;;6092:18;;:::i;:::-;-1:-1:-1;;;6128:18:1;;6016:136::o;6776:339::-;6978:2;6960:21;;;7017:2;6997:18;;;6990:30;-1:-1:-1;;;7051:2:1;7036:18;;7029:45;7106:2;7091:18;;6776:339::o;7874:251::-;7944:6;7997:2;7985:9;7976:7;7972:23;7968:32;7965:52;;;8013:1;8010;8003:12;7965:52;8045:9;8039:16;8064:31;8089:5;8064:31;:::i;14884:597::-;14996:4;15025:2;15054;15043:9;15036:21;15086:6;15080:13;15129:6;15124:2;15113:9;15109:18;15102:34;15154:1;15164:140;15178:6;15175:1;15172:13;15164:140;;;15273:14;;;15269:23;;15263:30;15239:17;;;15258:2;15235:26;15228:66;15193:10;;15164:140;;;15322:6;15319:1;15316:13;15313:91;;;15392:1;15387:2;15378:6;15367:9;15363:22;15359:31;15352:42;15313:91;-1:-1:-1;15465:2:1;15444:15;-1:-1:-1;;15440:29:1;15425:45;;;;15472:2;15421:54;;14884:597;-1:-1:-1;;;14884:597:1:o

Swarm Source

ipfs://146ccdac3e7236cefd5185910cccd65c9f74919cd2a6b07d43b016b80d9b5d06

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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