APE Price: $0.19 (-0.01%)

Contract

0x889b0da73556D2476abCA13Bf5f262F444F1AceC

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BearDice

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2026-01-23
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;


interface IGovernanceManager {
    function RNG() external view returns (address);
    function owner() external view returns (address);
    function referralManager() external view returns (address);
    function feeReceiver() external view returns (address);
    function claimManager() external view returns (address);
    function house() external view returns (address);
    function isGame(address game) external view returns (bool);
    function userInfoTracker() external view returns (address);
    function canPlayForOthers(address addr) external view returns (bool);
    function paused() external view returns (bool);
    function isAdmin(address admin) external view returns (bool);
}

interface IRNGPythV2 {
    function requestRandom(bytes32 userRandomNumber, uint8 numWords, uint32 customGasLimit) external payable returns (uint64);
    function getFeeV2(uint32 customGasLimit) external view returns (uint256);
}

contract ApeOwnableGameV2GasLimit {

    // Governance Manager
    IGovernanceManager public constant manager = IGovernanceManager(0x8632f22e5A921C751CFbBFF92F058A3b11E96b8a);
    address public constant V2_RNG = 0x258f9EAd08d35955FC80678658d9cDFd36f98563;

    modifier onlyOwner() {
        require(
            msg.sender == manager.owner(),
            'Only Owner'
        );
        _;
    }

    modifier onlyGame() {
        require(
            manager.isGame(msg.sender),
            'UnAuthorized'
        );
        _;
    }

    modifier onlyRNG() {
        require(
            msg.sender == manager.RNG() || msg.sender == V2_RNG,
            'Only RNG Contract'
        );
        _;
    }

    modifier validatePlayer(address player) {
        if (player != msg.sender) {
            require(
                manager.canPlayForOthers(msg.sender),
                'UnAuthorized To Play For Others'
            );
        }
        _;
    }

    modifier notPaused() {
        require(
            manager.paused() == false,
            'All Games Paused'
        );
        _;
    }

    modifier onlyAdmin() {
        require(
            manager.isAdmin(msg.sender),
            'UnAuthorized'
        );
        _;
    }
}

interface IGame {
    /**
        Callback to provide us with randomness
     */
    function fulfillRandomWords(
        uint64 requestId,
        uint256[] calldata randomWords
    ) external;

    function play(address user, bytes calldata gameData) external payable;
}

interface IUserInfoTracker {
    function wagered(address user, uint256 amount, uint256 GAME_ID) external;
}

interface IClaimManager {
    function credit(
        uint256 GAME_ID,
        address user
    ) external payable;
    function claim() external;
}

interface IHistoryManager {
    function addData(address user, uint256 GAME_ID, uint256 gameId) external;
}

interface IFeeRecipient {
    function takeFee(address ref, address player) external payable;
}

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}

interface IHouse {
    
    /**
        House has profited from game, call this to send value into the house and emit the correct event for SubGraphs
     */
    function houseProfit(uint256 GAME_ID) external payable;

    /**
        Function Games Call to tell the house that a user has won the bet
     */
    function payout(uint256 GAME_ID, address user, uint256 value) external;
    
    /**
        Read function to determine the maximum payout allowed by the house at the current time
     */
    function maxPayout() external view returns (uint256);

    /**
        Randomness has been requested, withdrawals are paused until it is resolved by called `randomRequestResolved()`
     */
    function randomRequested() external;

    /**
        Resolves a random request from chainlink, allowing house users to withdraw
     */
    function randomRequestResolved() external;

}

interface ITestGroup {
    function isInTestGroup(address user) external view returns (bool);
}

/**
    Game Master Class, any inheriting game must pass the necessary fields into the constructor
 */
contract GameMasterclass is ApeOwnableGameV2GasLimit, IGame {

    // GAME ID
    uint256 public immutable GAME_ID;

    // History Manager
    IHistoryManager public immutable history;

    /** Game Is Either Paused Or Unpaused */
    bool public paused = false;

    /** List of all used game ids */
    uint256[] public usedGameIds;
    mapping ( uint256 => bool ) internal isUsedGameId;

    // request ID => GameID
    mapping ( uint64 => uint256 ) private requestToGame;

    // Test Group
    ITestGroup private constant testGroup = ITestGroup(0x1e79dA4F709Db18E4c3De214d29f0d7B45f986ea);

    // Fully live for public
    bool internal fullyLive = false;

    /// @notice emitted after a random request has been sent out
    event RandomnessRequested(uint256 gameId);

    /**
        Builds The Necessary Components Of Any Game
     */
    constructor(
        uint256 GAME_ID_,
        address history_
    )  {

        // set other variables
        GAME_ID = GAME_ID_;
        history = IHistoryManager(history_);
    }

    //////////////////////////////////////
    ///////    OWNER FUNCTIONS    ////////
    //////////////////////////////////////

    function goLive() external onlyOwner {
        require(fullyLive == false, 'Already Live');
        fullyLive = true;
    }

    function pause() external onlyOwner {
        paused = true;
    }

    function resume() external onlyOwner {
        paused = false;
    }

    function withdrawETH(address to, uint256 amount) external onlyOwner {
        (bool s,) = payable(to).call{value: amount}("");
        require(s);
    }

    function withdrawToken(address token, uint amount) external onlyOwner {
        TransferHelper.safeTransfer(token, msg.sender, amount);
    }

    function _registerBet(address user, uint256 amount) internal {
        IUserInfoTracker(manager.userInfoTracker()).wagered(user, amount, GAME_ID);
    }

    function _processFee(uint256 feeAmount, address ref, address player) internal {
        IFeeRecipient(manager.feeReceiver()).takeFee{value: feeAmount}(ref, player);
    }
    
    function getVRFFee(uint32 customGasLimit) public view returns (uint256) {
        return IRNGPythV2(V2_RNG).getFeeV2(customGasLimit);
    }

    function fulfillRandomWords(uint64 requestId, uint256[] calldata randomWords) external virtual {}

    function play(address player, bytes calldata gameData) external payable override validatePlayer(player) notPaused() {
        require(
            !paused,
            'Paused'
        );
        if (fullyLive == false) {
            require(testGroup.isInTestGroup(player), 'Not In Test Group');
        }

        // play game
        _playGame(player, gameData);
    }

    function _playGame(address player, bytes calldata gameData) internal virtual {}

    function _handlePayout(address player, uint256 totalToPayout, uint256 amountForHouse) internal {

        if (totalToPayout > 0) {
            // there is a payout, we won something

            if (totalToPayout >= amountForHouse) {
                // the user has won more than we are giving to the house
                // this means we need to send them (to claim manager) amountForHouse directly
                // and only request that the house `payout` the difference!

                // add to user's claim manager the amount for the house
                IClaimManager(manager.claimManager()).credit{value: amountForHouse}(
                    GAME_ID,
                    player
                );

                // get the difference
                uint256 remaining = totalToPayout - amountForHouse;
                if (remaining > 0) {
                    // payout the rest from the house
                    IHouse(manager.house()).payout(GAME_ID, player, remaining);
                }
                
            } else {
                // the user has won less than we are giving to the house
                // pay them out directly in full, send whatever is left over to the house

                // add to user's claim manager the amount for the house
                IClaimManager(manager.claimManager()).credit{value: totalToPayout}(
                    GAME_ID,
                    player
                );

                // calculate remaining left for the house
                uint256 remaining = amountForHouse - totalToPayout;

                // send the remaining to the house
                IHouse(manager.house()).houseProfit{value: remaining }(GAME_ID);
            }

        } else {
            // we won nothing, send the house everything
            IHouse(manager.house()).houseProfit{value: amountForHouse }(GAME_ID);
        }
    }

    /// @dev logs the gameId in the used list and adds game to player's history
    function _registerGameId(address player, uint256 gameId) internal {

        // set history data
        history.addData(player, GAME_ID, gameId);

        // add to list of used game ids
        usedGameIds.push(gameId);
        isUsedGameId[gameId] = true;
    }

    function _requestRandom(uint256 gameId, uint8 numWords, bytes32 userRandomWord, uint32 customGasLimit) internal {

        // request random words from RNG contract
        uint64 requestId = IRNGPythV2(manager.RNG()).requestRandom{value: getVRFFee(customGasLimit)}(
            userRandomWord, // random user seed
            numWords,       // the number of random results to return
            customGasLimit
        );

        // require that the requestId is unused
        require(
            requestToGame[requestId] == 0,
            'RequestId In Use'
        );

        // map this request ID to the game it belongs to
        requestToGame[requestId] = gameId;

        // set data in house
        IHouse(manager.house()).randomRequested();

        // emit event
        emit RandomnessRequested(gameId);
    }

    function _resolveRandom(uint64 requestId) internal {
        // resolve request in house
        IHouse(manager.house()).randomRequestResolved();

        // clear storage
        delete requestToGame[requestId];
    }

    function getGameIdFromRequest(uint64 requestId) internal view returns (uint256) {
        return requestToGame[requestId];
    }

    function getHouse() public view returns (address) {
        return manager.house();
    }

    function isValidGameId(uint256 gameId) public view returns (bool) {
        return isUsedGameId[gameId] == false && gameId > 0;
    }

    function batchCallIsUsedGameId(uint256[] calldata gameIds) external view returns (bool[] memory isUsed) {
        uint len = gameIds.length;
        isUsed = new bool[](len);
        for (uint i = 0; i < len;) {
            isUsed[i] = isUsedGameId[gameIds[i]];
            unchecked { ++i; }
        }
    }

    function paginateUsedGameIDs(uint256 start, uint256 end) external view returns (uint256[] memory) {
        if (end > usedGameIds.length) {
            end = usedGameIds.length;
        }
        uint256[] memory ids = new uint256[](end - start);
        for (uint i = start; i < end;) {
            ids[i - start] = usedGameIds[i];
            unchecked { ++i; }
        }
        return ids;
    }

    function numUsedGameIDs() external view returns (uint256) {
        return usedGameIds.length;
    }

    function getEssentialGameInfo(uint256[] calldata gameIds) external view virtual returns (
        address[] memory players,
        uint256[] memory buyInAmounts,
        uint256[] memory totalPayouts,
        uint256[] memory timestamps,
        bool[] memory hasEndeds
    ) {}

    function batchRawGameInfo(uint256[] calldata gameIds) external view virtual returns (bytes[] memory) {}
}

/**
    BearDice PvH Game
 */
contract BearDice is GameMasterclass {

    // Num Spins
    uint8 public constant MAX_RUNS = 5;

    // Base gas per game
    uint32 public BASE_GAS = 500_000;
    uint32 public GAS_PER_RUN = 100_000;

    // Game Struct
    struct Game {

        /** Player */
        address player;

        /** Amount Bet */
        uint256 betAmount;

        /** Total Amount For House */
        uint256 amountForHouse;

        /** Number of Runs */
        uint8 numRuns;

        /** Difficulty */
        uint8 difficulty;

        /** Final Output -- reels */
        uint8[] dice1Results;
        uint8[] dice2Results;

        /** Payouts */
        uint256 payout;

        /** Whether or not the game has ended and the VRF has called back */
        bool hasEnded;

        /** Timestamp */
        uint256 timestamp;
    }

    struct GameInfoReturnType {
        address player;
        uint256 betAmount;
        uint256 totalBetAmount;
        uint8 numRuns;
        uint8 difficulty;
        uint8[] dice1Results;
        uint8[] dice2Results;
        uint256 totalPayout;
        bool hasEnded;
        uint256 timestamp;
    }

    // mapping from GameID => Game
    mapping ( uint256 => Game ) public games;

    /** Platform Fee Taken Out Of Buy In */
    uint256 public platformFee = 200;

    /** Maps difficulty -> num runs -> dice number -> payout */
    mapping ( uint8 => mapping ( uint8 => mapping ( uint8 => uint256 ) ) ) public payouts;

    /** Payout Denom */
    uint256 public constant PAYOUT_DENOM = 10_000; // 0.01x precision (payout of 100 = 0.01x, 10,000 = 1x, 1,000,000 = 100x)

    /// @notice emitted after the platform fee has been changed
    event SetPlatformFee(uint256 newFee);

    /// @notice emitted after a game has been started at a specific table
    event GameStarted(address indexed user, uint256 gameId);

    /// @notice Emitted after the VRF comes back with the index of the winning player
    event GameEnded(
        address indexed user, 
        uint256 gameId, 
        uint256 buyIn,
        uint256 payout
    );

    /// @notice Emitted if the fulfilRandomWords function needs to return out for any reason
    event FulfilRandomFailed(uint256 requestId, uint256 gameId, uint256[] randomWords);

    constructor(
        uint256 GAME_ID_,
        address _history
    ) GameMasterclass(GAME_ID_, _history){
        payouts[0][1][2] = 183;
        payouts[0][1][3] = 139;
        payouts[0][1][4] = 120;
        payouts[0][1][5] = 109;
        payouts[0][1][6] = 101;
        payouts[0][1][8] = 101;
        payouts[0][1][9] = 109;
        payouts[0][1][10] = 120;
        payouts[0][1][11] = 139;
        payouts[0][1][12] = 183;
        payouts[0][2][2] = 183;
        payouts[0][2][3] = 141;
        payouts[0][2][4] = 122;
        payouts[0][2][5] = 110;
        payouts[0][2][6] = 102;
        payouts[0][2][8] = 102;
        payouts[0][2][9] = 110;
        payouts[0][2][10] = 122;
        payouts[0][2][11] = 141;
        payouts[0][2][12] = 183;
        payouts[0][3][2] = 184;
        payouts[0][3][3] = 141;
        payouts[0][3][4] = 122;
        payouts[0][3][5] = 110;
        payouts[0][3][6] = 103;
        payouts[0][3][8] = 103;
        payouts[0][3][9] = 110;
        payouts[0][3][10] = 122;
        payouts[0][3][11] = 141;
        payouts[0][3][12] = 184;
        payouts[0][4][2] = 187;
        payouts[0][4][3] = 141;
        payouts[0][4][4] = 122;
        payouts[0][4][5] = 110;
        payouts[0][4][6] = 103;
        payouts[0][4][8] = 103;
        payouts[0][4][9] = 110;
        payouts[0][4][10] = 122;
        payouts[0][4][11] = 141;
        payouts[0][4][12] = 187;
        payouts[0][5][2] = 184;
        payouts[0][5][3] = 141;
        payouts[0][5][4] = 122;
        payouts[0][5][5] = 110;
        payouts[0][5][6] = 104;
        payouts[0][5][8] = 104;
        payouts[0][5][9] = 110;
        payouts[0][5][10] = 122;
        payouts[0][5][11] = 141;
        payouts[0][5][12] = 184;
        payouts[1][1][2] = 380;
        payouts[1][1][3] = 225;
        payouts[1][1][4] = 155;
        payouts[1][1][5] = 117;
        payouts[1][1][9] = 117;
        payouts[1][1][10] = 155;
        payouts[1][1][11] = 225;
        payouts[1][1][12] = 380;
        payouts[1][2][2] = 384;
        payouts[1][2][3] = 227;
        payouts[1][2][4] = 157;
        payouts[1][2][5] = 118;
        payouts[1][2][9] = 118;
        payouts[1][2][10] = 157;
        payouts[1][2][11] = 227;
        payouts[1][2][12] = 384;
        payouts[1][3][2] = 385;
        payouts[1][3][3] = 227;
        payouts[1][3][4] = 158;
        payouts[1][3][5] = 118;
        payouts[1][3][9] = 118;
        payouts[1][3][10] = 158;
        payouts[1][3][11] = 227;
        payouts[1][3][12] = 385;
        payouts[1][4][2] = 385;
        payouts[1][4][3] = 229;
        payouts[1][4][4] = 157;
        payouts[1][4][5] = 119;
        payouts[1][4][9] = 119;
        payouts[1][4][10] = 157;
        payouts[1][4][11] = 229;
        payouts[1][4][12] = 385;
        payouts[1][5][2] = 386;
        payouts[1][5][3] = 227;
        payouts[1][5][4] = 158;
        payouts[1][5][5] = 119;
        payouts[1][5][9] = 119;
        payouts[1][5][10] = 158;
        payouts[1][5][11] = 227;
        payouts[1][5][12] = 386;
        payouts[2][1][2] = 630;
        payouts[2][1][3] = 300;
        payouts[2][1][4] = 177;
        payouts[2][1][10] = 177;
        payouts[2][1][11] = 300;
        payouts[2][1][12] = 630;
        payouts[2][2][2] = 637;
        payouts[2][2][3] = 303;
        payouts[2][2][4] = 179;
        payouts[2][2][10] = 179;
        payouts[2][2][11] = 303;
        payouts[2][2][12] = 637;
        payouts[2][3][2] = 640;
        payouts[2][3][3] = 305;
        payouts[2][3][4] = 179;
        payouts[2][3][10] = 179;
        payouts[2][3][11] = 305;
        payouts[2][3][12] = 640;
        payouts[2][4][2] = 643;
        payouts[2][4][3] = 305;
        payouts[2][4][4] = 179;
        payouts[2][4][10] = 179;
        payouts[2][4][11] = 305;
        payouts[2][4][12] = 643;
        payouts[2][5][2] = 643;
        payouts[2][5][3] = 306;
        payouts[2][5][4] = 179;
        payouts[2][5][10] = 179;
        payouts[2][5][11] = 306;
        payouts[2][5][12] = 643;
        payouts[3][1][2] = 972;
        payouts[3][1][3] = 395;
        payouts[3][1][11] = 395;
        payouts[3][1][12] = 972;
        payouts[3][2][2] = 980;
        payouts[3][2][3] = 400;
        payouts[3][2][11] = 400;
        payouts[3][2][12] = 980;
        payouts[3][3][2] = 982;
        payouts[3][3][3] = 401;
        payouts[3][3][11] = 401;
        payouts[3][3][12] = 982;
        payouts[3][4][2] = 984;
        payouts[3][4][3] = 403;
        payouts[3][4][11] = 403;
        payouts[3][4][12] = 984;
        payouts[3][5][2] = 986;
        payouts[3][5][3] = 403;
        payouts[3][5][11] = 403;
        payouts[3][5][12] = 986;
        payouts[4][1][2] = 1762;
        payouts[4][1][12] = 1762;
        payouts[4][2][2] = 1780;
        payouts[4][2][12] = 1780;
        payouts[4][3][2] = 1787;
        payouts[4][3][12] = 1787;
        payouts[4][4][2] = 1789;
        payouts[4][4][12] = 1789;
        payouts[4][5][2] = 1792;
        payouts[4][5][12] = 1792;
    }

    function setPlatformFee(uint256 newPlatform) external onlyOwner {
        require(
            newPlatform <= PAYOUT_DENOM / 5,
            'Cannot Exceed 20%'
        );
        platformFee = newPlatform;
        emit SetPlatformFee(newPlatform);
    }

    function setBaseGas(uint32 _baseGas) external onlyOwner {
        BASE_GAS = _baseGas;
    }

    function setGasPerRun(uint32 _gasPerRun) external onlyOwner {
        GAS_PER_RUN = _gasPerRun;
    }

    receive() external payable {}

    function _playGame(address player, bytes calldata gameData) internal override {

        // decode game data
        (
            uint8 difficulty,
            uint8 numRuns,
            uint256 gameId,
            address ref,
            bytes32 userRandomWord
        ) = abi.decode(gameData, (uint8, uint8, uint256, address, bytes32));
        require(
            numRuns > 0 && numRuns <= MAX_RUNS,
            'ERR: INVALID RUNS'
        );

        uint32 customGasLimit = BASE_GAS + ( numRuns * GAS_PER_RUN);

        // determine vrf fee
        uint256 vrfFee = getVRFFee(customGasLimit);

        // validate inputs
        require(
            msg.value >= vrfFee,
            'ERR: MIN BUY IN'
        );
        require(
            isValidGameId(gameId) == true,
            'ERR: INVALID GAME ID'
        );
        require(
            payouts[difficulty][1][2] > 0,
            'ERR: INVALID DIFFICULTY'
        );

        // determine total bet amount
        uint256 totalBetAmount = msg.value - vrfFee;

        // take platform fee out of the buy in
        uint256 platformFeeAmount = ( totalBetAmount * platformFee ) / PAYOUT_DENOM;

        // send to platform receiver (taking ref into account)
        _processFee(platformFeeAmount, ref, player);

        // save game data
        games[gameId].player = player;
        games[gameId].betAmount = totalBetAmount;
        games[gameId].amountForHouse = totalBetAmount - platformFeeAmount;
        games[gameId].numRuns = numRuns;
        games[gameId].difficulty = difficulty;
        games[gameId].dice1Results = new uint8[](numRuns);
        games[gameId].dice2Results = new uint8[](numRuns);
        games[gameId].timestamp = block.timestamp;

        // register game Id
        _registerGameId(player, gameId);

        // register bet
        _registerBet(player, totalBetAmount);
        
        // emit event
        emit GameStarted(player, gameId);

        // fetch random number
        _requestRandom(gameId, numRuns * 2, userRandomWord, customGasLimit);
    }

    /**
        Callback to provide us with randomness
     */
    function fulfillRandomWords(
        uint64 requestId,
        uint256[] calldata randomWords
    ) external override onlyRNG {

        // get game ID from requestId
        uint256 gameId = getGameIdFromRequest(requestId);
        uint8 NUM_RUNS = games[gameId].numRuns;
        uint8 DIFFICULTY = games[gameId].difficulty;

        // resolve randomness
        _resolveRandom(requestId);
        
        // if faulty ID, remove
        if (
            gameId == 0 || 
            games[gameId].player == address(0) || 
            games[gameId].hasEnded == true ||
            NUM_RUNS == 0 ||
            randomWords.length != NUM_RUNS * 2
        ) {
            emit FulfilRandomFailed(requestId, gameId, randomWords);
            return;
        }

        // set game has ended
        games[gameId].hasEnded = true;

        // fetch the bet amount per spin
        uint256 totalBetAmount = games[gameId].betAmount;

        // total to pay out for the house and total to send the house
        uint256 totalToPayout = totalBetAmount;

        // loop through spins
        for (uint i = 0; i < NUM_RUNS;) {

            // fetch index (coin) of reel array
            uint8 dice1Result = uint8(( randomWords[i * 2] % 6 ) + 1);
            uint8 dice2Result = uint8(( randomWords[(i * 2) + 1] % 6 ) + 1);

            // combined dice number
            uint8 diceNumber = ( dice1Result + dice2Result );

            // save indexes to state
            games[gameId].dice1Results[i] = dice1Result;
            games[gameId].dice2Results[i] = dice2Result;

            uint256 multiplier = payouts[DIFFICULTY][NUM_RUNS][diceNumber];

            // if payout exists, user won this spin
            if (multiplier > 0) {
                totalToPayout = ( totalToPayout * multiplier ) / 100;
            } else {
                // user hit the bear tile, no payout for entire game
                totalToPayout = 0;
                break;
            }
            unchecked { ++i; }
        }

        // save payout info
        games[gameId].payout = totalToPayout;

        // handle payouts
        _handlePayout(games[gameId].player, totalToPayout, games[gameId].amountForHouse);

        // emit game ended event
        emit GameEnded(games[gameId].player, gameId, totalBetAmount, totalToPayout);
    }

    function getGameInfo(uint256 gameId) public view returns (
        GameInfoReturnType memory
    ) {
        return GameInfoReturnType({
            player: games[gameId].player,
            betAmount: games[gameId].betAmount,
            totalBetAmount: games[gameId].betAmount,
            numRuns: games[gameId].numRuns,
            difficulty: games[gameId].difficulty,
            dice1Results: games[gameId].dice1Results,
            dice2Results: games[gameId].dice2Results,
            totalPayout: games[gameId].payout,
            hasEnded: games[gameId].hasEnded,
            timestamp: games[gameId].timestamp
        });
    }

    function batchGameInfo(uint256[] calldata gameIds) external view returns (
        GameInfoReturnType[] memory
    ) {
        uint len = gameIds.length;
        GameInfoReturnType[] memory retTypes = new GameInfoReturnType[](len);
        
        for (uint i = 0; i < len;) {
            retTypes[i] = getGameInfo(gameIds[i]);
            unchecked { ++i; }
        }

        return retTypes;
    }

    function batchRawGameInfo(uint256[] calldata gameIds) external view override returns (bytes[] memory) {
        uint len = gameIds.length;
        bytes[] memory retTypes = new bytes[](len);
        for (uint i = 0; i < len;) {
            retTypes[i] = abi.encode(getGameInfo(gameIds[i]));
            unchecked { ++i; }
        }
        return retTypes;
    }

    function getEssentialGameInfo(uint256[] calldata gameIds) external view override returns (
        address[] memory players,
        uint256[] memory buyInAmounts,
        uint256[] memory totalPayouts,
        uint256[] memory timestamps,
        bool[] memory hasEndeds
    ) {
        uint len = gameIds.length;
        players = new address[](len);
        buyInAmounts = new uint256[](len);
        totalPayouts = new uint256[](len);
        timestamps = new uint256[](len);
        hasEndeds = new bool[](len);

        for (uint i = 0; i < len;) {
            players[i] = games[gameIds[i]].player;
            buyInAmounts[i] = games[gameIds[i]].betAmount;
            totalPayouts[i] = games[gameIds[i]].payout;
            timestamps[i] = games[gameIds[i]].timestamp;
            hasEndeds[i] = games[gameIds[i]].hasEnded;
            unchecked { ++i; }
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"GAME_ID_","type":"uint256"},{"internalType":"address","name":"_history","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"FulfilRandomFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"GameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SetPlatformFee","type":"event"},{"inputs":[],"name":"BASE_GAS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GAME_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GAS_PER_RUN","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RUNS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYOUT_DENOM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V2_RNG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchCallIsUsedGameId","outputs":[{"internalType":"bool[]","name":"isUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchGameInfo","outputs":[{"components":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"uint256","name":"totalBetAmount","type":"uint256"},{"internalType":"uint8","name":"numRuns","type":"uint8"},{"internalType":"uint8","name":"difficulty","type":"uint8"},{"internalType":"uint8[]","name":"dice1Results","type":"uint8[]"},{"internalType":"uint8[]","name":"dice2Results","type":"uint8[]"},{"internalType":"uint256","name":"totalPayout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct BearDice.GameInfoReturnType[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchRawGameInfo","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"requestId","type":"uint64"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"fulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"uint256","name":"amountForHouse","type":"uint256"},{"internalType":"uint8","name":"numRuns","type":"uint8"},{"internalType":"uint8","name":"difficulty","type":"uint8"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"getEssentialGameInfo","outputs":[{"internalType":"address[]","name":"players","type":"address[]"},{"internalType":"uint256[]","name":"buyInAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"totalPayouts","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"bool[]","name":"hasEndeds","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"getGameInfo","outputs":[{"components":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"uint256","name":"totalBetAmount","type":"uint256"},{"internalType":"uint8","name":"numRuns","type":"uint8"},{"internalType":"uint8","name":"difficulty","type":"uint8"},{"internalType":"uint8[]","name":"dice1Results","type":"uint8[]"},{"internalType":"uint8[]","name":"dice2Results","type":"uint8[]"},{"internalType":"uint256","name":"totalPayout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct BearDice.GameInfoReturnType","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"customGasLimit","type":"uint32"}],"name":"getVRFFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"history","outputs":[{"internalType":"contract IHistoryManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"isValidGameId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numUsedGameIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"paginateUsedGameIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"payouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"bytes","name":"gameData","type":"bytes"}],"name":"play","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_baseGas","type":"uint32"}],"name":"setBaseGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_gasPerRun","type":"uint32"}],"name":"setGasPerRun","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlatform","type":"uint256"}],"name":"setPlatformFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedGameIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000805460ff19169055600480546001600160481b031916670186a00007a1200017905560c860065534801561003957600080fd5b50604051614dfd380380614dfd833981016040819052610058916115f9565b6080919091526001600160a01b031660a05260b77ff39ce545b2b1b9a036325bfee4db10badccdc1e6b051a018a37d4c7d7724c334819055608b7ff6c3bfecb24bf6668781fd063fd487731fff69bff278624dd257d0f58c56af5b81905560787f7335c907d94a423793820c9fd1c7bfe9a8cad94f35ccd6312ea727f746cab2f1819055606d7fdd0a5c68823e9e8c2378ce1cb941c25f178eafda49c28104751c289c5f76e73a81905560657fb632b7861480af83de614061d278572a81cee88ff84359043c55b4b5904188fd8190557f1c7ec8d95e3c5286fd3ed87ff4787e96f46de367998f48458067fa65954e0811557f4057a05fcd736e217af65167ffc6cf8d12e288fe3eb16a6c349b99d9f7e86200557fb55d3c0e2e6999622badd77e0789903d6fb435e59c381590046a40d1e891c4f6557fc9796bf4df6467babf2a22ba96bcf1f6117ec6ef0684a4f45bb99948403c1a4c557fdb385aa1c05217d9634ed3502235af5cc25599813ef970c81b17811f2b9bc07e8190557fd5433abe063ebc2883ca9554ff493a2af50eeb8ab858f5344038247c013111c1819055608d7f1c21fa7ba4d52450e6bd80e3f5dd2333715671317d780746447d96bba2391344819055607a7fd8214cb637d5904e46f084b47d27c406bdf3f93edc020fb8c26c0c2887a10033819055606e7f2cac11be01ac143d6cb111ba384557bc4968702e26036f0d890a51ad76739db681905560667f16ac05add237c4749218ab5c20494a42c56b5515cdd74ca6b8e0dc939ab0df6f8190557fca5a49929829beff5a79f5c4c9d5a4e061b518981bbf88879402d7e1ced167d1557f9c586a8c8d3eb160ea0252b0824bb8b61974b71052bec7c0580864ecc669bff78190557f73b5665ba9df3abf92a8d91290344c13cb133a0f0eab9212d9227cc77ee52e9a8290557ecee714bfc4353af6568e6127702d8e411c9732049d73c08d7d44088d4518f58390557feeb0bc0f95986c64ee483fe98e11d82c43fc5870da683d5e5387af3636e22b649390935560b87f9e06c407a8c58c4369c12bd8976f0cf660b4bcba4ec1330b7916684d409aad688190557ff419df20de161d32a832aec97026f1cbd9a7c6b90df4dc6c3c274b6d45c7474f8390557fc35afe017415d929e40c0cba08586ea041aaf100d6c4c958aba3ebcec71466628290557fdfebd94bc92846057e8091ae6314fb045758a0903a6f93f6cc7c8a0a435855f584905560677fa3b0fd02c4787fe9ce93f9ad26fd7a50422102e552650c3d7f9d68fa4c9744928190557f1fcb29a9191898302d2355b54e3a18adbb85df08bbbd4dc5e6af67e92e7e26488190557fb054988df9e00a1c9404e6b8cc3e86c25e2c7ced983fe05eaa917bc5729eae7d8590557ff35fb0c23bb8173b985589da63c6cc51ebd940843a634aa7017e40d544db09078390557f48af5296bffe5a201121d05f95452fba9d8b41c99587af253c406f4b4b0edc338490557f1a9b359f0421da9ce98212369245cfc6b59f4810a800152703f1df281a28fc5b82905560bb7f26c06e70665393f56c7ca397d05f9bcef51a98cee6aa55a15f4cb8dd2788802b8190557fab557653779158a4fb55eee019314301e0576802c597f3cc06fccf3bebe09c0c8590557f446905334ca522051b6b5b7fb411852634a604ee3e5a1c51b36834282cb110498490557fa25dcdf209255c5f01b70a4006938167e8c245dde85b8229afc9f8c32aa34c898690557ff228ed0e83a412a30ba39ff5a0b818fc64b9baac9a162fbff567b42e71889e2f8290557f52016415589b73f6c925d24ea4c9ab6d8aef8a9878430a6591114544aa429527919091557f7237d8d307ac0baa4a3da118c732978ef3d9c2f1931af02f929afe2e001b9e258590557f41380d767448419cf0595059adbda0d15e37f6e4965165f6412375e72504892e8390557ff784f2fecbcea612ee95730027bfd9a5f090f418f650c1dc12424e3223cb463e8490557f5b7a17f893104a96c65aeea5c600b7570113c480c73041a76d7f0d4aebba29e2557f2552f683fc30990dee200962844c09df26d6a68602bf97a0ab323f1bf96c0d418190557f0908d63bbc2033f990225e9249d4f0bacabe03089242db14306a5b1b5467005b8390557fc069ce517785a8de5f3542004fe5aec58db581de071af72ef88b41695efd2cf88290557f339e76e709f4dd8f245587f1ac4d696c31d872e34cc7130d52309ad9fc08388f84905560687f4d304de5b12368f8e5615e35c10ac2714ea3a163a1a0cedc6877345b9bece7c28190557f130c74bea1a84ad6249bf57fda8425b77576ce00d4b67d0edad0079a47f8d70f557f86ab63ab74bd98376d11178df4c602b73e07368ee3935db1a8bd29eec068a27c939093557f666332a339ea3370ea8e3ecf7d929e92cfb59a1d108b7454c2f1b08faf781260557f76d6863403250c7b4f18b15e604dad92862403509a78f0d3749570e813bb0abf557fc0c19054a5e98b7a941cb505382af875ad80f0e36b2759eac2063e443a13f66b5561017c7f8a163b4e14839ae7149d277e79646f8c216affbd8ab496b5a938b8305732910681905560e17fa2626de0017c7f40b58c21b7192a8ece4c5575323e61ff0a168f89401752f048819055609b7fa84c4400fa03c5e292509f6ed0c3d6605d1975a8ab4733e4718c051b2d9b2c1f81905560757f2be77b3d5dcff480d8aaa8d72fc9eaaa31115f21f761a0f77136f4d3e73a70528190557fe8ec8d3cf8e3312762cfca6ef62c2ddf11dc93be78903b450c7ab93b3ca36d0c557f37714bd1f0a81be2dc999daea93366fafab66372e99772ba0a2df41df2599be1557f563ecdd321e4f608c73a0a3170b42640ce7d1c1d98f256a1dac13dfb24143f55557f7d0dc49113d1e4161ec512279d5f919184f8c1453bf32a932c54ccf1038f6118556101807f0148be5fffff4800b775b40d615a7fa2a86cf750c0147dc2b472c2668e25ef4381905560e37fc4e316ceb48bd1b84b5db493065fbb66de646a8bfd7e09657dd2538415cd386e819055609d7fb039dcb71abec5dbac643dd5ab302b4e28f0f030a3ac60f0fbc3d1f1b685ec6f81905560767f691404f3f0666a52496643d28c64839f5095b913e78694f04a55e79410629ea48190557f4863322c3d6b58037468713e9459ee10ca0d667cb936ab98db407ce62d8ad5908190557f13bdf0589b2a5c9e9a4f2e0c8339bdbbece8be53989867b63811f7104fa3ff3b8290557f5b645b1d57368649a0eb7652677d3acc16069f733f5352ff2e32c41938662c3e8390557f1721926c29e1ebfd7fe03c48a28b4ca76817b8e1335a66fd4a073a067e693833939093556101817f8fa54a136a9af3ce45de768d20c83482147e342156b2a513a27a671c06ef919a8190557f10e71ad6e25da2b42efa565fd8b6549423c44132236000ddf7ac59fbf31ead12839055609e7fd06040a2de58c377a256685324f46d18d74514fc1679af2692c60877c1a155f28190557ff327afca7417abcc5186a52b15c563ee2245ba407d6f89baf4aa48c97bf07f578590557ffe7b80f44058d76727954ff9c895d399f9b6d00588899ebe617af9a8b8fbe9d0949094557fa307bc698f5cbfb1ea98b7a993a2512b0f13cf9be61cac9c7b6fd268209981408490557f6ba872d46fb277123f7359834bd11e24e8902a31ff5fb7ac110f1a48ef3023ef8390557f3be51dd5f04bff6c5956d391663adc3ea99d4c0f023258b7db8aada8c779d8718190557f3cdcd4bd5d92251f01e1c36fcfae689e5da17953073cc865b60d73a2163f834681905560e57f7623b6a823a8a1245af5f51623615b790da2dd30a6e9dfeed4049458221f32448190557f6604586c0254a1a7ad4dc019e567784b235e10b7aec99ab7c6006b71b3b3bd0983905560777fb7130f434760125bff27feb03ea98abca0a30eb1f60540cfa09859127b293db88190557f8ec79e122686f1e65b4b0fedfd2d7f0ecd1b5ec72d94a52267f264be781b8e3d8190557fd0f36771b60f0271833d5db1e069c0d87324c5416160d73c00be0b3521ebed0c939093557ffef779749c99f38630daf5bbadc5ff175ef8cf6da8be7a8ac71d568caf270798557f91166abfd65e098a58d37060bbe14c6f1fc9721c72b78e8a504850c5b63adb1c556101827fbb7ea7f38b59f02f76404957c84f3d209c7c033c8dc980f2464eda92d194c0258190557ff6bbe2f872ba187339351d39337cfeadef35518711e01645028992cac329e1a68390557fa1de332a92bd9207f40e916f4c8ee058e010160ca062cca732f229032cef0a638490557fe0a32d0c023d41e0124e6045d447d7e09e62e350d13d05b577cce155e2f1685e8290557fdfa8257455b2f9335813860c8b77b0e4582d23c4405c3825391408d8d24d8eb7919091557f65e5b291d88a84dbaf797b9631169a1c5470427067e8584bcab625163b878f2d929092557f2b70da9cdbd3962cfd27789204fb97b2aa3a892aa4a4a154ca2434eff4c9f294557fb647e4022fed46657d514865d85353a3a5a31c28bdc0411093b4f438da429e60556102767f82b65d6b89d46a86c95b660ed27d48a108dd76f562fb0312242659629cc475de81905561012c7ff7e516dea209888b9d85f1c8b6696d0ae68e3eed36c41ae4c6cdb8bfd12b35b481905560b17f17c3e942de377b4881994c0508e856ba4ef8e57d487dfb7ac966effb914143fa8190557f5342019c28669cc007403c3abd06568ecee5dd9b923c00fd83f61a0d719089dd557fba2b3daa6f15ef62e6bd9573eb2ce011e8ead0244e63dfac1e11f14652341a13557f115f4274f0c20ab0ecf2c04a0d6fc9679107d00e73bebef35baadda79962e1775561027d7f266cef0276773a07165e915fd6176b7375e7fdcf42ec255c691bf96c695f63cd81905561012f7f5a08a3d5c86f386cc2a17db540799b7e4ec376e11cb30d2c504a10e1de66f3af81905560b37f36d8c4a20a22d6ba7324872d9bb80482ec6fb5cdf8729e4062aeb54595d32e218190557f82f65071287c76c07840773a77ed2ae94313fe72f8dac0c5552170055c17edd18190557fb663beb3d615ae8b449d55d46948598c0e8c6e547accadc6074b814dfb08f6ac919091557fb9b1f5e5111398233ac3ab7bc5363c1df51a5ecbf6a1d22bbf539671896c5e9e919091556102807fdb9961755b3a5dcddb847dc40b98196cd86ea468fa9c81434bbf91c2204a3e228190556101317f075f6d924c6d3c29645c45807b425e4e865e5f7241f4141891c4c98b381cf0768190557f68633ffc35ee9d30da55c3088d60c56c73d9fcaf1c0c332e9f7f0153a9576b0c8390557f2060b66b034b180e2ef7eed7d54a7b048409b9e42fcb0003af37f76c0b47b8078390557fd50bd1e7557232f9d3465aaefa58e29c7dfa64efeb01a1ae3c689196b55550308190557f74bed876a09183871c9ea434e30451bf36d3549f8159f365d5a0df1c8717697b919091556102837fa950940b518c0e6095e8974f74df0ad954082cb24e8430e09113bd55656505cb8190557f700bb7a68f54bb5c77a4384a8d09f40eb34ba008b59cc1d6fd516dbfef63e5218290557fd26f7f5c5adb127f5cc12f90fbcb553c1c9704239edaae440c1e67467864ccf08390557fad25bb3d97a173b8db6d3459ffaa78f385d86ac571163154b6a58102d47f74428390557fb534795a4a11de1df322a5c21fc0d1186d7d3440c9eb6d64009972f88b4a6fef919091557f67e45428301aa041ba7c56777a7bb3c5709561c47c3c6c133f4c9297c8c596a48190557f1fb9bcccb90bce04af4ddda4e5c54217dbd6f5a49bc225f8d5c5f9587a9c3c728190556101327f6ed18aa85c3c3c1e0379373382757c2d74326cc61c2ec65deb688c6c750406c98190557f192cbfcf7d4edadcf0f6403871631676eccf78379e8b7541ed8edaceeace26198390557fd0c61f5170451e4447205e489298451b9846be2c1cace4882e87cc2ffb1afb47929092557f80d37b890d9a05b5a0721de1ecff01c270c8205851aaa57fd7dc18992a8462c9919091557f02580703e350c8e1cf31da8886ffc9985c352f51ff612c7b5870e3a15b5a5010556103cc7f25226a01c8748db6e238bf4a1795635c04e519c1386812f4769123cb7f9afa7e81905561018b7f7e0ec472817962d8f1c2ef67e615325bfc6f840823b5a6cdfbcbfdc6b627157f8190557fda02aa61e1952fa35f0291e5b5e2b42821463ce17a770ab52ea8463e8cb04797557f57119a6fb4208ca5cb253236994f63b69d2dfae1437436dcbdaf0b0fb0f0e23a556103d47f0beb36da48f30312a55247f8e2d069c29dc909e7cf2feacbcb5a65c10290fd708190556101907ff1289fb581ab70a4cd47e1c5efe64c8fa38f5b3c14835b50aa5cb708e6e453dc8190557f24ec78a77bfca346cbaf8078cee8b15ba8692ab780873509d5d7223385d18477557f5bb4c2928fbb03c4abb7b5ca20419d6cd84fc5110b39727c2a6d10470d9c941e556103d67f0e10eee5ee203af19171092667a7c008ce16152603653f8b43ab3021d29224048190556101917f7925213dfcf141dae1829a65c412e234de4c11db776b762c2df917d9ce6cd4c28190557fe1da6b2ca1cad5ca5c8b061c5161e36f1edfb184411c7598657a889d80216ad4557fc7b2c01fc2b9573254c643cd5ea60202d409183f354bb29babd55b42cabeb955556103d87f9b70a898df240e306a25d4945d7f67b0248a06ed32fc73a1305762bf7cc8f3e78190556101937f9aa86530dff21b03b955d356084a78bafce62d6f1416b695d3ab946e45518e178190557f9f9ebc5fea284621a1b05ae1dbc4c15140813b17ba69eba81c1f87f31baa83ba8190557f2606062aad23a8cb42bf511f160b0798484fcf9b0567ae55b75d58b8ba74cd27919091556103da7feb932f8d0f3c316f252312f024c735e1358086fde15444fb8d7e134e2dc970208190557fbaee63b37316258b199bf66e38f2c4ab22bc77f87fad44149f4582a4fa702d9f8290557f5cdd6073f602c8f4d27b5fd42f0d8f96cb349d8f46e7f296eab998cb6654be30919091557f48fec1e1fb3465d8476d2f3e12e997446154c29959dbcac8676b54bd270bd878556106e27f53f10fca388a3f067753b761e845cfbe42197918c5ebe5d7a6aa6fa8d0e5a7db8190557ff2743524fd3f3362d3e8996b8f270ad779493767323dd8ebb70038d61b618fe3556106f47fba7a64f22cec61d137c9ada21860c8b7b16836f3a4cc393b481bbe88eb4c00ea8190557f2bc530f87c24363fea71b14055adbb9d794916cadc05e1e58b44ee8a6be071e6556106fb7f40d4d39db361ba528dc154519467b81b5f1fc1cf5e61be6f89f872df43a875848190557fbd07b81201f8189cd1c03db10d79db1673e3c6df414babf2e6953569ba9f54d8556106fd7fda7730e96aebe0f162ae374b3a40858dacbbf9de10863ef1f8ad30c3ebe3a4428190557f167d1f62ee47cbf400f75def8198a6d96db874f5f4af8b58d748775e47f31b75556107007f7b81f43c11f32267778c44cff433e03e5efc820bb30a246186aa2a6dee6c14f9819055600c6000527fd45446725a474b636cec29f0a9e179fad2a1540b4d0bfeaff8809af7fbb4f8636020527fce21148dc9af09939523b78bf330ca70d35dae80d196462eef1471bfc525bf2955611636565b6000806040838503121561160c57600080fd5b825160208401519092506001600160a01b038116811461162b57600080fd5b809150509250929050565b60805160a05161376a61169360003960008181610620015261299101526000818161071b01528181611f3f0152818161204a0152818161214a0152818161225101528181612347015281816129640152612acf015261376a6000f3fe6080604052600436106101f25760003560e01c80635c975abb1161010d57806398daac83116100a0578063cc81d0551161006f578063cc81d055146106a6578063dc5bdf13146106bb578063faf3bbc2146106e1578063fdcdb06b14610709578063ff5d4c871461073d57600080fd5b806398daac831461060e5780639e281a9814610642578063c4fd5d6d14610662578063c811ad711461069357600080fd5b80638026e311116100dc5780638026e3111461058c5780638456cb59146105ac57806389fc2c0f146105c157806391ea41e6146105e157600080fd5b80635c975abb146104e7578063735e7d6614610501578063749fa03c1461053f5780637b8d38791461055f57600080fd5b8063389aa3421161018557806348e8294a1161015457806348e8294a1461044d5780634cdc38181461047a57806351e92559146104a157806352233e91146104d157600080fd5b8063389aa342146103a75780634782f779146103de57806347e1d550146103fe578063481c6a751461042b57600080fd5b80631dd0d57a116101c15780631dd0d57a1461032157806326232a2e146103415780632c28f5791461036557806332883e7e1461037a57600080fd5b8063046f7da2146101fe57806304e2064f14610215578063117a5b901461024757806312e8e2c31461030157600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361075d565b005b34801561022157600080fd5b5061022a610812565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025357600080fd5b506102b6610262366004612ece565b60056020526000908152604090208054600182015460028301546003840154600685015460078601546008909601546001600160a01b03909516959394929360ff8084169461010090940481169391169088565b604080516001600160a01b03909916895260208901979097529587019490945260ff92831660608701529116608085015260a0840152151560c083015260e08201526101000161023e565b34801561030d57600080fd5b5061021361031c366004612ece565b610889565b34801561032d57600080fd5b5061021361033c366004612ee7565b6109b4565b34801561034d57600080fd5b5061035760065481565b60405190815260200161023e565b34801561037157600080fd5b50610213610a76565b34801561038657600080fd5b5061039a610395366004612f14565b610b67565b60405161023e9190612f72565b3480156103b357600080fd5b506004546103c990610100900463ffffffff1681565b60405163ffffffff909116815260200161023e565b3480156103ea57600080fd5b506102136103f9366004612f9d565b610c2b565b34801561040a57600080fd5b5061041e610419366004612ece565b610d30565b60405161023e91906130b8565b34801561043757600080fd5b5061022a60008051602061371583398151915281565b34801561045957600080fd5b5061046d610468366004613116565b610ed0565b60405161023e9190613157565b34801561048657600080fd5b5061048f600581565b60405160ff909116815260200161023e565b3480156104ad57600080fd5b506104c16104bc366004612ece565b610f83565b604051901515815260200161023e565b3480156104dd57600080fd5b5061035761271081565b3480156104f357600080fd5b506000546104c19060ff1681565b34801561050d57600080fd5b5061035761051c3660046131d2565b600760209081526000938452604080852082529284528284209052825290205481565b34801561054b57600080fd5b5061021361055a36600461322a565b610fa3565b34801561056b57600080fd5b5061057f61057a366004613116565b6113d9565b60405161023e91906132b2565b34801561059857600080fd5b506102136105a7366004612ee7565b611496565b3480156105b857600080fd5b50610213611560565b3480156105cd57600080fd5b506103576105dc366004612ece565b61160f565b3480156105ed57600080fd5b506106016105fc366004613116565b611630565b60405161023e91906132e9565b34801561061a57600080fd5b5061022a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561064e57600080fd5b5061021361065d366004612f9d565b6116e7565b34801561066e57600080fd5b5061068261067d366004613116565b611796565b60405161023e95949392919061335d565b6102136106a13660046133fd565b611ac9565b3480156106b257600080fd5b50600154610357565b3480156106c757600080fd5b506004546103c99065010000000000900463ffffffff1681565b3480156106ed57600080fd5b5061022a73258f9ead08d35955fc80678658d9cdfd36f9856381565b34801561071557600080fd5b506103577f000000000000000000000000000000000000000000000000000000000000000081565b34801561074957600080fd5b50610357610758366004612ee7565b611d5b565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cd9190613482565b6001600160a01b0316336001600160a01b0316146108065760405162461bcd60e51b81526004016107fd9061349f565b60405180910390fd5b6000805460ff19169055565b60006000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610860573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108849190613482565b905090565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190613482565b6001600160a01b0316336001600160a01b0316146109295760405162461bcd60e51b81526004016107fd9061349f565b61093660056127106134ef565b8111156109795760405162461bcd60e51b815260206004820152601160248201527043616e6e6f74204578636565642032302560781b60448201526064016107fd565b60068190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a249190613482565b6001600160a01b0316336001600160a01b031614610a545760405162461bcd60e51b81526004016107fd9061349f565b6004805463ffffffff9092166101000264ffffffff0019909216919091179055565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae69190613482565b6001600160a01b0316336001600160a01b031614610b165760405162461bcd60e51b81526004016107fd9061349f565b60045460ff1615610b585760405162461bcd60e51b815260206004820152600c60248201526b416c7265616479204c69766560a01b60448201526064016107fd565b6004805460ff19166001179055565b600154606090821115610b7a5760015491505b6000610b868484613503565b6001600160401b03811115610b9d57610b9d613516565b604051908082528060200260200182016040528015610bc6578160200160208202803683370190505b509050835b83811015610c215760018181548110610be657610be661352c565b9060005260206000200154828683610bfe9190613503565b81518110610c0e57610c0e61352c565b6020908102919091010152600101610bcb565b5090505b92915050565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9b9190613482565b6001600160a01b0316336001600160a01b031614610ccb5760405162461bcd60e51b81526004016107fd9061349f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d18576040519150601f19603f3d011682016040523d82523d6000602084013e610d1d565b606091505b5050905080610d2b57600080fd5b505050565b610d38612daf565b604080516101408101825260008481526005602081815284832080546001600160a01b03168552600181015482860181905285870152600381015460ff80821660608801526101009091041660808601529287905290815260049091018054845181840281018401909552808552929360a08501939092830182828015610dfc57602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610dcd5790505b5050505050815260200160056000858152602001908152602001600020600501805480602002602001604051908101604052809291908181526020018280548015610e8457602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610e555790505b50505091835250506000848152600560208181526040808420600681015483870152600781015460ff161515918601919091529690925290526008909301546060909301929092525090565b6060816000816001600160401b03811115610eed57610eed613516565b604051908082528060200260200182016040528015610f2657816020015b610f13612daf565b815260200190600190039081610f0b5790505b50905060005b82811015610f7a57610f55868683818110610f4957610f4961352c565b90506020020135610d30565b828281518110610f6757610f6761352c565b6020908102919091010152600101610f2c565b50949350505050565b60008181526002602052604081205460ff16158015610c25575050151590565b6000805160206137158339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110139190613482565b6001600160a01b0316336001600160a01b0316148061104557503373258f9ead08d35955fc80678658d9cdfd36f98563145b6110855760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107fd565b6001600160401b0383166000908152600360208181526040808420548085526005909252909220015460ff808216916101009004166110c386611dd7565b8215806110e557506000838152600560205260409020546001600160a01b0316155b80611106575060008381526005602052604090206007015460ff1615156001145b80611112575060ff8216155b8061112a5750611123826002613542565b60ff168414155b15611174577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5868487876040516111649493929190613565565b60405180910390a1505050505050565b600083815260056020526040812060078101805460ff1916600190811790915501549081905b8460ff1681101561133f576000600689896111b68560026135b7565b8181106111c5576111c561352c565b905060200201356111d691906135ce565b6111e19060016135e2565b9050600060068a8a6111f48660026135b7565b6111ff9060016135e2565b81811061120e5761120e61352c565b9050602002013561121f91906135ce565b61122a9060016135e2565b9050600061123882846135f5565b60008a815260056020526040902060040180549192508491869081106112605761126061352c565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555081600560008b815260200190815260200160002060050185815481106112b2576112b261352c565b60009182526020808320818304018054601f9093166101000a60ff81810219909416958416029490941790935589811682526007835260408083208c831684528452808320918516835292522054801561132357606461131282886135b7565b61131c91906134ef565b9550611330565b600095505050505061133f565b8460010194505050505061119a565b506000858152600560205260409020600681018290558054600290910154611372916001600160a01b0316908390611eb3565b6000858152600560209081526040918290205482518881529182018590529181018390526001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89060600160405180910390a25050505050505050565b606081806001600160401b038111156113f4576113f4613516565b60405190808252806020026020018201604052801561141d578160200160208202803683370190505b50915060005b8181101561148e57600260008686848181106114415761144161352c565b90506020020135815260200190815260200160002060009054906101000a900460ff168382815181106114765761147661352c565b91151560209283029190910190910152600101611423565b505092915050565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115069190613482565b6001600160a01b0316336001600160a01b0316146115365760405162461bcd60e51b81526004016107fd9061349f565b6004805463ffffffff909216650100000000000268ffffffff000000000019909216919091179055565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190613482565b6001600160a01b0316336001600160a01b0316146116005760405162461bcd60e51b81526004016107fd9061349f565b6000805460ff19166001179055565b6001818154811061161f57600080fd5b600091825260209091200154905081565b6060816000816001600160401b0381111561164d5761164d613516565b60405190808252806020026020018201604052801561168057816020015b606081526020019060019003908161166b5790505b50905060005b82811015610f7a576116a3868683818110610f4957610f4961352c565b6040516020016116b391906130b8565b6040516020818303038152906040528282815181106116d4576116d461352c565b6020908102919091010152600101611686565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117579190613482565b6001600160a01b0316336001600160a01b0316146117875760405162461bcd60e51b81526004016107fd9061349f565b61179282338361239d565b5050565b60608080808085806001600160401b038111156117b5576117b5613516565b6040519080825280602002602001820160405280156117de578160200160208202803683370190505b509550806001600160401b038111156117f9576117f9613516565b604051908082528060200260200182016040528015611822578160200160208202803683370190505b509450806001600160401b0381111561183d5761183d613516565b604051908082528060200260200182016040528015611866578160200160208202803683370190505b509350806001600160401b0381111561188157611881613516565b6040519080825280602002602001820160405280156118aa578160200160208202803683370190505b509250806001600160401b038111156118c5576118c5613516565b6040519080825280602002602001820160405280156118ee578160200160208202803683370190505b50915060005b81811015611abd57600560008a8a848181106119125761191261352c565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b03168782815181106119505761195061352c565b60200260200101906001600160a01b031690816001600160a01b031681525050600560008a8a848181106119865761198661352c565b905060200201358152602001908152602001600020600101548682815181106119b1576119b161352c565b602002602001018181525050600560008a8a848181106119d3576119d361352c565b905060200201358152602001908152602001600020600601548582815181106119fe576119fe61352c565b602002602001018181525050600560008a8a84818110611a2057611a2061352c565b90506020020135815260200190815260200160002060080154848281518110611a4b57611a4b61352c565b602002602001018181525050600560008a8a84818110611a6d57611a6d61352c565b90506020020135815260200190815260200160002060070160009054906101000a900460ff16838281518110611aa557611aa561352c565b911515602092830291909101909101526001016118f4565b50509295509295909350565b826001600160a01b0381163314611b9357604051636d6d50a160e11b81523360048201526000805160206137158339815191529063dadaa14290602401602060405180830381865afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b47919061360e565b611b935760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107fd565b6000805160206137158339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c03919061360e565b15611c435760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107fd565b60005460ff1615611c7f5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107fd565b60045460ff161515600003611d4a5760405163242aefad60e21b81526001600160a01b0385166004820152731e79da4f709db18e4c3de214d29f0d7b45f986ea906390abbeb490602401602060405180830381865afa158015611ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0a919061360e565b611d4a5760405162461bcd60e51b815260206004820152601160248201527004e6f7420496e20546573742047726f757607c1b60448201526064016107fd565b611d558484846124ce565b50505050565b60405163ca1642e160e01b815263ffffffff8216600482015260009073258f9ead08d35955fc80678658d9cdfd36f985639063ca1642e190602401602060405180830381865afa158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c259190613630565b6000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e479190613482565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e8157600080fd5b505af1158015611e95573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b81156122c6578082106120cb576000805160206137158339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f309190613482565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b158015611f9c57600080fd5b505af1158015611fb0573d6000803e3d6000fd5b505050505060008183611fc39190613503565b90508015611d55576000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203b9190613482565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b1580156120ad57600080fd5b505af11580156120c1573d6000803e3d6000fd5b5050505050505050565b6000805160206137158339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190613482565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b1580156121a757600080fd5b505af11580156121bb573d6000803e3d6000fd5b5050505050600082826121ce9190613503565b90506000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122409190613482565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161228e91815260200190565b6000604051808303818588803b1580156122a757600080fd5b505af11580156122bb573d6000803e3d6000fd5b505050505050505050565b6000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123369190613482565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161238491815260200190565b6000604051808303818588803b1580156120ad57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123f99190613649565b6000604051808303816000865af19150503d8060008114612436576040519150601f19603f3d011682016040523d82523d6000602084013e61243b565b606091505b5091509150818015612465575080511580612465575080806020019051810190612465919061360e565b6124c75760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107fd565b5050505050565b6000808080806124e086880188613665565b9450945094509450945060008460ff161180156125015750600560ff851611155b6125415760405162461bcd60e51b81526020600482015260116024820152704552523a20494e56414c49442052554e5360781b60448201526064016107fd565b6004546000906125639065010000000000900463ffffffff1660ff87166136bc565b60045461257b9190610100900463ffffffff166136db565b9050600061258882611d5b565b9050803410156125cc5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107fd565b6125d585610f83565b151560011461261d5760405162461bcd60e51b81526020600482015260146024820152731154948e88125395905312510811d0535148125160621b60448201526064016107fd565b60ff87166000908152600760209081526040808320600184528252808320600284529091529020546126915760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c494420444946464943554c545900000000000000000060448201526064016107fd565b600061269d8234613503565b90506000612710600654836126b291906135b7565b6126bc91906134ef565b90506126c981878e61289b565b600087815260056020526040902080546001600160a01b0319166001600160a01b038e161781556001018290556127008183613503565b60008881526005602052604090206002810191909155600301805460ff8a811661ffff199092168217610100918d1691909102179091556001600160401b0381111561274e5761274e613516565b604051908082528060200260200182016040528015612777578160200160208202803683370190505b506005600089815260200190815260200160002060040190805190602001906127a1929190612e13565b508760ff166001600160401b038111156127bd576127bd613516565b6040519080825280602002602001820160405280156127e6578160200160208202803683370190505b506000888152600560208181526040909220835161280a9491909201920190612e13565b5060008781526005602052604090204260089091015561282a8c88612945565b6128348c83612a39565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c78860405161286f91815260200190565b60405180910390a261288d876128868a6002613542565b8787612b37565b505050505050505050505050565b6000805160206137158339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290b9190613482565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e5908590604401612384565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b1580156129d557600080fd5b505af11580156129e9573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000805160206137158339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa99190613482565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612b1b57600080fd5b505af1158015612b2f573d6000803e3d6000fd5b505050505050565b60006000805160206137158339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba99190613482565b6001600160a01b031663f09cdf37612bc084611d5b565b6040516001600160e01b031960e084901b1681526004810187905260ff8816602482015263ffffffff8616604482015260640160206040518083038185885af1158015612c11573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c3691906136f7565b6001600160401b03811660009081526003602052604090205490915015612c925760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107fd565b6001600160401b038116600090815260036020908152604091829020879055815160016264c53160e01b0319815291516000805160206137158339815191529263ff9b3acf9260048083019391928290030181865afa158015612cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1d9190613482565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d5757600080fd5b505af1158015612d6b573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d4585604051612da091815260200190565b60405180910390a15050505050565b60405180610140016040528060006001600160a01b031681526020016000815260200160008152602001600060ff168152602001600060ff168152602001606081526020016060815260200160008152602001600015158152602001600081525090565b82805482825590600052602060002090601f01602090048101928215612ea95791602002820160005b83821115612e7a57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302612e3c565b8015612ea75782816101000a81549060ff0219169055600101602081600001049283019260010302612e7a565b505b50612eb5929150612eb9565b5090565b5b80821115612eb55760008155600101612eba565b600060208284031215612ee057600080fd5b5035919050565b600060208284031215612ef957600080fd5b813563ffffffff81168114612f0d57600080fd5b9392505050565b60008060408385031215612f2757600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b82811015612f68578151865260209586019590910190600101612f4a565b5093949350505050565b602081526000612f0d6020830184612f36565b6001600160a01b0381168114612f9a57600080fd5b50565b60008060408385031215612fb057600080fd5b8235612fbb81612f85565b946020939093013593505050565b600081518084526020840193506020830160005b82811015612f6857815160ff16865260209586019590910190600101612fdd565b80516001600160a01b03168252602081015160208301526040810151604083015260006060820151613035606085018260ff169052565b50608082015161304a608085018260ff169052565b5060a082015161014060a0850152613066610140850182612fc9565b905060c083015184820360c086015261307f8282612fc9565b91505060e083015160e08501526101008301516130a161010086018215159052565b506101208301516101208501528091505092915050565b602081526000612f0d6020830184612ffe565b60008083601f8401126130dd57600080fd5b5081356001600160401b038111156130f457600080fd5b6020830191508360208260051b850101111561310f57600080fd5b9250929050565b6000806020838503121561312957600080fd5b82356001600160401b0381111561313f57600080fd5b61314b858286016130cb565b90969095509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156131b057603f1987860301845261319b858351612ffe565b9450602093840193919091019060010161317f565b50929695505050505050565b803560ff811681146131cd57600080fd5b919050565b6000806000606084860312156131e757600080fd5b6131f0846131bc565b92506131fe602085016131bc565b915061320c604085016131bc565b90509250925092565b6001600160401b0381168114612f9a57600080fd5b60008060006040848603121561323f57600080fd5b833561324a81613215565b925060208401356001600160401b0381111561326557600080fd5b613271868287016130cb565b9497909650939450505050565b600081518084526020840193506020830160005b82811015612f685781511515865260209586019590910190600101613292565b602081526000612f0d602083018461327e565b60005b838110156132e05781810151838201526020016132c8565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156131b057603f198786030184528151805180875261333a8160208901602085016132c5565b601f01601f19169590950160209081019550938401939190910190600101613311565b60a08082528651908201819052600090602088019060c0840190835b818110156133a05783516001600160a01b0316835260209384019390920191600101613379565b505083810360208501526133b48189612f36565b91505082810360408401526133c98187612f36565b905082810360608401526133dd8186612f36565b905082810360808401526133f1818561327e565b98975050505050505050565b60008060006040848603121561341257600080fd5b833561341d81612f85565b925060208401356001600160401b0381111561343857600080fd5b8401601f8101861361344957600080fd5b80356001600160401b0381111561345f57600080fd5b86602082840101111561347157600080fd5b939660209190910195509293505050565b60006020828403121561349457600080fd5b8151612f0d81612f85565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000826134fe576134fe6134c3565b500490565b81810381811115610c2557610c256134d9565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60ff818116838216029081169081811461355e5761355e6134d9565b5092915050565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b0383111561359c57600080fd5b8260051b808560808501379190910160800195945050505050565b8082028115828204841417610c2557610c256134d9565b6000826135dd576135dd6134c3565b500690565b80820180821115610c2557610c256134d9565b60ff8181168382160190811115610c2557610c256134d9565b60006020828403121561362057600080fd5b81518015158114612f0d57600080fd5b60006020828403121561364257600080fd5b5051919050565b6000825161365b8184602087016132c5565b9190910192915050565b600080600080600060a0868803121561367d57600080fd5b613686866131bc565b9450613694602087016131bc565b93506040860135925060608601356136ab81612f85565b949793965091946080013592915050565b63ffffffff818116838216029081169081811461355e5761355e6134d9565b63ffffffff8181168382160190811115610c2557610c256134d9565b60006020828403121561370957600080fd5b8151612f0d8161321556fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220da10f80d4c5c0e5f4ef67cea385d8f30d76f9a2226fbe89c418aebd2455868c064736f6c634300081c00330000000000000000000000000000000000000000000000000000000000000014000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

Deployed Bytecode

0x6080604052600436106101f25760003560e01c80635c975abb1161010d57806398daac83116100a0578063cc81d0551161006f578063cc81d055146106a6578063dc5bdf13146106bb578063faf3bbc2146106e1578063fdcdb06b14610709578063ff5d4c871461073d57600080fd5b806398daac831461060e5780639e281a9814610642578063c4fd5d6d14610662578063c811ad711461069357600080fd5b80638026e311116100dc5780638026e3111461058c5780638456cb59146105ac57806389fc2c0f146105c157806391ea41e6146105e157600080fd5b80635c975abb146104e7578063735e7d6614610501578063749fa03c1461053f5780637b8d38791461055f57600080fd5b8063389aa3421161018557806348e8294a1161015457806348e8294a1461044d5780634cdc38181461047a57806351e92559146104a157806352233e91146104d157600080fd5b8063389aa342146103a75780634782f779146103de57806347e1d550146103fe578063481c6a751461042b57600080fd5b80631dd0d57a116101c15780631dd0d57a1461032157806326232a2e146103415780632c28f5791461036557806332883e7e1461037a57600080fd5b8063046f7da2146101fe57806304e2064f14610215578063117a5b901461024757806312e8e2c31461030157600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361075d565b005b34801561022157600080fd5b5061022a610812565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025357600080fd5b506102b6610262366004612ece565b60056020526000908152604090208054600182015460028301546003840154600685015460078601546008909601546001600160a01b03909516959394929360ff8084169461010090940481169391169088565b604080516001600160a01b03909916895260208901979097529587019490945260ff92831660608701529116608085015260a0840152151560c083015260e08201526101000161023e565b34801561030d57600080fd5b5061021361031c366004612ece565b610889565b34801561032d57600080fd5b5061021361033c366004612ee7565b6109b4565b34801561034d57600080fd5b5061035760065481565b60405190815260200161023e565b34801561037157600080fd5b50610213610a76565b34801561038657600080fd5b5061039a610395366004612f14565b610b67565b60405161023e9190612f72565b3480156103b357600080fd5b506004546103c990610100900463ffffffff1681565b60405163ffffffff909116815260200161023e565b3480156103ea57600080fd5b506102136103f9366004612f9d565b610c2b565b34801561040a57600080fd5b5061041e610419366004612ece565b610d30565b60405161023e91906130b8565b34801561043757600080fd5b5061022a60008051602061371583398151915281565b34801561045957600080fd5b5061046d610468366004613116565b610ed0565b60405161023e9190613157565b34801561048657600080fd5b5061048f600581565b60405160ff909116815260200161023e565b3480156104ad57600080fd5b506104c16104bc366004612ece565b610f83565b604051901515815260200161023e565b3480156104dd57600080fd5b5061035761271081565b3480156104f357600080fd5b506000546104c19060ff1681565b34801561050d57600080fd5b5061035761051c3660046131d2565b600760209081526000938452604080852082529284528284209052825290205481565b34801561054b57600080fd5b5061021361055a36600461322a565b610fa3565b34801561056b57600080fd5b5061057f61057a366004613116565b6113d9565b60405161023e91906132b2565b34801561059857600080fd5b506102136105a7366004612ee7565b611496565b3480156105b857600080fd5b50610213611560565b3480156105cd57600080fd5b506103576105dc366004612ece565b61160f565b3480156105ed57600080fd5b506106016105fc366004613116565b611630565b60405161023e91906132e9565b34801561061a57600080fd5b5061022a7f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b34801561064e57600080fd5b5061021361065d366004612f9d565b6116e7565b34801561066e57600080fd5b5061068261067d366004613116565b611796565b60405161023e95949392919061335d565b6102136106a13660046133fd565b611ac9565b3480156106b257600080fd5b50600154610357565b3480156106c757600080fd5b506004546103c99065010000000000900463ffffffff1681565b3480156106ed57600080fd5b5061022a73258f9ead08d35955fc80678658d9cdfd36f9856381565b34801561071557600080fd5b506103577f000000000000000000000000000000000000000000000000000000000000001481565b34801561074957600080fd5b50610357610758366004612ee7565b611d5b565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cd9190613482565b6001600160a01b0316336001600160a01b0316146108065760405162461bcd60e51b81526004016107fd9061349f565b60405180910390fd5b6000805460ff19169055565b60006000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610860573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108849190613482565b905090565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190613482565b6001600160a01b0316336001600160a01b0316146109295760405162461bcd60e51b81526004016107fd9061349f565b61093660056127106134ef565b8111156109795760405162461bcd60e51b815260206004820152601160248201527043616e6e6f74204578636565642032302560781b60448201526064016107fd565b60068190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a249190613482565b6001600160a01b0316336001600160a01b031614610a545760405162461bcd60e51b81526004016107fd9061349f565b6004805463ffffffff9092166101000264ffffffff0019909216919091179055565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae69190613482565b6001600160a01b0316336001600160a01b031614610b165760405162461bcd60e51b81526004016107fd9061349f565b60045460ff1615610b585760405162461bcd60e51b815260206004820152600c60248201526b416c7265616479204c69766560a01b60448201526064016107fd565b6004805460ff19166001179055565b600154606090821115610b7a5760015491505b6000610b868484613503565b6001600160401b03811115610b9d57610b9d613516565b604051908082528060200260200182016040528015610bc6578160200160208202803683370190505b509050835b83811015610c215760018181548110610be657610be661352c565b9060005260206000200154828683610bfe9190613503565b81518110610c0e57610c0e61352c565b6020908102919091010152600101610bcb565b5090505b92915050565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9b9190613482565b6001600160a01b0316336001600160a01b031614610ccb5760405162461bcd60e51b81526004016107fd9061349f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d18576040519150601f19603f3d011682016040523d82523d6000602084013e610d1d565b606091505b5050905080610d2b57600080fd5b505050565b610d38612daf565b604080516101408101825260008481526005602081815284832080546001600160a01b03168552600181015482860181905285870152600381015460ff80821660608801526101009091041660808601529287905290815260049091018054845181840281018401909552808552929360a08501939092830182828015610dfc57602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610dcd5790505b5050505050815260200160056000858152602001908152602001600020600501805480602002602001604051908101604052809291908181526020018280548015610e8457602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610e555790505b50505091835250506000848152600560208181526040808420600681015483870152600781015460ff161515918601919091529690925290526008909301546060909301929092525090565b6060816000816001600160401b03811115610eed57610eed613516565b604051908082528060200260200182016040528015610f2657816020015b610f13612daf565b815260200190600190039081610f0b5790505b50905060005b82811015610f7a57610f55868683818110610f4957610f4961352c565b90506020020135610d30565b828281518110610f6757610f6761352c565b6020908102919091010152600101610f2c565b50949350505050565b60008181526002602052604081205460ff16158015610c25575050151590565b6000805160206137158339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110139190613482565b6001600160a01b0316336001600160a01b0316148061104557503373258f9ead08d35955fc80678658d9cdfd36f98563145b6110855760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107fd565b6001600160401b0383166000908152600360208181526040808420548085526005909252909220015460ff808216916101009004166110c386611dd7565b8215806110e557506000838152600560205260409020546001600160a01b0316155b80611106575060008381526005602052604090206007015460ff1615156001145b80611112575060ff8216155b8061112a5750611123826002613542565b60ff168414155b15611174577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5868487876040516111649493929190613565565b60405180910390a1505050505050565b600083815260056020526040812060078101805460ff1916600190811790915501549081905b8460ff1681101561133f576000600689896111b68560026135b7565b8181106111c5576111c561352c565b905060200201356111d691906135ce565b6111e19060016135e2565b9050600060068a8a6111f48660026135b7565b6111ff9060016135e2565b81811061120e5761120e61352c565b9050602002013561121f91906135ce565b61122a9060016135e2565b9050600061123882846135f5565b60008a815260056020526040902060040180549192508491869081106112605761126061352c565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555081600560008b815260200190815260200160002060050185815481106112b2576112b261352c565b60009182526020808320818304018054601f9093166101000a60ff81810219909416958416029490941790935589811682526007835260408083208c831684528452808320918516835292522054801561132357606461131282886135b7565b61131c91906134ef565b9550611330565b600095505050505061133f565b8460010194505050505061119a565b506000858152600560205260409020600681018290558054600290910154611372916001600160a01b0316908390611eb3565b6000858152600560209081526040918290205482518881529182018590529181018390526001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89060600160405180910390a25050505050505050565b606081806001600160401b038111156113f4576113f4613516565b60405190808252806020026020018201604052801561141d578160200160208202803683370190505b50915060005b8181101561148e57600260008686848181106114415761144161352c565b90506020020135815260200190815260200160002060009054906101000a900460ff168382815181106114765761147661352c565b91151560209283029190910190910152600101611423565b505092915050565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115069190613482565b6001600160a01b0316336001600160a01b0316146115365760405162461bcd60e51b81526004016107fd9061349f565b6004805463ffffffff909216650100000000000268ffffffff000000000019909216919091179055565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190613482565b6001600160a01b0316336001600160a01b0316146116005760405162461bcd60e51b81526004016107fd9061349f565b6000805460ff19166001179055565b6001818154811061161f57600080fd5b600091825260209091200154905081565b6060816000816001600160401b0381111561164d5761164d613516565b60405190808252806020026020018201604052801561168057816020015b606081526020019060019003908161166b5790505b50905060005b82811015610f7a576116a3868683818110610f4957610f4961352c565b6040516020016116b391906130b8565b6040516020818303038152906040528282815181106116d4576116d461352c565b6020908102919091010152600101611686565b6000805160206137158339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117579190613482565b6001600160a01b0316336001600160a01b0316146117875760405162461bcd60e51b81526004016107fd9061349f565b61179282338361239d565b5050565b60608080808085806001600160401b038111156117b5576117b5613516565b6040519080825280602002602001820160405280156117de578160200160208202803683370190505b509550806001600160401b038111156117f9576117f9613516565b604051908082528060200260200182016040528015611822578160200160208202803683370190505b509450806001600160401b0381111561183d5761183d613516565b604051908082528060200260200182016040528015611866578160200160208202803683370190505b509350806001600160401b0381111561188157611881613516565b6040519080825280602002602001820160405280156118aa578160200160208202803683370190505b509250806001600160401b038111156118c5576118c5613516565b6040519080825280602002602001820160405280156118ee578160200160208202803683370190505b50915060005b81811015611abd57600560008a8a848181106119125761191261352c565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b03168782815181106119505761195061352c565b60200260200101906001600160a01b031690816001600160a01b031681525050600560008a8a848181106119865761198661352c565b905060200201358152602001908152602001600020600101548682815181106119b1576119b161352c565b602002602001018181525050600560008a8a848181106119d3576119d361352c565b905060200201358152602001908152602001600020600601548582815181106119fe576119fe61352c565b602002602001018181525050600560008a8a84818110611a2057611a2061352c565b90506020020135815260200190815260200160002060080154848281518110611a4b57611a4b61352c565b602002602001018181525050600560008a8a84818110611a6d57611a6d61352c565b90506020020135815260200190815260200160002060070160009054906101000a900460ff16838281518110611aa557611aa561352c565b911515602092830291909101909101526001016118f4565b50509295509295909350565b826001600160a01b0381163314611b9357604051636d6d50a160e11b81523360048201526000805160206137158339815191529063dadaa14290602401602060405180830381865afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b47919061360e565b611b935760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107fd565b6000805160206137158339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c03919061360e565b15611c435760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107fd565b60005460ff1615611c7f5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107fd565b60045460ff161515600003611d4a5760405163242aefad60e21b81526001600160a01b0385166004820152731e79da4f709db18e4c3de214d29f0d7b45f986ea906390abbeb490602401602060405180830381865afa158015611ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0a919061360e565b611d4a5760405162461bcd60e51b815260206004820152601160248201527004e6f7420496e20546573742047726f757607c1b60448201526064016107fd565b611d558484846124ce565b50505050565b60405163ca1642e160e01b815263ffffffff8216600482015260009073258f9ead08d35955fc80678658d9cdfd36f985639063ca1642e190602401602060405180830381865afa158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c259190613630565b6000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e479190613482565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e8157600080fd5b505af1158015611e95573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b81156122c6578082106120cb576000805160206137158339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f309190613482565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000001460048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b158015611f9c57600080fd5b505af1158015611fb0573d6000803e3d6000fd5b505050505060008183611fc39190613503565b90508015611d55576000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203b9190613482565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000001460048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b1580156120ad57600080fd5b505af11580156120c1573d6000803e3d6000fd5b5050505050505050565b6000805160206137158339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190613482565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000001460048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b1580156121a757600080fd5b505af11580156121bb573d6000803e3d6000fd5b5050505050600082826121ce9190613503565b90506000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122409190613482565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000146040518363ffffffff1660e01b815260040161228e91815260200190565b6000604051808303818588803b1580156122a757600080fd5b505af11580156122bb573d6000803e3d6000fd5b505050505050505050565b6000805160206137158339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123369190613482565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000146040518363ffffffff1660e01b815260040161238491815260200190565b6000604051808303818588803b1580156120ad57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123f99190613649565b6000604051808303816000865af19150503d8060008114612436576040519150601f19603f3d011682016040523d82523d6000602084013e61243b565b606091505b5091509150818015612465575080511580612465575080806020019051810190612465919061360e565b6124c75760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107fd565b5050505050565b6000808080806124e086880188613665565b9450945094509450945060008460ff161180156125015750600560ff851611155b6125415760405162461bcd60e51b81526020600482015260116024820152704552523a20494e56414c49442052554e5360781b60448201526064016107fd565b6004546000906125639065010000000000900463ffffffff1660ff87166136bc565b60045461257b9190610100900463ffffffff166136db565b9050600061258882611d5b565b9050803410156125cc5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107fd565b6125d585610f83565b151560011461261d5760405162461bcd60e51b81526020600482015260146024820152731154948e88125395905312510811d0535148125160621b60448201526064016107fd565b60ff87166000908152600760209081526040808320600184528252808320600284529091529020546126915760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c494420444946464943554c545900000000000000000060448201526064016107fd565b600061269d8234613503565b90506000612710600654836126b291906135b7565b6126bc91906134ef565b90506126c981878e61289b565b600087815260056020526040902080546001600160a01b0319166001600160a01b038e161781556001018290556127008183613503565b60008881526005602052604090206002810191909155600301805460ff8a811661ffff199092168217610100918d1691909102179091556001600160401b0381111561274e5761274e613516565b604051908082528060200260200182016040528015612777578160200160208202803683370190505b506005600089815260200190815260200160002060040190805190602001906127a1929190612e13565b508760ff166001600160401b038111156127bd576127bd613516565b6040519080825280602002602001820160405280156127e6578160200160208202803683370190505b506000888152600560208181526040909220835161280a9491909201920190612e13565b5060008781526005602052604090204260089091015561282a8c88612945565b6128348c83612a39565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c78860405161286f91815260200190565b60405180910390a261288d876128868a6002613542565b8787612b37565b505050505050505050505050565b6000805160206137158339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290b9190613482565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e5908590604401612384565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000146024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b1580156129d557600080fd5b505af11580156129e9573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000805160206137158339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa99190613482565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000146044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612b1b57600080fd5b505af1158015612b2f573d6000803e3d6000fd5b505050505050565b60006000805160206137158339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba99190613482565b6001600160a01b031663f09cdf37612bc084611d5b565b6040516001600160e01b031960e084901b1681526004810187905260ff8816602482015263ffffffff8616604482015260640160206040518083038185885af1158015612c11573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c3691906136f7565b6001600160401b03811660009081526003602052604090205490915015612c925760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107fd565b6001600160401b038116600090815260036020908152604091829020879055815160016264c53160e01b0319815291516000805160206137158339815191529263ff9b3acf9260048083019391928290030181865afa158015612cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1d9190613482565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d5757600080fd5b505af1158015612d6b573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d4585604051612da091815260200190565b60405180910390a15050505050565b60405180610140016040528060006001600160a01b031681526020016000815260200160008152602001600060ff168152602001600060ff168152602001606081526020016060815260200160008152602001600015158152602001600081525090565b82805482825590600052602060002090601f01602090048101928215612ea95791602002820160005b83821115612e7a57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302612e3c565b8015612ea75782816101000a81549060ff0219169055600101602081600001049283019260010302612e7a565b505b50612eb5929150612eb9565b5090565b5b80821115612eb55760008155600101612eba565b600060208284031215612ee057600080fd5b5035919050565b600060208284031215612ef957600080fd5b813563ffffffff81168114612f0d57600080fd5b9392505050565b60008060408385031215612f2757600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b82811015612f68578151865260209586019590910190600101612f4a565b5093949350505050565b602081526000612f0d6020830184612f36565b6001600160a01b0381168114612f9a57600080fd5b50565b60008060408385031215612fb057600080fd5b8235612fbb81612f85565b946020939093013593505050565b600081518084526020840193506020830160005b82811015612f6857815160ff16865260209586019590910190600101612fdd565b80516001600160a01b03168252602081015160208301526040810151604083015260006060820151613035606085018260ff169052565b50608082015161304a608085018260ff169052565b5060a082015161014060a0850152613066610140850182612fc9565b905060c083015184820360c086015261307f8282612fc9565b91505060e083015160e08501526101008301516130a161010086018215159052565b506101208301516101208501528091505092915050565b602081526000612f0d6020830184612ffe565b60008083601f8401126130dd57600080fd5b5081356001600160401b038111156130f457600080fd5b6020830191508360208260051b850101111561310f57600080fd5b9250929050565b6000806020838503121561312957600080fd5b82356001600160401b0381111561313f57600080fd5b61314b858286016130cb565b90969095509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156131b057603f1987860301845261319b858351612ffe565b9450602093840193919091019060010161317f565b50929695505050505050565b803560ff811681146131cd57600080fd5b919050565b6000806000606084860312156131e757600080fd5b6131f0846131bc565b92506131fe602085016131bc565b915061320c604085016131bc565b90509250925092565b6001600160401b0381168114612f9a57600080fd5b60008060006040848603121561323f57600080fd5b833561324a81613215565b925060208401356001600160401b0381111561326557600080fd5b613271868287016130cb565b9497909650939450505050565b600081518084526020840193506020830160005b82811015612f685781511515865260209586019590910190600101613292565b602081526000612f0d602083018461327e565b60005b838110156132e05781810151838201526020016132c8565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156131b057603f198786030184528151805180875261333a8160208901602085016132c5565b601f01601f19169590950160209081019550938401939190910190600101613311565b60a08082528651908201819052600090602088019060c0840190835b818110156133a05783516001600160a01b0316835260209384019390920191600101613379565b505083810360208501526133b48189612f36565b91505082810360408401526133c98187612f36565b905082810360608401526133dd8186612f36565b905082810360808401526133f1818561327e565b98975050505050505050565b60008060006040848603121561341257600080fd5b833561341d81612f85565b925060208401356001600160401b0381111561343857600080fd5b8401601f8101861361344957600080fd5b80356001600160401b0381111561345f57600080fd5b86602082840101111561347157600080fd5b939660209190910195509293505050565b60006020828403121561349457600080fd5b8151612f0d81612f85565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000826134fe576134fe6134c3565b500490565b81810381811115610c2557610c256134d9565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60ff818116838216029081169081811461355e5761355e6134d9565b5092915050565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b0383111561359c57600080fd5b8260051b808560808501379190910160800195945050505050565b8082028115828204841417610c2557610c256134d9565b6000826135dd576135dd6134c3565b500690565b80820180821115610c2557610c256134d9565b60ff8181168382160190811115610c2557610c256134d9565b60006020828403121561362057600080fd5b81518015158114612f0d57600080fd5b60006020828403121561364257600080fd5b5051919050565b6000825161365b8184602087016132c5565b9190910192915050565b600080600080600060a0868803121561367d57600080fd5b613686866131bc565b9450613694602087016131bc565b93506040860135925060608601356136ab81612f85565b949793965091946080013592915050565b63ffffffff818116838216029081169081811461355e5761355e6134d9565b63ffffffff8181168382160190811115610c2557610c256134d9565b60006020828403121561370957600080fd5b8151612f0d8161321556fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220da10f80d4c5c0e5f4ef67cea385d8f30d76f9a2226fbe89c418aebd2455868c064736f6c634300081c0033

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

0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

-----Decoded View---------------
Arg [0] : GAME_ID_ (uint256): 20
Arg [1] : _history (address): 0xFa296156dAc165Af92F7Fdb012B61a874670e1AA

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [1] : 000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa


Deployed Bytecode Sourcemap

13932:14952:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7410:70;;;;;;;;;;;;;:::i;:::-;;12404:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;287:32:1;;;269:51;;257:2;242:18;12404:91:0;;;;;;;;15162:40;;;;;;;;;;-1:-1:-1;15162:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15162:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1085:32:1;;;1067:51;;1149:2;1134:18;;1127:34;;;;1177:18;;;1170:34;;;;1252:4;1240:17;;;1235:2;1220:18;;1213:45;1295:17;;1289:3;1274:19;;1267:46;1105:3;1329:19;;1322:35;1401:14;1394:22;1388:3;1373:19;;1366:51;1448:3;1433:19;;1426:35;1054:3;1039:19;15162:40:0;738:729:1;21412:260:0;;;;;;;;;;-1:-1:-1;21412:260:0;;;;;:::i;:::-;;:::i;21680:94::-;;;;;;;;;;-1:-1:-1;21680:94:0;;;;;:::i;:::-;;:::i;15256:32::-;;;;;;;;;;;;;;;;;;;1899:25:1;;;1887:2;1872:18;15256:32:0;1753:177:1;7200:126:0;;;;;;;;;;;;;:::i;12969:409::-;;;;;;;;;;-1:-1:-1;12969:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14065:32::-;;;;;;;;;;-1:-1:-1;14065:32:0;;;;;;;;;;;;;;3151:10:1;3139:23;;;3121:42;;3109:2;3094:18;14065:32:0;2977:192:1;7488:155:0;;;;;;;;;;-1:-1:-1;7488:155:0;;;;;:::i;:::-;;:::i;26519:654::-;;;;;;;;;;-1:-1:-1;26519:654:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1081:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1081:107:0;;27181:413;;;;;;;;;;-1:-1:-1;27181:413:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13996:34::-;;;;;;;;;;;;14029:1;13996:34;;;;;7544:4:1;7532:17;;;7514:36;;7502:2;7487:18;13996:34:0;7372:184:1;12503:135:0;;;;;;;;;;-1:-1:-1;12503:135:0;;;;;:::i;:::-;;:::i;:::-;;;7726:14:1;;7719:22;7701:41;;7689:2;7674:18;12503:135:0;7561:187:1;15481:45:0;;;;;;;;;;;;15520:6;15481:45;;6233:26;;;;;;;;;;-1:-1:-1;6233:26:0;;;;;;;;15362:85;;;;;;;;;;-1:-1:-1;15362:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24121:2390;;;;;;;;;;-1:-1:-1;24121:2390:0;;;;;:::i;:::-;;:::i;12646:315::-;;;;;;;;;;-1:-1:-1;12646:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21782:103::-;;;;;;;;;;-1:-1:-1;21782:103:0;;;;;:::i;:::-;;:::i;7334:68::-;;;;;;;;;;;;;:::i;6306:28::-;;;;;;;;;;-1:-1:-1;6306:28:0;;;;;:::i;:::-;;:::i;27602:370::-;;;;;;;;;;-1:-1:-1;27602:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6138:40::-;;;;;;;;;;;;;;;7651:143;;;;;;;;;;-1:-1:-1;7651:143:0;;;;;:::i;:::-;;:::i;27980:901::-;;;;;;;;;;-1:-1:-1;27980:901:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;8402:382::-;;;;;;:::i;:::-;;:::i;13386:102::-;;;;;;;;;;-1:-1:-1;13462:11:0;:18;13386:102;;14104:35;;;;;;;;;;-1:-1:-1;14104:35:0;;;;;;;;;;;1195:75;;;;;;;;;;;;1228:42;1195:75;;6073:32;;;;;;;;;;;;;;;8148:141;;;;;;;;;;-1:-1:-1;8148:141:0;;;;;:::i;:::-;;:::i;7410:70::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;;;;;;;;;7467:5:::1;7458:14:::0;;-1:-1:-1;;7458:14:0::1;::::0;;7410:70::o;12404:91::-;12445:7;-1:-1:-1;;;;;;;;;;;;;;;;12472:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12465:22;;12404:91;:::o;21412:260::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;21524:16:::1;21539:1;15520:6;21524:16;:::i;:::-;21509:11;:31;;21487:98;;;::::0;-1:-1:-1;;;21487:98:0;;14468:2:1;21487:98:0::1;::::0;::::1;14450:21:1::0;14507:2;14487:18;;;14480:30;-1:-1:-1;;;14526:18:1;;;14519:47;14583:18;;21487:98:0::1;14266:341:1::0;21487:98:0::1;21596:11;:25:::0;;;21637:27:::1;::::0;1899:25:1;;;21637:27:0::1;::::0;1887:2:1;1872:18;21637:27:0::1;;;;;;;21412:260:::0;:::o;21680:94::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;21747:8:::1;:19:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;21747:19:0;;::::1;::::0;;;::::1;::::0;;21680:94::o;7200:126::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;7256:9:::1;::::0;::::1;;:18;7248:43;;;::::0;-1:-1:-1;;;7248:43:0;;14814:2:1;7248:43:0::1;::::0;::::1;14796:21:1::0;14853:2;14833:18;;;14826:30;-1:-1:-1;;;14872:18:1;;;14865:42;14924:18;;7248:43:0::1;14612:336:1::0;7248:43:0::1;7302:9;:16:::0;;-1:-1:-1;;7302:16:0::1;7314:4;7302:16;::::0;;7200:126::o;12969:409::-;13088:11;:18;13049:16;;13082:24;;13078:81;;;13129:11;:18;;-1:-1:-1;13078:81:0;13169:20;13206:11;13212:5;13206:3;:11;:::i;:::-;-1:-1:-1;;;;;13192:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13192:26:0;-1:-1:-1;13169:49:0;-1:-1:-1;13243:5:0;13229:121;13254:3;13250:1;:7;13229:121;;;13292:11;13304:1;13292:14;;;;;;;;:::i;:::-;;;;;;;;;13275:3;13283:5;13279:1;:9;;;;:::i;:::-;13275:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;13333:3;;13229:121;;;-1:-1:-1;13367:3:0;-1:-1:-1;12969:409:0;;;;;:::o;7488:155::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;7568:6:::1;7587:2;-1:-1:-1::0;;;;;7579:16:0::1;7603:6;7579:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7567:47;;;7633:1;7625:10;;;::::0;::::1;;7556:87;7488:155:::0;;:::o;26519:654::-;26587:25;;:::i;:::-;26638:527;;;;;;;;-1:-1:-1;26680:13:0;;;:5;:13;;;;;;;:20;;-1:-1:-1;;;;;26680:20:0;26638:527;;26680:20;26726:23;;;26638:527;;;;;;;;;;26827:21;;;;;;;;26638:527;;;;26680:20;26875:24;;;;26638:527;;;;26928:13;;;;;;;:26;;;;26638:527;;;;;;;;;;;;;;;;;;;;;;;;;;;26928:26;26638:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26983:5;:13;26989:6;26983:13;;;;;;;;;;;:26;;26638:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26638:527:0;;;-1:-1:-1;;27037:13:0;;;;:5;26638:527;27037:13;;;;;;;:20;;;;26638:527;;;;27082:22;;;;;;26638:527;;;;;;;;;27130:13;;;;;;:23;;;;;26638:527;;;;;;;;-1:-1:-1;26631:534:0;26519:654::o;27181:413::-;27265:27;27322:7;27311:8;27322:7;-1:-1:-1;;;;;27386:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;27347:68;;27441:6;27436:123;27457:3;27453:1;:7;27436:123;;;27492:23;27504:7;;27512:1;27504:10;;;;;;;:::i;:::-;;;;;;;27492:11;:23::i;:::-;27478:8;27487:1;27478:11;;;;;;;;:::i;:::-;;;;;;;;;;:37;27542:3;;27436:123;;;-1:-1:-1;27578:8:0;27181:413;-1:-1:-1;;;;27181:413:0:o;12503:135::-;12563:4;12587:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;12620:10:0;;;12503:135::o;24121:2390::-;-1:-1:-1;;;;;;;;;;;;;;;;1641:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1627:27:0;:10;-1:-1:-1;;;;;1627:27:0;;:51;;;-1:-1:-1;1658:10:0;1228:42;1658:20;1627:51;1605:118;;;;-1:-1:-1;;;1605:118:0;;15762:2:1;1605:118:0;;;15744:21:1;15801:2;15781:18;;;15774:30;-1:-1:-1;;;15820:18:1;;;15813:47;15877:18;;1605:118:0;15560:341:1;1605:118:0;-1:-1:-1;;;;;12364:24:0;;24302:14:::1;12364:24:::0;;;:13;:24;;;;;;;;;24378:13;;;:5:::1;:13:::0;;;;;;:21:::1;::::0;::::1;::::0;;::::1;::::0;::::1;24429:24:::0;::::1;;24497:25;12364:24:::0;24497:14:::1;:25::i;:::-;24594:11:::0;;;:63:::1;;-1:-1:-1::0;24655:1:0::1;24623:13:::0;;;:5:::1;:13;::::0;;;;:20;-1:-1:-1;;;;;24623:20:0::1;:34:::0;24594:63:::1;:111;;;-1:-1:-1::0;24675:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;24594:111;:141;;;-1:-1:-1::0;24722:13:0::1;::::0;::::1;::::0;24594:141:::1;:192;;;-1:-1:-1::0;24774:12:0::1;:8:::0;24785:1:::1;24774:12;:::i;:::-;24752:34;;::::0;::::1;;24594:192;24576:325;;;24818:50;24837:9;24848:6;24856:11;;24818:50;;;;;;;;;:::i;:::-;;;;;;;;24883:7;;;7556:87;7488:155:::0;;:::o;24576:325::-:1;24944:13;::::0;;;:5:::1;:13;::::0;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;24944:29:0::1;24969:4;24944:29:::0;;::::1;::::0;;;25053:23:::1;::::0;;;;25242:942:::1;25263:8;25259:12;;:1;:12;25242:942;;;25340:17;25389:1;25368:11:::0;;25380:5:::1;:1:::0;25384::::1;25380:5;:::i;:::-;25368:18;;;;;;;:::i;:::-;;;;;;;:22;;;;:::i;:::-;25366:30;::::0;25395:1:::1;25366:30;:::i;:::-;25340:57:::0;-1:-1:-1;25412:17:0::1;25467:1;25440:11:::0;;25453:5:::1;:1:::0;25457::::1;25453:5;:::i;:::-;25452:11;::::0;25462:1:::1;25452:11;:::i;:::-;25440:24;;;;;;;:::i;:::-;;;;;;;:28;;;;:::i;:::-;25438:36;::::0;25473:1:::1;25438:36;:::i;:::-;25412:63:::0;-1:-1:-1;25529:16:0::1;25550:25;25412:63:::0;25550:11;:25:::1;:::i;:::-;25632:13;::::0;;;:5:::1;:13;::::0;;;;:26:::1;;:29:::0;;25529:48;;-1:-1:-1;25664:11:0;;25659:1;;25632:29;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;25722:11;25690:5;:13;25696:6;25690:13;;;;;;;;;;;:26;;25717:1;25690:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;:43:::0;;:29;;;;:43:::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;25771:19;;::::1;::::0;;:7:::1;:19:::0;;;;;;:29;;::::1;::::0;;;;;;;:41;;::::1;::::0;;;;;;25886:14;;25882:259:::1;;25970:3;25939:26;25955:10:::0;25939:13;:26:::1;:::i;:::-;25937:36;;;;:::i;:::-;25921:52;;25882:259;;;26100:1;26084:17;;26120:5;;;;;;25882:259;26167:3;;;;;25274:910;;;;25242:942;;;-1:-1:-1::0;26225:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:20:::1;::::0;::::1;:36:::0;;;26315:20;;26352:28:::1;::::0;;::::1;::::0;26301:80:::1;::::0;-1:-1:-1;;;;;26315:20:0::1;::::0;26248:13;;26301::::1;:80::i;:::-;26443:13;::::0;;;:5:::1;:13;::::0;;;;;;;;:20;26433:70;;17527:25:1;;;17568:18;;;17561:34;;;17611:18;;;17604:34;;;-1:-1:-1;;;;;26443:20:0;;::::1;::::0;26433:70:::1;::::0;17515:2:1;17500:18;26433:70:0::1;;;;;;;24250:2261;;;;;24121:2390:::0;;;:::o;12646:315::-;12728:20;12772:7;;-1:-1:-1;;;;;12806:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12806:15:0;;12797:24;;12837:6;12832:122;12853:3;12849:1;:7;12832:122;;;12886:12;:24;12899:7;;12907:1;12899:10;;;;;;;:::i;:::-;;;;;;;12886:24;;;;;;;;;;;;;;;;;;;;;12874:6;12881:1;12874:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;12937:3;;12832:122;;;;12750:211;12646:315;;;;:::o;21782:103::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;21853:11:::1;:24:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;21853:24:0;;::::1;::::0;;;::::1;::::0;;21782:103::o;7334:68::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;7381:6:::1;:13:::0;;-1:-1:-1;;7381:13:0::1;7390:4;7381:13;::::0;;7334:68::o;6306:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6306:28:0;:::o;27602:370::-;27688:14;27726:7;27715:8;27726:7;-1:-1:-1;;;;;27777:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27751:42;;27809:6;27804:135;27825:3;27821:1;:7;27804:135;;;27871:23;27883:7;;27891:1;27883:10;;;;;;;:::i;27871:23::-;27860:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;27846:8;27855:1;27846:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;27922:3;;27804:135;;7651:143;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;7732:54:::1;7760:5;7767:10;7779:6;7732:27;:54::i;:::-;7651:143:::0;;:::o;27980:901::-;28080:24;;;;;28286:7;;-1:-1:-1;;;;;28321:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28321:18:0;;28311:28;;28379:3;-1:-1:-1;;;;;28365:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28365:18:0;;28350:33;;28423:3;-1:-1:-1;;;;;28409:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28409:18:0;;28394:33;;28465:3;-1:-1:-1;;;;;28451:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28451:18:0;;28438:31;;28503:3;-1:-1:-1;;;;;28492:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28492:15:0;;28480:27;;28525:6;28520:354;28541:3;28537:1;:7;28520:354;;;28575:5;:17;28581:7;;28589:1;28581:10;;;;;;;:::i;:::-;;;;;;;28575:17;;;;;;;;;;;:24;;;;;;;;;;-1:-1:-1;;;;;28575:24:0;28562:7;28570:1;28562:10;;;;;;;;:::i;:::-;;;;;;:37;-1:-1:-1;;;;;28562:37:0;;;-1:-1:-1;;;;;28562:37:0;;;;;28632:5;:17;28638:7;;28646:1;28638:10;;;;;;;:::i;:::-;;;;;;;28632:17;;;;;;;;;;;:27;;;28614:12;28627:1;28614:15;;;;;;;;:::i;:::-;;;;;;:45;;;;;28692:5;:17;28698:7;;28706:1;28698:10;;;;;;;:::i;:::-;;;;;;;28692:17;;;;;;;;;;;:24;;;28674:12;28687:1;28674:15;;;;;;;;:::i;:::-;;;;;;:42;;;;;28747:5;:17;28753:7;;28761:1;28753:10;;;;;;;:::i;:::-;;;;;;;28747:17;;;;;;;;;;;:27;;;28731:10;28742:1;28731:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;28804:5;:17;28810:7;;28818:1;28810:10;;;;;;;:::i;:::-;;;;;;;28804:17;;;;;;;;;;;:26;;;;;;;;;;;;28789:9;28799:1;28789:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;28857:3;;28520:354;;;;28264:617;27980:901;;;;;;;;:::o;8402:382::-;8498:6;-1:-1:-1;;;;;1806:20:0;;1816:10;1806:20;1802:182;;1869:36;;-1:-1:-1;;;1869:36:0;;1894:10;1869:36;;;269:51:1;-1:-1:-1;;;;;;;;;;;1145:42:0;1869:24;;242:18:1;;1869:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1843:129;;;;-1:-1:-1;;;1843:129:0;;18133:2:1;1843:129:0;;;18115:21:1;18172:2;18152:18;;;18145:30;18211:33;18191:18;;;18184:61;18262:18;;1843:129:0;17931:355:1;1843:129:0;-1:-1:-1;;;;;;;;;;;;;;;;2065:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;2043:91;;;::::0;-1:-1:-1;;;2043:91:0;;18493:2:1;2043:91:0::1;::::0;::::1;18475:21:1::0;18532:2;18512:18;;;18505:30;-1:-1:-1;;;18551:18:1;;;18544:46;18607:18;;2043:91:0::1;18291:340:1::0;2043:91:0::1;8552:6:::2;::::0;::::2;;8551:7;8529:63;;;::::0;-1:-1:-1;;;8529:63:0;;18838:2:1;8529:63:0::2;::::0;::::2;18820:21:1::0;18877:1;18857:18;;;18850:29;-1:-1:-1;;;18895:18:1;;;18888:36;18941:18;;8529:63:0::2;18636:329:1::0;8529:63:0::2;8607:9;::::0;::::2;;:18;;:9;:18:::0;8603:112:::2;;8650:31;::::0;-1:-1:-1;;;8650:31:0;;-1:-1:-1;;;;;287:32:1;;8650:31:0::2;::::0;::::2;269:51:1::0;6558:42:0::2;::::0;8650:23:::2;::::0;242:18:1;;8650:31:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8642:61;;;::::0;-1:-1:-1;;;8642:61:0;;19172:2:1;8642:61:0::2;::::0;::::2;19154:21:1::0;19211:2;19191:18;;;19184:30;-1:-1:-1;;;19230:18:1;;;19223:47;19287:18;;8642:61:0::2;18970:341:1::0;8642:61:0::2;8749:27;8759:6;8767:8;;8749:9;:27::i;:::-;8402:382:::0;;;;:::o;8148:141::-;8238:43;;-1:-1:-1;;;8238:43:0;;3151:10:1;3139:23;;8238:43:0;;;3121:42:1;8211:7:0;;1228:42;;8238:27;;3094:18:1;;8238:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12034:224::-;-1:-1:-1;;;;;;;;;;;;;;;;12140:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12133:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;12226:24:0;;;;;:13;:24;;;;;12219:31;12034:224::o;8879:1929::-;8991:17;;8987:1814;;9100:14;9083:13;:31;9079:1550;;-1:-1:-1;;;;;;;;;;;;;;;;9470:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9456:145;;-1:-1:-1;;;9456:145:0;;9546:7;9456:145;;;19679:25:1;-1:-1:-1;;;;;19740:32:1;;;19720:18;;;19713:60;9456:44:0;;;;;;;9508:14;;19652:18:1;;9456:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9661:17;9697:14;9681:13;:30;;;;:::i;:::-;9661:50;-1:-1:-1;9734:13:0;;9730:175;;-1:-1:-1;;;;;;;;;;;;;;;;9834:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9827:58;;-1:-1:-1;;;9827:58:0;;9858:7;9827:58;;;19986:25:1;-1:-1:-1;;;;;20047:32:1;;;20027:18;;;20020:60;20096:18;;;20089:34;;;9827:30:0;;;;;;;19959:18:1;;9827:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9116:822;7556:87:::1;7488:155:::0;;:::o;9079:1550::-;-1:-1:-1;;;;;;;;;;;;;;;;10217:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10203:144;;-1:-1:-1;;;10203:144:0;;10292:7;10203:144;;;19679:25:1;-1:-1:-1;;;;;19740:32:1;;;19720:18;;;19713:60;10203:44:0;;;;;;;10255:13;;19652:18:1;;10203:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10427:17;10464:13;10447:14;:30;;;;:::i;:::-;10427:50;;-1:-1:-1;;;;;;;;;;;;;;;;10557:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10550:35:0;;10593:9;10605:7;10550:63;;;;;;;;;;;;;1899:25:1;;1887:2;1872:18;;1753:177;10550:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9944:685;7556:87:::1;7488:155:::0;;:::o;8987:1814::-;-1:-1:-1;;;;;;;;;;;;;;;;10728:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10721:35:0;;10764:14;10781:7;10721:68;;;;;;;;;;;;;1899:25:1;;1887:2;1872:18;;1753:177;10721:68:0;;;;;;;;;;;;;;;;;;;;3678:449;3910:45;;;-1:-1:-1;;;;;20326:32:1;;;3910:45:0;;;20308:51:1;20375:18;;;;20368:34;;;3910:45:0;;;;;;;;;;20281:18:1;;;;3910:45:0;;;;;;;-1:-1:-1;;;;;3910:45:0;-1:-1:-1;;;3910:45:0;;;3899:57;;-1:-1:-1;;;;3899:10:0;;;;:57;;3910:45;3899:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3863:93;;;;3989:7;:57;;;;-1:-1:-1;4001:11:0;;:16;;:44;;;4032:4;4021:24;;;;;;;;;;;;:::i;:::-;3967:152;;;;-1:-1:-1;;;3967:152:0;;20907:2:1;3967:152:0;;;20889:21:1;20946:2;20926:18;;;20919:30;20985:34;20965:18;;;20958:62;-1:-1:-1;;;21036:18:1;;;21029:43;21089:19;;3967:152:0;20705:409:1;3967:152:0;3785:342;;3678:449;;;:::o;21930:2117::-;22065:16;;;;;22215:63;;;;22226:8;22215:63;:::i;:::-;22050:228;;;;;;;;;;22321:1;22311:7;:11;;;:34;;;;-1:-1:-1;14029:1:0;22326:19;;;;;22311:34;22289:101;;;;-1:-1:-1;;;22289:101:0;;21911:2:1;22289:101:0;;;21893:21:1;21950:2;21930:18;;;21923:30;-1:-1:-1;;;21969:18:1;;;21962:47;22026:18;;22289:101:0;21709:341:1;22289:101:0;22450:11;;22403:21;;22440;;22450:11;;;;;22440:21;;;;:::i;:::-;22427:8;;:35;;;:8;;;;;:35;:::i;:::-;22403:59;;22505:14;22522:25;22532:14;22522:9;:25::i;:::-;22505:42;;22623:6;22610:9;:19;;22588:84;;;;-1:-1:-1;;;22588:84:0;;22678:2:1;22588:84:0;;;22660:21:1;22717:2;22697:18;;;22690:30;-1:-1:-1;;;22736:18:1;;;22729:45;22791:18;;22588:84:0;22476:339:1;22588:84:0;22705:21;22719:6;22705:13;:21::i;:::-;:29;;22730:4;22705:29;22683:99;;;;-1:-1:-1;;;22683:99:0;;23022:2:1;22683:99:0;;;23004:21:1;23061:2;23041:18;;;23034:30;-1:-1:-1;;;23080:18:1;;;23073:50;23140:18;;22683:99:0;22820:344:1;22683:99:0;22815:19;;;22843:1;22815:19;;;:7;:19;;;;;;;;22835:1;22815:22;;;;;;;22838:1;22815:25;;;;;;;;22793:102;;;;-1:-1:-1;;;22793:102:0;;23371:2:1;22793:102:0;;;23353:21:1;23410:2;23390:18;;;23383:30;23449:25;23429:18;;;23422:53;23492:18;;22793:102:0;23169:347:1;22793:102:0;22947:22;22972:18;22984:6;22972:9;:18;:::i;:::-;22947:43;;23051:25;15520:6;23098:11;;23081:14;:28;;;;:::i;:::-;23079:47;;;;:::i;:::-;23051:75;;23203:43;23215:17;23234:3;23239:6;23203:11;:43::i;:::-;23286:13;;;;:5;:13;;;;;:29;;-1:-1:-1;;;;;;23286:29:0;-1:-1:-1;;;;;23286:29:0;;;;;-1:-1:-1;23326:23:0;:40;;;23408:34;23425:17;23326:40;23408:34;:::i;:::-;23377:13;;;;:5;:13;;;;;:28;;;:65;;;;23453:21;;:31;;;;;;-1:-1:-1;;23495:37:0;;;;;23453:31;23495:37;;;;;;;;;;;-1:-1:-1;;;;;23572:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23572:20:0;;23543:5;:13;23549:6;23543:13;;;;;;;;;;;:26;;:49;;;;;;;;;;;;:::i;:::-;;23644:7;23632:20;;-1:-1:-1;;;;;23632:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23632:20:0;-1:-1:-1;23603:13:0;;;;:5;:13;;;;;;;;:49;;;;:26;;;;;:49;;;:::i;:::-;-1:-1:-1;23663:13:0;;;;:5;:13;;;;;23689:15;23663:23;;;;:41;23746:31;23762:6;23669;23746:15;:31::i;:::-;23815:36;23828:6;23836:14;23815:12;:36::i;:::-;23912:6;-1:-1:-1;;;;;23900:27:0;;23920:6;23900:27;;;;1899:25:1;;1887:2;1872:18;;1753:177;23900:27:0;;;;;;;;23972:67;23987:6;23995:11;:7;24005:1;23995:11;:::i;:::-;24008:14;24024;23972;:67::i;:::-;22008:2039;;;;;;;;;21930:2117;;;:::o;7964:172::-;-1:-1:-1;;;;;;;;;;;;;;;;8067:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8053:75;;-1:-1:-1;;;8053:75:0;;-1:-1:-1;;;;;23713:32:1;;;8053:75:0;;;23695:51:1;23782:32;;;23762:18;;;23755:60;8053:44:0;;;;;;;8105:9;;23668:18:1;;8053:75:0;23521:300:1;10897:272:0;11005:40;;-1:-1:-1;;;11005:40:0;;-1:-1:-1;;;;;24046:32:1;;;11005:40:0;;;24028:51:1;11029:7:0;24095:18:1;;;24088:34;24138:18;;;24131:34;;;11005:7:0;:15;;;;24001:18:1;;11005:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11099:11:0;:24;;;;;;;;;;;;-1:-1:-1;11134:20:0;;;:12;11099:24;11134:20;;;;;:27;;-1:-1:-1;;11134:27:0;;;;;;;-1:-1:-1;;;10897:272:0:o;7802:154::-;-1:-1:-1;;;;;;;;;;;;;;;;7891:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7874:74;;-1:-1:-1;;;7874:74:0;;-1:-1:-1;;;;;24046:32:1;;;7874:74:0;;;24028:51:1;24095:18;;;24088:34;;;7940:7:0;24138:18:1;;;24131:34;7874:51:0;;;;;;;24001:18:1;;7874:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7802:154;;:::o;11177:849::-;11353:16;-1:-1:-1;;;;;;;;;;;;;;;;11383:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11372:39:0;;11419:25;11429:14;11419:9;:25::i;:::-;11372:233;;-1:-1:-1;;;;;;11372:233:0;;;;;;;;;;24372:25:1;;;24445:4;24433:17;;24413:18;;;24406:45;11372:233:0;24487:23:1;;24467:18;;;24460:51;24345:18;;11372:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11689:24:0;;;;;;:13;:24;;;;;;11353:252;;-1:-1:-1;11689:29:0;11667:95;;;;-1:-1:-1;;;11667:95:0;;24978:2:1;11667:95:0;;;24960:21:1;25017:2;24997:18;;;24990:30;-1:-1:-1;;;25036:18:1;;;25029:46;25092:18;;11667:95:0;24776:340:1;11667:95:0;-1:-1:-1;;;;;11833:24:0;;;;;;:13;:24;;;;;;;;;:33;;;11916:15;;-1:-1:-1;;;;;;11916:15:0;;;;-1:-1:-1;;;;;;;;;;;1145:42:0;11916:13;;:15;;;;;11833:24;;11916:15;;;;;1145:42;11916:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11909:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11991:27;12011:6;11991:27;;;;1899:25:1;;1887:2;1872:18;;1753:177;11991:27:0;;;;;;;;11289:737;11177:849;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;331:226:1;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;-1:-1:-1;504:23:1;;331:226;-1:-1:-1;331:226:1:o;1472:276::-;1530:6;1583:2;1571:9;1562:7;1558:23;1554:32;1551:52;;;1599:1;1596;1589:12;1551:52;1638:9;1625:23;1688:10;1681:5;1677:22;1670:5;1667:33;1657:61;;1714:1;1711;1704:12;1657:61;1737:5;1472:276;-1:-1:-1;;;1472:276:1:o;1935:346::-;2003:6;2011;2064:2;2052:9;2043:7;2039:23;2035:32;2032:52;;;2080:1;2077;2070:12;2032:52;-1:-1:-1;;2125:23:1;;;2245:2;2230:18;;;2217:32;;-1:-1:-1;1935:346:1:o;2286:420::-;2339:3;2377:5;2371:12;2404:6;2399:3;2392:19;2436:4;2431:3;2427:14;2420:21;;2475:4;2468:5;2464:16;2498:1;2508:173;2522:6;2519:1;2516:13;2508:173;;;2583:13;;2571:26;;2626:4;2617:14;;;;2654:17;;;;2544:1;2537:9;2508:173;;;-1:-1:-1;2697:3:1;;2286:420;-1:-1:-1;;;;2286:420:1:o;2711:261::-;2890:2;2879:9;2872:21;2853:4;2910:56;2962:2;2951:9;2947:18;2939:6;2910:56;:::i;3174:131::-;-1:-1:-1;;;;;3249:31:1;;3239:42;;3229:70;;3295:1;3292;3285:12;3229:70;3174:131;:::o;3310:367::-;3378:6;3386;3439:2;3427:9;3418:7;3414:23;3410:32;3407:52;;;3455:1;3452;3445:12;3407:52;3494:9;3481:23;3513:31;3538:5;3513:31;:::i;:::-;3563:5;3641:2;3626:18;;;;3613:32;;-1:-1:-1;;;3310:367:1:o;3682:429::-;3733:3;3771:5;3765:12;3798:6;3793:3;3786:19;3830:4;3825:3;3821:14;3814:21;;3869:4;3862:5;3858:16;3892:1;3902:184;3916:6;3913:1;3910:13;3902:184;;;3981:13;;3996:4;3977:24;3965:37;;4031:4;4022:14;;;;4059:17;;;;3938:1;3931:9;3902:184;;4116:1050;4214:12;;-1:-1:-1;;;;;80:31:1;68:44;;4281:4;4274:5;4270:16;4264:23;4257:4;4252:3;4248:14;4241:47;4337:4;4330:5;4326:16;4320:23;4313:4;4308:3;4304:14;4297:47;4177:3;4390:4;4383:5;4379:16;4373:23;4405:46;4445:4;4440:3;4436:14;4422:12;629:4;618:16;606:29;;562:75;4405:46;;4499:4;4492:5;4488:16;4482:23;4514:48;4556:4;4551:3;4547:14;4531;629:4;618:16;606:29;;562:75;4514:48;;4610:4;4603:5;4599:16;4593:23;4648:6;4641:4;4636:3;4632:14;4625:30;4676:60;4728:6;4723:3;4719:16;4703:14;4676:60;:::i;:::-;4664:72;;4784:4;4777:5;4773:16;4767:23;4832:3;4826:4;4822:14;4815:4;4810:3;4806:14;4799:38;4860:48;4903:4;4887:14;4860:48;:::i;:::-;4846:62;;;4957:4;4950:5;4946:16;4940:23;4933:4;4928:3;4924:14;4917:47;5012:6;5005:5;5001:18;4995:25;5029:49;5070:6;5065:3;5061:16;5045:14;712:13;705:21;693:34;;642:91;5029:49;;5129:6;5122:5;5118:18;5112:25;5103:6;5098:3;5094:16;5087:51;5154:6;5147:13;;;4116:1050;;;;:::o;5171:291::-;5372:2;5361:9;5354:21;5335:4;5392:64;5452:2;5441:9;5437:18;5429:6;5392:64;:::i;5700:367::-;5763:8;5773:6;5827:3;5820:4;5812:6;5808:17;5804:27;5794:55;;5845:1;5842;5835:12;5794:55;-1:-1:-1;5868:20:1;;-1:-1:-1;;;;;5900:30:1;;5897:50;;;5943:1;5940;5933:12;5897:50;5980:4;5972:6;5968:17;5956:29;;6040:3;6033:4;6023:6;6020:1;6016:14;6008:6;6004:27;6000:38;5997:47;5994:67;;;6057:1;6054;6047:12;5994:67;5700:367;;;;;:::o;6072:437::-;6158:6;6166;6219:2;6207:9;6198:7;6194:23;6190:32;6187:52;;;6235:1;6232;6225:12;6187:52;6275:9;6262:23;-1:-1:-1;;;;;6300:6:1;6297:30;6294:50;;;6340:1;6337;6330:12;6294:50;6379:70;6441:7;6432:6;6421:9;6417:22;6379:70;:::i;:::-;6468:8;;6353:96;;-1:-1:-1;6072:437:1;-1:-1:-1;;;;6072:437:1:o;6514:853::-;6728:4;6776:2;6765:9;6761:18;6806:2;6795:9;6788:21;6829:6;6864;6858:13;6895:6;6887;6880:22;6933:2;6922:9;6918:18;6911:25;;6995:2;6985:6;6982:1;6978:14;6967:9;6963:30;6959:39;6945:53;;7033:2;7025:6;7021:15;7054:1;7064:274;7078:6;7075:1;7072:13;7064:274;;;7171:2;7167:7;7155:9;7147:6;7143:22;7139:36;7134:3;7127:49;7199:59;7251:6;7242;7236:13;7199:59;:::i;:::-;7189:69;-1:-1:-1;7293:2:1;7316:12;;;;7281:15;;;;;7100:1;7093:9;7064:274;;;-1:-1:-1;7355:6:1;;6514:853;-1:-1:-1;;;;;;6514:853:1:o;7753:156::-;7819:20;;7879:4;7868:16;;7858:27;;7848:55;;7899:1;7896;7889:12;7848:55;7753:156;;;:::o;7914:322::-;7985:6;7993;8001;8054:2;8042:9;8033:7;8029:23;8025:32;8022:52;;;8070:1;8067;8060:12;8022:52;8093:27;8110:9;8093:27;:::i;:::-;8083:37;;8139:36;8171:2;8160:9;8156:18;8139:36;:::i;:::-;8129:46;;8194:36;8226:2;8215:9;8211:18;8194:36;:::i;:::-;8184:46;;7914:322;;;;;:::o;8241:129::-;-1:-1:-1;;;;;8319:5:1;8315:30;8308:5;8305:41;8295:69;;8360:1;8357;8350:12;8375:570;8469:6;8477;8485;8538:2;8526:9;8517:7;8513:23;8509:32;8506:52;;;8554:1;8551;8544:12;8506:52;8593:9;8580:23;8612:30;8636:5;8612:30;:::i;:::-;8661:5;-1:-1:-1;8717:2:1;8702:18;;8689:32;-1:-1:-1;;;;;8733:30:1;;8730:50;;;8776:1;8773;8766:12;8730:50;8815:70;8877:7;8868:6;8857:9;8853:22;8815:70;:::i;:::-;8375:570;;8904:8;;-1:-1:-1;8789:96:1;;-1:-1:-1;;;;8375:570:1:o;8950:433::-;9000:3;9038:5;9032:12;9065:6;9060:3;9053:19;9097:4;9092:3;9088:14;9081:21;;9136:4;9129:5;9125:16;9159:1;9169:189;9183:6;9180:1;9177:13;9169:189;;;9258:13;;9251:21;9244:29;9232:42;;9303:4;9294:14;;;;9331:17;;;;9205:1;9198:9;9169:189;;9388:252;9561:2;9550:9;9543:21;9524:4;9581:53;9630:2;9619:9;9615:18;9607:6;9581:53;:::i;9645:250::-;9730:1;9740:113;9754:6;9751:1;9748:13;9740:113;;;9830:11;;;9824:18;9811:11;;;9804:39;9776:2;9769:10;9740:113;;;-1:-1:-1;;9887:1:1;9869:16;;9862:27;9645:250::o;9900:991::-;10060:4;10108:2;10097:9;10093:18;10138:2;10127:9;10120:21;10161:6;10196;10190:13;10227:6;10219;10212:22;10265:2;10254:9;10250:18;10243:25;;10327:2;10317:6;10314:1;10310:14;10299:9;10295:30;10291:39;10277:53;;10365:2;10357:6;10353:15;10386:1;10396:466;10410:6;10407:1;10404:13;10396:466;;;10503:2;10499:7;10487:9;10479:6;10475:22;10471:36;10466:3;10459:49;10537:6;10531:13;10579:2;10573:9;10610:8;10602:6;10595:24;10632:74;10697:8;10692:2;10684:6;10680:15;10675:2;10671;10667:11;10632:74;:::i;:::-;10772:2;10749:17;-1:-1:-1;;10745:31:1;10733:44;;;;10779:2;10729:53;;;;-1:-1:-1;10840:12:1;;;;10805:15;;;;;10432:1;10425:9;10396:466;;11127:1424;11623:3;11636:22;;;11707:13;;11608:19;;;11729:22;;;11575:4;;11821;11809:17;;;11782:3;11767:19;;;11575:4;11854:199;11868:6;11865:1;11862:13;11854:199;;;11933:13;;-1:-1:-1;;;;;11929:39:1;11917:52;;11998:4;12026:17;;;;11989:14;;;;11965:1;11883:9;11854:199;;;11858:3;;12100:9;12095:3;12091:19;12084:4;12073:9;12069:20;12062:49;12134:41;12171:3;12163:6;12134:41;:::i;:::-;12120:55;;;12223:9;12215:6;12211:22;12206:2;12195:9;12191:18;12184:50;12257:44;12294:6;12286;12257:44;:::i;:::-;12243:58;;12349:9;12341:6;12337:22;12332:2;12321:9;12317:18;12310:50;12383:44;12420:6;12412;12383:44;:::i;:::-;12369:58;;12476:9;12468:6;12464:22;12458:3;12447:9;12443:19;12436:51;12504:41;12538:6;12530;12504:41;:::i;:::-;12496:49;11127:1424;-1:-1:-1;;;;;;;;11127:1424:1:o;12556:721::-;12635:6;12643;12651;12704:2;12692:9;12683:7;12679:23;12675:32;12672:52;;;12720:1;12717;12710:12;12672:52;12759:9;12746:23;12778:31;12803:5;12778:31;:::i;:::-;12828:5;-1:-1:-1;12884:2:1;12869:18;;12856:32;-1:-1:-1;;;;;12900:30:1;;12897:50;;;12943:1;12940;12933:12;12897:50;12966:22;;13019:4;13011:13;;13007:27;-1:-1:-1;12997:55:1;;13048:1;13045;13038:12;12997:55;13088:2;13075:16;-1:-1:-1;;;;;13106:6:1;13103:30;13100:50;;;13146:1;13143;13136:12;13100:50;13191:7;13186:2;13177:6;13173:2;13169:15;13165:24;13162:37;13159:57;;;13212:1;13209;13202:12;13159:57;12556:721;;13243:2;13235:11;;;;;-1:-1:-1;13265:6:1;;-1:-1:-1;;;12556:721:1:o;13282:251::-;13352:6;13405:2;13393:9;13384:7;13380:23;13376:32;13373:52;;;13421:1;13418;13411:12;13373:52;13453:9;13447:16;13472:31;13497:5;13472:31;:::i;13538:334::-;13740:2;13722:21;;;13779:2;13759:18;;;13752:30;-1:-1:-1;;;13813:2:1;13798:18;;13791:40;13863:2;13848:18;;13538:334::o;13877:127::-;13938:10;13933:3;13929:20;13926:1;13919:31;13969:4;13966:1;13959:15;13993:4;13990:1;13983:15;14009:127;14070:10;14065:3;14061:20;14058:1;14051:31;14101:4;14098:1;14091:15;14125:4;14122:1;14115:15;14141:120;14181:1;14207;14197:35;;14212:18;;:::i;:::-;-1:-1:-1;14246:9:1;;14141:120::o;14953:128::-;15020:9;;;15041:11;;;15038:37;;;15055:18;;:::i;15086:127::-;15147:10;15142:3;15138:20;15135:1;15128:31;15178:4;15175:1;15168:15;15202:4;15199:1;15192:15;15218:127;15279:10;15274:3;15270:20;15267:1;15260:31;15310:4;15307:1;15300:15;15334:4;15331:1;15324:15;15906:225;16010:4;15989:12;;;16003;;;15985:31;16036:22;;;;16077:24;;;16067:58;;16105:18;;:::i;:::-;16067:58;15906:225;;;;:::o;16136:611::-;-1:-1:-1;;;;;16380:31:1;;16362:50;;16443:2;16428:18;;16421:34;;;16491:2;16486;16471:18;;16464:30;;;16510:18;;16503:34;;;-1:-1:-1;;;;;;16549:31:1;;16546:51;;;16593:1;16590;16583:12;16546:51;16627:6;16624:1;16620:14;16685:6;16677;16671:3;16660:9;16656:19;16643:49;16713:22;;;;16737:3;16709:32;;16136:611;-1:-1:-1;;;;;16136:611:1:o;16752:168::-;16825:9;;;16856;;16873:15;;;16867:22;;16853:37;16843:71;;16894:18;;:::i;16925:112::-;16957:1;16983;16973:35;;16988:18;;:::i;:::-;-1:-1:-1;17022:9:1;;16925:112::o;17042:125::-;17107:9;;;17128:10;;;17125:36;;;17141:18;;:::i;17172:148::-;17260:4;17239:12;;;17253;;;17235:31;;17278:13;;17275:39;;;17294:18;;:::i;17649:277::-;17716:6;17769:2;17757:9;17748:7;17744:23;17740:32;17737:52;;;17785:1;17782;17775:12;17737:52;17817:9;17811:16;17870:5;17863:13;17856:21;17849:5;17846:32;17836:60;;17892:1;17889;17882:12;19316:184;19386:6;19439:2;19427:9;19418:7;19414:23;19410:32;19407:52;;;19455:1;19452;19445:12;19407:52;-1:-1:-1;19478:16:1;;19316:184;-1:-1:-1;19316:184:1:o;20413:287::-;20542:3;20580:6;20574:13;20596:66;20655:6;20650:3;20643:4;20635:6;20631:17;20596:66;:::i;:::-;20678:16;;;;;20413:287;-1:-1:-1;;20413:287:1:o;21119:585::-;21218:6;21226;21234;21242;21250;21303:3;21291:9;21282:7;21278:23;21274:33;21271:53;;;21320:1;21317;21310:12;21271:53;21343:27;21360:9;21343:27;:::i;:::-;21333:37;;21389:36;21421:2;21410:9;21406:18;21389:36;:::i;:::-;21379:46;-1:-1:-1;21494:2:1;21479:18;;21466:32;;-1:-1:-1;21574:2:1;21559:18;;21546:32;21587:33;21546:32;21587:33;:::i;:::-;21119:585;;;;-1:-1:-1;21119:585:1;;21693:3;21678:19;21665:33;;21119:585;-1:-1:-1;;21119:585:1:o;22055:244::-;22166:10;22139:18;;;22159;;;22135:43;22198:28;;;;22245:24;;;22235:58;;22273:18;;:::i;22304:167::-;22399:10;22372:18;;;22392;;;22368:43;;22423:19;;22420:45;;;22445:18;;:::i;24522:249::-;24591:6;24644:2;24632:9;24623:7;24619:23;24615:32;24612:52;;;24660:1;24657;24650:12;24612:52;24692:9;24686:16;24711:30;24735:5;24711:30;:::i

Swarm Source

ipfs://da10f80d4c5c0e5f4ef67cea385d8f30d76f9a2226fbe89c418aebd2455868c0

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.