APE Price: $0.19 (+0.80%)

Contract

0xbcfA645D79F4ccF2B5448aC67309DCd15Bc94035

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo162.7735216426 APE

APE Value

$30.91 (@ $0.19/APE)

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To
Make Guess327456912026-01-23 22:25:351 hr ago1769207135IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04067595101.68276
Make Guess327456852026-01-23 22:25:301 hr ago1769207130IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04241472101.68276
Play327456702026-01-23 22:25:231 hr ago1769207123IN
0xbcfA645D...15Bc94035
2.07321158 APE0.06813822101.68276
Play327428672026-01-23 21:14:152 hrs ago1769202855IN
0xbcfA645D...15Bc94035
10.07321158 APE0.07191411101.68276
Cash Out327418082026-01-23 20:45:102 hrs ago1769201110IN
0xbcfA645D...15Bc94035
0 APE0.01173693101.68276
Make Guess327418022026-01-23 20:45:032 hrs ago1769201103IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04036825101.68276
Play327417952026-01-23 20:44:502 hrs ago1769201090IN
0xbcfA645D...15Bc94035
25.07321158 APE0.06605118101.68276
Play327417892026-01-23 20:44:442 hrs ago1769201084IN
0xbcfA645D...15Bc94035
25.07321158 APE0.06576647101.68276
Play327417702026-01-23 20:44:042 hrs ago1769201044IN
0xbcfA645D...15Bc94035
3.06321158 APE0.07013731101.68276
Play327417662026-01-23 20:43:462 hrs ago1769201026IN
0xbcfA645D...15Bc94035
3.06321158 APE0.0681126101.68276
Play327417642026-01-23 20:43:412 hrs ago1769201021IN
0xbcfA645D...15Bc94035
3.06321158 APE0.06811382101.68276
Cash Out327410562026-01-23 20:22:243 hrs ago1769199744IN
0xbcfA645D...15Bc94035
0 APE0.01347449101.68276
Cash Out327396612026-01-23 19:21:454 hrs ago1769196105IN
0xbcfA645D...15Bc94035
0 APE0.01173693101.68276
Make Guess327396592026-01-23 19:21:404 hrs ago1769196100IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04571667101.68276
Make Guess327396552026-01-23 19:21:274 hrs ago1769196087IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04065419101.68276
Play327396462026-01-23 19:21:154 hrs ago1769196075IN
0xbcfA645D...15Bc94035
10.07321158 APE0.0681004101.68276
Make Guess327396432026-01-23 19:21:064 hrs ago1769196066IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04065297101.68276
Make Guess327396352026-01-23 19:20:534 hrs ago1769196053IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04065297101.68276
Play327396282026-01-23 19:20:434 hrs ago1769196043IN
0xbcfA645D...15Bc94035
10.07321158 APE0.06809907101.68276
Make Guess327388882026-01-23 18:54:174 hrs ago1769194457IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04064809101.68276
Make Guess327388822026-01-23 18:54:104 hrs ago1769194450IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04238686101.68276
Play327388712026-01-23 18:54:044 hrs ago1769194444IN
0xbcfA645D...15Bc94035
5.07321158 APE0.06604508101.68276
Make Guess327332472026-01-23 15:49:137 hrs ago1769183353IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04571667101.68276
Make Guess327332402026-01-23 15:49:037 hrs ago1769183343IN
0xbcfA645D...15Bc94035
0.07321158 APE0.04571667101.68276
Play327332372026-01-23 15:48:597 hrs ago1769183339IN
0xbcfA645D...15Bc94035
5.07321158 APE0.0681004101.68276
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
327456922026-01-23 22:25:371 hr ago1769207137
0xbcfA645D...15Bc94035
3.31776 APE
327456912026-01-23 22:25:351 hr ago1769207135
0xbcfA645D...15Bc94035
0.07321158 APE
327456912026-01-23 22:25:351 hr ago1769207135
0xbcfA645D...15Bc94035
0.13824 APE
327456882026-01-23 22:25:311 hr ago1769207131
0xbcfA645D...15Bc94035
0.6912 APE
327456852026-01-23 22:25:301 hr ago1769207130
0xbcfA645D...15Bc94035
0.07321158 APE
327456852026-01-23 22:25:301 hr ago1769207130
0xbcfA645D...15Bc94035
0.1152 APE
327456732026-01-23 22:25:251 hr ago1769207125
0xbcfA645D...15Bc94035
0.96 APE
327456702026-01-23 22:25:231 hr ago1769207123
0xbcfA645D...15Bc94035
0.07321158 APE
327456702026-01-23 22:25:231 hr ago1769207123
0xbcfA645D...15Bc94035
0.08 APE
327428682026-01-23 21:14:162 hrs ago1769202856
0xbcfA645D...15Bc94035
9.6 APE
327428672026-01-23 21:14:152 hrs ago1769202855
0xbcfA645D...15Bc94035
0.07321158 APE
327428672026-01-23 21:14:152 hrs ago1769202855
0xbcfA645D...15Bc94035
0.4 APE
327418082026-01-23 20:45:102 hrs ago1769201110
0xbcfA645D...15Bc94035
31.625 APE
327418032026-01-23 20:45:042 hrs ago1769201104
0xbcfA645D...15Bc94035
5.225 APE
327418022026-01-23 20:45:032 hrs ago1769201103
0xbcfA645D...15Bc94035
0.07321158 APE
327418022026-01-23 20:45:032 hrs ago1769201103
0xbcfA645D...15Bc94035
1.1 APE
327417972026-01-23 20:44:522 hrs ago1769201092
0xbcfA645D...15Bc94035
3.5 APE
327417952026-01-23 20:44:502 hrs ago1769201090
0xbcfA645D...15Bc94035
0.07321158 APE
327417952026-01-23 20:44:502 hrs ago1769201090
0xbcfA645D...15Bc94035
1 APE
327417902026-01-23 20:44:442 hrs ago1769201084
0xbcfA645D...15Bc94035
24 APE
327417892026-01-23 20:44:442 hrs ago1769201084
0xbcfA645D...15Bc94035
0.07321158 APE
327417892026-01-23 20:44:442 hrs ago1769201084
0xbcfA645D...15Bc94035
1 APE
327417722026-01-23 20:44:062 hrs ago1769201046
0xbcfA645D...15Bc94035
2.8704 APE
327417702026-01-23 20:44:042 hrs ago1769201044
0xbcfA645D...15Bc94035
0.07321158 APE
327417702026-01-23 20:44:042 hrs ago1769201044
0xbcfA645D...15Bc94035
0.1196 APE
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DeathFun

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 2025-08-12
*/

//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 IRNG {
    function requestRandom(bytes32 userRandomNumber, uint8 numWords) external payable returns (uint64);
    function getFee() external view returns (uint256);
}


contract ApeOwnable {

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

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

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

    modifier onlyRNG() {
        require(
            msg.sender == manager.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;

}

/**
    Game Master Class, any inheriting game must pass the necessary fields into the constructor
 */
contract GameMasterclass is ApeOwnable, 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;

    /// @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 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() public view returns (uint256) {
        return IRNG(manager.RNG()).getFee();
    }

    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'
        );

        // 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) internal {

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

        // 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) {}
}

contract Claimer {

    address public parent;

    constructor() {
        // set parent to the address that deployed this contract
        parent = msg.sender;
    }

    function claim(address claimManager) external returns (uint256) {
        require(msg.sender == parent, "Only parent can call this function");

        // Call the claim function on the claim manager
        IClaimManager(claimManager).claim();

        // get amount
        uint256 amount = address(this).balance;

        // transfer the balance back to the parent
        (bool success, ) = payable(parent).call{value: amount}("");
        require(success, "Transfer failed");

        // return the amount transferred
        return amount;
    }

    receive() external payable {}
}

interface IHouseMaxPayout {
    function getMaxPayoutForGame(uint256 GAME_ID) external view returns (uint256);
}

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

    // How the game moves based on the player's index
    uint8 public constant MIN_ROWS = 2;
    uint8 public constant MAX_ROWS = 7;
    uint8 public constant ROWS_MODULUS = MAX_ROWS - MIN_ROWS + 1; // 6

    // maps a row to a payout multiplier
    mapping ( uint8 => uint256 ) public rowPayouts;

    // fees
    uint256 public platformFee = 250; // 2.5%

    /** Fee Denominator */
    uint256 private constant FEE_DENOM = 10_000;

    // Game Struct
    struct Game {

        // user playing the game
        address user;

        // guesses placed on each row (number for which row the user guessed)
        uint8[] rowGuesses;

        // where death hit on each row (number for which row the death hit)
        uint8[] rowDeathHits;

        // current payout the user could cash out
        uint256 currentPayout;

        // seeds the tile set to generate the tiles based on randomness
        uint256 tilesetSeed;

        // initial bet amount
        uint256 initialBetAmount;

        // total payout - 0 if user lost, set when user cashed out
        uint256 totalPayout;

        // bet amount sub fees for each round
        uint256 amountForHouse;

        // true when the game is over, either by user cashing out or game ended
        bool hasEnded;

        // time the game was started
        uint256 timestamp;
    }

    // return type
    struct GameInfoReturnType {
        uint256 initialBetAmount; // initial bet amount
        uint256 payout; // total payout
        address user; // user playing the game
        uint256 currentPayout;
        uint8[] rowGuesses;
        uint8[] rowDeathHits;
        uint256 tilesetSeed;
        bool hasEnded; // has the game ended
        uint256 timestamp; // timestamp of the game
    }

    // claimer
    Claimer public claimer;

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

    /// @notice emitted when the platform fee is changed
    event SetPlatformFee(uint256 newPlatformFee);

    /// @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(

        // Game ID
        uint256 GAME_ID_,

        /** History Manager */
        address history_

    ) GameMasterclass(GAME_ID_, history_) {

        rowPayouts[2] = 19_200; // 1.92x
        rowPayouts[3] = 14_400; // 1.44x
        rowPayouts[4] = 12_800; // 1.28x
        rowPayouts[5] = 12_000; // 1.20x
        rowPayouts[6] = 11_500; // 1.15x
        rowPayouts[7] = 11_000; // 1.10x

        // set claimer
        claimer = new Claimer();
    }

    function setPlatformFees(uint256 newPlatformFee) external onlyOwner {
        require(
            newPlatformFee <= 500,
            'Cannot Exceed 5% Fee'
        );
        
        platformFee = newPlatformFee;
        emit SetPlatformFee(newPlatformFee);
    }

    function setRowPayout(uint8 row, uint256 payout) external onlyOwner {
        require(
            row >= MIN_ROWS && row <= MAX_ROWS,
            'Invalid Row'
        );
        require(
            payout >= FEE_DENOM && payout <= 20_000,
            'Invalid Payout'
        );
        rowPayouts[row] = payout;
    }

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

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

        // decode game data
        (
            uint256 gameId,
            uint256 tilesetSeed,
            uint8 firstGuess,
            address ref,
            bytes32 userRandomWord
        ) = abi.decode(gameData, (uint256, uint256, uint8, address, bytes32));

        // validate inputs
        require(
            msg.value >= vrfFee,
            'ERR: MIN BUY IN'
        );
        require(
            isValidGameId(gameId) == true,
            'Invalid Game ID'
        );

        // get rows for round
        uint8 numTiles = getRowsForRound(0, games[gameId].tilesetSeed);
        require(
            firstGuess < numTiles,
            'ERR: INVALID FIRST GUESS'
        );

        // determine total bet amount
        uint256 totalBetAmount = msg.value - vrfFee;
        require(
            totalBetAmount > 0,
            'Invalid Bet Amount'
        );

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

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

        // pair gameId data
        games[gameId].user = player;
        games[gameId].tilesetSeed = tilesetSeed;
        games[gameId].hasEnded = false;
        games[gameId].timestamp = block.timestamp;
        games[gameId].amountForHouse = totalBetAmount - platformFeeAmount;
        games[gameId].rowGuesses.push(firstGuess);
        games[gameId].currentPayout = totalBetAmount;
        games[gameId].initialBetAmount = totalBetAmount;

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

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

        // fetch random number
        _requestRandom(gameId, 1, userRandomWord);
    }

    function makeGuess(
        uint256 gameId,
        uint8 index,
        bytes32 userRandomWord
    ) external payable {
        require(
            msg.value == getVRFFee(),
            'ERR: INVALID FEE AMOUNT'
        );
        require(
            games[gameId].user == msg.sender,
            'ERR: NOT YOUR GAME'
        );
        require(
            games[gameId].hasEnded == false,
            'ERR: GAME HAS ENDED'
        );
        require(
            games[gameId].rowDeathHits.length > 0,
            'ERR: NO ROUNDS PLAYED YET'
        );
        require(
            games[gameId].rowGuesses.length == games[gameId].rowDeathHits.length,
            'ERR: MUST RESOLVE LAST GUESS FIRST'
        );
        require(
            index < getRowsForRound(games[gameId].rowDeathHits.length, games[gameId].tilesetSeed),
            'ERR: INVALID GUESS'
        );

        // save guess
        games[gameId].rowGuesses.push(index);

        // manage bet amount -- this is the next bet officially -- use the payout of the last round
        uint256 newBetAmount = games[gameId].currentPayout;

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

        // send to platform receiver
        _processFee(platformFeeAmount, address(0), msg.sender);

        // save amount for house
        games[gameId].amountForHouse = newBetAmount - platformFeeAmount;

        // register bet
        _registerBet(msg.sender, newBetAmount);

        // request random number
        _requestRandom(gameId, 1, userRandomWord);
    }

    function cashOut(uint256 gameId) external {

        // check if game exists
        require(
            games[gameId].user == msg.sender,
            'ERR: NOT YOUR GAME'
        );

        // check if game has ended
        require(
            games[gameId].hasEnded == false,
            'ERR: GAME HAS ENDED'
        );
        require(
            games[gameId].rowDeathHits.length > 0,
            'Invalid Round'
        );
        require(
            games[gameId].rowGuesses.length == games[gameId].rowDeathHits.length,
            'ERR: MUST RESOLVE LAST GUESS FIRST'
        );

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

        // if the last round has a payout, we can cash out
        uint256 payout = games[gameId].currentPayout;
        require(
            payout > 0,
            'ERR: NO PAYOUT'
        );

        require(
            address(this).balance >= payout,
            'ERR: NOT ENOUGH FUNDS TO PAYOUT'
        );

        // save payout
        games[gameId].totalPayout = payout;

        // send payout to user
        IClaimManager(manager.claimManager()).credit{value: payout}(
            GAME_ID,
            games[gameId].user
        );
        
        // emit event
        emit GameEnded(games[gameId].user, gameId, games[gameId].initialBetAmount, payout);
    }

    /**
        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);

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

        // fetch round ID
        uint256 roundId = games[gameId].rowDeathHits.length;
        if (roundId != games[gameId].rowGuesses.length - 1) {
            emit FulfilRandomFailed(requestId, gameId, randomWords);
            return;
        }

        uint8 numTiles = getRowsForRound(roundId, games[gameId].tilesetSeed);
        
        // determine tile death hit
        uint8 deathHit = uint8((randomWords[0] % numTiles));

        // save death hit
        games[gameId].rowDeathHits.push(deathHit);

        // if death hit is the same as the guess, game over
        if (deathHit == games[gameId].rowGuesses[roundId]) {

            // game is over, user lost
            games[gameId].hasEnded = true;
            games[gameId].totalPayout = 0;
            games[gameId].currentPayout = 0;

            // emit Game Ended Event
            emit GameEnded(games[gameId].user, gameId, games[gameId].initialBetAmount, 0);

            // handle payout
            IHouse(manager.house()).houseProfit{value: games[gameId].amountForHouse }(GAME_ID);

        } else {

            // user survived, calculate new payout
            uint256 roundPayout = ( games[gameId].currentPayout * rowPayouts[numTiles] ) / FEE_DENOM;

            // update current payout
            games[gameId].currentPayout = roundPayout;

            if (roundPayout > games[gameId].amountForHouse && roundPayout > 0) {

                // get max house payout
                uint256 maxPayout = IHouseMaxPayout(manager.house()).getMaxPayoutForGame(GAME_ID);

                // user won, determine amount needed to payout
                uint256 diff = roundPayout - games[gameId].amountForHouse;

                // if the payout is larger than the max payout, we need to handle it
                if (diff > maxPayout) {

                    // determine excess
                    uint256 excess = diff - maxPayout;

                    // reduce payout by excess
                    games[gameId].currentPayout -= excess;

                    // handle midgame payout
                    uint256 amountOut = _handleMidgamePayout(maxPayout);

                    if (amountOut < maxPayout) {
                        // if the amount out is less than the max payout, we need to reduce the payout
                        games[gameId].currentPayout -= (maxPayout - amountOut);
                    }

                    // end the game to prevent future moves
                    games[gameId].hasEnded = true;

                    // if the last round has a payout, we can cash out
                    uint256 payout = games[gameId].currentPayout;

                    // save payout
                    games[gameId].totalPayout = payout;

                    // send payout to user
                    IClaimManager(manager.claimManager()).credit{value: payout}(
                        GAME_ID,
                        games[gameId].user
                    );
                    
                    // emit event
                    emit GameEnded(games[gameId].user, gameId, games[gameId].initialBetAmount, payout);

                } else {

                    // handle midgame payout
                    _handleMidgamePayout(diff);
                }
            }
        }
    }

    function _handleMidgamePayout(uint256 amount) internal returns (uint256 amountOut) {

        if (amount > 0) {

            // payout the rest from the house
            IHouse(manager.house()).payout(GAME_ID, address(claimer), amount);

            // claim from claim manager
            amountOut = claimer.claim(manager.claimManager());
        }
    }

    function getRowsForRound(uint256 roundId, uint256 tilesetSeed) public pure returns (uint8) {

        if (tilesetSeed == 0) {
            // now we do our cascading rounds, starting with 7 going to 3, then back to 7, then back to 3, etc.
            if (roundId > 0 && roundId % 20 == 0) {
                return uint8(2);
            }
            return uint8(7) - uint8( roundId % 5 ); // 7-3
        }
        
        // hash the tileset seed with the round ID
        uint256 tSeed = uint256(keccak256(abi.encodePacked(roundId, tilesetSeed)));

        // constrain the rows to be between MIN_ROWS and MAX_ROWS
        return uint8((tSeed % ROWS_MODULUS) + MIN_ROWS);
    }

    function batchRowsForRounds(uint256[] calldata roundIds, uint256 tilesetSeed) external pure returns (uint8[] memory rows) {
        uint len = roundIds.length;
        rows = new uint8[](len);
        for (uint i = 0; i < len;) {
            rows[i] = getRowsForRound(roundIds[i], tilesetSeed);
            unchecked { ++i; }
        }
    }

    function getGameInfo(uint256 _gameId) public view returns (
        GameInfoReturnType memory
    ) {
        if (games[_gameId].rowGuesses.length == 0) {
            return GameInfoReturnType({
                initialBetAmount: 0,
                payout: 0,
                user: address(0),
                currentPayout: 0,
                rowGuesses: new uint8[](0),
                rowDeathHits: new uint8[](0),
                tilesetSeed: 0,
                hasEnded: false,
                timestamp: 0
            });
        }

        return GameInfoReturnType({
            initialBetAmount: games[_gameId].initialBetAmount, // first round bet amount
            payout: games[_gameId].totalPayout,
            user: games[_gameId].user,
            currentPayout: games[_gameId].currentPayout,
            rowGuesses: games[_gameId].rowGuesses,
            rowDeathHits: games[_gameId].rowDeathHits,
            tilesetSeed: games[_gameId].tilesetSeed,
            hasEnded: games[_gameId].hasEnded,
            timestamp: games[_gameId].timestamp
        });
    }

    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]].user;
            uint256 rounds = games[gameIds[i]].rowGuesses.length;
            if (rounds == 0) {
                buyInAmounts[i] = 0;
                totalPayouts[i] = 0;
                timestamps[i] = 0;
                hasEndeds[i] = false;
            } else {
                buyInAmounts[i] = games[gameIds[i]].initialBetAmount; // first round bet amount
                totalPayouts[i] = games[gameIds[i]].totalPayout; // total payout
                timestamps[i] = games[gameIds[i]].timestamp; // timestamp of the game
                hasEndeds[i] = games[gameIds[i]].hasEnded; // has the game ended?
            }
            unchecked { ++i; }
        }
    }

    receive() external payable {}
}

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":"newPlatformFee","type":"uint256"}],"name":"SetPlatformFee","type":"event"},{"inputs":[],"name":"GAME_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ROWS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_ROWS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROWS_MODULUS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"batchRawGameInfo","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"roundIds","type":"uint256[]"},{"internalType":"uint256","name":"tilesetSeed","type":"uint256"}],"name":"batchRowsForRounds","outputs":[{"internalType":"uint8[]","name":"rows","type":"uint8[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"cashOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimer","outputs":[{"internalType":"contract Claimer","name":"","type":"address"}],"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":"user","type":"address"},{"internalType":"uint256","name":"currentPayout","type":"uint256"},{"internalType":"uint256","name":"tilesetSeed","type":"uint256"},{"internalType":"uint256","name":"initialBetAmount","type":"uint256"},{"internalType":"uint256","name":"totalPayout","type":"uint256"},{"internalType":"uint256","name":"amountForHouse","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":"uint256","name":"initialBetAmount","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"currentPayout","type":"uint256"},{"internalType":"uint8[]","name":"rowGuesses","type":"uint8[]"},{"internalType":"uint8[]","name":"rowDeathHits","type":"uint8[]"},{"internalType":"uint256","name":"tilesetSeed","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct DeathFun.GameInfoReturnType","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"uint256","name":"tilesetSeed","type":"uint256"}],"name":"getRowsForRound","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getVRFFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"gameId","type":"uint256"},{"internalType":"uint8","name":"index","type":"uint8"},{"internalType":"bytes32","name":"userRandomWord","type":"bytes32"}],"name":"makeGuess","outputs":[],"stateMutability":"payable","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":[],"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":"uint8","name":"","type":"uint8"}],"name":"rowPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlatformFee","type":"uint256"}],"name":"setPlatformFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"row","type":"uint8"},{"internalType":"uint256","name":"payout","type":"uint256"}],"name":"setRowPayout","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"}]

60c06040526000805460ff1916905560fa60055534801561001f57600080fd5b506040516141ac3803806141ac83398101604081905261003e91610196565b60808290526001600160a01b03811660a0526004602052614b007f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7556138407f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa0556132007f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f55612ee07f04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f0555612cec7fc59312466997bb42aaaf719ece141047820e6b34531e1670dc1852a453648f0f556007600052612af87fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5515560405161014490610189565b604051809103906000f080158015610160573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b0392909216919091179055506101d39050565b61029780613f1583390190565b600080604083850312156101a957600080fd5b825160208401519092506001600160a01b03811681146101c857600080fd5b809150509250929050565b60805160a051613ce5610230600039600081816105c701526133c80152600081816106d301528181611423015281816118c401528181611a2201528181611bfd015281816129ed01528181612e17015261339b0152613ce56000f3fe6080604052600436106101f25760003560e01c806379caee8c1161010d578063b6d5cfbb116100a0578063d379be231161006f578063d379be2314610677578063e67953ea14610697578063f0034a7e146106ac578063fdcdb06b146106c1578063ffc22316146106f557600080fd5b8063b6d5cfbb14610609578063c4fd5d6d1461061e578063c811ad711461064f578063cc81d0551461066257600080fd5b806391ea41e6116100dc57806391ea41e61461055b57806398006ebe1461058857806398daac83146105b55780639e281a98146105e957600080fd5b806379caee8c146104d95780637b8d3879146104f95780638456cb591461052657806389fc2c0f1461053b57600080fd5b806346d369bc1161018557806351e925591161015457806351e925591461044f5780635c7b79f51461047f5780635c975abb1461049f578063749fa03c146104b957600080fd5b806346d369bc146103cd5780634782f779146103e057806347e1d55014610400578063481c6a751461042d57600080fd5b8063252ddc72116101c1578063252ddc721461032f57806326232a2e1461034f57806332883e7e1461037357806343aade15146103a057600080fd5b8063046f7da2146101fe57806304e2064f146102155780630840cfaa14610247578063117a5b901461027957600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361070a565b005b34801561022157600080fd5b5061022a6107bf565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025357600080fd5b50610267610262366004613470565b610836565b60405160ff909116815260200161023e565b34801561028557600080fd5b506102e8610294366004613492565b6007602081905260009182526040909120805460038201546004830154600584015460068501549585015460088601546009909601546001600160a01b039095169693959294919392909160ff9091169088565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a0840152151560c083015260e08201526101000161023e565b34801561033b57600080fd5b5061021361034a3660046134bc565b6108e3565b34801561035b57600080fd5b5061036560055481565b60405190815260200161023e565b34801561037f57600080fd5b5061039361038e366004613470565b610a3c565b60405161023e9190613522565b3480156103ac57600080fd5b506103656103bb36600461353c565b60046020526000908152604090205481565b6102136103db366004613557565b610afe565b3480156103ec57600080fd5b506102136103fb3660046135a5565b610db9565b34801561040c57600080fd5b5061042061041b366004613492565b610ebe565b60405161023e91906135f8565b34801561043957600080fd5b5061022a600080516020613c9083398151915281565b34801561045b57600080fd5b5061046f61046a366004613492565b61117d565b604051901515815260200161023e565b34801561048b57600080fd5b5061021361049a366004613492565b61119d565b3480156104ab57600080fd5b5060005461046f9060ff1681565b3480156104c557600080fd5b506102136104d4366004613704565b6114fd565b3480156104e557600080fd5b506102136104f4366004613492565b611d00565b34801561050557600080fd5b50610519610514366004613758565b611e24565b60405161023e91906137cd565b34801561053257600080fd5b50610213611ee1565b34801561054757600080fd5b50610365610556366004613492565b611f90565b34801561056757600080fd5b5061057b610576366004613758565b611fb1565b60405161023e9190613804565b34801561059457600080fd5b506105a86105a3366004613884565b61207d565b60405161023e91906138cf565b3480156105c157600080fd5b5061022a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105f557600080fd5b506102136106043660046135a5565b612126565b34801561061557600080fd5b50610267600281565b34801561062a57600080fd5b5061063e610639366004613758565b6121d5565b60405161023e9594939291906138e2565b61021361065d366004613982565b6125d1565b34801561066e57600080fd5b50600154610365565b34801561068357600080fd5b5060065461022a906001600160a01b031681565b3480156106a357600080fd5b50610267600781565b3480156106b857600080fd5b50610365612798565b3480156106cd57600080fd5b506103657f000000000000000000000000000000000000000000000000000000000000000081565b34801561070157600080fd5b5061026761286b565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190613a07565b6001600160a01b0316336001600160a01b0316146107b35760405162461bcd60e51b81526004016107aa90613a24565b60405180910390fd5b6000805460ff19169055565b6000600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561080d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108319190613a07565b905090565b600081600003610882576000831180156108585750610856601484613a5e565b155b15610865575060026108dd565b610870600584613a5e565b61087b906007613a88565b90506108dd565b6040805160208082018690528183018590528251808303840181526060909201909252805191012060026108b7816007613a88565b6108c2906001613aa1565b6108cf9060ff1683613a5e565b6108d99190613aba565b9150505b92915050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109539190613a07565b6001600160a01b0316336001600160a01b0316146109835760405162461bcd60e51b81526004016107aa90613a24565b600260ff83161080159061099b5750600760ff831611155b6109d55760405162461bcd60e51b815260206004820152600b60248201526a496e76616c696420526f7760a81b60448201526064016107aa565b61271081101580156109e95750614e208111155b610a265760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a590814185e5bdd5d60921b60448201526064016107aa565b60ff909116600090815260046020526040902055565b600154606090821115610a4f5760015491505b6000610a5b8484613acd565b6001600160401b03811115610a7257610a72613ae0565b604051908082528060200260200182016040528015610a9b578160200160208202803683370190505b509050835b83811015610af65760018181548110610abb57610abb613af6565b9060005260206000200154828683610ad39190613acd565b81518110610ae357610ae3613af6565b6020908102919091010152600101610aa0565b509392505050565b610b06612798565b3414610b545760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c49442046454520414d4f554e5400000000000000000060448201526064016107aa565b6000838152600760205260409020546001600160a01b03163314610baf5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107aa565b60008381526007602052604090206008015460ff1615610c075760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107aa565b600083815260076020526040902060020154610c655760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f20524f554e445320504c41594544205945540000000000000060448201526064016107aa565b6000838152600760205260409020600281015460019091015414610c9b5760405162461bcd60e51b81526004016107aa90613b0c565b60008381526007602052604090206002810154600490910154610cbe9190610836565b60ff168260ff1610610d075760405162461bcd60e51b81526020600482015260126024820152714552523a20494e56414c494420475545535360701b60448201526064016107aa565b600083815260076020908152604082206001808201805491820181558452828420928104909201805460ff808816601f9095166101000a94850294021916929092179091558482526003015460055490919061271090610d679084613b4e565b610d719190613b65565b9050610d7f81600033612885565b610d898183613acd565b60008681526007602081905260409091200155610da63383612957565b610db285600185612a55565b5050505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190613a07565b6001600160a01b0316336001600160a01b031614610e595760405162461bcd60e51b81526004016107aa90613a24565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ea6576040519150601f19603f3d011682016040523d82523d6000602084013e610eab565b606091505b5050905080610eb957600080fd5b505050565b610f18604051806101200160405280600081526020016000815260200160006001600160a01b0316815260200160008152602001606081526020016060815260200160008152602001600015158152602001600081525090565b6000828152600760205260408120600101549003610ff357604051806101200160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160401b03811115610f7a57610f7a613ae0565b604051908082528060200260200182016040528015610fa3578160200160208202803683370190505b5081526020016000604051908082528060200260200182016040528015610fd4578160200160208202803683370190505b5081526000602082018190526040820181905260609091015292915050565b60408051610120810182526000848152600760208181528483206005810154855260068101548286015280546001600160a01b0316858701526003810154606086015292879052908152600190910180548451818402810184019095528085529293608085019390928301828280156110a957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161107a5790505b505050505081526020016007600085815260200190815260200160002060020180548060200260200160405190810160405280929190818152602001828054801561113157602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116111025790505b50505091835250506000848152600760208181526040808420600481015483870152600881015460ff161515918601919091529690925290526009909301546060909301929092525090565b60008181526002602052604081205460ff161580156108dd575050151590565b6000818152600760205260409020546001600160a01b031633146111f85760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107aa565b60008181526007602052604090206008015460ff16156112505760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107aa565b60008181526007602052604090206002015461129e5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908149bdd5b99609a1b60448201526064016107aa565b60008181526007602052604090206002810154600190910154146112d45760405162461bcd60e51b81526004016107aa90613b0c565b600081815260076020526040902060088101805460ff1916600117905560030154806113335760405162461bcd60e51b815260206004820152600e60248201526d1154948e881393c814105653d55560921b60448201526064016107aa565b804710156113835760405162461bcd60e51b815260206004820152601f60248201527f4552523a204e4f5420454e4f5547482046554e445320544f205041594f55540060448201526064016107aa565b600082815260076020908152604091829020600601839055815163a9a36dcd60e01b81529151600080516020613c908339815191529263a9a36dcd9260048083019391928290030181865afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114049190613a07565b600083815260076020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561147e57600080fd5b505af1158015611492573d6000803e3d6000fd5b50505060008481526007602090815260409182902080546005909101548351888152928301529181018590526001600160a01b0390911692507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae8915060600160405180910390a25050565b600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156d9190613a07565b6001600160a01b0316336001600160a01b0316146115c15760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107aa565b6001600160401b0383166000908152600360205260409020546115e384612cb1565b80158061160557506000818152600760205260409020546001600160a01b0316155b80611626575060008181526007602052604090206008015460ff1615156001145b1561166e577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5848285856040516116609493929190613b79565b60405180910390a150505050565b60008181526007602052604090206002810154600191820154909161169291613acd565b81146116dc577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5858386866040516116cd9493929190613b79565b60405180910390a15050505050565b6000828152600760205260408120600401546116f9908390610836565b905060008160ff168686600081811061171457611714613af6565b905060200201356117259190613a5e565b6000858152600760209081526040822060028101805460018181018355918552838520938104909301805460ff808816601f9096166101000a958602950219169390931790925591879052018054919250908490811061178757611787613af6565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff160361193657600084815260076020908152604080832060088101805460ff1916600117905560068101849055600381018490558054600590910154825189815293840152908201929092526001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89060600160405180910390a2600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a29190613a07565b600085815260076020819052604091829020015490516359e5b78d60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03929092169163b3cb6f1a91906024016000604051808303818588803b15801561191857600080fd5b505af115801561192c573d6000803e3d6000fd5b5050505050611cf7565b60ff821660009081526004602090815260408083205487845260079092528220600301546127109161196791613b4e565b6119719190613b65565b60008681526007602081905260409091206003810183905501549091508111801561199c5750600081115b15611cf5576000600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190613a07565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015611a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9d9190613bcb565b60008781526007602081905260408220015491925090611abd9084613acd565b905081811115611ce7576000611ad38383613acd565b905080600760008a81526020019081526020016000206003016000828254611afb9190613acd565b9091555060009050611b0c84612d8d565b905083811015611b4757611b208185613acd565b60008a81526007602052604081206003018054909190611b41908490613acd565b90915550505b60008981526007602090815260409182902060088101805460ff1916600117905560038101546006909101819055825163a9a36dcd60e01b815292519092600080516020613c908339815191529263a9a36dcd926004808401938290030181865afa158015611bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bde9190613a07565b60008b815260076020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b50505060008c81526007602052604090819020805460059091015491516001600160a01b0390911693507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89250611cd7918e9186909283526020830191909152604082015260600190565b60405180910390a2505050611cf2565b611cf081612d8d565b505b50505b505b50505050505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d709190613a07565b6001600160a01b0316336001600160a01b031614611da05760405162461bcd60e51b81526004016107aa90613a24565b6101f4811115611de95760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74204578636565642035252046656560601b60448201526064016107aa565b60058190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b606081806001600160401b03811115611e3f57611e3f613ae0565b604051908082528060200260200182016040528015611e68578160200160208202803683370190505b50915060005b81811015611ed95760026000868684818110611e8c57611e8c613af6565b90506020020135815260200190815260200160002060009054906101000a900460ff16838281518110611ec157611ec1613af6565b91151560209283029190910190910152600101611e6e565b505092915050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f519190613a07565b6001600160a01b0316336001600160a01b031614611f815760405162461bcd60e51b81526004016107aa90613a24565b6000805460ff19166001179055565b60018181548110611fa057600080fd5b600091825260209091200154905081565b6060816000816001600160401b03811115611fce57611fce613ae0565b60405190808252806020026020018201604052801561200157816020015b6060815260200190600190039081611fec5790505b50905060005b828110156120745761203086868381811061202457612024613af6565b90506020020135610ebe565b60405160200161204091906135f8565b60405160208183030381529060405282828151811061206157612061613af6565b6020908102919091010152600101612007565b50949350505050565b606082806001600160401b0381111561209857612098613ae0565b6040519080825280602002602001820160405280156120c1578160200160208202803683370190505b50915060005b8181101561211d576120f18686838181106120e4576120e4613af6565b9050602002013585610836565b83828151811061210357612103613af6565b60ff909216602092830291909101909101526001016120c7565b50509392505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121969190613a07565b6001600160a01b0316336001600160a01b0316146121c65760405162461bcd60e51b81526004016107aa90613a24565b6121d1823383612f93565b5050565b60608080808085806001600160401b038111156121f4576121f4613ae0565b60405190808252806020026020018201604052801561221d578160200160208202803683370190505b509550806001600160401b0381111561223857612238613ae0565b604051908082528060200260200182016040528015612261578160200160208202803683370190505b509450806001600160401b0381111561227c5761227c613ae0565b6040519080825280602002602001820160405280156122a5578160200160208202803683370190505b509350806001600160401b038111156122c0576122c0613ae0565b6040519080825280602002602001820160405280156122e9578160200160208202803683370190505b509250806001600160401b0381111561230457612304613ae0565b60405190808252806020026020018201604052801561232d578160200160208202803683370190505b50915060005b818110156125c557600760008a8a8481811061235157612351613af6565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b031687828151811061238f5761238f613af6565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600760008b8b858181106123c7576123c7613af6565b9050602002013581526020019081526020016000206001018054905090508060000361247657600087838151811061240157612401613af6565b602002602001018181525050600086838151811061242157612421613af6565b602002602001018181525050600085838151811061244157612441613af6565b602002602001018181525050600084838151811061246157612461613af6565b911515602092830291909101909101526125bc565b600760008b8b8581811061248c5761248c613af6565b905060200201358152602001908152602001600020600501548783815181106124b7576124b7613af6565b602002602001018181525050600760008b8b858181106124d9576124d9613af6565b9050602002013581526020019081526020016000206006015486838151811061250457612504613af6565b602002602001018181525050600760008b8b8581811061252657612526613af6565b9050602002013581526020019081526020016000206009015485838151811061255157612551613af6565b602002602001018181525050600760008b8b8581811061257357612573613af6565b90506020020135815260200190815260200160002060080160009054906101000a900460ff168483815181106125ab576125ab613af6565b911515602092830291909101909101525b50600101612333565b50509295509295909350565b826001600160a01b038116331461269b57604051636d6d50a160e11b8152336004820152600080516020613c908339815191529063dadaa14290602401602060405180830381865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f9190613be4565b61269b5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107aa565b600080516020613c908339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270b9190613be4565b1561274b5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107aa565b60005460ff16156127875760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107aa565b6127928484846130bd565b50505050565b6000600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280a9190613a07565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108319190613bcb565b61287760026007613a88565b612882906001613aa1565b81565b600080516020613c908339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f59190613a07565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e59085906044016000604051808303818588803b15801561294357600080fd5b505af1158015611cf5573d6000803e3d6000fd5b600080516020613c908339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c79190613a07565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612a3957600080fd5b505af1158015612a4d573d6000803e3d6000fd5b505050505050565b6000600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac79190613a07565b6001600160a01b03166397cca7af612add612798565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015612b22573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b479190613c06565b6001600160401b03811660009081526003602052604090205490915015612ba35760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107aa565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b031981529151600080516020613c908339815191529263ff9b3acf9260048083019391928290030181865afa158015612c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2e9190613a07565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d458460405161166091815260200190565b600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d219190613a07565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d5b57600080fd5b505af1158015612d6f573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b60008115612f8e57600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e059190613a07565b60065460405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391821660248201526044810185905291169063ae2f5d9390606401600060405180830381600087803b158015612e7857600080fd5b505af1158015612e8c573d6000803e3d6000fd5b50505050600660009054906101000a90046001600160a01b03166001600160a01b0316631e83409a600080516020613c908339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f249190613a07565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015612f6a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190613bcb565b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612fef9190613c23565b6000604051808303816000865af19150503d806000811461302c576040519150601f19603f3d011682016040523d82523d6000602084013e613031565b606091505b509150915081801561305b57508051158061305b57508080602001905181019061305b9190613be4565b610db25760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107aa565b60006130c7612798565b90506000808080806130db87890189613c3f565b94509450945094509450853410156131275760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107aa565b6131308561117d565b15156001146131735760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b60448201526064016107aa565b600085815260076020526040812060040154613190908290610836565b90508060ff168460ff16106131e75760405162461bcd60e51b815260206004820152601860248201527f4552523a20494e56414c4944204649525354204755455353000000000000000060448201526064016107aa565b60006131f38834613acd565b90506000811161323a5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b60448201526064016107aa565b60006127106005548361324d9190613b4e565b6132579190613b65565b905061326481868e612885565b600088815260076020526040902080546001600160a01b0319166001600160a01b038e161781556004810188905560088101805460ff19169055426009909101556132af8183613acd565b60008981526007602081815260408320918201939093556001808201805491820181558352838320938104909301805460ff808c16601f9096166101000a9586029502191693909317909255899052600381018390556005018290556133158c8961337c565b61331f8c83612957565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c78960405161335a91815260200190565b60405180910390a261336e88600186612a55565b505050505050505050505050565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b15801561340c57600080fd5b505af1158015613420573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000806040838503121561348357600080fd5b50508035926020909101359150565b6000602082840312156134a457600080fd5b5035919050565b803560ff81168114612f8e57600080fd5b600080604083850312156134cf57600080fd5b6134d8836134ab565b946020939093013593505050565b600081518084526020840193506020830160005b828110156135185781518652602095860195909101906001016134fa565b5093949350505050565b60208152600061353560208301846134e6565b9392505050565b60006020828403121561354e57600080fd5b613535826134ab565b60008060006060848603121561356c57600080fd5b8335925061357c602085016134ab565b929592945050506040919091013590565b6001600160a01b03811681146135a257600080fd5b50565b600080604083850312156135b857600080fd5b82356134d88161358d565b600081518084526020840193506020830160005b8281101561351857815160ff168652602095860195909101906001016135d7565b6020815281516020820152602082015160408201526000604083015161362960608401826001600160a01b03169052565b5060608301516080830152608083015161012060a084015261364f6101408401826135c3565b905060a0840151601f198483030160c085015261366c82826135c3565b91505060c084015160e084015260e084015161368d61010085018215159052565b506101008401516101208401528091505092915050565b6001600160401b03811681146135a257600080fd5b60008083601f8401126136cb57600080fd5b5081356001600160401b038111156136e257600080fd5b6020830191508360208260051b85010111156136fd57600080fd5b9250929050565b60008060006040848603121561371957600080fd5b8335613724816136a4565b925060208401356001600160401b0381111561373f57600080fd5b61374b868287016136b9565b9497909650939450505050565b6000806020838503121561376b57600080fd5b82356001600160401b0381111561378157600080fd5b61378d858286016136b9565b90969095509350505050565b600081518084526020840193506020830160005b8281101561351857815115158652602095860195909101906001016137ad565b6020815260006135356020830184613799565b60005b838110156137fb5781810151838201526020016137e3565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561387857603f19878603018452815180518087526138558160208901602085016137e0565b601f01601f1916959095016020908101955093840193919091019060010161382c565b50929695505050505050565b60008060006040848603121561389957600080fd5b83356001600160401b038111156138af57600080fd5b6138bb868287016136b9565b909790965060209590950135949350505050565b60208152600061353560208301846135c3565b60a08082528651908201819052600090602088019060c0840190835b818110156139255783516001600160a01b03168352602093840193909201916001016138fe565b5050838103602085015261393981896134e6565b915050828103604084015261394e81876134e6565b9050828103606084015261396281866134e6565b905082810360808401526139768185613799565b98975050505050505050565b60008060006040848603121561399757600080fd5b83356139a28161358d565b925060208401356001600160401b038111156139bd57600080fd5b8401601f810186136139ce57600080fd5b80356001600160401b038111156139e457600080fd5b8660208284010111156139f657600080fd5b939660209190910195509293505050565b600060208284031215613a1957600080fd5b81516135358161358d565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082613a6d57613a6d613a48565b500690565b634e487b7160e01b600052601160045260246000fd5b60ff82811682821603908111156108dd576108dd613a72565b60ff81811683821601908111156108dd576108dd613a72565b808201808211156108dd576108dd613a72565b818103818111156108dd576108dd613a72565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60208082526022908201527f4552523a204d555354205245534f4c5645204c4153542047554553532046495260408201526114d560f21b606082015260800190565b80820281158282048414176108dd576108dd613a72565b600082613b7457613b74613a48565b500490565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b03831115613bb057600080fd5b8260051b808560808501379190910160800195945050505050565b600060208284031215613bdd57600080fd5b5051919050565b600060208284031215613bf657600080fd5b8151801515811461353557600080fd5b600060208284031215613c1857600080fd5b8151613535816136a4565b60008251613c358184602087016137e0565b9190910192915050565b600080600080600060a08688031215613c5757600080fd5b8535945060208601359350613c6e604087016134ab565b92506060860135613c7e8161358d565b94979396509194608001359291505056fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212207f4e812b814813a999f7c15e75443867a624ac0637fdb57bc849e3920e30fb2564736f6c634300081c00336080604052348015600f57600080fd5b50600080546001600160a01b03191633179055610266806100316000396000f3fe60806040526004361061002d5760003560e01c80631e83409a1461003957806360f96a8f1461006c57600080fd5b3661003457005b600080fd5b34801561004557600080fd5b50610059610054366004610200565b6100a4565b6040519081526020015b60405180910390f35b34801561007857600080fd5b5060005461008c906001600160a01b031681565b6040516001600160a01b039091168152602001610063565b600080546001600160a01b0316331461010f5760405162461bcd60e51b815260206004820152602260248201527f4f6e6c7920706172656e742063616e2063616c6c20746869732066756e63746960448201526137b760f11b60648201526084015b60405180910390fd5b816001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561014a57600080fd5b505af115801561015e573d6000803e3d6000fd5b5050600080546040514794509192506001600160a01b03169083908381818185875af1925050503d80600081146101b1576040519150601f19603f3d011682016040523d82523d6000602084013e6101b6565b606091505b50509050806101f95760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610106565b5092915050565b60006020828403121561021257600080fd5b81356001600160a01b038116811461022957600080fd5b939250505056fea26469706673582212209d3dcfa10808d923c6427b4fae63609b7edac37cce12a2317ed57a753ada9c9564736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

Deployed Bytecode

0x6080604052600436106101f25760003560e01c806379caee8c1161010d578063b6d5cfbb116100a0578063d379be231161006f578063d379be2314610677578063e67953ea14610697578063f0034a7e146106ac578063fdcdb06b146106c1578063ffc22316146106f557600080fd5b8063b6d5cfbb14610609578063c4fd5d6d1461061e578063c811ad711461064f578063cc81d0551461066257600080fd5b806391ea41e6116100dc57806391ea41e61461055b57806398006ebe1461058857806398daac83146105b55780639e281a98146105e957600080fd5b806379caee8c146104d95780637b8d3879146104f95780638456cb591461052657806389fc2c0f1461053b57600080fd5b806346d369bc1161018557806351e925591161015457806351e925591461044f5780635c7b79f51461047f5780635c975abb1461049f578063749fa03c146104b957600080fd5b806346d369bc146103cd5780634782f779146103e057806347e1d55014610400578063481c6a751461042d57600080fd5b8063252ddc72116101c1578063252ddc721461032f57806326232a2e1461034f57806332883e7e1461037357806343aade15146103a057600080fd5b8063046f7da2146101fe57806304e2064f146102155780630840cfaa14610247578063117a5b901461027957600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361070a565b005b34801561022157600080fd5b5061022a6107bf565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025357600080fd5b50610267610262366004613470565b610836565b60405160ff909116815260200161023e565b34801561028557600080fd5b506102e8610294366004613492565b6007602081905260009182526040909120805460038201546004830154600584015460068501549585015460088601546009909601546001600160a01b039095169693959294919392909160ff9091169088565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a0840152151560c083015260e08201526101000161023e565b34801561033b57600080fd5b5061021361034a3660046134bc565b6108e3565b34801561035b57600080fd5b5061036560055481565b60405190815260200161023e565b34801561037f57600080fd5b5061039361038e366004613470565b610a3c565b60405161023e9190613522565b3480156103ac57600080fd5b506103656103bb36600461353c565b60046020526000908152604090205481565b6102136103db366004613557565b610afe565b3480156103ec57600080fd5b506102136103fb3660046135a5565b610db9565b34801561040c57600080fd5b5061042061041b366004613492565b610ebe565b60405161023e91906135f8565b34801561043957600080fd5b5061022a600080516020613c9083398151915281565b34801561045b57600080fd5b5061046f61046a366004613492565b61117d565b604051901515815260200161023e565b34801561048b57600080fd5b5061021361049a366004613492565b61119d565b3480156104ab57600080fd5b5060005461046f9060ff1681565b3480156104c557600080fd5b506102136104d4366004613704565b6114fd565b3480156104e557600080fd5b506102136104f4366004613492565b611d00565b34801561050557600080fd5b50610519610514366004613758565b611e24565b60405161023e91906137cd565b34801561053257600080fd5b50610213611ee1565b34801561054757600080fd5b50610365610556366004613492565b611f90565b34801561056757600080fd5b5061057b610576366004613758565b611fb1565b60405161023e9190613804565b34801561059457600080fd5b506105a86105a3366004613884565b61207d565b60405161023e91906138cf565b3480156105c157600080fd5b5061022a7f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b3480156105f557600080fd5b506102136106043660046135a5565b612126565b34801561061557600080fd5b50610267600281565b34801561062a57600080fd5b5061063e610639366004613758565b6121d5565b60405161023e9594939291906138e2565b61021361065d366004613982565b6125d1565b34801561066e57600080fd5b50600154610365565b34801561068357600080fd5b5060065461022a906001600160a01b031681565b3480156106a357600080fd5b50610267600781565b3480156106b857600080fd5b50610365612798565b3480156106cd57600080fd5b506103657f000000000000000000000000000000000000000000000000000000000000000d81565b34801561070157600080fd5b5061026761286b565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190613a07565b6001600160a01b0316336001600160a01b0316146107b35760405162461bcd60e51b81526004016107aa90613a24565b60405180910390fd5b6000805460ff19169055565b6000600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561080d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108319190613a07565b905090565b600081600003610882576000831180156108585750610856601484613a5e565b155b15610865575060026108dd565b610870600584613a5e565b61087b906007613a88565b90506108dd565b6040805160208082018690528183018590528251808303840181526060909201909252805191012060026108b7816007613a88565b6108c2906001613aa1565b6108cf9060ff1683613a5e565b6108d99190613aba565b9150505b92915050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109539190613a07565b6001600160a01b0316336001600160a01b0316146109835760405162461bcd60e51b81526004016107aa90613a24565b600260ff83161080159061099b5750600760ff831611155b6109d55760405162461bcd60e51b815260206004820152600b60248201526a496e76616c696420526f7760a81b60448201526064016107aa565b61271081101580156109e95750614e208111155b610a265760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a590814185e5bdd5d60921b60448201526064016107aa565b60ff909116600090815260046020526040902055565b600154606090821115610a4f5760015491505b6000610a5b8484613acd565b6001600160401b03811115610a7257610a72613ae0565b604051908082528060200260200182016040528015610a9b578160200160208202803683370190505b509050835b83811015610af65760018181548110610abb57610abb613af6565b9060005260206000200154828683610ad39190613acd565b81518110610ae357610ae3613af6565b6020908102919091010152600101610aa0565b509392505050565b610b06612798565b3414610b545760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c49442046454520414d4f554e5400000000000000000060448201526064016107aa565b6000838152600760205260409020546001600160a01b03163314610baf5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107aa565b60008381526007602052604090206008015460ff1615610c075760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107aa565b600083815260076020526040902060020154610c655760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f20524f554e445320504c41594544205945540000000000000060448201526064016107aa565b6000838152600760205260409020600281015460019091015414610c9b5760405162461bcd60e51b81526004016107aa90613b0c565b60008381526007602052604090206002810154600490910154610cbe9190610836565b60ff168260ff1610610d075760405162461bcd60e51b81526020600482015260126024820152714552523a20494e56414c494420475545535360701b60448201526064016107aa565b600083815260076020908152604082206001808201805491820181558452828420928104909201805460ff808816601f9095166101000a94850294021916929092179091558482526003015460055490919061271090610d679084613b4e565b610d719190613b65565b9050610d7f81600033612885565b610d898183613acd565b60008681526007602081905260409091200155610da63383612957565b610db285600185612a55565b5050505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190613a07565b6001600160a01b0316336001600160a01b031614610e595760405162461bcd60e51b81526004016107aa90613a24565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ea6576040519150601f19603f3d011682016040523d82523d6000602084013e610eab565b606091505b5050905080610eb957600080fd5b505050565b610f18604051806101200160405280600081526020016000815260200160006001600160a01b0316815260200160008152602001606081526020016060815260200160008152602001600015158152602001600081525090565b6000828152600760205260408120600101549003610ff357604051806101200160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160401b03811115610f7a57610f7a613ae0565b604051908082528060200260200182016040528015610fa3578160200160208202803683370190505b5081526020016000604051908082528060200260200182016040528015610fd4578160200160208202803683370190505b5081526000602082018190526040820181905260609091015292915050565b60408051610120810182526000848152600760208181528483206005810154855260068101548286015280546001600160a01b0316858701526003810154606086015292879052908152600190910180548451818402810184019095528085529293608085019390928301828280156110a957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161107a5790505b505050505081526020016007600085815260200190815260200160002060020180548060200260200160405190810160405280929190818152602001828054801561113157602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116111025790505b50505091835250506000848152600760208181526040808420600481015483870152600881015460ff161515918601919091529690925290526009909301546060909301929092525090565b60008181526002602052604081205460ff161580156108dd575050151590565b6000818152600760205260409020546001600160a01b031633146111f85760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107aa565b60008181526007602052604090206008015460ff16156112505760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107aa565b60008181526007602052604090206002015461129e5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908149bdd5b99609a1b60448201526064016107aa565b60008181526007602052604090206002810154600190910154146112d45760405162461bcd60e51b81526004016107aa90613b0c565b600081815260076020526040902060088101805460ff1916600117905560030154806113335760405162461bcd60e51b815260206004820152600e60248201526d1154948e881393c814105653d55560921b60448201526064016107aa565b804710156113835760405162461bcd60e51b815260206004820152601f60248201527f4552523a204e4f5420454e4f5547482046554e445320544f205041594f55540060448201526064016107aa565b600082815260076020908152604091829020600601839055815163a9a36dcd60e01b81529151600080516020613c908339815191529263a9a36dcd9260048083019391928290030181865afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114049190613a07565b600083815260076020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561147e57600080fd5b505af1158015611492573d6000803e3d6000fd5b50505060008481526007602090815260409182902080546005909101548351888152928301529181018590526001600160a01b0390911692507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae8915060600160405180910390a25050565b600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156d9190613a07565b6001600160a01b0316336001600160a01b0316146115c15760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107aa565b6001600160401b0383166000908152600360205260409020546115e384612cb1565b80158061160557506000818152600760205260409020546001600160a01b0316155b80611626575060008181526007602052604090206008015460ff1615156001145b1561166e577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5848285856040516116609493929190613b79565b60405180910390a150505050565b60008181526007602052604090206002810154600191820154909161169291613acd565b81146116dc577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5858386866040516116cd9493929190613b79565b60405180910390a15050505050565b6000828152600760205260408120600401546116f9908390610836565b905060008160ff168686600081811061171457611714613af6565b905060200201356117259190613a5e565b6000858152600760209081526040822060028101805460018181018355918552838520938104909301805460ff808816601f9096166101000a958602950219169390931790925591879052018054919250908490811061178757611787613af6565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff160361193657600084815260076020908152604080832060088101805460ff1916600117905560068101849055600381018490558054600590910154825189815293840152908201929092526001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89060600160405180910390a2600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a29190613a07565b600085815260076020819052604091829020015490516359e5b78d60e11b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b03929092169163b3cb6f1a91906024016000604051808303818588803b15801561191857600080fd5b505af115801561192c573d6000803e3d6000fd5b5050505050611cf7565b60ff821660009081526004602090815260408083205487845260079092528220600301546127109161196791613b4e565b6119719190613b65565b60008681526007602081905260409091206003810183905501549091508111801561199c5750600081115b15611cf5576000600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190613a07565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015611a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9d9190613bcb565b60008781526007602081905260408220015491925090611abd9084613acd565b905081811115611ce7576000611ad38383613acd565b905080600760008a81526020019081526020016000206003016000828254611afb9190613acd565b9091555060009050611b0c84612d8d565b905083811015611b4757611b208185613acd565b60008a81526007602052604081206003018054909190611b41908490613acd565b90915550505b60008981526007602090815260409182902060088101805460ff1916600117905560038101546006909101819055825163a9a36dcd60e01b815292519092600080516020613c908339815191529263a9a36dcd926004808401938290030181865afa158015611bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bde9190613a07565b60008b815260076020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b50505060008c81526007602052604090819020805460059091015491516001600160a01b0390911693507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89250611cd7918e9186909283526020830191909152604082015260600190565b60405180910390a2505050611cf2565b611cf081612d8d565b505b50505b505b50505050505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d709190613a07565b6001600160a01b0316336001600160a01b031614611da05760405162461bcd60e51b81526004016107aa90613a24565b6101f4811115611de95760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74204578636565642035252046656560601b60448201526064016107aa565b60058190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b606081806001600160401b03811115611e3f57611e3f613ae0565b604051908082528060200260200182016040528015611e68578160200160208202803683370190505b50915060005b81811015611ed95760026000868684818110611e8c57611e8c613af6565b90506020020135815260200190815260200160002060009054906101000a900460ff16838281518110611ec157611ec1613af6565b91151560209283029190910190910152600101611e6e565b505092915050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f519190613a07565b6001600160a01b0316336001600160a01b031614611f815760405162461bcd60e51b81526004016107aa90613a24565b6000805460ff19166001179055565b60018181548110611fa057600080fd5b600091825260209091200154905081565b6060816000816001600160401b03811115611fce57611fce613ae0565b60405190808252806020026020018201604052801561200157816020015b6060815260200190600190039081611fec5790505b50905060005b828110156120745761203086868381811061202457612024613af6565b90506020020135610ebe565b60405160200161204091906135f8565b60405160208183030381529060405282828151811061206157612061613af6565b6020908102919091010152600101612007565b50949350505050565b606082806001600160401b0381111561209857612098613ae0565b6040519080825280602002602001820160405280156120c1578160200160208202803683370190505b50915060005b8181101561211d576120f18686838181106120e4576120e4613af6565b9050602002013585610836565b83828151811061210357612103613af6565b60ff909216602092830291909101909101526001016120c7565b50509392505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121969190613a07565b6001600160a01b0316336001600160a01b0316146121c65760405162461bcd60e51b81526004016107aa90613a24565b6121d1823383612f93565b5050565b60608080808085806001600160401b038111156121f4576121f4613ae0565b60405190808252806020026020018201604052801561221d578160200160208202803683370190505b509550806001600160401b0381111561223857612238613ae0565b604051908082528060200260200182016040528015612261578160200160208202803683370190505b509450806001600160401b0381111561227c5761227c613ae0565b6040519080825280602002602001820160405280156122a5578160200160208202803683370190505b509350806001600160401b038111156122c0576122c0613ae0565b6040519080825280602002602001820160405280156122e9578160200160208202803683370190505b509250806001600160401b0381111561230457612304613ae0565b60405190808252806020026020018201604052801561232d578160200160208202803683370190505b50915060005b818110156125c557600760008a8a8481811061235157612351613af6565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b031687828151811061238f5761238f613af6565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600760008b8b858181106123c7576123c7613af6565b9050602002013581526020019081526020016000206001018054905090508060000361247657600087838151811061240157612401613af6565b602002602001018181525050600086838151811061242157612421613af6565b602002602001018181525050600085838151811061244157612441613af6565b602002602001018181525050600084838151811061246157612461613af6565b911515602092830291909101909101526125bc565b600760008b8b8581811061248c5761248c613af6565b905060200201358152602001908152602001600020600501548783815181106124b7576124b7613af6565b602002602001018181525050600760008b8b858181106124d9576124d9613af6565b9050602002013581526020019081526020016000206006015486838151811061250457612504613af6565b602002602001018181525050600760008b8b8581811061252657612526613af6565b9050602002013581526020019081526020016000206009015485838151811061255157612551613af6565b602002602001018181525050600760008b8b8581811061257357612573613af6565b90506020020135815260200190815260200160002060080160009054906101000a900460ff168483815181106125ab576125ab613af6565b911515602092830291909101909101525b50600101612333565b50509295509295909350565b826001600160a01b038116331461269b57604051636d6d50a160e11b8152336004820152600080516020613c908339815191529063dadaa14290602401602060405180830381865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f9190613be4565b61269b5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107aa565b600080516020613c908339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270b9190613be4565b1561274b5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107aa565b60005460ff16156127875760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107aa565b6127928484846130bd565b50505050565b6000600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280a9190613a07565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108319190613bcb565b61287760026007613a88565b612882906001613aa1565b81565b600080516020613c908339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f59190613a07565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e59085906044016000604051808303818588803b15801561294357600080fd5b505af1158015611cf5573d6000803e3d6000fd5b600080516020613c908339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c79190613a07565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f000000000000000000000000000000000000000000000000000000000000000d6044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612a3957600080fd5b505af1158015612a4d573d6000803e3d6000fd5b505050505050565b6000600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac79190613a07565b6001600160a01b03166397cca7af612add612798565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015612b22573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b479190613c06565b6001600160401b03811660009081526003602052604090205490915015612ba35760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107aa565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b031981529151600080516020613c908339815191529263ff9b3acf9260048083019391928290030181865afa158015612c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2e9190613a07565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d458460405161166091815260200190565b600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d219190613a07565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d5b57600080fd5b505af1158015612d6f573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b60008115612f8e57600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e059190613a07565b60065460405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b0391821660248201526044810185905291169063ae2f5d9390606401600060405180830381600087803b158015612e7857600080fd5b505af1158015612e8c573d6000803e3d6000fd5b50505050600660009054906101000a90046001600160a01b03166001600160a01b0316631e83409a600080516020613c908339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f249190613a07565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015612f6a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190613bcb565b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612fef9190613c23565b6000604051808303816000865af19150503d806000811461302c576040519150601f19603f3d011682016040523d82523d6000602084013e613031565b606091505b509150915081801561305b57508051158061305b57508080602001905181019061305b9190613be4565b610db25760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107aa565b60006130c7612798565b90506000808080806130db87890189613c3f565b94509450945094509450853410156131275760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107aa565b6131308561117d565b15156001146131735760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b60448201526064016107aa565b600085815260076020526040812060040154613190908290610836565b90508060ff168460ff16106131e75760405162461bcd60e51b815260206004820152601860248201527f4552523a20494e56414c4944204649525354204755455353000000000000000060448201526064016107aa565b60006131f38834613acd565b90506000811161323a5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b60448201526064016107aa565b60006127106005548361324d9190613b4e565b6132579190613b65565b905061326481868e612885565b600088815260076020526040902080546001600160a01b0319166001600160a01b038e161781556004810188905560088101805460ff19169055426009909101556132af8183613acd565b60008981526007602081815260408320918201939093556001808201805491820181558352838320938104909301805460ff808c16601f9096166101000a9586029502191693909317909255899052600381018390556005018290556133158c8961337c565b61331f8c83612957565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c78960405161335a91815260200190565b60405180910390a261336e88600186612a55565b505050505050505050505050565b604051639a4918c160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000d6024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b15801561340c57600080fd5b505af1158015613420573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000806040838503121561348357600080fd5b50508035926020909101359150565b6000602082840312156134a457600080fd5b5035919050565b803560ff81168114612f8e57600080fd5b600080604083850312156134cf57600080fd5b6134d8836134ab565b946020939093013593505050565b600081518084526020840193506020830160005b828110156135185781518652602095860195909101906001016134fa565b5093949350505050565b60208152600061353560208301846134e6565b9392505050565b60006020828403121561354e57600080fd5b613535826134ab565b60008060006060848603121561356c57600080fd5b8335925061357c602085016134ab565b929592945050506040919091013590565b6001600160a01b03811681146135a257600080fd5b50565b600080604083850312156135b857600080fd5b82356134d88161358d565b600081518084526020840193506020830160005b8281101561351857815160ff168652602095860195909101906001016135d7565b6020815281516020820152602082015160408201526000604083015161362960608401826001600160a01b03169052565b5060608301516080830152608083015161012060a084015261364f6101408401826135c3565b905060a0840151601f198483030160c085015261366c82826135c3565b91505060c084015160e084015260e084015161368d61010085018215159052565b506101008401516101208401528091505092915050565b6001600160401b03811681146135a257600080fd5b60008083601f8401126136cb57600080fd5b5081356001600160401b038111156136e257600080fd5b6020830191508360208260051b85010111156136fd57600080fd5b9250929050565b60008060006040848603121561371957600080fd5b8335613724816136a4565b925060208401356001600160401b0381111561373f57600080fd5b61374b868287016136b9565b9497909650939450505050565b6000806020838503121561376b57600080fd5b82356001600160401b0381111561378157600080fd5b61378d858286016136b9565b90969095509350505050565b600081518084526020840193506020830160005b8281101561351857815115158652602095860195909101906001016137ad565b6020815260006135356020830184613799565b60005b838110156137fb5781810151838201526020016137e3565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561387857603f19878603018452815180518087526138558160208901602085016137e0565b601f01601f1916959095016020908101955093840193919091019060010161382c565b50929695505050505050565b60008060006040848603121561389957600080fd5b83356001600160401b038111156138af57600080fd5b6138bb868287016136b9565b909790965060209590950135949350505050565b60208152600061353560208301846135c3565b60a08082528651908201819052600090602088019060c0840190835b818110156139255783516001600160a01b03168352602093840193909201916001016138fe565b5050838103602085015261393981896134e6565b915050828103604084015261394e81876134e6565b9050828103606084015261396281866134e6565b905082810360808401526139768185613799565b98975050505050505050565b60008060006040848603121561399757600080fd5b83356139a28161358d565b925060208401356001600160401b038111156139bd57600080fd5b8401601f810186136139ce57600080fd5b80356001600160401b038111156139e457600080fd5b8660208284010111156139f657600080fd5b939660209190910195509293505050565b600060208284031215613a1957600080fd5b81516135358161358d565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082613a6d57613a6d613a48565b500690565b634e487b7160e01b600052601160045260246000fd5b60ff82811682821603908111156108dd576108dd613a72565b60ff81811683821601908111156108dd576108dd613a72565b808201808211156108dd576108dd613a72565b818103818111156108dd576108dd613a72565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60208082526022908201527f4552523a204d555354205245534f4c5645204c4153542047554553532046495260408201526114d560f21b606082015260800190565b80820281158282048414176108dd576108dd613a72565b600082613b7457613b74613a48565b500490565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b03831115613bb057600080fd5b8260051b808560808501379190910160800195945050505050565b600060208284031215613bdd57600080fd5b5051919050565b600060208284031215613bf657600080fd5b8151801515811461353557600080fd5b600060208284031215613c1857600080fd5b8151613535816136a4565b60008251613c358184602087016137e0565b9190910192915050565b600080600080600060a08688031215613c5757600080fd5b8535945060208601359350613c6e604087016134ab565b92506060860135613c7e8161358d565b94979396509194608001359291505056fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212207f4e812b814813a999f7c15e75443867a624ac0637fdb57bc849e3920e30fb2564736f6c634300081c0033

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

000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

-----Decoded View---------------
Arg [0] : GAME_ID_ (uint256): 13
Arg [1] : history_ (address): 0xFa296156dAc165Af92F7Fdb012B61a874670e1AA

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


Deployed Bytecode Sourcemap

14011:17178:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6796:70;;;;;;;;;;;;;:::i;:::-;;11573:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;287:32:1;;;269:51;;257:2;242:18;11573:91:0;;;;;;;;27295:694;;;;;;;;;;-1:-1:-1;27295:694:0;;;;;:::i;:::-;;:::i;:::-;;;854:4:1;842:17;;;824:36;;812:2;797:18;27295:694:0;682:184:1;15961:40:0;;;;;;;;;;-1:-1:-1;15961:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15961:40:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1553:32:1;;;1535:51;;1617:2;1602:18;;1595:34;;;;1645:18;;;1638:34;;;;1703:2;1688:18;;1681:34;;;;1746:3;1731:19;;1724:35;1573:3;1775:19;;1768:35;1847:14;1840:22;1834:3;1819:19;;1812:51;1894:3;1879:19;;1872:35;1522:3;1507:19;15961:40:0;1198:715:1;17448:331:0;;;;;;;;;;-1:-1:-1;17448:331:0;;;;;:::i;:::-;;:::i;14378:32::-;;;;;;;;;;;;;;;;;;;2526:25:1;;;2514:2;2499:18;14378:32:0;2380:177:1;12138:409:0;;;;;;;;;;-1:-1:-1;12138:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14310:46::-;;;;;;;;;;-1:-1:-1;14310:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;19877:1655;;;;;;:::i;:::-;;:::i;6874:155::-;;;;;;;;;;-1:-1:-1;6874:155:0;;;;;:::i;:::-;;:::i;28353:1106::-;;;;;;;;;;-1:-1:-1;28353:1106:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1014:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1014:107:0;;11672:135;;;;;;;;;;-1:-1:-1;11672:135:0;;;;;:::i;:::-;;:::i;:::-;;;6345:14:1;;6338:22;6320:41;;6308:2;6293:18;11672:135:0;6180:187:1;21540:1385:0;;;;;;;;;;-1:-1:-1;21540:1385:0;;;;;:::i;:::-;;:::i;5945:26::-;;;;;;;;;;-1:-1:-1;5945:26:0;;;;;;;;22999:3913;;;;;;;;;;-1:-1:-1;22999:3913:0;;;;;:::i;:::-;;:::i;17167:273::-;;;;;;;;;;-1:-1:-1;17167:273:0;;;;;:::i;:::-;;:::i;11815:315::-;;;;;;;;;;-1:-1:-1;11815:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6720:68::-;;;;;;;;;;;;;:::i;6018:28::-;;;;;;;;;;-1:-1:-1;6018:28:0;;;;;:::i;:::-;;:::i;29467:370::-;;;;;;;;;;-1:-1:-1;29467:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27997:348::-;;;;;;;;;;-1:-1:-1;27997:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5850:40::-;;;;;;;;;;;;;;;7037:143;;;;;;;;;;-1:-1:-1;7037:143:0;;;;;:::i;:::-;;:::i;14112:34::-;;;;;;;;;;;;14145:1;14112:34;;29845:1304;;;;;;;;;;-1:-1:-1;29845:1304:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;7752:260::-;;;;;;:::i;:::-;;:::i;12555:102::-;;;;;;;;;;-1:-1:-1;12631:11:0;:18;12555:102;;15894:22;;;;;;;;;;-1:-1:-1;15894:22:0;;;;-1:-1:-1;;;;;15894:22:0;;;14153:34;;;;;;;;;;;;14186:1;14153:34;;7534:105;;;;;;;;;;;;;:::i;5785:32::-;;;;;;;;;;;;;;;14194:60;;;;;;;;;;;;;:::i;6796:70::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;;;;;;;;;6853:5:::1;6844:14:::0;;-1:-1:-1;;6844:14:0::1;::::0;;6796:70::o;11573:91::-;11614:7;-1:-1:-1;;;;;;;;;;;;;;;;11641:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11634:22;;11573:91;:::o;27295:694::-;27379:5;27403:11;27418:1;27403:16;27399:309;;27563:1;27553:7;:11;:32;;;;-1:-1:-1;27568:12:0;27578:2;27568:7;:12;:::i;:::-;:17;27553:32;27549:88;;;-1:-1:-1;27619:1:0;27606:15;;27549:88;27676:11;27686:1;27676:7;:11;:::i;:::-;27658:31;;27664:1;27658:31;:::i;:::-;27651:38;;;;27399:309;27814:38;;;;;;;14564:19:1;;;14599:12;;;14592:28;;;27814:38:0;;;;;;;;;14636:12:1;;;;27814:38:0;;;27804:49;;;;;14145:1;14231:19;14145:1;14186;14231:19;:::i;:::-;:23;;14253:1;14231:23;:::i;:::-;27948:20;;;;:5;:20;:::i;:::-;27947:33;;;;:::i;:::-;27934:47;;;27295:694;;;;;:::o;17448:331::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;14145:1:::1;17549:15;::::0;::::1;;::::0;::::1;::::0;:34:::1;;-1:-1:-1::0;14186:1:0::1;17568:15;::::0;::::1;;;17549:34;17527:95;;;::::0;-1:-1:-1;;;17527:95:0;;15144:2:1;17527:95:0::1;::::0;::::1;15126:21:1::0;15183:2;15163:18;;;15156:30;-1:-1:-1;;;15202:18:1;;;15195:41;15253:18;;17527:95:0::1;14942:335:1::0;17527:95:0::1;14492:6;17655;:19;;:39;;;;;17688:6;17678;:16;;17655:39;17633:103;;;::::0;-1:-1:-1;;;17633:103:0;;15484:2:1;17633:103:0::1;::::0;::::1;15466:21:1::0;15523:2;15503:18;;;15496:30;-1:-1:-1;;;15542:18:1;;;15535:44;15596:18;;17633:103:0::1;15282:338:1::0;17633:103:0::1;17747:15;::::0;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:24;17448:331::o;12138:409::-;12257:11;:18;12218:16;;12251:24;;12247:81;;;12298:11;:18;;-1:-1:-1;12247:81:0;12338:20;12375:11;12381:5;12375:3;:11;:::i;:::-;-1:-1:-1;;;;;12361:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12361:26:0;-1:-1:-1;12338:49:0;-1:-1:-1;12412:5:0;12398:121;12423:3;12419:1;:7;12398:121;;;12461:11;12473:1;12461:14;;;;;;;;:::i;:::-;;;;;;;;;12444:3;12452:5;12448:1;:9;;;;:::i;:::-;12444:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;12502:3;;12398:121;;;-1:-1:-1;12536:3:0;12138:409;-1:-1:-1;;;12138:409:0:o;19877:1655::-;20046:11;:9;:11::i;:::-;20033:9;:24;20011:97;;;;-1:-1:-1;;;20011:97:0;;16224:2:1;20011:97:0;;;16206:21:1;16263:2;16243:18;;;16236:30;16302:25;16282:18;;;16275:53;16345:18;;20011:97:0;16022:347:1;20011:97:0;20141:13;;;;:5;:13;;;;;:18;-1:-1:-1;;;;;20141:18:0;20163:10;20141:32;20119:100;;;;-1:-1:-1;;;20119:100:0;;16576:2:1;20119:100:0;;;16558:21:1;16615:2;16595:18;;;16588:30;-1:-1:-1;;;16634:18:1;;;16627:48;16692:18;;20119:100:0;16374:342:1;20119:100:0;20252:13;;;;:5;:13;;;;;:22;;;;;:31;20230:100;;;;-1:-1:-1;;;20230:100:0;;16923:2:1;20230:100:0;;;16905:21:1;16962:2;16942:18;;;16935:30;-1:-1:-1;;;16981:18:1;;;16974:49;17040:18;;20230:100:0;16721:343:1;20230:100:0;20399:1;20363:13;;;:5;:13;;;;;:26;;:33;20341:112;;;;-1:-1:-1;;;20341:112:0;;17271:2:1;20341:112:0;;;17253:21:1;17310:2;17290:18;;;17283:30;17349:27;17329:18;;;17322:55;17394:18;;20341:112:0;17069:349:1;20341:112:0;20521:13;;;;:5;:13;;;;;:26;;;:33;20486:24;;;;:31;:68;20464:152;;;;-1:-1:-1;;;20464:152:0;;;;;;;:::i;:::-;20673:13;;;;:5;:13;;;;;:26;;;:33;20708:25;;;;;20657:77;;20673:33;20657:15;:77::i;:::-;20649:85;;:5;:85;;;20627:153;;;;-1:-1:-1;;;20627:153:0;;18028:2:1;20627:153:0;;;18010:21:1;18067:2;18047:18;;;18040:30;-1:-1:-1;;;18086:18:1;;;18079:48;18144:18;;20627:153:0;17826:342:1;20627:153:0;20816:13;;;;:5;:13;;;;;;;:24;;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20989:13;;;:27;;;21121:11;;20989:27;;20816:13;14492:6;;21106:26;;20989:27;21106:26;:::i;:::-;21105:40;;;;:::i;:::-;21077:68;;21196:54;21208:17;21235:1;21239:10;21196:11;:54::i;:::-;21328:32;21343:17;21328:12;:32;:::i;:::-;21297:13;;;;:5;:13;;;;;;;;:28;:63;21398:38;21411:10;21423:12;21398;:38::i;:::-;21483:41;21498:6;21506:1;21509:14;21483;:41::i;:::-;20000:1532;;19877:1655;;;:::o;6874:155::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;6954:6:::1;6973:2;-1:-1:-1::0;;;;;6965:16:0::1;6989:6;6965:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6953:47;;;7019:1;7011:10;;;::::0;::::1;;6942:87;6874:155:::0;;:::o;28353:1106::-;28422:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28422:25:0;28470:14;;;;:5;:14;;;;;:25;;:32;:37;;28466:438;;28531:361;;;;;;;;28587:1;28531:361;;;;28615:1;28531:361;;;;28649:1;-1:-1:-1;;;;;28531:361:0;;;;;28685:1;28531:361;;;;28729:1;-1:-1:-1;;;;;28717:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28717:14:0;-1:-1:-1;28531:361:0;;;;28776:1;28764:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28764:14:0;-1:-1:-1;28531:361:0;;28810:1;28531:361;;;;;;;;;;;;;;;;;28524:368;28353:1106;-1:-1:-1;;28353:1106:0:o;28466:438::-;28923:528;;;;;;;;-1:-1:-1;28975:14:0;;;:5;:14;;;;;;;:31;;;;28923:528;;29055:26;;;;28923:528;;;;29102:19;;-1:-1:-1;;;;;29102:19:0;28923:528;;;;29151:28;;;;28923:528;;;;29206:14;;;;;;;29102:19;29206:25;;;28923:528;;;;;;;;;;;;;;;;;;;;;;;;;;;29206:25;28923:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29260:5;:14;29266:7;29260:14;;;;;;;;;;;:27;;28923:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28923:528:0;;;-1:-1:-1;;29315:14:0;;;;:5;28923:528;29315:14;;;;;;;:26;;;;28923:528;;;;29366:23;;;;;;28923:528;;;;;;;;;29415:14;;;;;;:24;;;;;28923:528;;;;;;;;-1:-1:-1;28916:535:0;28353:1106::o;11672:135::-;11732:4;11756:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;11789:10:0;;;11672:135::o;21540:1385::-;21650:13;;;;:5;:13;;;;;:18;-1:-1:-1;;;;;21650:18:0;21672:10;21650:32;21628:100;;;;-1:-1:-1;;;21628:100:0;;16576:2:1;21628:100:0;;;16558:21:1;16615:2;16595:18;;;16588:30;-1:-1:-1;;;16634:18:1;;;16627:48;16692:18;;21628:100:0;16374:342:1;21628:100:0;21799:13;;;;:5;:13;;;;;:22;;;;;:31;21777:100;;;;-1:-1:-1;;;21777:100:0;;16923:2:1;21777:100:0;;;16905:21:1;16962:2;16942:18;;;16935:30;-1:-1:-1;;;16981:18:1;;;16974:49;17040:18;;21777:100:0;16721:343:1;21777:100:0;21946:1;21910:13;;;:5;:13;;;;;:26;;:33;21888:100;;;;-1:-1:-1;;;21888:100:0;;18883:2:1;21888:100:0;;;18865:21:1;18922:2;18902:18;;;18895:30;-1:-1:-1;;;18941:18:1;;;18934:43;18994:18;;21888:100:0;18681:337:1;21888:100:0;22056:13;;;;:5;:13;;;;;:26;;;:33;22021:24;;;;:31;:68;21999:152;;;;-1:-1:-1;;;21999:152:0;;;;;;;:::i;:::-;22194:13;;;;:5;:13;;;;;:22;;;:29;;-1:-1:-1;;22194:29:0;22219:4;22194:29;;;22313:27;;;22373:10;22351:74;;;;-1:-1:-1;;;22351:74:0;;19225:2:1;22351:74:0;;;19207:21:1;19264:2;19244:18;;;19237:30;-1:-1:-1;;;19283:18:1;;;19276:44;19337:18;;22351:74:0;19023:338:1;22351:74:0;22485:6;22460:21;:31;;22438:112;;;;-1:-1:-1;;;22438:112:0;;19568:2:1;22438:112:0;;;19550:21:1;19607:2;19587:18;;;19580:30;19646:33;19626:18;;;19619:61;19697:18;;22438:112:0;19366:355:1;22438:112:0;22587:13;;;;:5;:13;;;;;;;;;:25;;:34;;;22680:22;;-1:-1:-1;;;22680:22:0;;;;-1:-1:-1;;;;;;;;;;;1078:42:0;22680:20;;:22;;;;;22587:13;;22680:22;;;;;1078:42;22680:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22762:13;;;;:5;:13;;;;;;;:18;22666:125;;-1:-1:-1;;;22666:125:0;;22740:7;22666:125;;;19900:25:1;-1:-1:-1;;;;;22762:18:0;;;19941::1;;;19934:60;22666:44:0;;;;;22718:6;;19873:18:1;;22666:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22850:13:0;;;;:5;:13;;;;;;;;;:18;;22878:30;;;;;22840:77;;20207:25:1;;;20248:18;;;20241:34;20291:18;;;20284:34;;;-1:-1:-1;;;;;22850:18:0;;;;-1:-1:-1;22840:77:0;;-1:-1:-1;20195:2:1;20180:18;22840:77:0;;;;;;;21582:1343;21540:1385;:::o;22999:3913::-;-1:-1:-1;;;;;;;;;;;;;;;;1492:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1478:27:0;:10;-1:-1:-1;;;;;1478:27:0;;1456:94;;;;-1:-1:-1;;;1456:94:0;;20531:2:1;1456:94:0;;;20513:21:1;20570:2;20550:18;;;20543:30;-1:-1:-1;;;20589:18:1;;;20582:47;20646:18;;1456:94:0;20329:341:1;1456:94:0;-1:-1:-1;;;;;11533:24:0;;23180:14:::1;11533:24:::0;;;:13;:24;;;;;;23272:25:::1;11533:24:::0;23272:14:::1;:25::i;:::-;23355:11:::0;;;:47:::1;;-1:-1:-1::0;23400:1:0::1;23370:13:::0;;;:5:::1;:13;::::0;;;;:18;-1:-1:-1;;;;;23370:18:0::1;:32:::0;23355:47:::1;:81;;;-1:-1:-1::0;23406:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;23355:81;23351:190;;;23458:50;23477:9;23488:6;23496:11;;23458:50;;;;;;;;;:::i;:::-;;;;;;;;23523:7;6942:87;6874:155:::0;;:::o;23351:190::-:1;23580:15;23598:13:::0;;;:5:::1;:13;::::0;;;;:26:::1;::::0;::::1;:33:::0;23691:1:::1;23657:24:::0;;::::1;:31:::0;23598:33;;23657:35:::1;::::0;::::1;:::i;:::-;23646:7;:46;23642:155;;23714:50;23733:9;23744:6;23752:11;;23714:50;;;;;;;;;:::i;:::-;;;;;;;;23779:7;;6942:87;6874:155:::0;;:::o;23642:::-:1;23809:14;23851:13:::0;;;:5:::1;:13;::::0;;;;:25:::1;;::::0;23826:51:::1;::::0;23842:7;;23826:15:::1;:51::i;:::-;23809:68;;23935:14;23976:8;23959:25;;:11;;23971:1;23959:14;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;24026:13;::::0;;;:5:::1;:13;::::0;;;;;;:26:::1;::::0;::::1;:41:::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;::::1;;;::::0;;;::::1;::::0;;;24157:13;;;;:24:::1;:33:::0;;23935:51;;-1:-1:-1;24157:24:0;24182:7;;24157:33;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;24145:45;;:8;:45;;::::0;24141:2764:::1;;24249:13;::::0;;;:5:::1;:13;::::0;;;;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;24249:29:0::1;24274:4;24249:29;::::0;;24293:25:::1;::::0;::::1;:29:::0;;;24337:27:::1;::::0;::::1;:31:::0;;;24438:18;;-1:-1:-1;24466:30:0;;::::1;::::0;24428:72;;20207:25:1;;;20248:18;;;20241:34;20291:18;;;20284:34;;;;-1:-1:-1;;;;;24438:18:0;;::::1;::::0;24428:72:::1;::::0;20195:2:1;20180:18;24428:72:0::1;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;24554:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24590:13;::::0;;;:5:::1;:13;::::0;;;;;;;;:28:::1;::::0;24547:82;;-1:-1:-1;;;24547:82:0;;24621:7:::1;24547:82;::::0;::::1;2526:25:1::0;-1:-1:-1;;;;;24547:35:0;;;::::1;::::0;::::1;::::0;24590:28;2499:18:1;;24547:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;24141:2764;;;24772:20;::::0;::::1;24718:19;24772:20:::0;;;:10:::1;:20;::::0;;;;;;;;24742:13;;;:5:::1;:13:::0;;;;;:27:::1;;::::0;14492:6:::1;::::0;24742:50:::1;::::0;::::1;:::i;:::-;24740:66;;;;:::i;:::-;24861:13;::::0;;;:5:::1;:13;::::0;;;;;;;:27:::1;::::0;::::1;:41:::0;;;24937:28:::1;::::0;24718:88;;-1:-1:-1;24923:42:0;::::1;:61:::0;::::1;;;;24983:1;24969:11;:15;24923:61;24919:1975;;;25048:17;-1:-1:-1::0;;;;;;;;;;;;;;;;25084:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25068:61;::::0;-1:-1:-1;;;25068:61:0;;25121:7:::1;25068:61;::::0;::::1;2526:25:1::0;-1:-1:-1;;;;;25068:52:0;;;::::1;::::0;::::1;::::0;2499:18:1;;25068:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25214:12;25243:13:::0;;;:5:::1;:13;::::0;;;;;;:28:::1;::::0;25048:81;;-1:-1:-1;25214:12:0;25229:42:::1;::::0;:11;:42:::1;:::i;:::-;25214:57;;25389:9;25382:4;:16;25378:1501;;;25466:14;25483:16;25490:9:::0;25483:4;:16:::1;:::i;:::-;25466:33;;25603:6;25572:5;:13;25578:6;25572:13;;;;;;;;;;;:27;;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;25680:17:0::1;::::0;-1:-1:-1;25700:31:0::1;25721:9:::0;25700:20:::1;:31::i;:::-;25680:51;;25772:9;25760;:21;25756:236;;;25946:21;25958:9:::0;25946;:21:::1;:::i;:::-;25914:13;::::0;;;:5:::1;:13;::::0;;;;:27:::1;;:54:::0;;:27;;:13;:54:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;25756:236:0::1;26077:13;::::0;;;:5:::1;:13;::::0;;;;;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;26077:29:0::1;26102:4;26077:29;::::0;;26220:27:::1;::::0;::::1;::::0;26308:25:::1;::::0;;::::1;:34:::0;;;26425:22;;-1:-1:-1;;;26425:22:0;;;;26220:27;;-1:-1:-1;;;;;;;;;;;1078:42:0;26425:20:::1;::::0;:22:::1;::::0;;::::1;::::0;;;;;;1078:42;26425:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26531:13;::::0;;;:5:::1;:13;::::0;;;;;;:18;26411:161;;-1:-1:-1;;;26411:161:0;;26497:7:::1;26411:161;::::0;::::1;19900:25:1::0;-1:-1:-1;;;;;26531:18:0;;::::1;19941::1::0;;;19934:60;26411:44:0;::::1;::::0;::::1;::::0;26463:6;;19873:18:1;;26411:161:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;26667:13:0::1;::::0;;;:5:::1;:13;::::0;;;;;;:18;;26695:30:::1;::::0;;::::1;::::0;26657:77;;-1:-1:-1;;;;;26667:18:0;;::::1;::::0;-1:-1:-1;26657:77:0::1;::::0;-1:-1:-1;26657:77:0::1;::::0;26673:6;;26727;;20207:25:1;;;20263:2;20248:18;;20241:34;;;;20306:2;20291:18;;20284:34;20195:2;20180:18;;20005:319;26657:77:0::1;;;;;;;;25400:1356;;;25378:1501;;;26833:26;26854:4;26833:20;:26::i;:::-;;25378:1501;24986:1908;;24919:1975;24649:2256;24141:2764;23128:3784;;;;22999:3913:::0;;;:::o;17167:273::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;17286:3:::1;17268:14;:21;;17246:91;;;::::0;-1:-1:-1;;;17246:91:0;;22014:2:1;17246:91:0::1;::::0;::::1;21996:21:1::0;22053:2;22033:18;;;22026:30;-1:-1:-1;;;22072:18:1;;;22065:50;22132:18;;17246:91:0::1;21812:344:1::0;17246:91:0::1;17358:11;:28:::0;;;17402:30:::1;::::0;2526:25:1;;;17402:30:0::1;::::0;2514:2:1;2499:18;17402:30:0::1;;;;;;;17167:273:::0;:::o;11815:315::-;11897:20;11941:7;;-1:-1:-1;;;;;11975:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11975:15:0;;11966:24;;12006:6;12001:122;12022:3;12018:1;:7;12001:122;;;12055:12;:24;12068:7;;12076:1;12068:10;;;;;;;:::i;:::-;;;;;;;12055:24;;;;;;;;;;;;;;;;;;;;;12043:6;12050:1;12043:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;12106:3;;12001:122;;;;11919:211;11815:315;;;;:::o;6720:68::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;6767:6:::1;:13:::0;;-1:-1:-1;;6767:13:0::1;6776:4;6767:13;::::0;;6720:68::o;6018:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6018:28:0;:::o;29467:370::-;29553:14;29591:7;29580:8;29591:7;-1:-1:-1;;;;;29642:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29616:42;;29674:6;29669:135;29690:3;29686:1;:7;29669:135;;;29736:23;29748:7;;29756:1;29748:10;;;;;;;:::i;:::-;;;;;;;29736:11;:23::i;:::-;29725:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;29711:8;29720:1;29711:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;29787:3;;29669:135;;;-1:-1:-1;29821:8:0;29467:370;-1:-1:-1;;;;29467:370:0:o;27997:348::-;28098:19;28141:8;;-1:-1:-1;;;;;28174:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28174:16:0;;28167:23;;28206:6;28201:137;28222:3;28218:1;:7;28201:137;;;28253:41;28269:8;;28278:1;28269:11;;;;;;;:::i;:::-;;;;;;;28282;28253:15;:41::i;:::-;28243:4;28248:1;28243:7;;;;;;;;:::i;:::-;:51;;;;:7;;;;;;;;;;;:51;28321:3;;28201:137;;;;28119:226;27997:348;;;;;:::o;7037:143::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;7118:54:::1;7146:5;7153:10;7165:6;7118:27;:54::i;:::-;7037:143:::0;;:::o;29845:1304::-;29945:24;;;;;30151:7;;-1:-1:-1;;;;;30186:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30186:18:0;;30176:28;;30244:3;-1:-1:-1;;;;;30230:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30230:18:0;;30215:33;;30288:3;-1:-1:-1;;;;;30274:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30274:18:0;;30259:33;;30330:3;-1:-1:-1;;;;;30316:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30316:18:0;;30303:31;;30368:3;-1:-1:-1;;;;;30357:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30357:15:0;;30345:27;;30390:6;30385:757;30406:3;30402:1;:7;30385:757;;;30440:5;:17;30446:7;;30454:1;30446:10;;;;;;;:::i;:::-;;;;;;;30440:17;;;;;;;;;;;:22;;;;;;;;;;-1:-1:-1;;;;;30440:22:0;30427:7;30435:1;30427:10;;;;;;;;:::i;:::-;;;;;;:35;-1:-1:-1;;;;;30427:35:0;;;-1:-1:-1;;;;;30427:35:0;;;;;30477:14;30494:5;:17;30500:7;;30508:1;30500:10;;;;;;;:::i;:::-;;;;;;;30494:17;;;;;;;;;;;:28;;:35;;;;30477:52;;30548:6;30558:1;30548:11;30544:555;;30598:1;30580:12;30593:1;30580:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;30636:1;30618:12;30631:1;30618:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;30672:1;30656:10;30667:1;30656:13;;;;;;;;:::i;:::-;;;;;;:17;;;;;30707:5;30692:9;30702:1;30692:12;;;;;;;;:::i;:::-;:20;;;:12;;;;;;;;;;;:20;30544:555;;;30771:5;:17;30777:7;;30785:1;30777:10;;;;;;;:::i;:::-;;;;;;;30771:17;;;;;;;;;;;:34;;;30753:12;30766:1;30753:15;;;;;;;;:::i;:::-;;;;;;:52;;;;;30868:5;:17;30874:7;;30882:1;30874:10;;;;;;;:::i;:::-;;;;;;;30868:17;;;;;;;;;;;:29;;;30850:12;30863:1;30850:15;;;;;;;;:::i;:::-;;;;;;:47;;;;;30948:5;:17;30954:7;;30962:1;30954:10;;;;;;;:::i;:::-;;;;;;;30948:17;;;;;;;;;;;:27;;;30932:10;30943:1;30932:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;31034:5;:17;31040:7;;31048:1;31040:10;;;;;;;:::i;:::-;;;;;;;31034:17;;;;;;;;;;;:26;;;;;;;;;;;;31019:9;31029:1;31019:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;30544:555;-1:-1:-1;31125:3:0;;30385:757;;;;30129:1020;29845:1304;;;;;;;;:::o;7752:260::-;7848:6;-1:-1:-1;;;;;1633:20:0;;1643:10;1633:20;1629:182;;1696:36;;-1:-1:-1;;;1696:36:0;;1721:10;1696:36;;;269:51:1;-1:-1:-1;;;;;;;;;;;1078:42:0;1696:24;;242:18:1;;1696:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1670:129;;;;-1:-1:-1;;;1670:129:0;;22645:2:1;1670:129:0;;;22627:21:1;22684:2;22664:18;;;22657:30;22723:33;22703:18;;;22696:61;22774:18;;1670:129:0;22443:355:1;1670:129:0;-1:-1:-1;;;;;;;;;;;;;;;;1892:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;1870:91;;;::::0;-1:-1:-1;;;1870:91:0;;23005:2:1;1870:91:0::1;::::0;::::1;22987:21:1::0;23044:2;23024:18;;;23017:30;-1:-1:-1;;;23063:18:1;;;23056:46;23119:18;;1870:91:0::1;22803:340:1::0;1870:91:0::1;7902:6:::2;::::0;::::2;;7901:7;7879:63;;;::::0;-1:-1:-1;;;7879:63:0;;23350:2:1;7879:63:0::2;::::0;::::2;23332:21:1::0;23389:1;23369:18;;;23362:29;-1:-1:-1;;;23407:18:1;;;23400:36;23453:18;;7879:63:0::2;23148:329:1::0;7879:63:0::2;7977:27;7987:6;7995:8;;7977:9;:27::i;:::-;7752:260:::0;;;;:::o;7534:105::-;7576:7;-1:-1:-1;;;;;;;;;;;;;;;;7608:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7603:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14194:60::-;14231:19;14145:1;14186;14231:19;:::i;:::-;:23;;14253:1;14231:23;:::i;:::-;14194:60;:::o;7350:172::-;-1:-1:-1;;;;;;;;;;;;;;;;7453:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7439:75;;-1:-1:-1;;;7439:75:0;;-1:-1:-1;;;;;23674:32:1;;;7439:75:0;;;23656:51:1;23743:32;;;23723:18;;;23716:60;7439:44:0;;;;;;;7491:9;;23629:18:1;;7439:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7188:154;-1:-1:-1;;;;;;;;;;;;;;;;7277:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7260:74;;-1:-1:-1;;;7260:74:0;;-1:-1:-1;;;;;24007:32:1;;;7260:74:0;;;23989:51:1;24056:18;;;24049:34;;;7326:7:0;24099:18:1;;;24092:34;7260:51:0;;;;;;;23962:18:1;;7260:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7188:154;;:::o;10417:778::-;10570:16;-1:-1:-1;;;;;;;;;;;;;;;;10594:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10589:33:0;;10630:11;:9;:11::i;:::-;10589:185;;-1:-1:-1;;;;;;10589:185:0;;;;;;;;;;24307:25:1;;;24380:4;24368:17;;24348:18;;;24341:45;24280:18;;10589:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10858:24:0;;;;;;:13;:24;;;;;;10570:204;;-1:-1:-1;10858:29:0;10836:95;;;;-1:-1:-1;;;10836:95:0;;24853:2:1;10836:95:0;;;24835:21:1;24892:2;24872:18;;;24865:30;-1:-1:-1;;;24911:18:1;;;24904:46;24967:18;;10836:95:0;24651:340:1;10836:95:0;-1:-1:-1;;;;;11002:24:0;;;;;;:13;:24;;;;;;;;;:33;;;11085:15;;-1:-1:-1;;;;;;11085:15:0;;;;-1:-1:-1;;;;;;;;;;;1078:42:0;11085:13;;:15;;;;;11002:24;;11085:15;;;;;1078:42;11085:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11078:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11160:27;11180:6;11160:27;;;;2526:25:1;;2514:2;2499:18;;2380:177;11203:224:0;-1:-1:-1;;;;;;;;;;;;;;;;11309:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11302:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;11395:24:0;;;;;:13;:24;;;;;11388:31;11203:224::o;26920:367::-;26984:17;27020:10;;27016:264;;-1:-1:-1;;;;;;;;;;;;;;;;27103:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27144:7;;27096:65;;-1:-1:-1;;;27096:65:0;;27127:7;27096:65;;;25198:25:1;-1:-1:-1;;;;;27144:7:0;;;25239:18:1;;;25232:60;25308:18;;;25301:34;;;27096:30:0;;;;;25171:18:1;;27096:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27231:7;;;;;;;;;-1:-1:-1;;;;;27231:7:0;-1:-1:-1;;;;;27231:13:0;;-1:-1:-1;;;;;;;;;;;;;;;;27245:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27231:37;;-1:-1:-1;;;;;;27231:37:0;;;;;;;-1:-1:-1;;;;;287:32:1;;;27231:37:0;;;269:51:1;242:18;;27231:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27016:264::-;26920:367;;;:::o;3505:449::-;3737:45;;;-1:-1:-1;;;;;25538:32:1;;;3737:45:0;;;25520:51:1;25587:18;;;;25580:34;;;3737:45:0;;;;;;;;;;25493:18:1;;;;3737:45:0;;;;;;;-1:-1:-1;;;;;3737:45:0;-1:-1:-1;;;3737:45:0;;;3726:57;;-1:-1:-1;;;;3726:10:0;;;;:57;;3737:45;3726:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3690:93;;;;3816:7;:57;;;;-1:-1:-1;3828:11:0;;:16;;:44;;;3859:4;3848:24;;;;;;;;;;;;:::i;:::-;3794:152;;;;-1:-1:-1;;;3794:152:0;;26119:2:1;3794:152:0;;;26101:21:1;26158:2;26138:18;;;26131:30;26197:34;26177:18;;;26170:62;-1:-1:-1;;;26248:18:1;;;26241:43;26301:19;;3794:152:0;25917:409:1;17787:2082:0;17908:14;17925:11;:9;:11::i;:::-;17908:28;-1:-1:-1;17993:14:0;;;;;18149:65;;;;18160:8;18149:65;:::i;:::-;17978:236;;;;;;;;;;18290:6;18277:9;:19;;18255:84;;;;-1:-1:-1;;;18255:84:0;;27225:2:1;18255:84:0;;;27207:21:1;27264:2;27244:18;;;27237:30;-1:-1:-1;;;27283:18:1;;;27276:45;27338:18;;18255:84:0;27023:339:1;18255:84:0;18372:21;18386:6;18372:13;:21::i;:::-;:29;;18397:4;18372:29;18350:94;;;;-1:-1:-1;;;18350:94:0;;27569:2:1;18350:94:0;;;27551:21:1;27608:2;27588:18;;;27581:30;-1:-1:-1;;;27627:18:1;;;27620:45;27682:18;;18350:94:0;27367:339:1;18350:94:0;18488:14;18524:13;;;:5;:13;;;;;:25;;;18505:45;;18488:14;;18505:15;:45::i;:::-;18488:62;;18596:8;18583:21;;:10;:21;;;18561:95;;;;-1:-1:-1;;;18561:95:0;;27913:2:1;18561:95:0;;;27895:21:1;27952:2;27932:18;;;27925:30;27991:26;27971:18;;;27964:54;28035:18;;18561:95:0;27711:348:1;18561:95:0;18708:22;18733:18;18745:6;18733:9;:18;:::i;:::-;18708:43;;18801:1;18784:14;:18;18762:86;;;;-1:-1:-1;;;18762:86:0;;28266:2:1;18762:86:0;;;28248:21:1;28305:2;28285:18;;;28278:30;-1:-1:-1;;;28324:18:1;;;28317:48;28382:18;;18762:86:0;28064:342:1;18762:86:0;18909:25;14492:6;18955:11;;18938:14;:28;;;;:::i;:::-;18937:42;;;;:::i;:::-;18909:70;;19056:43;19068:17;19087:3;19092:6;19056:11;:43::i;:::-;19141:13;;;;:5;:13;;;;;:27;;-1:-1:-1;;;;;;19141:27:0;-1:-1:-1;;;;;19141:27:0;;;;;19179:25;;;:39;;;19229:22;;;:30;;-1:-1:-1;;19229:30:0;;;19296:15;19270:23;;;;:41;19353:34;19370:17;19353:14;:34;:::i;:::-;19322:13;;;;:5;:13;;;;;;;:28;;;:65;;;;19398:24;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19450:13;;;:27;;;:44;;;19505:30;;:47;;;19594:31;19610:6;19328;19594:15;:31::i;:::-;19663:36;19676:6;19684:14;19663:12;:36::i;:::-;19760:6;-1:-1:-1;;;;;19748:27:0;;19768:6;19748:27;;;;2526:25:1;;2514:2;2499:18;;2380:177;19748:27:0;;;;;;;;19820:41;19835:6;19843:1;19846:14;19820;:41::i;:::-;17865:2004;;;;;;;;;17787:2082;;;:::o;10137:272::-;10245:40;;-1:-1:-1;;;10245:40:0;;-1:-1:-1;;;;;24007:32:1;;;10245:40:0;;;23989:51:1;10269:7:0;24056:18:1;;;24049:34;24099:18;;;24092:34;;;10245:7:0;:15;;;;23962:18:1;;10245:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10339:11:0;:24;;;;;;;;;;;;-1:-1:-1;10374:20:0;;;:12;10339:24;10374:20;;;;;:27;;-1:-1:-1;;10374:27:0;;;;;;;-1:-1:-1;;;10137:272:0:o;331:346:1:-;399:6;407;460:2;448:9;439:7;435:23;431:32;428:52;;;476:1;473;466:12;428:52;-1:-1:-1;;521:23:1;;;641:2;626:18;;;613:32;;-1:-1:-1;331:346:1:o;871:226::-;930:6;983:2;971:9;962:7;958:23;954:32;951:52;;;999:1;996;989:12;951:52;-1:-1:-1;1044:23:1;;871:226;-1:-1:-1;871:226:1:o;1918:156::-;1984:20;;2044:4;2033:16;;2023:27;;2013:55;;2064:1;2061;2054:12;2079:296;2145:6;2153;2206:2;2194:9;2185:7;2181:23;2177:32;2174:52;;;2222:1;2219;2212:12;2174:52;2245:27;2262:9;2245:27;:::i;:::-;2235:37;2341:2;2326:18;;;;2313:32;;-1:-1:-1;;;2079:296:1:o;2562:420::-;2615:3;2653:5;2647:12;2680:6;2675:3;2668:19;2712:4;2707:3;2703:14;2696:21;;2751:4;2744:5;2740:16;2774:1;2784:173;2798:6;2795:1;2792:13;2784:173;;;2859:13;;2847:26;;2902:4;2893:14;;;;2930:17;;;;2820:1;2813:9;2784:173;;;-1:-1:-1;2973:3:1;;2562:420;-1:-1:-1;;;;2562:420:1:o;2987:261::-;3166:2;3155:9;3148:21;3129:4;3186:56;3238:2;3227:9;3223:18;3215:6;3186:56;:::i;:::-;3178:64;2987:261;-1:-1:-1;;;2987:261:1:o;3253:182::-;3310:6;3363:2;3351:9;3342:7;3338:23;3334:32;3331:52;;;3379:1;3376;3369:12;3331:52;3402:27;3419:9;3402:27;:::i;3440:416::-;3515:6;3523;3531;3584:2;3572:9;3563:7;3559:23;3555:32;3552:52;;;3600:1;3597;3590:12;3552:52;3645:23;;;-1:-1:-1;3711:36:1;3743:2;3728:18;;3711:36;:::i;:::-;3440:416;;3701:46;;-1:-1:-1;;;3820:2:1;3805:18;;;;3792:32;;3440:416::o;3861:131::-;-1:-1:-1;;;;;3936:31:1;;3926:42;;3916:70;;3982:1;3979;3972:12;3916:70;3861:131;:::o;3997:367::-;4065:6;4073;4126:2;4114:9;4105:7;4101:23;4097:32;4094:52;;;4142:1;4139;4132:12;4094:52;4181:9;4168:23;4200:31;4225:5;4200:31;:::i;4369:429::-;4420:3;4458:5;4452:12;4485:6;4480:3;4473:19;4517:4;4512:3;4508:14;4501:21;;4556:4;4549:5;4545:16;4579:1;4589:184;4603:6;4600:1;4597:13;4589:184;;;4668:13;;4683:4;4664:24;4652:37;;4718:4;4709:14;;;;4746:17;;;;4625:1;4618:9;4589:184;;4803:1139;5004:2;4993:9;4986:21;5049:6;5043:13;5038:2;5027:9;5023:18;5016:41;5111:2;5103:6;5099:15;5093:22;5088:2;5077:9;5073:18;5066:50;4967:4;5163:2;5155:6;5151:15;5145:22;5176:52;5224:2;5213:9;5209:18;5195:12;-1:-1:-1;;;;;80:31:1;68:44;;14:104;5176:52;;5283:2;5275:6;5271:15;5265:22;5259:3;5248:9;5244:19;5237:51;5337:3;5329:6;5325:16;5319:23;5379:6;5373:3;5362:9;5358:19;5351:35;5409:63;5467:3;5456:9;5452:19;5436:14;5409:63;:::i;:::-;5395:77;;5521:3;5513:6;5509:16;5503:23;5595:2;5591:7;5579:9;5571:6;5567:22;5563:36;5557:3;5546:9;5542:19;5535:65;5623:50;5666:6;5650:14;5623:50;:::i;:::-;5609:64;;;5728:3;5720:6;5716:16;5710:23;5704:3;5693:9;5689:19;5682:52;5783:3;5775:6;5771:16;5765:23;5797:52;5844:3;5833:9;5829:19;5813:14;1172:13;1165:21;1153:34;;1102:91;5797:52;;5907:3;5899:6;5895:16;5889:23;5880:6;5869:9;5865:22;5858:55;5930:6;5922:14;;;4803:1139;;;;:::o;6372:129::-;-1:-1:-1;;;;;6450:5:1;6446:30;6439:5;6436:41;6426:69;;6491:1;6488;6481:12;6506:367;6569:8;6579:6;6633:3;6626:4;6618:6;6614:17;6610:27;6600:55;;6651:1;6648;6641:12;6600:55;-1:-1:-1;6674:20:1;;-1:-1:-1;;;;;6706:30:1;;6703:50;;;6749:1;6746;6739:12;6703:50;6786:4;6778:6;6774:17;6762:29;;6846:3;6839:4;6829:6;6826:1;6822:14;6814:6;6810:27;6806:38;6803:47;6800:67;;;6863:1;6860;6853:12;6800:67;6506:367;;;;;:::o;6878:570::-;6972:6;6980;6988;7041:2;7029:9;7020:7;7016:23;7012:32;7009:52;;;7057:1;7054;7047:12;7009:52;7096:9;7083:23;7115:30;7139:5;7115:30;:::i;:::-;7164:5;-1:-1:-1;7220:2:1;7205:18;;7192:32;-1:-1:-1;;;;;7236:30:1;;7233:50;;;7279:1;7276;7269:12;7233:50;7318:70;7380:7;7371:6;7360:9;7356:22;7318:70;:::i;:::-;6878:570;;7407:8;;-1:-1:-1;7292:96:1;;-1:-1:-1;;;;6878:570:1:o;7453:437::-;7539:6;7547;7600:2;7588:9;7579:7;7575:23;7571:32;7568:52;;;7616:1;7613;7606:12;7568:52;7656:9;7643:23;-1:-1:-1;;;;;7681:6:1;7678:30;7675:50;;;7721:1;7718;7711:12;7675:50;7760:70;7822:7;7813:6;7802:9;7798:22;7760:70;:::i;:::-;7849:8;;7734:96;;-1:-1:-1;7453:437:1;-1:-1:-1;;;;7453:437:1:o;7895:433::-;7945:3;7983:5;7977:12;8010:6;8005:3;7998:19;8042:4;8037:3;8033:14;8026:21;;8081:4;8074:5;8070:16;8104:1;8114:189;8128:6;8125:1;8122:13;8114:189;;;8203:13;;8196:21;8189:29;8177:42;;8248:4;8239:14;;;;8276:17;;;;8150:1;8143:9;8114:189;;8333:252;8506:2;8495:9;8488:21;8469:4;8526:53;8575:2;8564:9;8560:18;8552:6;8526:53;:::i;8590:250::-;8675:1;8685:113;8699:6;8696:1;8693:13;8685:113;;;8775:11;;;8769:18;8756:11;;;8749:39;8721:2;8714:10;8685:113;;;-1:-1:-1;;8832:1:1;8814:16;;8807:27;8590:250::o;8845:991::-;9005:4;9053:2;9042:9;9038:18;9083:2;9072:9;9065:21;9106:6;9141;9135:13;9172:6;9164;9157:22;9210:2;9199:9;9195:18;9188:25;;9272:2;9262:6;9259:1;9255:14;9244:9;9240:30;9236:39;9222:53;;9310:2;9302:6;9298:15;9331:1;9341:466;9355:6;9352:1;9349:13;9341:466;;;9448:2;9444:7;9432:9;9424:6;9420:22;9416:36;9411:3;9404:49;9482:6;9476:13;9524:2;9518:9;9555:8;9547:6;9540:24;9577:74;9642:8;9637:2;9629:6;9625:15;9620:2;9616;9612:11;9577:74;:::i;:::-;9717:2;9694:17;-1:-1:-1;;9690:31:1;9678:44;;;;9724:2;9674:53;;;;-1:-1:-1;9785:12:1;;;;9750:15;;;;;9377:1;9370:9;9341:466;;;-1:-1:-1;9824:6:1;;8845:991;-1:-1:-1;;;;;;8845:991:1:o;9841:551::-;9936:6;9944;9952;10005:2;9993:9;9984:7;9980:23;9976:32;9973:52;;;10021:1;10018;10011:12;9973:52;10061:9;10048:23;-1:-1:-1;;;;;10086:6:1;10083:30;10080:50;;;10126:1;10123;10116:12;10080:50;10165:70;10227:7;10218:6;10207:9;10203:22;10165:70;:::i;:::-;10254:8;;10139:96;;-1:-1:-1;10358:2:1;10343:18;;;;10330:32;;9841:551;-1:-1:-1;;;;9841:551:1:o;10397:255::-;10572:2;10561:9;10554:21;10535:4;10592:54;10642:2;10631:9;10627:18;10619:6;10592:54;:::i;10888:1424::-;11384:3;11397:22;;;11468:13;;11369:19;;;11490:22;;;11336:4;;11582;11570:17;;;11543:3;11528:19;;;11336:4;11615:199;11629:6;11626:1;11623:13;11615:199;;;11694:13;;-1:-1:-1;;;;;11690:39:1;11678:52;;11759:4;11787:17;;;;11750:14;;;;11726:1;11644:9;11615:199;;;11619:3;;11861:9;11856:3;11852:19;11845:4;11834:9;11830:20;11823:49;11895:41;11932:3;11924:6;11895:41;:::i;:::-;11881:55;;;11984:9;11976:6;11972:22;11967:2;11956:9;11952:18;11945:50;12018:44;12055:6;12047;12018:44;:::i;:::-;12004:58;;12110:9;12102:6;12098:22;12093:2;12082:9;12078:18;12071:50;12144:44;12181:6;12173;12144:44;:::i;:::-;12130:58;;12237:9;12229:6;12225:22;12219:3;12208:9;12204:19;12197:51;12265:41;12299:6;12291;12265:41;:::i;:::-;12257:49;10888:1424;-1:-1:-1;;;;;;;;10888:1424:1:o;12317:721::-;12396:6;12404;12412;12465:2;12453:9;12444:7;12440:23;12436:32;12433:52;;;12481:1;12478;12471:12;12433:52;12520:9;12507:23;12539:31;12564:5;12539:31;:::i;:::-;12589:5;-1:-1:-1;12645:2:1;12630:18;;12617:32;-1:-1:-1;;;;;12661:30:1;;12658:50;;;12704:1;12701;12694:12;12658:50;12727:22;;12780:4;12772:13;;12768:27;-1:-1:-1;12758:55:1;;12809:1;12806;12799:12;12758:55;12849:2;12836:16;-1:-1:-1;;;;;12867:6:1;12864:30;12861:50;;;12907:1;12904;12897:12;12861:50;12952:7;12947:2;12938:6;12934:2;12930:15;12926:24;12923:37;12920:57;;;12973:1;12970;12963:12;12920:57;12317:721;;13004:2;12996:11;;;;;-1:-1:-1;13026:6:1;;-1:-1:-1;;;12317:721:1:o;13275:251::-;13345:6;13398:2;13386:9;13377:7;13373:23;13369:32;13366:52;;;13414:1;13411;13404:12;13366:52;13446:9;13440:16;13465:31;13490:5;13465:31;:::i;13531:334::-;13733:2;13715:21;;;13772:2;13752:18;;;13745:30;-1:-1:-1;;;13806:2:1;13791:18;;13784:40;13856:2;13841:18;;13531:334::o;13870:127::-;13931:10;13926:3;13922:20;13919:1;13912:31;13962:4;13959:1;13952:15;13986:4;13983:1;13976:15;14002:112;14034:1;14060;14050:35;;14065:18;;:::i;:::-;-1:-1:-1;14099:9:1;;14002:112::o;14119:127::-;14180:10;14175:3;14171:20;14168:1;14161:31;14211:4;14208:1;14201:15;14235:4;14232:1;14225:15;14251:151;14341:4;14334:12;;;14320;;;14316:31;;14359:14;;14356:40;;;14376:18;;:::i;14659:148::-;14747:4;14726:12;;;14740;;;14722:31;;14765:13;;14762:39;;;14781:18;;:::i;14812:125::-;14877:9;;;14898:10;;;14895:36;;;14911:18;;:::i;15625:128::-;15692:9;;;15713:11;;;15710:37;;;15727:18;;:::i;15758:127::-;15819:10;15814:3;15810:20;15807:1;15800:31;15850:4;15847:1;15840:15;15874:4;15871:1;15864:15;15890:127;15951:10;15946:3;15942:20;15939:1;15932:31;15982:4;15979:1;15972:15;16006:4;16003:1;15996:15;17423:398;17625:2;17607:21;;;17664:2;17644:18;;;17637:30;17703:34;17698:2;17683:18;;17676:62;-1:-1:-1;;;17769:2:1;17754:18;;17747:32;17811:3;17796:19;;17423:398::o;18173:168::-;18246:9;;;18277;;18294:15;;;18288:22;;18274:37;18264:71;;18315:18;;:::i;18346:120::-;18386:1;18412;18402:35;;18417:18;;:::i;:::-;-1:-1:-1;18451:9:1;;18346:120::o;20675:611::-;-1:-1:-1;;;;;20919:31:1;;20901:50;;20982:2;20967:18;;20960:34;;;21030:2;21025;21010:18;;21003:30;;;21049:18;;21042:34;;;-1:-1:-1;;;;;;21088:31:1;;21085:51;;;21132:1;21129;21122:12;21085:51;21166:6;21163:1;21159:14;21224:6;21216;21210:3;21199:9;21195:19;21182:49;21252:22;;;;21276:3;21248:32;;20675:611;-1:-1:-1;;;;;20675:611:1:o;21623:184::-;21693:6;21746:2;21734:9;21725:7;21721:23;21717:32;21714:52;;;21762:1;21759;21752:12;21714:52;-1:-1:-1;21785:16:1;;21623:184;-1:-1:-1;21623:184:1:o;22161:277::-;22228:6;22281:2;22269:9;22260:7;22256:23;22252:32;22249:52;;;22297:1;22294;22287:12;22249:52;22329:9;22323:16;22382:5;22375:13;22368:21;22361:5;22358:32;22348:60;;22404:1;22401;22394:12;24397:249;24466:6;24519:2;24507:9;24498:7;24494:23;24490:32;24487:52;;;24535:1;24532;24525:12;24487:52;24567:9;24561:16;24586:30;24610:5;24586:30;:::i;25625:287::-;25754:3;25792:6;25786:13;25808:66;25867:6;25862:3;25855:4;25847:6;25843:17;25808:66;:::i;:::-;25890:16;;;;;25625:287;-1:-1:-1;;25625:287:1:o;26331:687::-;26432:6;26440;26448;26456;26464;26517:3;26505:9;26496:7;26492:23;26488:33;26485:53;;;26534:1;26531;26524:12;26485:53;26579:23;;;-1:-1:-1;26699:2:1;26684:18;;26671:32;;-1:-1:-1;26748:36:1;26780:2;26765:18;;26748:36;:::i;:::-;26738:46;;26836:2;26825:9;26821:18;26808:32;26849:33;26874:7;26849:33;:::i;:::-;26331:687;;;;-1:-1:-1;26331:687:1;;26981:3;26966:19;26953:33;;26331:687;-1:-1:-1;;26331:687:1:o

Swarm Source

ipfs://9d3dcfa10808d923c6427b4fae63609b7edac37cce12a2317ed57a753ada9c95

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
0xbcfA645D79F4ccF2B5448aC67309DCd15Bc94035
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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