Overview
APE Balance
APE Value
$0.00Multichain Info
Latest 25 from a total of 2,396 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Play | 32795509 | 21 secs ago | IN | 20.0878539 APE | 0.07066951 | ||||
| Play | 32795495 | 41 secs ago | IN | 15.0878539 APE | 0.07066951 | ||||
| Play | 32795458 | 1 min ago | IN | 10.10249622 APE | 0.07068009 | ||||
| Play | 32795437 | 1 min ago | IN | 5.10249622 APE | 0.07067887 | ||||
| Play | 32795180 | 9 mins ago | IN | 19.5878539 APE | 0.07066951 | ||||
| Play | 32795171 | 9 mins ago | IN | 19.5878539 APE | 0.07066829 | ||||
| Play | 32795162 | 9 mins ago | IN | 14.5878539 APE | 0.07066951 | ||||
| Play | 32795136 | 10 mins ago | IN | 9.5878539 APE | 0.07066951 | ||||
| Play | 32795122 | 11 mins ago | IN | 4.60249622 APE | 0.07068009 | ||||
| Play | 32795103 | 11 mins ago | IN | 23.8878539 APE | 0.07066951 | ||||
| Play | 32795094 | 11 mins ago | IN | 18.8878539 APE | 0.07066951 | ||||
| Play | 32795076 | 12 mins ago | IN | 13.8878539 APE | 0.07066829 | ||||
| Play | 32795064 | 12 mins ago | IN | 8.90249622 APE | 0.07068009 | ||||
| Play | 32795052 | 13 mins ago | IN | 25.0878539 APE | 0.07066951 | ||||
| Play | 32795046 | 13 mins ago | IN | 15.0878539 APE | 0.07066829 | ||||
| Play | 32795042 | 13 mins ago | IN | 3.0878539 APE | 0.07067073 | ||||
| Play | 32795034 | 13 mins ago | IN | 5.10249622 APE | 0.07574257 | ||||
| Play | 32795032 | 13 mins ago | IN | 3.0878539 APE | 0.07573321 | ||||
| Play | 32795025 | 13 mins ago | IN | 3.0878539 APE | 0.07067073 | ||||
| Play | 32795019 | 14 mins ago | IN | 5.0878539 APE | 0.07066951 | ||||
| Play | 32795017 | 14 mins ago | IN | 3.0878539 APE | 0.07067073 | ||||
| Play | 32795012 | 14 mins ago | IN | 3.0878539 APE | 0.07067073 | ||||
| Play | 32795002 | 14 mins ago | IN | 3.0878539 APE | 0.07067073 | ||||
| Play | 32794994 | 14 mins ago | IN | 150.11713854 APE | 0.07066738 | ||||
| Play | 32794978 | 15 mins ago | IN | 150.11713854 APE | 0.07066626 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 32795510 | 20 secs ago | 19.6 APE | ||||
| 32795509 | 21 secs ago | 0.0878539 APE | ||||
| 32795509 | 21 secs ago | 0.4 APE | ||||
| 32795496 | 39 secs ago | 14.7 APE | ||||
| 32795495 | 41 secs ago | 0.0878539 APE | ||||
| 32795495 | 41 secs ago | 0.3 APE | ||||
| 32795459 | 1 min ago | 9.8 APE | ||||
| 32795458 | 1 min ago | 0.10249622 APE | ||||
| 32795458 | 1 min ago | 0.2 APE | ||||
| 32795441 | 1 min ago | 4.9 APE | ||||
| 32795437 | 1 min ago | 0.10249622 APE | ||||
| 32795437 | 1 min ago | 0.1 APE | ||||
| 32795182 | 9 mins ago | 19.11 APE | ||||
| 32795180 | 9 mins ago | 0.0878539 APE | ||||
| 32795180 | 9 mins ago | 0.39 APE | ||||
| 32795174 | 9 mins ago | 19.11 APE | ||||
| 32795171 | 9 mins ago | 0.0878539 APE | ||||
| 32795171 | 9 mins ago | 0.39 APE | ||||
| 32795163 | 9 mins ago | 14.21 APE | ||||
| 32795162 | 9 mins ago | 0.0878539 APE | ||||
| 32795162 | 9 mins ago | 0.29 APE | ||||
| 32795140 | 10 mins ago | 9.31 APE | ||||
| 32795136 | 10 mins ago | 0.0878539 APE | ||||
| 32795136 | 10 mins ago | 0.19 APE | ||||
| 32795124 | 11 mins ago | 4.41 APE |
Cross-Chain Transactions
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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
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.