APE Price: $0.19 (-1.67%)

Contract

0x6a48A513A46955D8622C809Fce876d2f11142003

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To
Play327955092026-01-24 22:37:4721 secs ago1769294267IN
0x6a48A513...f11142003
20.0878539 APE0.07066951101.68276
Play327954952026-01-24 22:37:2741 secs ago1769294247IN
0x6a48A513...f11142003
15.0878539 APE0.07066951101.68276
Play327954582026-01-24 22:36:351 min ago1769294195IN
0x6a48A513...f11142003
10.10249622 APE0.07068009101.68276
Play327954372026-01-24 22:36:091 min ago1769294169IN
0x6a48A513...f11142003
5.10249622 APE0.07067887101.68276
Play327951802026-01-24 22:28:509 mins ago1769293730IN
0x6a48A513...f11142003
19.5878539 APE0.07066951101.68276
Play327951712026-01-24 22:28:339 mins ago1769293713IN
0x6a48A513...f11142003
19.5878539 APE0.07066829101.68276
Play327951622026-01-24 22:28:149 mins ago1769293694IN
0x6a48A513...f11142003
14.5878539 APE0.07066951101.68276
Play327951362026-01-24 22:27:3010 mins ago1769293650IN
0x6a48A513...f11142003
9.5878539 APE0.07066951101.68276
Play327951222026-01-24 22:26:5811 mins ago1769293618IN
0x6a48A513...f11142003
4.60249622 APE0.07068009101.68276
Play327951032026-01-24 22:26:3611 mins ago1769293596IN
0x6a48A513...f11142003
23.8878539 APE0.07066951101.68276
Play327950942026-01-24 22:26:1711 mins ago1769293577IN
0x6a48A513...f11142003
18.8878539 APE0.07066951101.68276
Play327950762026-01-24 22:25:5212 mins ago1769293552IN
0x6a48A513...f11142003
13.8878539 APE0.07066829101.68276
Play327950642026-01-24 22:25:2412 mins ago1769293524IN
0x6a48A513...f11142003
8.90249622 APE0.07068009101.68276
Play327950522026-01-24 22:25:0413 mins ago1769293504IN
0x6a48A513...f11142003
25.0878539 APE0.07066951101.68276
Play327950462026-01-24 22:24:4813 mins ago1769293488IN
0x6a48A513...f11142003
15.0878539 APE0.07066829101.68276
Play327950422026-01-24 22:24:3213 mins ago1769293472IN
0x6a48A513...f11142003
3.0878539 APE0.07067073101.68276
Play327950342026-01-24 22:24:2413 mins ago1769293464IN
0x6a48A513...f11142003
5.10249622 APE0.07574257101.68276
Play327950322026-01-24 22:24:2213 mins ago1769293462IN
0x6a48A513...f11142003
3.0878539 APE0.07573321101.68276
Play327950252026-01-24 22:24:1113 mins ago1769293451IN
0x6a48A513...f11142003
3.0878539 APE0.07067073101.68276
Play327950192026-01-24 22:24:0014 mins ago1769293440IN
0x6a48A513...f11142003
5.0878539 APE0.07066951101.68276
Play327950172026-01-24 22:23:5914 mins ago1769293439IN
0x6a48A513...f11142003
3.0878539 APE0.07067073101.68276
Play327950122026-01-24 22:23:4814 mins ago1769293428IN
0x6a48A513...f11142003
3.0878539 APE0.07067073101.68276
Play327950022026-01-24 22:23:3714 mins ago1769293417IN
0x6a48A513...f11142003
3.0878539 APE0.07067073101.68276
Play327949942026-01-24 22:23:1614 mins ago1769293396IN
0x6a48A513...f11142003
150.11713854 APE0.07066738101.68276
Play327949782026-01-24 22:22:5115 mins ago1769293371IN
0x6a48A513...f11142003
150.11713854 APE0.07066626101.68276
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
327955102026-01-24 22:37:4820 secs ago1769294268
0x6a48A513...f11142003
19.6 APE
327955092026-01-24 22:37:4721 secs ago1769294267
0x6a48A513...f11142003
0.0878539 APE
327955092026-01-24 22:37:4721 secs ago1769294267
0x6a48A513...f11142003
0.4 APE
327954962026-01-24 22:37:2939 secs ago1769294249
0x6a48A513...f11142003
14.7 APE
327954952026-01-24 22:37:2741 secs ago1769294247
0x6a48A513...f11142003
0.0878539 APE
327954952026-01-24 22:37:2741 secs ago1769294247
0x6a48A513...f11142003
0.3 APE
327954592026-01-24 22:36:361 min ago1769294196
0x6a48A513...f11142003
9.8 APE
327954582026-01-24 22:36:351 min ago1769294195
0x6a48A513...f11142003
0.10249622 APE
327954582026-01-24 22:36:351 min ago1769294195
0x6a48A513...f11142003
0.2 APE
327954412026-01-24 22:36:101 min ago1769294170
0x6a48A513...f11142003
4.9 APE
327954372026-01-24 22:36:091 min ago1769294169
0x6a48A513...f11142003
0.10249622 APE
327954372026-01-24 22:36:091 min ago1769294169
0x6a48A513...f11142003
0.1 APE
327951822026-01-24 22:28:529 mins ago1769293732
0x6a48A513...f11142003
19.11 APE
327951802026-01-24 22:28:509 mins ago1769293730
0x6a48A513...f11142003
0.0878539 APE
327951802026-01-24 22:28:509 mins ago1769293730
0x6a48A513...f11142003
0.39 APE
327951742026-01-24 22:28:369 mins ago1769293716
0x6a48A513...f11142003
19.11 APE
327951712026-01-24 22:28:339 mins ago1769293713
0x6a48A513...f11142003
0.0878539 APE
327951712026-01-24 22:28:339 mins ago1769293713
0x6a48A513...f11142003
0.39 APE
327951632026-01-24 22:28:169 mins ago1769293696
0x6a48A513...f11142003
14.21 APE
327951622026-01-24 22:28:149 mins ago1769293694
0x6a48A513...f11142003
0.0878539 APE
327951622026-01-24 22:28:149 mins ago1769293694
0x6a48A513...f11142003
0.29 APE
327951402026-01-24 22:27:3110 mins ago1769293651
0x6a48A513...f11142003
9.31 APE
327951362026-01-24 22:27:3010 mins ago1769293650
0x6a48A513...f11142003
0.0878539 APE
327951362026-01-24 22:27:3010 mins ago1769293650
0x6a48A513...f11142003
0.19 APE
327951242026-01-24 22:27:0111 mins ago1769293621
0x6a48A513...f11142003
4.41 APE
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BearDice

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

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

contract ApeOwnableGameV2GasLimit {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

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

    // GAME ID
    uint256 public immutable GAME_ID;

    // History Manager
    IHistoryManager public immutable history;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        // emit event
        emit RandomnessRequested(gameId);
    }

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

        // clear storage
        delete requestToGame[requestId];
    }

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

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

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

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

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

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

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

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

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

    // Num Spins
    uint8 public constant MAX_RUNS = 5;

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

    // Game Struct
    struct Game {

        /** Player */
        address player;

        /** Amount Bet */
        uint256 betAmount;

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

        /** Number of Runs */
        uint8 numRuns;

        /** Difficulty */
        uint8 difficulty;

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

        /** Payouts */
        uint256 payout;

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

        /** Timestamp */
        uint256 timestamp;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    receive() external payable {}

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

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

        uint32 customGasLimit = BASE_GAS + ( numRuns * GAS_PER_RUN);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return retTypes;
    }

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

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

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

Contract Security Audit

Contract ABI

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

60c06040526000805460ff19169055600480546001600160481b031916670186a00007a1200017905560c860065534801561003957600080fd5b50604051614d7f380380614d7f833981016040819052610058916115f9565b6080919091526001600160a01b031660a05260b77ff39ce545b2b1b9a036325bfee4db10badccdc1e6b051a018a37d4c7d7724c334819055608b7ff6c3bfecb24bf6668781fd063fd487731fff69bff278624dd257d0f58c56af5b81905560787f7335c907d94a423793820c9fd1c7bfe9a8cad94f35ccd6312ea727f746cab2f1819055606d7fdd0a5c68823e9e8c2378ce1cb941c25f178eafda49c28104751c289c5f76e73a81905560657fb632b7861480af83de614061d278572a81cee88ff84359043c55b4b5904188fd8190557f1c7ec8d95e3c5286fd3ed87ff4787e96f46de367998f48458067fa65954e0811557f4057a05fcd736e217af65167ffc6cf8d12e288fe3eb16a6c349b99d9f7e86200557fb55d3c0e2e6999622badd77e0789903d6fb435e59c381590046a40d1e891c4f6557fc9796bf4df6467babf2a22ba96bcf1f6117ec6ef0684a4f45bb99948403c1a4c557fdb385aa1c05217d9634ed3502235af5cc25599813ef970c81b17811f2b9bc07e8190557fd5433abe063ebc2883ca9554ff493a2af50eeb8ab858f5344038247c013111c1819055608d7f1c21fa7ba4d52450e6bd80e3f5dd2333715671317d780746447d96bba2391344819055607a7fd8214cb637d5904e46f084b47d27c406bdf3f93edc020fb8c26c0c2887a10033819055606e7f2cac11be01ac143d6cb111ba384557bc4968702e26036f0d890a51ad76739db681905560667f16ac05add237c4749218ab5c20494a42c56b5515cdd74ca6b8e0dc939ab0df6f8190557fca5a49929829beff5a79f5c4c9d5a4e061b518981bbf88879402d7e1ced167d1557f9c586a8c8d3eb160ea0252b0824bb8b61974b71052bec7c0580864ecc669bff78190557f73b5665ba9df3abf92a8d91290344c13cb133a0f0eab9212d9227cc77ee52e9a8290557ecee714bfc4353af6568e6127702d8e411c9732049d73c08d7d44088d4518f58390557feeb0bc0f95986c64ee483fe98e11d82c43fc5870da683d5e5387af3636e22b649390935560b87f9e06c407a8c58c4369c12bd8976f0cf660b4bcba4ec1330b7916684d409aad688190557ff419df20de161d32a832aec97026f1cbd9a7c6b90df4dc6c3c274b6d45c7474f8390557fc35afe017415d929e40c0cba08586ea041aaf100d6c4c958aba3ebcec71466628290557fdfebd94bc92846057e8091ae6314fb045758a0903a6f93f6cc7c8a0a435855f584905560677fa3b0fd02c4787fe9ce93f9ad26fd7a50422102e552650c3d7f9d68fa4c9744928190557f1fcb29a9191898302d2355b54e3a18adbb85df08bbbd4dc5e6af67e92e7e26488190557fb054988df9e00a1c9404e6b8cc3e86c25e2c7ced983fe05eaa917bc5729eae7d8590557ff35fb0c23bb8173b985589da63c6cc51ebd940843a634aa7017e40d544db09078390557f48af5296bffe5a201121d05f95452fba9d8b41c99587af253c406f4b4b0edc338490557f1a9b359f0421da9ce98212369245cfc6b59f4810a800152703f1df281a28fc5b82905560bb7f26c06e70665393f56c7ca397d05f9bcef51a98cee6aa55a15f4cb8dd2788802b8190557fab557653779158a4fb55eee019314301e0576802c597f3cc06fccf3bebe09c0c8590557f446905334ca522051b6b5b7fb411852634a604ee3e5a1c51b36834282cb110498490557fa25dcdf209255c5f01b70a4006938167e8c245dde85b8229afc9f8c32aa34c898690557ff228ed0e83a412a30ba39ff5a0b818fc64b9baac9a162fbff567b42e71889e2f8290557f52016415589b73f6c925d24ea4c9ab6d8aef8a9878430a6591114544aa429527919091557f7237d8d307ac0baa4a3da118c732978ef3d9c2f1931af02f929afe2e001b9e258590557f41380d767448419cf0595059adbda0d15e37f6e4965165f6412375e72504892e8390557ff784f2fecbcea612ee95730027bfd9a5f090f418f650c1dc12424e3223cb463e8490557f5b7a17f893104a96c65aeea5c600b7570113c480c73041a76d7f0d4aebba29e2557f2552f683fc30990dee200962844c09df26d6a68602bf97a0ab323f1bf96c0d418190557f0908d63bbc2033f990225e9249d4f0bacabe03089242db14306a5b1b5467005b8390557fc069ce517785a8de5f3542004fe5aec58db581de071af72ef88b41695efd2cf88290557f339e76e709f4dd8f245587f1ac4d696c31d872e34cc7130d52309ad9fc08388f84905560687f4d304de5b12368f8e5615e35c10ac2714ea3a163a1a0cedc6877345b9bece7c28190557f130c74bea1a84ad6249bf57fda8425b77576ce00d4b67d0edad0079a47f8d70f557f86ab63ab74bd98376d11178df4c602b73e07368ee3935db1a8bd29eec068a27c939093557f666332a339ea3370ea8e3ecf7d929e92cfb59a1d108b7454c2f1b08faf781260557f76d6863403250c7b4f18b15e604dad92862403509a78f0d3749570e813bb0abf557fc0c19054a5e98b7a941cb505382af875ad80f0e36b2759eac2063e443a13f66b5561017c7f8a163b4e14839ae7149d277e79646f8c216affbd8ab496b5a938b8305732910681905560e17fa2626de0017c7f40b58c21b7192a8ece4c5575323e61ff0a168f89401752f048819055609b7fa84c4400fa03c5e292509f6ed0c3d6605d1975a8ab4733e4718c051b2d9b2c1f81905560757f2be77b3d5dcff480d8aaa8d72fc9eaaa31115f21f761a0f77136f4d3e73a70528190557fe8ec8d3cf8e3312762cfca6ef62c2ddf11dc93be78903b450c7ab93b3ca36d0c557f37714bd1f0a81be2dc999daea93366fafab66372e99772ba0a2df41df2599be1557f563ecdd321e4f608c73a0a3170b42640ce7d1c1d98f256a1dac13dfb24143f55557f7d0dc49113d1e4161ec512279d5f919184f8c1453bf32a932c54ccf1038f6118556101807f0148be5fffff4800b775b40d615a7fa2a86cf750c0147dc2b472c2668e25ef4381905560e37fc4e316ceb48bd1b84b5db493065fbb66de646a8bfd7e09657dd2538415cd386e819055609d7fb039dcb71abec5dbac643dd5ab302b4e28f0f030a3ac60f0fbc3d1f1b685ec6f81905560767f691404f3f0666a52496643d28c64839f5095b913e78694f04a55e79410629ea48190557f4863322c3d6b58037468713e9459ee10ca0d667cb936ab98db407ce62d8ad5908190557f13bdf0589b2a5c9e9a4f2e0c8339bdbbece8be53989867b63811f7104fa3ff3b8290557f5b645b1d57368649a0eb7652677d3acc16069f733f5352ff2e32c41938662c3e8390557f1721926c29e1ebfd7fe03c48a28b4ca76817b8e1335a66fd4a073a067e693833939093556101817f8fa54a136a9af3ce45de768d20c83482147e342156b2a513a27a671c06ef919a8190557f10e71ad6e25da2b42efa565fd8b6549423c44132236000ddf7ac59fbf31ead12839055609e7fd06040a2de58c377a256685324f46d18d74514fc1679af2692c60877c1a155f28190557ff327afca7417abcc5186a52b15c563ee2245ba407d6f89baf4aa48c97bf07f578590557ffe7b80f44058d76727954ff9c895d399f9b6d00588899ebe617af9a8b8fbe9d0949094557fa307bc698f5cbfb1ea98b7a993a2512b0f13cf9be61cac9c7b6fd268209981408490557f6ba872d46fb277123f7359834bd11e24e8902a31ff5fb7ac110f1a48ef3023ef8390557f3be51dd5f04bff6c5956d391663adc3ea99d4c0f023258b7db8aada8c779d8718190557f3cdcd4bd5d92251f01e1c36fcfae689e5da17953073cc865b60d73a2163f834681905560e57f7623b6a823a8a1245af5f51623615b790da2dd30a6e9dfeed4049458221f32448190557f6604586c0254a1a7ad4dc019e567784b235e10b7aec99ab7c6006b71b3b3bd0983905560777fb7130f434760125bff27feb03ea98abca0a30eb1f60540cfa09859127b293db88190557f8ec79e122686f1e65b4b0fedfd2d7f0ecd1b5ec72d94a52267f264be781b8e3d8190557fd0f36771b60f0271833d5db1e069c0d87324c5416160d73c00be0b3521ebed0c939093557ffef779749c99f38630daf5bbadc5ff175ef8cf6da8be7a8ac71d568caf270798557f91166abfd65e098a58d37060bbe14c6f1fc9721c72b78e8a504850c5b63adb1c556101827fbb7ea7f38b59f02f76404957c84f3d209c7c033c8dc980f2464eda92d194c0258190557ff6bbe2f872ba187339351d39337cfeadef35518711e01645028992cac329e1a68390557fa1de332a92bd9207f40e916f4c8ee058e010160ca062cca732f229032cef0a638490557fe0a32d0c023d41e0124e6045d447d7e09e62e350d13d05b577cce155e2f1685e8290557fdfa8257455b2f9335813860c8b77b0e4582d23c4405c3825391408d8d24d8eb7919091557f65e5b291d88a84dbaf797b9631169a1c5470427067e8584bcab625163b878f2d929092557f2b70da9cdbd3962cfd27789204fb97b2aa3a892aa4a4a154ca2434eff4c9f294557fb647e4022fed46657d514865d85353a3a5a31c28bdc0411093b4f438da429e60556102767f82b65d6b89d46a86c95b660ed27d48a108dd76f562fb0312242659629cc475de81905561012c7ff7e516dea209888b9d85f1c8b6696d0ae68e3eed36c41ae4c6cdb8bfd12b35b481905560b17f17c3e942de377b4881994c0508e856ba4ef8e57d487dfb7ac966effb914143fa8190557f5342019c28669cc007403c3abd06568ecee5dd9b923c00fd83f61a0d719089dd557fba2b3daa6f15ef62e6bd9573eb2ce011e8ead0244e63dfac1e11f14652341a13557f115f4274f0c20ab0ecf2c04a0d6fc9679107d00e73bebef35baadda79962e1775561027d7f266cef0276773a07165e915fd6176b7375e7fdcf42ec255c691bf96c695f63cd81905561012f7f5a08a3d5c86f386cc2a17db540799b7e4ec376e11cb30d2c504a10e1de66f3af81905560b37f36d8c4a20a22d6ba7324872d9bb80482ec6fb5cdf8729e4062aeb54595d32e218190557f82f65071287c76c07840773a77ed2ae94313fe72f8dac0c5552170055c17edd18190557fb663beb3d615ae8b449d55d46948598c0e8c6e547accadc6074b814dfb08f6ac919091557fb9b1f5e5111398233ac3ab7bc5363c1df51a5ecbf6a1d22bbf539671896c5e9e919091556102807fdb9961755b3a5dcddb847dc40b98196cd86ea468fa9c81434bbf91c2204a3e228190556101317f075f6d924c6d3c29645c45807b425e4e865e5f7241f4141891c4c98b381cf0768190557f68633ffc35ee9d30da55c3088d60c56c73d9fcaf1c0c332e9f7f0153a9576b0c8390557f2060b66b034b180e2ef7eed7d54a7b048409b9e42fcb0003af37f76c0b47b8078390557fd50bd1e7557232f9d3465aaefa58e29c7dfa64efeb01a1ae3c689196b55550308190557f74bed876a09183871c9ea434e30451bf36d3549f8159f365d5a0df1c8717697b919091556102837fa950940b518c0e6095e8974f74df0ad954082cb24e8430e09113bd55656505cb8190557f700bb7a68f54bb5c77a4384a8d09f40eb34ba008b59cc1d6fd516dbfef63e5218290557fd26f7f5c5adb127f5cc12f90fbcb553c1c9704239edaae440c1e67467864ccf08390557fad25bb3d97a173b8db6d3459ffaa78f385d86ac571163154b6a58102d47f74428390557fb534795a4a11de1df322a5c21fc0d1186d7d3440c9eb6d64009972f88b4a6fef919091557f67e45428301aa041ba7c56777a7bb3c5709561c47c3c6c133f4c9297c8c596a48190557f1fb9bcccb90bce04af4ddda4e5c54217dbd6f5a49bc225f8d5c5f9587a9c3c728190556101327f6ed18aa85c3c3c1e0379373382757c2d74326cc61c2ec65deb688c6c750406c98190557f192cbfcf7d4edadcf0f6403871631676eccf78379e8b7541ed8edaceeace26198390557fd0c61f5170451e4447205e489298451b9846be2c1cace4882e87cc2ffb1afb47929092557f80d37b890d9a05b5a0721de1ecff01c270c8205851aaa57fd7dc18992a8462c9919091557f02580703e350c8e1cf31da8886ffc9985c352f51ff612c7b5870e3a15b5a5010556103cc7f25226a01c8748db6e238bf4a1795635c04e519c1386812f4769123cb7f9afa7e81905561018b7f7e0ec472817962d8f1c2ef67e615325bfc6f840823b5a6cdfbcbfdc6b627157f8190557fda02aa61e1952fa35f0291e5b5e2b42821463ce17a770ab52ea8463e8cb04797557f57119a6fb4208ca5cb253236994f63b69d2dfae1437436dcbdaf0b0fb0f0e23a556103d47f0beb36da48f30312a55247f8e2d069c29dc909e7cf2feacbcb5a65c10290fd708190556101907ff1289fb581ab70a4cd47e1c5efe64c8fa38f5b3c14835b50aa5cb708e6e453dc8190557f24ec78a77bfca346cbaf8078cee8b15ba8692ab780873509d5d7223385d18477557f5bb4c2928fbb03c4abb7b5ca20419d6cd84fc5110b39727c2a6d10470d9c941e556103d67f0e10eee5ee203af19171092667a7c008ce16152603653f8b43ab3021d29224048190556101917f7925213dfcf141dae1829a65c412e234de4c11db776b762c2df917d9ce6cd4c28190557fe1da6b2ca1cad5ca5c8b061c5161e36f1edfb184411c7598657a889d80216ad4557fc7b2c01fc2b9573254c643cd5ea60202d409183f354bb29babd55b42cabeb955556103d87f9b70a898df240e306a25d4945d7f67b0248a06ed32fc73a1305762bf7cc8f3e78190556101937f9aa86530dff21b03b955d356084a78bafce62d6f1416b695d3ab946e45518e178190557f9f9ebc5fea284621a1b05ae1dbc4c15140813b17ba69eba81c1f87f31baa83ba8190557f2606062aad23a8cb42bf511f160b0798484fcf9b0567ae55b75d58b8ba74cd27919091556103da7feb932f8d0f3c316f252312f024c735e1358086fde15444fb8d7e134e2dc970208190557fbaee63b37316258b199bf66e38f2c4ab22bc77f87fad44149f4582a4fa702d9f8290557f5cdd6073f602c8f4d27b5fd42f0d8f96cb349d8f46e7f296eab998cb6654be30919091557f48fec1e1fb3465d8476d2f3e12e997446154c29959dbcac8676b54bd270bd878556106e27f53f10fca388a3f067753b761e845cfbe42197918c5ebe5d7a6aa6fa8d0e5a7db8190557ff2743524fd3f3362d3e8996b8f270ad779493767323dd8ebb70038d61b618fe3556106f47fba7a64f22cec61d137c9ada21860c8b7b16836f3a4cc393b481bbe88eb4c00ea8190557f2bc530f87c24363fea71b14055adbb9d794916cadc05e1e58b44ee8a6be071e6556106fb7f40d4d39db361ba528dc154519467b81b5f1fc1cf5e61be6f89f872df43a875848190557fbd07b81201f8189cd1c03db10d79db1673e3c6df414babf2e6953569ba9f54d8556106fd7fda7730e96aebe0f162ae374b3a40858dacbbf9de10863ef1f8ad30c3ebe3a4428190557f167d1f62ee47cbf400f75def8198a6d96db874f5f4af8b58d748775e47f31b75556107007f7b81f43c11f32267778c44cff433e03e5efc820bb30a246186aa2a6dee6c14f9819055600c6000527fd45446725a474b636cec29f0a9e179fad2a1540b4d0bfeaff8809af7fbb4f8636020527fce21148dc9af09939523b78bf330ca70d35dae80d196462eef1471bfc525bf2955611636565b6000806040838503121561160c57600080fd5b825160208401519092506001600160a01b038116811461162b57600080fd5b809150509250929050565b60805160a0516136ec61169360003960008181610620015261298a01526000818161071b01528181611f3801528181612043015281816121430152818161224a015281816123400152818161295d0152612ac801526136ec6000f3fe6080604052600436106101f25760003560e01c80635c975abb1161010d57806398daac83116100a0578063cc81d0551161006f578063cc81d055146106a6578063dc5bdf13146106bb578063faf3bbc2146106e1578063fdcdb06b14610709578063ff5d4c871461073d57600080fd5b806398daac831461060e5780639e281a9814610642578063c4fd5d6d14610662578063c811ad711461069357600080fd5b80638026e311116100dc5780638026e3111461058c5780638456cb59146105ac57806389fc2c0f146105c157806391ea41e6146105e157600080fd5b80635c975abb146104e7578063735e7d6614610501578063749fa03c1461053f5780637b8d38791461055f57600080fd5b8063389aa3421161018557806348e8294a1161015457806348e8294a1461044d5780634cdc38181461047a57806351e92559146104a157806352233e91146104d157600080fd5b8063389aa342146103a75780634782f779146103de57806347e1d550146103fe578063481c6a751461042b57600080fd5b80631dd0d57a116101c15780631dd0d57a1461032157806326232a2e146103415780632c28f5791461036557806332883e7e1461037a57600080fd5b8063046f7da2146101fe57806304e2064f14610215578063117a5b901461024757806312e8e2c31461030157600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361075d565b005b34801561022157600080fd5b5061022a610812565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025357600080fd5b506102b6610262366004612e5c565b60056020526000908152604090208054600182015460028301546003840154600685015460078601546008909601546001600160a01b03909516959394929360ff8084169461010090940481169391169088565b604080516001600160a01b03909916895260208901979097529587019490945260ff92831660608701529116608085015260a0840152151560c083015260e08201526101000161023e565b34801561030d57600080fd5b5061021361031c366004612e5c565b610889565b34801561032d57600080fd5b5061021361033c366004612e75565b6109b4565b34801561034d57600080fd5b5061035760065481565b60405190815260200161023e565b34801561037157600080fd5b50610213610a76565b34801561038657600080fd5b5061039a610395366004612ea2565b610b67565b60405161023e9190612f00565b3480156103b357600080fd5b506004546103c990610100900463ffffffff1681565b60405163ffffffff909116815260200161023e565b3480156103ea57600080fd5b506102136103f9366004612f2b565b610c2b565b34801561040a57600080fd5b5061041e610419366004612e5c565b610d30565b60405161023e919061303a565b34801561043757600080fd5b5061022a60008051602061369783398151915281565b34801561045957600080fd5b5061046d610468366004613098565b610ec9565b60405161023e91906130d9565b34801561048657600080fd5b5061048f600581565b60405160ff909116815260200161023e565b3480156104ad57600080fd5b506104c16104bc366004612e5c565b610f7c565b604051901515815260200161023e565b3480156104dd57600080fd5b5061035761271081565b3480156104f357600080fd5b506000546104c19060ff1681565b34801561050d57600080fd5b5061035761051c366004613154565b600760209081526000938452604080852082529284528284209052825290205481565b34801561054b57600080fd5b5061021361055a3660046131ac565b610f9c565b34801561056b57600080fd5b5061057f61057a366004613098565b6113d2565b60405161023e9190613234565b34801561059857600080fd5b506102136105a7366004612e75565b61148f565b3480156105b857600080fd5b50610213611559565b3480156105cd57600080fd5b506103576105dc366004612e5c565b611608565b3480156105ed57600080fd5b506106016105fc366004613098565b611629565b60405161023e919061326b565b34801561061a57600080fd5b5061022a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561064e57600080fd5b5061021361065d366004612f2b565b6116e0565b34801561066e57600080fd5b5061068261067d366004613098565b61178f565b60405161023e9594939291906132df565b6102136106a136600461337f565b611ac2565b3480156106b257600080fd5b50600154610357565b3480156106c757600080fd5b506004546103c99065010000000000900463ffffffff1681565b3480156106ed57600080fd5b5061022a73258f9ead08d35955fc80678658d9cdfd36f9856381565b34801561071557600080fd5b506103577f000000000000000000000000000000000000000000000000000000000000000081565b34801561074957600080fd5b50610357610758366004612e75565b611d54565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cd9190613404565b6001600160a01b0316336001600160a01b0316146108065760405162461bcd60e51b81526004016107fd90613421565b60405180910390fd5b6000805460ff19169055565b60006000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610860573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108849190613404565b905090565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190613404565b6001600160a01b0316336001600160a01b0316146109295760405162461bcd60e51b81526004016107fd90613421565b6109366005612710613471565b8111156109795760405162461bcd60e51b815260206004820152601160248201527043616e6e6f74204578636565642032302560781b60448201526064016107fd565b60068190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a249190613404565b6001600160a01b0316336001600160a01b031614610a545760405162461bcd60e51b81526004016107fd90613421565b6004805463ffffffff9092166101000264ffffffff0019909216919091179055565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae69190613404565b6001600160a01b0316336001600160a01b031614610b165760405162461bcd60e51b81526004016107fd90613421565b60045460ff1615610b585760405162461bcd60e51b815260206004820152600c60248201526b416c7265616479204c69766560a01b60448201526064016107fd565b6004805460ff19166001179055565b600154606090821115610b7a5760015491505b6000610b868484613485565b6001600160401b03811115610b9d57610b9d613498565b604051908082528060200260200182016040528015610bc6578160200160208202803683370190505b509050835b83811015610c215760018181548110610be657610be66134ae565b9060005260206000200154828683610bfe9190613485565b81518110610c0e57610c0e6134ae565b6020908102919091010152600101610bcb565b5090505b92915050565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9b9190613404565b6001600160a01b0316336001600160a01b031614610ccb5760405162461bcd60e51b81526004016107fd90613421565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d18576040519150601f19603f3d011682016040523d82523d6000602084013e610d1d565b606091505b5050905080610d2b57600080fd5b505050565b610d38612d44565b604080516101208101825260008481526005602081815284832080546001600160a01b03168552600181015482860152600381015460ff808216878901526101009091041660608601529287905290815260049091018054845181840281018401909552808552929360808501939092830182828015610df557602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610dc65790505b5050505050815260200160056000858152602001908152602001600020600501805480602002602001604051908101604052809291908181526020018280548015610e7d57602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610e4e5790505b50505091835250506000848152600560208181526040808420600681015483870152600781015460ff161515918601919091529690925290526008909301546060909301929092525090565b6060816000816001600160401b03811115610ee657610ee6613498565b604051908082528060200260200182016040528015610f1f57816020015b610f0c612d44565b815260200190600190039081610f045790505b50905060005b82811015610f7357610f4e868683818110610f4257610f426134ae565b90506020020135610d30565b828281518110610f6057610f606134ae565b6020908102919091010152600101610f25565b50949350505050565b60008181526002602052604081205460ff16158015610c25575050151590565b6000805160206136978339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190613404565b6001600160a01b0316336001600160a01b0316148061103e57503373258f9ead08d35955fc80678658d9cdfd36f98563145b61107e5760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107fd565b6001600160401b0383166000908152600360208181526040808420548085526005909252909220015460ff808216916101009004166110bc86611dd0565b8215806110de57506000838152600560205260409020546001600160a01b0316155b806110ff575060008381526005602052604090206007015460ff1615156001145b8061110b575060ff8216155b80611123575061111c8260026134c4565b60ff168414155b1561116d577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a58684878760405161115d94939291906134e7565b60405180910390a1505050505050565b600083815260056020526040812060078101805460ff1916600190811790915501549081905b8460ff16811015611338576000600689896111af856002613539565b8181106111be576111be6134ae565b905060200201356111cf9190613550565b6111da906001613564565b9050600060068a8a6111ed866002613539565b6111f8906001613564565b818110611207576112076134ae565b905060200201356112189190613550565b611223906001613564565b905060006112318284613577565b60008a81526005602052604090206004018054919250849186908110611259576112596134ae565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555081600560008b815260200190815260200160002060050185815481106112ab576112ab6134ae565b60009182526020808320818304018054601f9093166101000a60ff81810219909416958416029490941790935589811682526007835260408083208c831684528452808320918516835292522054801561131c57606461130b8288613539565b6113159190613471565b9550611329565b6000955050505050611338565b84600101945050505050611193565b50600085815260056020526040902060068101829055805460029091015461136b916001600160a01b0316908390611eac565b6000858152600560209081526040918290205482518881529182018590529181018390526001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89060600160405180910390a25050505050505050565b606081806001600160401b038111156113ed576113ed613498565b604051908082528060200260200182016040528015611416578160200160208202803683370190505b50915060005b81811015611487576002600086868481811061143a5761143a6134ae565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061146f5761146f6134ae565b9115156020928302919091019091015260010161141c565b505092915050565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ff9190613404565b6001600160a01b0316336001600160a01b03161461152f5760405162461bcd60e51b81526004016107fd90613421565b6004805463ffffffff909216650100000000000268ffffffff000000000019909216919091179055565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c99190613404565b6001600160a01b0316336001600160a01b0316146115f95760405162461bcd60e51b81526004016107fd90613421565b6000805460ff19166001179055565b6001818154811061161857600080fd5b600091825260209091200154905081565b6060816000816001600160401b0381111561164657611646613498565b60405190808252806020026020018201604052801561167957816020015b60608152602001906001900390816116645790505b50905060005b82811015610f735761169c868683818110610f4257610f426134ae565b6040516020016116ac919061303a565b6040516020818303038152906040528282815181106116cd576116cd6134ae565b602090810291909101015260010161167f565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117509190613404565b6001600160a01b0316336001600160a01b0316146117805760405162461bcd60e51b81526004016107fd90613421565b61178b823383612396565b5050565b60608080808085806001600160401b038111156117ae576117ae613498565b6040519080825280602002602001820160405280156117d7578160200160208202803683370190505b509550806001600160401b038111156117f2576117f2613498565b60405190808252806020026020018201604052801561181b578160200160208202803683370190505b509450806001600160401b0381111561183657611836613498565b60405190808252806020026020018201604052801561185f578160200160208202803683370190505b509350806001600160401b0381111561187a5761187a613498565b6040519080825280602002602001820160405280156118a3578160200160208202803683370190505b509250806001600160401b038111156118be576118be613498565b6040519080825280602002602001820160405280156118e7578160200160208202803683370190505b50915060005b81811015611ab657600560008a8a8481811061190b5761190b6134ae565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b0316878281518110611949576119496134ae565b60200260200101906001600160a01b031690816001600160a01b031681525050600560008a8a8481811061197f5761197f6134ae565b905060200201358152602001908152602001600020600101548682815181106119aa576119aa6134ae565b602002602001018181525050600560008a8a848181106119cc576119cc6134ae565b905060200201358152602001908152602001600020600601548582815181106119f7576119f76134ae565b602002602001018181525050600560008a8a84818110611a1957611a196134ae565b90506020020135815260200190815260200160002060080154848281518110611a4457611a446134ae565b602002602001018181525050600560008a8a84818110611a6657611a666134ae565b90506020020135815260200190815260200160002060070160009054906101000a900460ff16838281518110611a9e57611a9e6134ae565b911515602092830291909101909101526001016118ed565b50509295509295909350565b826001600160a01b0381163314611b8c57604051636d6d50a160e11b81523360048201526000805160206136978339815191529063dadaa14290602401602060405180830381865afa158015611b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b409190613590565b611b8c5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107fd565b6000805160206136978339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190613590565b15611c3c5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107fd565b60005460ff1615611c785760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107fd565b60045460ff161515600003611d435760405163242aefad60e21b81526001600160a01b0385166004820152731e79da4f709db18e4c3de214d29f0d7b45f986ea906390abbeb490602401602060405180830381865afa158015611cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d039190613590565b611d435760405162461bcd60e51b815260206004820152601160248201527004e6f7420496e20546573742047726f757607c1b60448201526064016107fd565b611d4e8484846124c7565b50505050565b60405163ca1642e160e01b815263ffffffff8216600482015260009073258f9ead08d35955fc80678658d9cdfd36f985639063ca1642e190602401602060405180830381865afa158015611dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2591906135b2565b6000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e409190613404565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e7a57600080fd5b505af1158015611e8e573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b81156122bf578082106120c4576000805160206136978339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190613404565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b158015611f9557600080fd5b505af1158015611fa9573d6000803e3d6000fd5b505050505060008183611fbc9190613485565b90508015611d4e576000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120349190613404565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b1580156120a657600080fd5b505af11580156120ba573d6000803e3d6000fd5b5050505050505050565b6000805160206136978339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121349190613404565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050600082826121c79190613485565b90506000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122399190613404565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161228791815260200190565b6000604051808303818588803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b505050505050505050565b6000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561230b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232f9190613404565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161237d91815260200190565b6000604051808303818588803b1580156120a657600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123f291906135cb565b6000604051808303816000865af19150503d806000811461242f576040519150601f19603f3d011682016040523d82523d6000602084013e612434565b606091505b509150915081801561245e57508051158061245e57508080602001905181019061245e9190613590565b6124c05760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107fd565b5050505050565b6000808080806124d9868801886135e7565b9450945094509450945060008460ff161180156124fa5750600560ff851611155b61253a5760405162461bcd60e51b81526020600482015260116024820152704552523a20494e56414c49442052554e5360781b60448201526064016107fd565b60045460009061255c9065010000000000900463ffffffff1660ff871661363e565b6004546125749190610100900463ffffffff1661365d565b9050600061258182611d54565b9050803410156125c55760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107fd565b6125ce85610f7c565b15156001146126165760405162461bcd60e51b81526020600482015260146024820152731154948e88125395905312510811d0535148125160621b60448201526064016107fd565b60ff871660009081526007602090815260408083206001845282528083206002845290915290205461268a5760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c494420444946464943554c545900000000000000000060448201526064016107fd565b60006126968234613485565b90506000612710600654836126ab9190613539565b6126b59190613471565b90506126c281878e612894565b600087815260056020526040902080546001600160a01b0319166001600160a01b038e161781556001018290556126f98183613485565b60008881526005602052604090206002810191909155600301805460ff8a811661ffff199092168217610100918d1691909102179091556001600160401b0381111561274757612747613498565b604051908082528060200260200182016040528015612770578160200160208202803683370190505b5060056000898152602001908152602001600020600401908051906020019061279a929190612da1565b508760ff166001600160401b038111156127b6576127b6613498565b6040519080825280602002602001820160405280156127df578160200160208202803683370190505b50600088815260056020818152604090922083516128039491909201920190612da1565b506000878152600560205260409020426008909101556128238c8861293e565b61282d8c83612a32565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c78860405161286891815260200190565b60405180910390a26128868761287f8a60026134c4565b8787612b30565b505050505050505050505050565b6000805160206136978339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129049190613404565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e590859060440161237d565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b1580156129ce57600080fd5b505af11580156129e2573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000805160206136978339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190613404565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612b1457600080fd5b505af1158015612b28573d6000803e3d6000fd5b505050505050565b600073258f9ead08d35955fc80678658d9cdfd36f9856363f09cdf37612b5584611d54565b6040516001600160e01b031960e084901b1681526004810187905260ff8816602482015263ffffffff8616604482015260640160206040518083038185885af1158015612ba6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bcb9190613679565b6001600160401b03811660009081526003602052604090205490915015612c275760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107fd565b6001600160401b038116600090815260036020908152604091829020879055815160016264c53160e01b0319815291516000805160206136978339815191529263ff9b3acf9260048083019391928290030181865afa158015612c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb29190613404565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612cec57600080fd5b505af1158015612d00573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d4585604051612d3591815260200190565b60405180910390a15050505050565b60405180610120016040528060006001600160a01b0316815260200160008152602001600060ff168152602001600060ff168152602001606081526020016060815260200160008152602001600015158152602001600081525090565b82805482825590600052602060002090601f01602090048101928215612e375791602002820160005b83821115612e0857835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302612dca565b8015612e355782816101000a81549060ff0219169055600101602081600001049283019260010302612e08565b505b50612e43929150612e47565b5090565b5b80821115612e435760008155600101612e48565b600060208284031215612e6e57600080fd5b5035919050565b600060208284031215612e8757600080fd5b813563ffffffff81168114612e9b57600080fd5b9392505050565b60008060408385031215612eb557600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b82811015612ef6578151865260209586019590910190600101612ed8565b5093949350505050565b602081526000612e9b6020830184612ec4565b6001600160a01b0381168114612f2857600080fd5b50565b60008060408385031215612f3e57600080fd5b8235612f4981612f13565b946020939093013593505050565b600081518084526020840193506020830160005b82811015612ef657815160ff16865260209586019590910190600101612f6b565b80516001600160a01b031682526020810151602083015260006040820151612fb9604085018260ff169052565b506060820151612fce606085018260ff169052565b5060808201516101206080850152612fea610120850182612f57565b905060a083015184820360a08601526130038282612f57565b91505060c083015160c085015260e083015161302360e086018215159052565b506101008301516101008501528091505092915050565b602081526000612e9b6020830184612f8c565b60008083601f84011261305f57600080fd5b5081356001600160401b0381111561307657600080fd5b6020830191508360208260051b850101111561309157600080fd5b9250929050565b600080602083850312156130ab57600080fd5b82356001600160401b038111156130c157600080fd5b6130cd8582860161304d565b90969095509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561313257603f1987860301845261311d858351612f8c565b94506020938401939190910190600101613101565b50929695505050505050565b803560ff8116811461314f57600080fd5b919050565b60008060006060848603121561316957600080fd5b6131728461313e565b92506131806020850161313e565b915061318e6040850161313e565b90509250925092565b6001600160401b0381168114612f2857600080fd5b6000806000604084860312156131c157600080fd5b83356131cc81613197565b925060208401356001600160401b038111156131e757600080fd5b6131f38682870161304d565b9497909650939450505050565b600081518084526020840193506020830160005b82811015612ef65781511515865260209586019590910190600101613214565b602081526000612e9b6020830184613200565b60005b8381101561326257818101518382015260200161324a565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561313257603f19878603018452815180518087526132bc816020890160208501613247565b601f01601f19169590950160209081019550938401939190910190600101613293565b60a08082528651908201819052600090602088019060c0840190835b818110156133225783516001600160a01b03168352602093840193909201916001016132fb565b505083810360208501526133368189612ec4565b915050828103604084015261334b8187612ec4565b9050828103606084015261335f8186612ec4565b905082810360808401526133738185613200565b98975050505050505050565b60008060006040848603121561339457600080fd5b833561339f81612f13565b925060208401356001600160401b038111156133ba57600080fd5b8401601f810186136133cb57600080fd5b80356001600160401b038111156133e157600080fd5b8660208284010111156133f357600080fd5b939660209190910195509293505050565b60006020828403121561341657600080fd5b8151612e9b81612f13565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008261348057613480613445565b500490565b81810381811115610c2557610c2561345b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60ff81811683821602908116908181146134e0576134e061345b565b5092915050565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b0383111561351e57600080fd5b8260051b808560808501379190910160800195945050505050565b8082028115828204841417610c2557610c2561345b565b60008261355f5761355f613445565b500690565b80820180821115610c2557610c2561345b565b60ff8181168382160190811115610c2557610c2561345b565b6000602082840312156135a257600080fd5b81518015158114612e9b57600080fd5b6000602082840312156135c457600080fd5b5051919050565b600082516135dd818460208701613247565b9190910192915050565b600080600080600060a086880312156135ff57600080fd5b6136088661313e565b94506136166020870161313e565b935060408601359250606086013561362d81612f13565b949793965091946080013592915050565b63ffffffff81811683821602908116908181146134e0576134e061345b565b63ffffffff8181168382160190811115610c2557610c2561345b565b60006020828403121561368b57600080fd5b8151612e9b8161319756fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212203f5d097178f1296b05e371a3d1175201b7feca75e3990a64b01333047a1c71c164736f6c634300081c00330000000000000000000000000000000000000000000000000000000000000014000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

Deployed Bytecode

0x6080604052600436106101f25760003560e01c80635c975abb1161010d57806398daac83116100a0578063cc81d0551161006f578063cc81d055146106a6578063dc5bdf13146106bb578063faf3bbc2146106e1578063fdcdb06b14610709578063ff5d4c871461073d57600080fd5b806398daac831461060e5780639e281a9814610642578063c4fd5d6d14610662578063c811ad711461069357600080fd5b80638026e311116100dc5780638026e3111461058c5780638456cb59146105ac57806389fc2c0f146105c157806391ea41e6146105e157600080fd5b80635c975abb146104e7578063735e7d6614610501578063749fa03c1461053f5780637b8d38791461055f57600080fd5b8063389aa3421161018557806348e8294a1161015457806348e8294a1461044d5780634cdc38181461047a57806351e92559146104a157806352233e91146104d157600080fd5b8063389aa342146103a75780634782f779146103de57806347e1d550146103fe578063481c6a751461042b57600080fd5b80631dd0d57a116101c15780631dd0d57a1461032157806326232a2e146103415780632c28f5791461036557806332883e7e1461037a57600080fd5b8063046f7da2146101fe57806304e2064f14610215578063117a5b901461024757806312e8e2c31461030157600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361075d565b005b34801561022157600080fd5b5061022a610812565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025357600080fd5b506102b6610262366004612e5c565b60056020526000908152604090208054600182015460028301546003840154600685015460078601546008909601546001600160a01b03909516959394929360ff8084169461010090940481169391169088565b604080516001600160a01b03909916895260208901979097529587019490945260ff92831660608701529116608085015260a0840152151560c083015260e08201526101000161023e565b34801561030d57600080fd5b5061021361031c366004612e5c565b610889565b34801561032d57600080fd5b5061021361033c366004612e75565b6109b4565b34801561034d57600080fd5b5061035760065481565b60405190815260200161023e565b34801561037157600080fd5b50610213610a76565b34801561038657600080fd5b5061039a610395366004612ea2565b610b67565b60405161023e9190612f00565b3480156103b357600080fd5b506004546103c990610100900463ffffffff1681565b60405163ffffffff909116815260200161023e565b3480156103ea57600080fd5b506102136103f9366004612f2b565b610c2b565b34801561040a57600080fd5b5061041e610419366004612e5c565b610d30565b60405161023e919061303a565b34801561043757600080fd5b5061022a60008051602061369783398151915281565b34801561045957600080fd5b5061046d610468366004613098565b610ec9565b60405161023e91906130d9565b34801561048657600080fd5b5061048f600581565b60405160ff909116815260200161023e565b3480156104ad57600080fd5b506104c16104bc366004612e5c565b610f7c565b604051901515815260200161023e565b3480156104dd57600080fd5b5061035761271081565b3480156104f357600080fd5b506000546104c19060ff1681565b34801561050d57600080fd5b5061035761051c366004613154565b600760209081526000938452604080852082529284528284209052825290205481565b34801561054b57600080fd5b5061021361055a3660046131ac565b610f9c565b34801561056b57600080fd5b5061057f61057a366004613098565b6113d2565b60405161023e9190613234565b34801561059857600080fd5b506102136105a7366004612e75565b61148f565b3480156105b857600080fd5b50610213611559565b3480156105cd57600080fd5b506103576105dc366004612e5c565b611608565b3480156105ed57600080fd5b506106016105fc366004613098565b611629565b60405161023e919061326b565b34801561061a57600080fd5b5061022a7f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b34801561064e57600080fd5b5061021361065d366004612f2b565b6116e0565b34801561066e57600080fd5b5061068261067d366004613098565b61178f565b60405161023e9594939291906132df565b6102136106a136600461337f565b611ac2565b3480156106b257600080fd5b50600154610357565b3480156106c757600080fd5b506004546103c99065010000000000900463ffffffff1681565b3480156106ed57600080fd5b5061022a73258f9ead08d35955fc80678658d9cdfd36f9856381565b34801561071557600080fd5b506103577f000000000000000000000000000000000000000000000000000000000000001481565b34801561074957600080fd5b50610357610758366004612e75565b611d54565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cd9190613404565b6001600160a01b0316336001600160a01b0316146108065760405162461bcd60e51b81526004016107fd90613421565b60405180910390fd5b6000805460ff19169055565b60006000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610860573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108849190613404565b905090565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190613404565b6001600160a01b0316336001600160a01b0316146109295760405162461bcd60e51b81526004016107fd90613421565b6109366005612710613471565b8111156109795760405162461bcd60e51b815260206004820152601160248201527043616e6e6f74204578636565642032302560781b60448201526064016107fd565b60068190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a249190613404565b6001600160a01b0316336001600160a01b031614610a545760405162461bcd60e51b81526004016107fd90613421565b6004805463ffffffff9092166101000264ffffffff0019909216919091179055565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae69190613404565b6001600160a01b0316336001600160a01b031614610b165760405162461bcd60e51b81526004016107fd90613421565b60045460ff1615610b585760405162461bcd60e51b815260206004820152600c60248201526b416c7265616479204c69766560a01b60448201526064016107fd565b6004805460ff19166001179055565b600154606090821115610b7a5760015491505b6000610b868484613485565b6001600160401b03811115610b9d57610b9d613498565b604051908082528060200260200182016040528015610bc6578160200160208202803683370190505b509050835b83811015610c215760018181548110610be657610be66134ae565b9060005260206000200154828683610bfe9190613485565b81518110610c0e57610c0e6134ae565b6020908102919091010152600101610bcb565b5090505b92915050565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9b9190613404565b6001600160a01b0316336001600160a01b031614610ccb5760405162461bcd60e51b81526004016107fd90613421565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d18576040519150601f19603f3d011682016040523d82523d6000602084013e610d1d565b606091505b5050905080610d2b57600080fd5b505050565b610d38612d44565b604080516101208101825260008481526005602081815284832080546001600160a01b03168552600181015482860152600381015460ff808216878901526101009091041660608601529287905290815260049091018054845181840281018401909552808552929360808501939092830182828015610df557602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610dc65790505b5050505050815260200160056000858152602001908152602001600020600501805480602002602001604051908101604052809291908181526020018280548015610e7d57602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610e4e5790505b50505091835250506000848152600560208181526040808420600681015483870152600781015460ff161515918601919091529690925290526008909301546060909301929092525090565b6060816000816001600160401b03811115610ee657610ee6613498565b604051908082528060200260200182016040528015610f1f57816020015b610f0c612d44565b815260200190600190039081610f045790505b50905060005b82811015610f7357610f4e868683818110610f4257610f426134ae565b90506020020135610d30565b828281518110610f6057610f606134ae565b6020908102919091010152600101610f25565b50949350505050565b60008181526002602052604081205460ff16158015610c25575050151590565b6000805160206136978339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190613404565b6001600160a01b0316336001600160a01b0316148061103e57503373258f9ead08d35955fc80678658d9cdfd36f98563145b61107e5760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107fd565b6001600160401b0383166000908152600360208181526040808420548085526005909252909220015460ff808216916101009004166110bc86611dd0565b8215806110de57506000838152600560205260409020546001600160a01b0316155b806110ff575060008381526005602052604090206007015460ff1615156001145b8061110b575060ff8216155b80611123575061111c8260026134c4565b60ff168414155b1561116d577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a58684878760405161115d94939291906134e7565b60405180910390a1505050505050565b600083815260056020526040812060078101805460ff1916600190811790915501549081905b8460ff16811015611338576000600689896111af856002613539565b8181106111be576111be6134ae565b905060200201356111cf9190613550565b6111da906001613564565b9050600060068a8a6111ed866002613539565b6111f8906001613564565b818110611207576112076134ae565b905060200201356112189190613550565b611223906001613564565b905060006112318284613577565b60008a81526005602052604090206004018054919250849186908110611259576112596134ae565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555081600560008b815260200190815260200160002060050185815481106112ab576112ab6134ae565b60009182526020808320818304018054601f9093166101000a60ff81810219909416958416029490941790935589811682526007835260408083208c831684528452808320918516835292522054801561131c57606461130b8288613539565b6113159190613471565b9550611329565b6000955050505050611338565b84600101945050505050611193565b50600085815260056020526040902060068101829055805460029091015461136b916001600160a01b0316908390611eac565b6000858152600560209081526040918290205482518881529182018590529181018390526001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89060600160405180910390a25050505050505050565b606081806001600160401b038111156113ed576113ed613498565b604051908082528060200260200182016040528015611416578160200160208202803683370190505b50915060005b81811015611487576002600086868481811061143a5761143a6134ae565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061146f5761146f6134ae565b9115156020928302919091019091015260010161141c565b505092915050565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ff9190613404565b6001600160a01b0316336001600160a01b03161461152f5760405162461bcd60e51b81526004016107fd90613421565b6004805463ffffffff909216650100000000000268ffffffff000000000019909216919091179055565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c99190613404565b6001600160a01b0316336001600160a01b0316146115f95760405162461bcd60e51b81526004016107fd90613421565b6000805460ff19166001179055565b6001818154811061161857600080fd5b600091825260209091200154905081565b6060816000816001600160401b0381111561164657611646613498565b60405190808252806020026020018201604052801561167957816020015b60608152602001906001900390816116645790505b50905060005b82811015610f735761169c868683818110610f4257610f426134ae565b6040516020016116ac919061303a565b6040516020818303038152906040528282815181106116cd576116cd6134ae565b602090810291909101015260010161167f565b6000805160206136978339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117509190613404565b6001600160a01b0316336001600160a01b0316146117805760405162461bcd60e51b81526004016107fd90613421565b61178b823383612396565b5050565b60608080808085806001600160401b038111156117ae576117ae613498565b6040519080825280602002602001820160405280156117d7578160200160208202803683370190505b509550806001600160401b038111156117f2576117f2613498565b60405190808252806020026020018201604052801561181b578160200160208202803683370190505b509450806001600160401b0381111561183657611836613498565b60405190808252806020026020018201604052801561185f578160200160208202803683370190505b509350806001600160401b0381111561187a5761187a613498565b6040519080825280602002602001820160405280156118a3578160200160208202803683370190505b509250806001600160401b038111156118be576118be613498565b6040519080825280602002602001820160405280156118e7578160200160208202803683370190505b50915060005b81811015611ab657600560008a8a8481811061190b5761190b6134ae565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b0316878281518110611949576119496134ae565b60200260200101906001600160a01b031690816001600160a01b031681525050600560008a8a8481811061197f5761197f6134ae565b905060200201358152602001908152602001600020600101548682815181106119aa576119aa6134ae565b602002602001018181525050600560008a8a848181106119cc576119cc6134ae565b905060200201358152602001908152602001600020600601548582815181106119f7576119f76134ae565b602002602001018181525050600560008a8a84818110611a1957611a196134ae565b90506020020135815260200190815260200160002060080154848281518110611a4457611a446134ae565b602002602001018181525050600560008a8a84818110611a6657611a666134ae565b90506020020135815260200190815260200160002060070160009054906101000a900460ff16838281518110611a9e57611a9e6134ae565b911515602092830291909101909101526001016118ed565b50509295509295909350565b826001600160a01b0381163314611b8c57604051636d6d50a160e11b81523360048201526000805160206136978339815191529063dadaa14290602401602060405180830381865afa158015611b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b409190613590565b611b8c5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107fd565b6000805160206136978339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190613590565b15611c3c5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107fd565b60005460ff1615611c785760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107fd565b60045460ff161515600003611d435760405163242aefad60e21b81526001600160a01b0385166004820152731e79da4f709db18e4c3de214d29f0d7b45f986ea906390abbeb490602401602060405180830381865afa158015611cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d039190613590565b611d435760405162461bcd60e51b815260206004820152601160248201527004e6f7420496e20546573742047726f757607c1b60448201526064016107fd565b611d4e8484846124c7565b50505050565b60405163ca1642e160e01b815263ffffffff8216600482015260009073258f9ead08d35955fc80678658d9cdfd36f985639063ca1642e190602401602060405180830381865afa158015611dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2591906135b2565b6000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e409190613404565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e7a57600080fd5b505af1158015611e8e573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b81156122bf578082106120c4576000805160206136978339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190613404565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000001460048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b158015611f9557600080fd5b505af1158015611fa9573d6000803e3d6000fd5b505050505060008183611fbc9190613485565b90508015611d4e576000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120349190613404565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000001460048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b1580156120a657600080fd5b505af11580156120ba573d6000803e3d6000fd5b5050505050505050565b6000805160206136978339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121349190613404565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000001460048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050600082826121c79190613485565b90506000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122399190613404565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000146040518363ffffffff1660e01b815260040161228791815260200190565b6000604051808303818588803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b505050505050505050565b6000805160206136978339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561230b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232f9190613404565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000146040518363ffffffff1660e01b815260040161237d91815260200190565b6000604051808303818588803b1580156120a657600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123f291906135cb565b6000604051808303816000865af19150503d806000811461242f576040519150601f19603f3d011682016040523d82523d6000602084013e612434565b606091505b509150915081801561245e57508051158061245e57508080602001905181019061245e9190613590565b6124c05760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107fd565b5050505050565b6000808080806124d9868801886135e7565b9450945094509450945060008460ff161180156124fa5750600560ff851611155b61253a5760405162461bcd60e51b81526020600482015260116024820152704552523a20494e56414c49442052554e5360781b60448201526064016107fd565b60045460009061255c9065010000000000900463ffffffff1660ff871661363e565b6004546125749190610100900463ffffffff1661365d565b9050600061258182611d54565b9050803410156125c55760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107fd565b6125ce85610f7c565b15156001146126165760405162461bcd60e51b81526020600482015260146024820152731154948e88125395905312510811d0535148125160621b60448201526064016107fd565b60ff871660009081526007602090815260408083206001845282528083206002845290915290205461268a5760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c494420444946464943554c545900000000000000000060448201526064016107fd565b60006126968234613485565b90506000612710600654836126ab9190613539565b6126b59190613471565b90506126c281878e612894565b600087815260056020526040902080546001600160a01b0319166001600160a01b038e161781556001018290556126f98183613485565b60008881526005602052604090206002810191909155600301805460ff8a811661ffff199092168217610100918d1691909102179091556001600160401b0381111561274757612747613498565b604051908082528060200260200182016040528015612770578160200160208202803683370190505b5060056000898152602001908152602001600020600401908051906020019061279a929190612da1565b508760ff166001600160401b038111156127b6576127b6613498565b6040519080825280602002602001820160405280156127df578160200160208202803683370190505b50600088815260056020818152604090922083516128039491909201920190612da1565b506000878152600560205260409020426008909101556128238c8861293e565b61282d8c83612a32565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c78860405161286891815260200190565b60405180910390a26128868761287f8a60026134c4565b8787612b30565b505050505050505050505050565b6000805160206136978339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129049190613404565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e590859060440161237d565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000146024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b1580156129ce57600080fd5b505af11580156129e2573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000805160206136978339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190613404565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000146044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612b1457600080fd5b505af1158015612b28573d6000803e3d6000fd5b505050505050565b600073258f9ead08d35955fc80678658d9cdfd36f9856363f09cdf37612b5584611d54565b6040516001600160e01b031960e084901b1681526004810187905260ff8816602482015263ffffffff8616604482015260640160206040518083038185885af1158015612ba6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bcb9190613679565b6001600160401b03811660009081526003602052604090205490915015612c275760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107fd565b6001600160401b038116600090815260036020908152604091829020879055815160016264c53160e01b0319815291516000805160206136978339815191529263ff9b3acf9260048083019391928290030181865afa158015612c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb29190613404565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612cec57600080fd5b505af1158015612d00573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d4585604051612d3591815260200190565b60405180910390a15050505050565b60405180610120016040528060006001600160a01b0316815260200160008152602001600060ff168152602001600060ff168152602001606081526020016060815260200160008152602001600015158152602001600081525090565b82805482825590600052602060002090601f01602090048101928215612e375791602002820160005b83821115612e0857835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302612dca565b8015612e355782816101000a81549060ff0219169055600101602081600001049283019260010302612e08565b505b50612e43929150612e47565b5090565b5b80821115612e435760008155600101612e48565b600060208284031215612e6e57600080fd5b5035919050565b600060208284031215612e8757600080fd5b813563ffffffff81168114612e9b57600080fd5b9392505050565b60008060408385031215612eb557600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b82811015612ef6578151865260209586019590910190600101612ed8565b5093949350505050565b602081526000612e9b6020830184612ec4565b6001600160a01b0381168114612f2857600080fd5b50565b60008060408385031215612f3e57600080fd5b8235612f4981612f13565b946020939093013593505050565b600081518084526020840193506020830160005b82811015612ef657815160ff16865260209586019590910190600101612f6b565b80516001600160a01b031682526020810151602083015260006040820151612fb9604085018260ff169052565b506060820151612fce606085018260ff169052565b5060808201516101206080850152612fea610120850182612f57565b905060a083015184820360a08601526130038282612f57565b91505060c083015160c085015260e083015161302360e086018215159052565b506101008301516101008501528091505092915050565b602081526000612e9b6020830184612f8c565b60008083601f84011261305f57600080fd5b5081356001600160401b0381111561307657600080fd5b6020830191508360208260051b850101111561309157600080fd5b9250929050565b600080602083850312156130ab57600080fd5b82356001600160401b038111156130c157600080fd5b6130cd8582860161304d565b90969095509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561313257603f1987860301845261311d858351612f8c565b94506020938401939190910190600101613101565b50929695505050505050565b803560ff8116811461314f57600080fd5b919050565b60008060006060848603121561316957600080fd5b6131728461313e565b92506131806020850161313e565b915061318e6040850161313e565b90509250925092565b6001600160401b0381168114612f2857600080fd5b6000806000604084860312156131c157600080fd5b83356131cc81613197565b925060208401356001600160401b038111156131e757600080fd5b6131f38682870161304d565b9497909650939450505050565b600081518084526020840193506020830160005b82811015612ef65781511515865260209586019590910190600101613214565b602081526000612e9b6020830184613200565b60005b8381101561326257818101518382015260200161324a565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561313257603f19878603018452815180518087526132bc816020890160208501613247565b601f01601f19169590950160209081019550938401939190910190600101613293565b60a08082528651908201819052600090602088019060c0840190835b818110156133225783516001600160a01b03168352602093840193909201916001016132fb565b505083810360208501526133368189612ec4565b915050828103604084015261334b8187612ec4565b9050828103606084015261335f8186612ec4565b905082810360808401526133738185613200565b98975050505050505050565b60008060006040848603121561339457600080fd5b833561339f81612f13565b925060208401356001600160401b038111156133ba57600080fd5b8401601f810186136133cb57600080fd5b80356001600160401b038111156133e157600080fd5b8660208284010111156133f357600080fd5b939660209190910195509293505050565b60006020828403121561341657600080fd5b8151612e9b81612f13565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008261348057613480613445565b500490565b81810381811115610c2557610c2561345b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60ff81811683821602908116908181146134e0576134e061345b565b5092915050565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b0383111561351e57600080fd5b8260051b808560808501379190910160800195945050505050565b8082028115828204841417610c2557610c2561345b565b60008261355f5761355f613445565b500690565b80820180821115610c2557610c2561345b565b60ff8181168382160190811115610c2557610c2561345b565b6000602082840312156135a257600080fd5b81518015158114612e9b57600080fd5b6000602082840312156135c457600080fd5b5051919050565b600082516135dd818460208701613247565b9190910192915050565b600080600080600060a086880312156135ff57600080fd5b6136088661313e565b94506136166020870161313e565b935060408601359250606086013561362d81612f13565b949793965091946080013592915050565b63ffffffff81811683821602908116908181146134e0576134e061345b565b63ffffffff8181168382160190811115610c2557610c2561345b565b60006020828403121561368b57600080fd5b8151612e9b8161319756fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212203f5d097178f1296b05e371a3d1175201b7feca75e3990a64b01333047a1c71c164736f6c634300081c0033

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

0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

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

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


Deployed Bytecode Sourcemap

13925:14865:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7410:70;;;;;;;;;;;;;:::i;:::-;;12397:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;287:32:1;;;269:51;;257:2;242:18;12397:91:0;;;;;;;;15122:40;;;;;;;;;;-1:-1:-1;15122:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15122:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1085:32:1;;;1067:51;;1149:2;1134:18;;1127:34;;;;1177:18;;;1170:34;;;;1252:4;1240:17;;;1235:2;1220:18;;1213:45;1295:17;;1289:3;1274:19;;1267:46;1105:3;1329:19;;1322:35;1401:14;1394:22;1388:3;1373:19;;1366:51;1448:3;1433:19;;1426:35;1054:3;1039:19;15122:40:0;738:729:1;21372:260:0;;;;;;;;;;-1:-1:-1;21372:260:0;;;;;:::i;:::-;;:::i;21640:94::-;;;;;;;;;;-1:-1:-1;21640:94:0;;;;;:::i;:::-;;:::i;15216:32::-;;;;;;;;;;;;;;;;;;;1899:25:1;;;1887:2;1872:18;15216:32:0;1753:177:1;7200:126:0;;;;;;;;;;;;;:::i;12962:409::-;;;;;;;;;;-1:-1:-1;12962:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14058:32::-;;;;;;;;;;-1:-1:-1;14058:32:0;;;;;;;;;;;;;;3151:10:1;3139:23;;;3121:42;;3109:2;3094:18;14058:32:0;2977:192:1;7488:155:0;;;;;;;;;;-1:-1:-1;7488:155:0;;;;;:::i;:::-;;:::i;26479:600::-;;;;;;;;;;-1:-1:-1;26479:600:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1081:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1081:107:0;;27087:413;;;;;;;;;;-1:-1:-1;27087:413:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13989:34::-;;;;;;;;;;;;14022:1;13989:34;;;;;7484:4:1;7472:17;;;7454:36;;7442:2;7427:18;13989:34:0;7312:184:1;12496:135:0;;;;;;;;;;-1:-1:-1;12496:135:0;;;;;:::i;:::-;;:::i;:::-;;;7666:14:1;;7659:22;7641:41;;7629:2;7614:18;12496:135:0;7501:187:1;15441:45:0;;;;;;;;;;;;15480:6;15441:45;;6233:26;;;;;;;;;;-1:-1:-1;6233:26:0;;;;;;;;15322:85;;;;;;;;;;-1:-1:-1;15322:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24081:2390;;;;;;;;;;-1:-1:-1;24081:2390:0;;;;;:::i;:::-;;:::i;12639:315::-;;;;;;;;;;-1:-1:-1;12639:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21742:103::-;;;;;;;;;;-1:-1:-1;21742:103:0;;;;;:::i;:::-;;:::i;7334:68::-;;;;;;;;;;;;;:::i;6306:28::-;;;;;;;;;;-1:-1:-1;6306:28:0;;;;;:::i;:::-;;:::i;27508:370::-;;;;;;;;;;-1:-1:-1;27508:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6138:40::-;;;;;;;;;;;;;;;7651:143;;;;;;;;;;-1:-1:-1;7651:143:0;;;;;:::i;:::-;;:::i;27886:901::-;;;;;;;;;;-1:-1:-1;27886:901:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;8402:382::-;;;;;;:::i;:::-;;:::i;13379:102::-;;;;;;;;;;-1:-1:-1;13455:11:0;:18;13379:102;;14097:35;;;;;;;;;;-1:-1:-1;14097:35:0;;;;;;;;;;;1195:75;;;;;;;;;;;;1228:42;1195:75;;6073:32;;;;;;;;;;;;;;;8148:141;;;;;;;;;;-1:-1:-1;8148:141:0;;;;;:::i;:::-;;:::i;7410:70::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;;;;;;;;;7467:5:::1;7458:14:::0;;-1:-1:-1;;7458:14:0::1;::::0;;7410:70::o;12397:91::-;12438:7;-1:-1:-1;;;;;;;;;;;;;;;;12465:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12458:22;;12397:91;:::o;21372:260::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;21484:16:::1;21499:1;15480:6;21484:16;:::i;:::-;21469:11;:31;;21447:98;;;::::0;-1:-1:-1;;;21447:98:0;;14408:2:1;21447:98:0::1;::::0;::::1;14390:21:1::0;14447:2;14427:18;;;14420:30;-1:-1:-1;;;14466:18:1;;;14459:47;14523:18;;21447:98:0::1;14206:341:1::0;21447:98:0::1;21556:11;:25:::0;;;21597:27:::1;::::0;1899:25:1;;;21597:27:0::1;::::0;1887:2:1;1872:18;21597:27:0::1;;;;;;;21372:260:::0;:::o;21640:94::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;21707:8:::1;:19:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;21707:19:0;;::::1;::::0;;;::::1;::::0;;21640:94::o;7200:126::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;7256:9:::1;::::0;::::1;;:18;7248:43;;;::::0;-1:-1:-1;;;7248:43:0;;14754:2:1;7248:43:0::1;::::0;::::1;14736:21:1::0;14793:2;14773:18;;;14766:30;-1:-1:-1;;;14812:18:1;;;14805:42;14864:18;;7248:43:0::1;14552:336:1::0;7248:43:0::1;7302:9;:16:::0;;-1:-1:-1;;7302:16:0::1;7314:4;7302:16;::::0;;7200:126::o;12962:409::-;13081:11;:18;13042:16;;13075:24;;13071:81;;;13122:11;:18;;-1:-1:-1;13071:81:0;13162:20;13199:11;13205:5;13199:3;:11;:::i;:::-;-1:-1:-1;;;;;13185:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13185:26:0;-1:-1:-1;13162:49:0;-1:-1:-1;13236:5:0;13222:121;13247:3;13243:1;:7;13222:121;;;13285:11;13297:1;13285:14;;;;;;;;:::i;:::-;;;;;;;;;13268:3;13276:5;13272:1;:9;;;;:::i;:::-;13268:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;13326:3;;13222:121;;;-1:-1:-1;13360:3:0;-1:-1:-1;12962:409:0;;;;;:::o;7488:155::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;7568:6:::1;7587:2;-1:-1:-1::0;;;;;7579:16:0::1;7603:6;7579:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7567:47;;;7633:1;7625:10;;;::::0;::::1;;7556:87;7488:155:::0;;:::o;26479:600::-;26547:25;;:::i;:::-;26598:473;;;;;;;;-1:-1:-1;26640:13:0;;;:5;:13;;;;;;;:20;;-1:-1:-1;;;;;26640:20:0;26598:473;;26640:20;26686:23;;;26598:473;;;;26733:21;;;;;;;;26598:473;;;;26640:20;26781:24;;;;26598:473;;;;26834:13;;;;;;;:26;;;;26598:473;;;;;;;;;;;;;;;;;;;;;;;;;;;26834:26;26598:473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26889:5;:13;26895:6;26889:13;;;;;;;;;;;:26;;26598:473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26598:473:0;;;-1:-1:-1;;26943:13:0;;;;:5;26598:473;26943:13;;;;;;;:20;;;;26598:473;;;;26988:22;;;;;;26598:473;;;;;;;;;27036:13;;;;;;:23;;;;;26598:473;;;;;;;;-1:-1:-1;26591:480:0;26479:600::o;27087:413::-;27171:27;27228:7;27217:8;27228:7;-1:-1:-1;;;;;27292:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;27253:68;;27347:6;27342:123;27363:3;27359:1;:7;27342:123;;;27398:23;27410:7;;27418:1;27410:10;;;;;;;:::i;:::-;;;;;;;27398:11;:23::i;:::-;27384:8;27393:1;27384:11;;;;;;;;:::i;:::-;;;;;;;;;;:37;27448:3;;27342:123;;;-1:-1:-1;27484:8:0;27087:413;-1:-1:-1;;;;27087:413:0:o;12496:135::-;12556:4;12580:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;12613:10:0;;;12496:135::o;24081:2390::-;-1:-1:-1;;;;;;;;;;;;;;;;1641:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1627:27:0;:10;-1:-1:-1;;;;;1627:27:0;;:51;;;-1:-1:-1;1658:10:0;1228:42;1658:20;1627:51;1605:118;;;;-1:-1:-1;;;1605:118:0;;15702:2:1;1605:118:0;;;15684:21:1;15741:2;15721:18;;;15714:30;-1:-1:-1;;;15760:18:1;;;15753:47;15817:18;;1605:118:0;15500:341:1;1605:118:0;-1:-1:-1;;;;;12357:24:0;;24262:14:::1;12357:24:::0;;;:13;:24;;;;;;;;;24338:13;;;:5:::1;:13:::0;;;;;;:21:::1;::::0;::::1;::::0;;::::1;::::0;::::1;24389:24:::0;::::1;;24457:25;12357:24:::0;24457:14:::1;:25::i;:::-;24554:11:::0;;;:63:::1;;-1:-1:-1::0;24615:1:0::1;24583:13:::0;;;:5:::1;:13;::::0;;;;:20;-1:-1:-1;;;;;24583:20:0::1;:34:::0;24554:63:::1;:111;;;-1:-1:-1::0;24635:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;24554:111;:141;;;-1:-1:-1::0;24682:13:0::1;::::0;::::1;::::0;24554:141:::1;:192;;;-1:-1:-1::0;24734:12:0::1;:8:::0;24745:1:::1;24734:12;:::i;:::-;24712:34;;::::0;::::1;;24554:192;24536:325;;;24778:50;24797:9;24808:6;24816:11;;24778:50;;;;;;;;;:::i;:::-;;;;;;;;24843:7;;;7556:87;7488:155:::0;;:::o;24536:325::-:1;24904:13;::::0;;;:5:::1;:13;::::0;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;24904:29:0::1;24929:4;24904:29:::0;;::::1;::::0;;;25013:23:::1;::::0;;;;25202:942:::1;25223:8;25219:12;;:1;:12;25202:942;;;25300:17;25349:1;25328:11:::0;;25340:5:::1;:1:::0;25344::::1;25340:5;:::i;:::-;25328:18;;;;;;;:::i;:::-;;;;;;;:22;;;;:::i;:::-;25326:30;::::0;25355:1:::1;25326:30;:::i;:::-;25300:57:::0;-1:-1:-1;25372:17:0::1;25427:1;25400:11:::0;;25413:5:::1;:1:::0;25417::::1;25413:5;:::i;:::-;25412:11;::::0;25422:1:::1;25412:11;:::i;:::-;25400:24;;;;;;;:::i;:::-;;;;;;;:28;;;;:::i;:::-;25398:36;::::0;25433:1:::1;25398:36;:::i;:::-;25372:63:::0;-1:-1:-1;25489:16:0::1;25510:25;25372:63:::0;25510:11;:25:::1;:::i;:::-;25592:13;::::0;;;:5:::1;:13;::::0;;;;:26:::1;;:29:::0;;25489:48;;-1:-1:-1;25624:11:0;;25619:1;;25592:29;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;25682:11;25650:5;:13;25656:6;25650:13;;;;;;;;;;;:26;;25677:1;25650:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;:43:::0;;:29;;;;:43:::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;25731:19;;::::1;::::0;;:7:::1;:19:::0;;;;;;:29;;::::1;::::0;;;;;;;:41;;::::1;::::0;;;;;;25846:14;;25842:259:::1;;25930:3;25899:26;25915:10:::0;25899:13;:26:::1;:::i;:::-;25897:36;;;;:::i;:::-;25881:52;;25842:259;;;26060:1;26044:17;;26080:5;;;;;;25842:259;26127:3;;;;;25234:910;;;;25202:942;;;-1:-1:-1::0;26185:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:20:::1;::::0;::::1;:36:::0;;;26275:20;;26312:28:::1;::::0;;::::1;::::0;26261:80:::1;::::0;-1:-1:-1;;;;;26275:20:0::1;::::0;26208:13;;26261::::1;:80::i;:::-;26403:13;::::0;;;:5:::1;:13;::::0;;;;;;;;:20;26393:70;;17467:25:1;;;17508:18;;;17501:34;;;17551:18;;;17544:34;;;-1:-1:-1;;;;;26403:20:0;;::::1;::::0;26393:70:::1;::::0;17455:2:1;17440:18;26393:70:0::1;;;;;;;24210:2261;;;;;24081:2390:::0;;;:::o;12639:315::-;12721:20;12765:7;;-1:-1:-1;;;;;12799:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12799:15:0;;12790:24;;12830:6;12825:122;12846:3;12842:1;:7;12825:122;;;12879:12;:24;12892:7;;12900:1;12892:10;;;;;;;:::i;:::-;;;;;;;12879:24;;;;;;;;;;;;;;;;;;;;;12867:6;12874:1;12867:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;12930:3;;12825:122;;;;12743:211;12639:315;;;;:::o;21742:103::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;21813:11:::1;:24:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;21813:24:0;;::::1;::::0;;;::::1;::::0;;21742:103::o;7334:68::-;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;7381:6:::1;:13:::0;;-1:-1:-1;;7381:13:0::1;7390:4;7381:13;::::0;;7334:68::o;6306:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6306:28:0;:::o;27508:370::-;27594:14;27632:7;27621:8;27632:7;-1:-1:-1;;;;;27683:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27657:42;;27715:6;27710:135;27731:3;27727:1;:7;27710:135;;;27777:23;27789:7;;27797:1;27789:10;;;;;;;:::i;27777:23::-;27766:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;27752:8;27761:1;27752:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;27828:3;;27710:135;;7651:143;-1:-1:-1;;;;;;;;;;;;;;;;1347:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1333:29:0;:10;-1:-1:-1;;;;;1333:29:0;;1311:89;;;;-1:-1:-1;;;1311:89:0;;;;;;;:::i;:::-;7732:54:::1;7760:5;7767:10;7779:6;7732:27;:54::i;:::-;7651:143:::0;;:::o;27886:901::-;27986:24;;;;;28192:7;;-1:-1:-1;;;;;28227:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28227:18:0;;28217:28;;28285:3;-1:-1:-1;;;;;28271:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28271:18:0;;28256:33;;28329:3;-1:-1:-1;;;;;28315:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28315:18:0;;28300:33;;28371:3;-1:-1:-1;;;;;28357:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28357:18:0;;28344:31;;28409:3;-1:-1:-1;;;;;28398:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28398:15:0;;28386:27;;28431:6;28426:354;28447:3;28443:1;:7;28426:354;;;28481:5;:17;28487:7;;28495:1;28487:10;;;;;;;:::i;:::-;;;;;;;28481:17;;;;;;;;;;;:24;;;;;;;;;;-1:-1:-1;;;;;28481:24:0;28468:7;28476:1;28468:10;;;;;;;;:::i;:::-;;;;;;:37;-1:-1:-1;;;;;28468:37:0;;;-1:-1:-1;;;;;28468:37:0;;;;;28538:5;:17;28544:7;;28552:1;28544:10;;;;;;;:::i;:::-;;;;;;;28538:17;;;;;;;;;;;:27;;;28520:12;28533:1;28520:15;;;;;;;;:::i;:::-;;;;;;:45;;;;;28598:5;:17;28604:7;;28612:1;28604:10;;;;;;;:::i;:::-;;;;;;;28598:17;;;;;;;;;;;:24;;;28580:12;28593:1;28580:15;;;;;;;;:::i;:::-;;;;;;:42;;;;;28653:5;:17;28659:7;;28667:1;28659:10;;;;;;;:::i;:::-;;;;;;;28653:17;;;;;;;;;;;:27;;;28637:10;28648:1;28637:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;28710:5;:17;28716:7;;28724:1;28716:10;;;;;;;:::i;:::-;;;;;;;28710:17;;;;;;;;;;;:26;;;;;;;;;;;;28695:9;28705:1;28695:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;28763:3;;28426:354;;;;28170:617;27886:901;;;;;;;;:::o;8402:382::-;8498:6;-1:-1:-1;;;;;1806:20:0;;1816:10;1806:20;1802:182;;1869:36;;-1:-1:-1;;;1869:36:0;;1894:10;1869:36;;;269:51:1;-1:-1:-1;;;;;;;;;;;1145:42:0;1869:24;;242:18:1;;1869:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1843:129;;;;-1:-1:-1;;;1843:129:0;;18073:2:1;1843:129:0;;;18055:21:1;18112:2;18092:18;;;18085:30;18151:33;18131:18;;;18124:61;18202:18;;1843:129:0;17871:355:1;1843:129:0;-1:-1:-1;;;;;;;;;;;;;;;;2065:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;2043:91;;;::::0;-1:-1:-1;;;2043:91:0;;18433:2:1;2043:91:0::1;::::0;::::1;18415:21:1::0;18472:2;18452:18;;;18445:30;-1:-1:-1;;;18491:18:1;;;18484:46;18547:18;;2043:91:0::1;18231:340:1::0;2043:91:0::1;8552:6:::2;::::0;::::2;;8551:7;8529:63;;;::::0;-1:-1:-1;;;8529:63:0;;18778:2:1;8529:63:0::2;::::0;::::2;18760:21:1::0;18817:1;18797:18;;;18790:29;-1:-1:-1;;;18835:18:1;;;18828:36;18881:18;;8529:63:0::2;18576:329:1::0;8529:63:0::2;8607:9;::::0;::::2;;:18;;:9;:18:::0;8603:112:::2;;8650:31;::::0;-1:-1:-1;;;8650:31:0;;-1:-1:-1;;;;;287:32:1;;8650:31:0::2;::::0;::::2;269:51:1::0;6558:42:0::2;::::0;8650:23:::2;::::0;242:18:1;;8650:31:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8642:61;;;::::0;-1:-1:-1;;;8642:61:0;;19112:2:1;8642:61:0::2;::::0;::::2;19094:21:1::0;19151:2;19131:18;;;19124:30;-1:-1:-1;;;19170:18:1;;;19163:47;19227:18;;8642:61:0::2;18910:341:1::0;8642:61:0::2;8749:27;8759:6;8767:8;;8749:9;:27::i;:::-;8402:382:::0;;;;:::o;8148:141::-;8238:43;;-1:-1:-1;;;8238:43:0;;3151:10:1;3139:23;;8238:43:0;;;3121:42:1;8211:7:0;;1228:42;;8238:27;;3094:18:1;;8238:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12027:224::-;-1:-1:-1;;;;;;;;;;;;;;;;12133:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12126:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;12219:24:0;;;;;:13;:24;;;;;12212:31;12027:224::o;8879:1929::-;8991:17;;8987:1814;;9100:14;9083:13;:31;9079:1550;;-1:-1:-1;;;;;;;;;;;;;;;;9470:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9456:145;;-1:-1:-1;;;9456:145:0;;9546:7;9456:145;;;19619:25:1;-1:-1:-1;;;;;19680:32:1;;;19660:18;;;19653:60;9456:44:0;;;;;;;9508:14;;19592:18:1;;9456:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9661:17;9697:14;9681:13;:30;;;;:::i;:::-;9661:50;-1:-1:-1;9734:13:0;;9730:175;;-1:-1:-1;;;;;;;;;;;;;;;;9834:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9827:58;;-1:-1:-1;;;9827:58:0;;9858:7;9827:58;;;19926:25:1;-1:-1:-1;;;;;19987:32:1;;;19967:18;;;19960:60;20036:18;;;20029:34;;;9827:30:0;;;;;;;19899:18:1;;9827:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9116:822;7556:87:::1;7488:155:::0;;:::o;9079:1550::-;-1:-1:-1;;;;;;;;;;;;;;;;10217:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10203:144;;-1:-1:-1;;;10203:144:0;;10292:7;10203:144;;;19619:25:1;-1:-1:-1;;;;;19680:32:1;;;19660:18;;;19653:60;10203:44:0;;;;;;;10255:13;;19592:18:1;;10203:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10427:17;10464:13;10447:14;:30;;;;:::i;:::-;10427:50;;-1:-1:-1;;;;;;;;;;;;;;;;10557:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10550:35:0;;10593:9;10605:7;10550:63;;;;;;;;;;;;;1899:25:1;;1887:2;1872:18;;1753:177;10550:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9944:685;7556:87:::1;7488:155:::0;;:::o;8987:1814::-;-1:-1:-1;;;;;;;;;;;;;;;;10728:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10721:35:0;;10764:14;10781:7;10721:68;;;;;;;;;;;;;1899:25:1;;1887:2;1872:18;;1753:177;10721:68:0;;;;;;;;;;;;;;;;;;;;3678:449;3910:45;;;-1:-1:-1;;;;;20266:32:1;;;3910:45:0;;;20248:51:1;20315:18;;;;20308:34;;;3910:45:0;;;;;;;;;;20221:18:1;;;;3910:45:0;;;;;;;-1:-1:-1;;;;;3910:45:0;-1:-1:-1;;;3910:45:0;;;3899:57;;-1:-1:-1;;;;3899:10:0;;;;:57;;3910:45;3899:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3863:93;;;;3989:7;:57;;;;-1:-1:-1;4001:11:0;;:16;;:44;;;4032:4;4021:24;;;;;;;;;;;;:::i;:::-;3967:152;;;;-1:-1:-1;;;3967:152:0;;20847:2:1;3967:152:0;;;20829:21:1;20886:2;20866:18;;;20859:30;20925:34;20905:18;;;20898:62;-1:-1:-1;;;20976:18:1;;;20969:43;21029:19;;3967:152:0;20645:409:1;3967:152:0;3785:342;;3678:449;;;:::o;21890:2117::-;22025:16;;;;;22175:63;;;;22186:8;22175:63;:::i;:::-;22010:228;;;;;;;;;;22281:1;22271:7;:11;;;:34;;;;-1:-1:-1;14022:1:0;22286:19;;;;;22271:34;22249:101;;;;-1:-1:-1;;;22249:101:0;;21851:2:1;22249:101:0;;;21833:21:1;21890:2;21870:18;;;21863:30;-1:-1:-1;;;21909:18:1;;;21902:47;21966:18;;22249:101:0;21649:341:1;22249:101:0;22410:11;;22363:21;;22400;;22410:11;;;;;22400:21;;;;:::i;:::-;22387:8;;:35;;;:8;;;;;:35;:::i;:::-;22363:59;;22465:14;22482:25;22492:14;22482:9;:25::i;:::-;22465:42;;22583:6;22570:9;:19;;22548:84;;;;-1:-1:-1;;;22548:84:0;;22618:2:1;22548:84:0;;;22600:21:1;22657:2;22637:18;;;22630:30;-1:-1:-1;;;22676:18:1;;;22669:45;22731:18;;22548:84:0;22416:339:1;22548:84:0;22665:21;22679:6;22665:13;:21::i;:::-;:29;;22690:4;22665:29;22643:99;;;;-1:-1:-1;;;22643:99:0;;22962:2:1;22643:99:0;;;22944:21:1;23001:2;22981:18;;;22974:30;-1:-1:-1;;;23020:18:1;;;23013:50;23080:18;;22643:99:0;22760:344:1;22643:99:0;22775:19;;;22803:1;22775:19;;;:7;:19;;;;;;;;22795:1;22775:22;;;;;;;22798:1;22775:25;;;;;;;;22753:102;;;;-1:-1:-1;;;22753:102:0;;23311:2:1;22753:102:0;;;23293:21:1;23350:2;23330:18;;;23323:30;23389:25;23369:18;;;23362:53;23432:18;;22753:102:0;23109:347:1;22753:102:0;22907:22;22932:18;22944:6;22932:9;:18;:::i;:::-;22907:43;;23011:25;15480:6;23058:11;;23041:14;:28;;;;:::i;:::-;23039:47;;;;:::i;:::-;23011:75;;23163:43;23175:17;23194:3;23199:6;23163:11;:43::i;:::-;23246:13;;;;:5;:13;;;;;:29;;-1:-1:-1;;;;;;23246:29:0;-1:-1:-1;;;;;23246:29:0;;;;;-1:-1:-1;23286:23:0;:40;;;23368:34;23385:17;23286:40;23368:34;:::i;:::-;23337:13;;;;:5;:13;;;;;:28;;;:65;;;;23413:21;;:31;;;;;;-1:-1:-1;;23455:37:0;;;;;23413:31;23455:37;;;;;;;;;;;-1:-1:-1;;;;;23532:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23532:20:0;;23503:5;:13;23509:6;23503:13;;;;;;;;;;;:26;;:49;;;;;;;;;;;;:::i;:::-;;23604:7;23592:20;;-1:-1:-1;;;;;23592:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23592:20:0;-1:-1:-1;23563:13:0;;;;:5;:13;;;;;;;;:49;;;;:26;;;;;:49;;;:::i;:::-;-1:-1:-1;23623:13:0;;;;:5;:13;;;;;23649:15;23623:23;;;;:41;23706:31;23722:6;23629;23706:15;:31::i;:::-;23775:36;23788:6;23796:14;23775:12;:36::i;:::-;23872:6;-1:-1:-1;;;;;23860:27:0;;23880:6;23860:27;;;;1899:25:1;;1887:2;1872:18;;1753:177;23860:27:0;;;;;;;;23932:67;23947:6;23955:11;:7;23965:1;23955:11;:::i;:::-;23968:14;23984;23932;:67::i;:::-;21968:2039;;;;;;;;;21890:2117;;;:::o;7964:172::-;-1:-1:-1;;;;;;;;;;;;;;;;8067:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8053:75;;-1:-1:-1;;;8053:75:0;;-1:-1:-1;;;;;23653:32:1;;;8053:75:0;;;23635:51:1;23722:32;;;23702:18;;;23695:60;8053:44:0;;;;;;;8105:9;;23608:18:1;;8053:75:0;23461:300:1;10897:272:0;11005:40;;-1:-1:-1;;;11005:40:0;;-1:-1:-1;;;;;23986:32:1;;;11005:40:0;;;23968:51:1;11029:7:0;24035:18:1;;;24028:34;24078:18;;;24071:34;;;11005:7:0;:15;;;;23941:18:1;;11005:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11099:11:0;:24;;;;;;;;;;;;-1:-1:-1;11134:20:0;;;:12;11099:24;11134:20;;;;;:27;;-1:-1:-1;;11134:27:0;;;;;;;-1:-1:-1;;;10897:272:0:o;7802:154::-;-1:-1:-1;;;;;;;;;;;;;;;;7891:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7874:74;;-1:-1:-1;;;7874:74:0;;-1:-1:-1;;;;;23986:32:1;;;7874:74:0;;;23968:51:1;24035:18;;;24028:34;;;7940:7:0;24078:18:1;;;24071:34;7874:51:0;;;;;;;23941:18:1;;7874:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7802:154;;:::o;11177:842::-;11353:16;1228:42;11372:32;11412:25;11422:14;11412:9;:25::i;:::-;11372:226;;-1:-1:-1;;;;;;11372:226:0;;;;;;;;;;24312:25:1;;;24385:4;24373:17;;24353:18;;;24346:45;11372:226:0;24427:23:1;;24407:18;;;24400:51;24285:18;;11372:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11682:24:0;;;;;;:13;:24;;;;;;11353:245;;-1:-1:-1;11682:29:0;11660:95;;;;-1:-1:-1;;;11660:95:0;;24918:2:1;11660:95:0;;;24900:21:1;24957:2;24937:18;;;24930:30;-1:-1:-1;;;24976:18:1;;;24969:46;25032:18;;11660:95:0;24716:340:1;11660:95:0;-1:-1:-1;;;;;11826:24:0;;;;;;:13;:24;;;;;;;;;:33;;;11909:15;;-1:-1:-1;;;;;;11909:15:0;;;;-1:-1:-1;;;;;;;;;;;1145:42:0;11909:13;;:15;;;;;11826:24;;11909:15;;;;;1145:42;11909:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11902:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11984:27;12004:6;11984:27;;;;1899:25:1;;1887:2;1872:18;;1753:177;11984:27:0;;;;;;;;11289:730;11177:842;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;331:226:1;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;-1:-1:-1;504:23:1;;331:226;-1:-1:-1;331:226:1:o;1472:276::-;1530:6;1583:2;1571:9;1562:7;1558:23;1554:32;1551:52;;;1599:1;1596;1589:12;1551:52;1638:9;1625:23;1688:10;1681:5;1677:22;1670:5;1667:33;1657:61;;1714:1;1711;1704:12;1657:61;1737:5;1472:276;-1:-1:-1;;;1472:276:1:o;1935:346::-;2003:6;2011;2064:2;2052:9;2043:7;2039:23;2035:32;2032:52;;;2080:1;2077;2070:12;2032:52;-1:-1:-1;;2125:23:1;;;2245:2;2230:18;;;2217:32;;-1:-1:-1;1935:346:1:o;2286:420::-;2339:3;2377:5;2371:12;2404:6;2399:3;2392:19;2436:4;2431:3;2427:14;2420:21;;2475:4;2468:5;2464:16;2498:1;2508:173;2522:6;2519:1;2516:13;2508:173;;;2583:13;;2571:26;;2626:4;2617:14;;;;2654:17;;;;2544:1;2537:9;2508:173;;;-1:-1:-1;2697:3:1;;2286:420;-1:-1:-1;;;;2286:420:1:o;2711:261::-;2890:2;2879:9;2872:21;2853:4;2910:56;2962:2;2951:9;2947:18;2939:6;2910:56;:::i;3174:131::-;-1:-1:-1;;;;;3249:31:1;;3239:42;;3229:70;;3295:1;3292;3285:12;3229:70;3174:131;:::o;3310:367::-;3378:6;3386;3439:2;3427:9;3418:7;3414:23;3410:32;3407:52;;;3455:1;3452;3445:12;3407:52;3494:9;3481:23;3513:31;3538:5;3513:31;:::i;:::-;3563:5;3641:2;3626:18;;;;3613:32;;-1:-1:-1;;;3310:367:1:o;3682:429::-;3733:3;3771:5;3765:12;3798:6;3793:3;3786:19;3830:4;3825:3;3821:14;3814:21;;3869:4;3862:5;3858:16;3892:1;3902:184;3916:6;3913:1;3910:13;3902:184;;;3981:13;;3996:4;3977:24;3965:37;;4031:4;4022:14;;;;4059:17;;;;3938:1;3931:9;3902:184;;4116:990;4214:12;;-1:-1:-1;;;;;80:31:1;68:44;;4281:4;4274:5;4270:16;4264:23;4257:4;4252:3;4248:14;4241:47;4177:3;4334:4;4327:5;4323:16;4317:23;4349:46;4389:4;4384:3;4380:14;4366:12;629:4;618:16;606:29;;562:75;4349:46;;4443:4;4436:5;4432:16;4426:23;4458:48;4500:4;4495:3;4491:14;4475;629:4;618:16;606:29;;562:75;4458:48;;4554:4;4547:5;4543:16;4537:23;4592:6;4585:4;4580:3;4576:14;4569:30;4620:60;4672:6;4667:3;4663:16;4647:14;4620:60;:::i;:::-;4608:72;;4728:4;4721:5;4717:16;4711:23;4776:3;4770:4;4766:14;4759:4;4754:3;4750:14;4743:38;4804:48;4847:4;4831:14;4804:48;:::i;:::-;4790:62;;;4901:4;4894:5;4890:16;4884:23;4877:4;4872:3;4868:14;4861:47;4956:4;4949:5;4945:16;4939:23;4971:47;5012:4;5007:3;5003:14;4987;712:13;705:21;693:34;;642:91;4971:47;;5069:6;5062:5;5058:18;5052:25;5043:6;5038:3;5034:16;5027:51;5094:6;5087:13;;;4116:990;;;;:::o;5111:291::-;5312:2;5301:9;5294:21;5275:4;5332:64;5392:2;5381:9;5377:18;5369:6;5332:64;:::i;5640:367::-;5703:8;5713:6;5767:3;5760:4;5752:6;5748:17;5744:27;5734:55;;5785:1;5782;5775:12;5734:55;-1:-1:-1;5808:20:1;;-1:-1:-1;;;;;5840:30:1;;5837:50;;;5883:1;5880;5873:12;5837:50;5920:4;5912:6;5908:17;5896:29;;5980:3;5973:4;5963:6;5960:1;5956:14;5948:6;5944:27;5940:38;5937:47;5934:67;;;5997:1;5994;5987:12;5934:67;5640:367;;;;;:::o;6012:437::-;6098:6;6106;6159:2;6147:9;6138:7;6134:23;6130:32;6127:52;;;6175:1;6172;6165:12;6127:52;6215:9;6202:23;-1:-1:-1;;;;;6240:6:1;6237:30;6234:50;;;6280:1;6277;6270:12;6234:50;6319:70;6381:7;6372:6;6361:9;6357:22;6319:70;:::i;:::-;6408:8;;6293:96;;-1:-1:-1;6012:437:1;-1:-1:-1;;;;6012:437:1:o;6454:853::-;6668:4;6716:2;6705:9;6701:18;6746:2;6735:9;6728:21;6769:6;6804;6798:13;6835:6;6827;6820:22;6873:2;6862:9;6858:18;6851:25;;6935:2;6925:6;6922:1;6918:14;6907:9;6903:30;6899:39;6885:53;;6973:2;6965:6;6961:15;6994:1;7004:274;7018:6;7015:1;7012:13;7004:274;;;7111:2;7107:7;7095:9;7087:6;7083:22;7079:36;7074:3;7067:49;7139:59;7191:6;7182;7176:13;7139:59;:::i;:::-;7129:69;-1:-1:-1;7233:2:1;7256:12;;;;7221:15;;;;;7040:1;7033:9;7004:274;;;-1:-1:-1;7295:6:1;;6454:853;-1:-1:-1;;;;;;6454:853:1:o;7693:156::-;7759:20;;7819:4;7808:16;;7798:27;;7788:55;;7839:1;7836;7829:12;7788:55;7693:156;;;:::o;7854:322::-;7925:6;7933;7941;7994:2;7982:9;7973:7;7969:23;7965:32;7962:52;;;8010:1;8007;8000:12;7962:52;8033:27;8050:9;8033:27;:::i;:::-;8023:37;;8079:36;8111:2;8100:9;8096:18;8079:36;:::i;:::-;8069:46;;8134:36;8166:2;8155:9;8151:18;8134:36;:::i;:::-;8124:46;;7854:322;;;;;:::o;8181:129::-;-1:-1:-1;;;;;8259:5:1;8255:30;8248:5;8245:41;8235:69;;8300:1;8297;8290:12;8315:570;8409:6;8417;8425;8478:2;8466:9;8457:7;8453:23;8449:32;8446:52;;;8494:1;8491;8484:12;8446:52;8533:9;8520:23;8552:30;8576:5;8552:30;:::i;:::-;8601:5;-1:-1:-1;8657:2:1;8642:18;;8629:32;-1:-1:-1;;;;;8673:30:1;;8670:50;;;8716:1;8713;8706:12;8670:50;8755:70;8817:7;8808:6;8797:9;8793:22;8755:70;:::i;:::-;8315:570;;8844:8;;-1:-1:-1;8729:96:1;;-1:-1:-1;;;;8315:570:1:o;8890:433::-;8940:3;8978:5;8972:12;9005:6;9000:3;8993:19;9037:4;9032:3;9028:14;9021:21;;9076:4;9069:5;9065:16;9099:1;9109:189;9123:6;9120:1;9117:13;9109:189;;;9198:13;;9191:21;9184:29;9172:42;;9243:4;9234:14;;;;9271:17;;;;9145:1;9138:9;9109:189;;9328:252;9501:2;9490:9;9483:21;9464:4;9521:53;9570:2;9559:9;9555:18;9547:6;9521:53;:::i;9585:250::-;9670:1;9680:113;9694:6;9691:1;9688:13;9680:113;;;9770:11;;;9764:18;9751:11;;;9744:39;9716:2;9709:10;9680:113;;;-1:-1:-1;;9827:1:1;9809:16;;9802:27;9585:250::o;9840:991::-;10000:4;10048:2;10037:9;10033:18;10078:2;10067:9;10060:21;10101:6;10136;10130:13;10167:6;10159;10152:22;10205:2;10194:9;10190:18;10183:25;;10267:2;10257:6;10254:1;10250:14;10239:9;10235:30;10231:39;10217:53;;10305:2;10297:6;10293:15;10326:1;10336:466;10350:6;10347:1;10344:13;10336:466;;;10443:2;10439:7;10427:9;10419:6;10415:22;10411:36;10406:3;10399:49;10477:6;10471:13;10519:2;10513:9;10550:8;10542:6;10535:24;10572:74;10637:8;10632:2;10624:6;10620:15;10615:2;10611;10607:11;10572:74;:::i;:::-;10712:2;10689:17;-1:-1:-1;;10685:31:1;10673:44;;;;10719:2;10669:53;;;;-1:-1:-1;10780:12:1;;;;10745:15;;;;;10372:1;10365:9;10336:466;;11067:1424;11563:3;11576:22;;;11647:13;;11548:19;;;11669:22;;;11515:4;;11761;11749:17;;;11722:3;11707:19;;;11515:4;11794:199;11808:6;11805:1;11802:13;11794:199;;;11873:13;;-1:-1:-1;;;;;11869:39:1;11857:52;;11938:4;11966:17;;;;11929:14;;;;11905:1;11823:9;11794:199;;;11798:3;;12040:9;12035:3;12031:19;12024:4;12013:9;12009:20;12002:49;12074:41;12111:3;12103:6;12074:41;:::i;:::-;12060:55;;;12163:9;12155:6;12151:22;12146:2;12135:9;12131:18;12124:50;12197:44;12234:6;12226;12197:44;:::i;:::-;12183:58;;12289:9;12281:6;12277:22;12272:2;12261:9;12257:18;12250:50;12323:44;12360:6;12352;12323:44;:::i;:::-;12309:58;;12416:9;12408:6;12404:22;12398:3;12387:9;12383:19;12376:51;12444:41;12478:6;12470;12444:41;:::i;:::-;12436:49;11067:1424;-1:-1:-1;;;;;;;;11067:1424:1:o;12496:721::-;12575:6;12583;12591;12644:2;12632:9;12623:7;12619:23;12615:32;12612:52;;;12660:1;12657;12650:12;12612:52;12699:9;12686:23;12718:31;12743:5;12718:31;:::i;:::-;12768:5;-1:-1:-1;12824:2:1;12809:18;;12796:32;-1:-1:-1;;;;;12840:30:1;;12837:50;;;12883:1;12880;12873:12;12837:50;12906:22;;12959:4;12951:13;;12947:27;-1:-1:-1;12937:55:1;;12988:1;12985;12978:12;12937:55;13028:2;13015:16;-1:-1:-1;;;;;13046:6:1;13043:30;13040:50;;;13086:1;13083;13076:12;13040:50;13131:7;13126:2;13117:6;13113:2;13109:15;13105:24;13102:37;13099:57;;;13152:1;13149;13142:12;13099:57;12496:721;;13183:2;13175:11;;;;;-1:-1:-1;13205:6:1;;-1:-1:-1;;;12496:721:1:o;13222:251::-;13292:6;13345:2;13333:9;13324:7;13320:23;13316:32;13313:52;;;13361:1;13358;13351:12;13313:52;13393:9;13387:16;13412:31;13437:5;13412:31;:::i;13478:334::-;13680:2;13662:21;;;13719:2;13699:18;;;13692:30;-1:-1:-1;;;13753:2:1;13738:18;;13731:40;13803:2;13788:18;;13478:334::o;13817:127::-;13878:10;13873:3;13869:20;13866:1;13859:31;13909:4;13906:1;13899:15;13933:4;13930:1;13923:15;13949:127;14010:10;14005:3;14001:20;13998:1;13991:31;14041:4;14038:1;14031:15;14065:4;14062:1;14055:15;14081:120;14121:1;14147;14137:35;;14152:18;;:::i;:::-;-1:-1:-1;14186:9:1;;14081:120::o;14893:128::-;14960:9;;;14981:11;;;14978:37;;;14995:18;;:::i;15026:127::-;15087:10;15082:3;15078:20;15075:1;15068:31;15118:4;15115:1;15108:15;15142:4;15139:1;15132:15;15158:127;15219:10;15214:3;15210:20;15207:1;15200:31;15250:4;15247:1;15240:15;15274:4;15271:1;15264:15;15846:225;15950:4;15929:12;;;15943;;;15925:31;15976:22;;;;16017:24;;;16007:58;;16045:18;;:::i;:::-;16007:58;15846:225;;;;:::o;16076:611::-;-1:-1:-1;;;;;16320:31:1;;16302:50;;16383:2;16368:18;;16361:34;;;16431:2;16426;16411:18;;16404:30;;;16450:18;;16443:34;;;-1:-1:-1;;;;;;16489:31:1;;16486:51;;;16533:1;16530;16523:12;16486:51;16567:6;16564:1;16560:14;16625:6;16617;16611:3;16600:9;16596:19;16583:49;16653:22;;;;16677:3;16649:32;;16076:611;-1:-1:-1;;;;;16076:611:1:o;16692:168::-;16765:9;;;16796;;16813:15;;;16807:22;;16793:37;16783:71;;16834:18;;:::i;16865:112::-;16897:1;16923;16913:35;;16928:18;;:::i;:::-;-1:-1:-1;16962:9:1;;16865:112::o;16982:125::-;17047:9;;;17068:10;;;17065:36;;;17081:18;;:::i;17112:148::-;17200:4;17179:12;;;17193;;;17175:31;;17218:13;;17215:39;;;17234:18;;:::i;17589:277::-;17656:6;17709:2;17697:9;17688:7;17684:23;17680:32;17677:52;;;17725:1;17722;17715:12;17677:52;17757:9;17751:16;17810:5;17803:13;17796:21;17789:5;17786:32;17776:60;;17832:1;17829;17822:12;19256:184;19326:6;19379:2;19367:9;19358:7;19354:23;19350:32;19347:52;;;19395:1;19392;19385:12;19347:52;-1:-1:-1;19418:16:1;;19256:184;-1:-1:-1;19256:184:1:o;20353:287::-;20482:3;20520:6;20514:13;20536:66;20595:6;20590:3;20583:4;20575:6;20571:17;20536:66;:::i;:::-;20618:16;;;;;20353:287;-1:-1:-1;;20353:287:1:o;21059:585::-;21158:6;21166;21174;21182;21190;21243:3;21231:9;21222:7;21218:23;21214:33;21211:53;;;21260:1;21257;21250:12;21211:53;21283:27;21300:9;21283:27;:::i;:::-;21273:37;;21329:36;21361:2;21350:9;21346:18;21329:36;:::i;:::-;21319:46;-1:-1:-1;21434:2:1;21419:18;;21406:32;;-1:-1:-1;21514:2:1;21499:18;;21486:32;21527:33;21486:32;21527:33;:::i;:::-;21059:585;;;;-1:-1:-1;21059:585:1;;21633:3;21618:19;21605:33;;21059:585;-1:-1:-1;;21059:585:1:o;21995:244::-;22106:10;22079:18;;;22099;;;22075:43;22138:28;;;;22185:24;;;22175:58;;22213:18;;:::i;22244:167::-;22339:10;22312:18;;;22332;;;22308:43;;22363:19;;22360:45;;;22385:18;;:::i;24462:249::-;24531:6;24584:2;24572:9;24563:7;24559:23;24555:32;24552:52;;;24600:1;24597;24590:12;24552:52;24632:9;24626:16;24651:30;24675:5;24651:30;:::i

Swarm Source

ipfs://3f5d097178f1296b05e371a3d1175201b7feca75e3990a64b01333047a1c71c1

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
0x6a48A513A46955D8622C809Fce876d2f11142003
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.