Overview
APE Balance
APE Value
$682,555.15 (@ $0.22/APE)More Info
Private Name Tags
ContractCreator
TokenTracker
Multichain Info
Latest 25 from a total of 3,790 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 32407519 | 2 hrs ago | IN | 0 APE | 0.01442766 | ||||
| Deposit | 32406987 | 2 hrs ago | IN | 55 APE | 0.01058517 | ||||
| Withdraw | 32405941 | 3 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Deposit | 32400425 | 5 hrs ago | IN | 2 APE | 0.01058517 | ||||
| Deposit | 32397594 | 6 hrs ago | IN | 5,590 APE | 0.01058517 | ||||
| Withdraw | 32397195 | 6 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32397054 | 7 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32396790 | 7 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32396465 | 7 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32396338 | 7 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32395680 | 7 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Deposit | 32395120 | 7 hrs ago | IN | 455 APE | 0.01058517 | ||||
| Withdraw | 32395022 | 7 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32394950 | 8 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32394944 | 8 hrs ago | IN | 0 APE | 0.01320787 | ||||
| Withdraw | 32394928 | 8 hrs ago | IN | 0 APE | 0.01321031 | ||||
| Withdraw | 32394563 | 8 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32394412 | 8 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Withdraw | 32394227 | 8 hrs ago | IN | 0 APE | 0.01320909 | ||||
| Deposit | 32385962 | 14 hrs ago | IN | 1,000 APE | 0.01058517 | ||||
| Withdraw | 32382049 | 17 hrs ago | IN | 0 APE | 0.01320787 | ||||
| Deposit | 32374248 | 22 hrs ago | IN | 3.4 APE | 0.01058517 | ||||
| Withdraw | 32373547 | 23 hrs ago | IN | 0 APE | 0.01494787 | ||||
| Deposit | 32373316 | 23 hrs ago | IN | 1,019.42 APE | 0.01058517 | ||||
| Deposit | 32372375 | 23 hrs ago | IN | 1,000 APE | 0.01058517 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 32410189 | 7 secs ago | 25.5 APE | ||||
| 32410173 | 33 secs ago | 11.02211 APE | ||||
| 32410165 | 41 secs ago | 1.663 APE | ||||
| 32410151 | 1 min ago | 6.72 APE | ||||
| 32410145 | 1 min ago | 24 APE | ||||
| 32410077 | 4 mins ago | 1.92 APE | ||||
| 32410069 | 5 mins ago | 4.8 APE | ||||
| 32410063 | 5 mins ago | 4.8 APE | ||||
| 32410051 | 5 mins ago | 4.87 APE | ||||
| 32410047 | 6 mins ago | 4.08 APE | ||||
| 32410044 | 6 mins ago | 0.2928 APE | ||||
| 32410039 | 6 mins ago | 18.432 APE | ||||
| 32410037 | 6 mins ago | 9.6 APE | ||||
| 32410025 | 7 mins ago | 5.34999999 APE | ||||
| 32410011 | 7 mins ago | 0.30290666 APE | ||||
| 32409995 | 8 mins ago | 9.1696 APE | ||||
| 32409990 | 9 mins ago | 0.5846 APE | ||||
| 32409984 | 9 mins ago | 0.5846 APE | ||||
| 32409970 | 10 mins ago | 0.3904 APE | ||||
| 32409957 | 10 mins ago | 0.976 APE | ||||
| 32409949 | 10 mins ago | 0.1952 APE | ||||
| 32409913 | 12 mins ago | 1.2125 APE | ||||
| 32409910 | 12 mins ago | 0.28 APE | ||||
| 32409771 | 20 mins ago | 10.736 APE | ||||
| 32409759 | 20 mins ago | 25.376 APE |
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at apescan.io on 2025-07-16
*/
//SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
interface IGovernanceManager {
function RNG() external view returns (address);
function owner() external view returns (address);
function referralManager() external view returns (address);
function feeReceiver() external view returns (address);
function claimManager() external view returns (address);
function house() external view returns (address);
function isGame(address game) external view returns (bool);
function userInfoTracker() external view returns (address);
function canPlayForOthers(address addr) external view returns (bool);
function paused() external view returns (bool);
function isAdmin(address admin) external view returns (bool);
}
interface IRNG {
function requestRandom(bytes32 userRandomNumber, uint8 numWords) external payable returns (uint64);
function getFee() external view returns (uint256);
}
contract ApeOwnable {
// Governance Manager
IGovernanceManager public constant manager = IGovernanceManager(0x8632f22e5A921C751CFbBFF92F058A3b11E96b8a);
modifier onlyOwner() {
require(
msg.sender == manager.owner(),
'Only Owner'
);
_;
}
modifier onlyGame() {
require(
manager.isGame(msg.sender),
'UnAuthorized'
);
_;
}
modifier onlyRNG() {
require(
msg.sender == manager.RNG(),
'Only RNG Contract'
);
_;
}
modifier validatePlayer(address player) {
if (player != msg.sender) {
require(
manager.canPlayForOthers(msg.sender),
'UnAuthorized To Play For Others'
);
}
_;
}
modifier notPaused() {
require(
manager.paused() == false,
'All Games Paused'
);
_;
}
modifier onlyAdmin() {
require(
manager.isAdmin(msg.sender),
'UnAuthorized'
);
_;
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function symbol() external view returns(string memory);
function name() external view returns(string memory);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Returns the number of decimal places
*/
function decimals() external view returns (uint8);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// 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 IClaimManager {
function credit(
uint256 GAME_ID,
address user
) external payable;
}
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 IArbInfo {
function configureAutomaticYield() external;
function configureVoidYield() external;
function configureDelegateYield(address delegate) external;
}
abstract contract OnChainYieldManager {
IArbInfo private constant ArbInfo = IArbInfo(0x0000000000000000000000000000000000000065);
function _configureAutomaticYield() internal {
ArbInfo.configureAutomaticYield();
}
function _configureVoidYield() internal {
ArbInfo.configureVoidYield();
}
function _configureDelegateYield(address _delegate) internal {
ArbInfo.configureDelegateYield(_delegate);
}
}
contract HouseDataTracking {
struct PriceChange {
uint256 price;
uint256 timestamp;
}
uint256 internal priceChangeIndex;
mapping ( uint256 => PriceChange ) private priceChanges;
function log(uint256 price) internal {
priceChanges[priceChangeIndex] = PriceChange(price, block.timestamp);
unchecked {
++priceChangeIndex;
}
}
function getPriceChange(uint256 index) external view returns (uint256, uint256) {
return (priceChanges[index].price, priceChanges[index].timestamp);
}
function getPriceChangeCount() external view returns (uint256) {
return priceChangeIndex;
}
function batchGetPriceChange(uint256 startIndex, uint256 endIndex) external view returns (uint256[] memory, uint256[] memory) {
if (endIndex > priceChangeIndex) {
endIndex = priceChangeIndex;
}
if (startIndex >= endIndex || priceChangeIndex == 0) {
return (new uint256[](0), new uint256[](0));
}
uint256[] memory prices = new uint256[](endIndex - startIndex);
uint256[] memory timestamps = new uint256[](endIndex - startIndex);
for (uint256 i = startIndex; i < endIndex;) {
prices[i - startIndex] = priceChanges[i].price;
timestamps[i - startIndex] = priceChanges[i].timestamp;
unchecked { ++i; }
}
return (prices, timestamps);
}
function getListOfPriceChanges(uint256[] calldata indexes) external view returns (uint256[] memory, uint256[] memory) {
uint len = indexes.length;
uint256[] memory prices = new uint256[](len);
uint256[] memory timestamps = new uint256[](len);
for (uint256 i = 0; i < len;) {
prices[i] = priceChanges[indexes[i]].price;
timestamps[i] = priceChanges[indexes[i]].timestamp;
unchecked { ++i; }
}
return (prices, timestamps);
}
function getEvenlySplitPriceChanges(uint256 numDataPoints) external view returns (uint256[] memory, uint256[] memory) {
if (priceChangeIndex == 0) {
return (new uint256[](0), new uint256[](0));
}
if (numDataPoints > priceChangeIndex) {
numDataPoints = priceChangeIndex;
}
uint256[] memory prices = new uint256[](numDataPoints);
uint256[] memory timestamps = new uint256[](numDataPoints);
// calculate step, how many price changes to skip
uint256 step = priceChangeIndex / ( numDataPoints - 1 );
for (uint256 i = 0; i < numDataPoints - 1;) {
prices[i] = priceChanges[i * step].price;
timestamps[i] = priceChanges[i * step].timestamp;
unchecked { ++i; }
}
// set most recent prices
prices[numDataPoints - 1] = priceChanges[priceChangeIndex - 1].price;
timestamps[numDataPoints - 1] = priceChanges[priceChangeIndex - 1].timestamp;
return (prices, timestamps);
}
function getApproxAverageEvenlySplitPriceChanges(uint256 numDataPoints, uint256 averageCount) external view returns (uint256[] memory, uint256[] memory) {
if (priceChangeIndex == 0) {
return (new uint256[](0), new uint256[](0));
}
if (numDataPoints > priceChangeIndex) {
numDataPoints = priceChangeIndex;
}
// create arrays to store prices and timestamps
uint256[] memory prices = new uint256[](numDataPoints);
uint256[] memory timestamps = new uint256[](numDataPoints);
// calculate step, how many price changes to skip
uint256 step = priceChangeIndex / ( numDataPoints - 1 );
if (step <= averageCount) {
averageCount = step - 1;
}
// loop through data points, determining average price changes around each step
for (uint256 i = 0; i < numDataPoints - 1;) {
// find average price changes around each step
uint256 sumPrice = 0;
uint256 sumTimestamp = 0;
for (uint j = 0; j < averageCount;) {
unchecked {
sumPrice += priceChanges[(i * step) + j].price;
sumTimestamp += priceChanges[(i * step) + j].timestamp;
++j;
}
}
prices[i] = sumPrice / averageCount;
timestamps[i] = sumTimestamp / averageCount;
unchecked { ++i; }
}
// set most recent prices
prices[numDataPoints - 1] = priceChanges[priceChangeIndex - 1].price;
timestamps[numDataPoints - 1] = priceChanges[priceChangeIndex - 1].timestamp;
return (prices, timestamps);
}
function getAverageTimeAndPrice(uint256[] calldata indexes) external view returns (uint256, uint256) {
uint len = indexes.length;
uint256 sumPrice;
uint256 sumTimestamp;
for (uint256 i = 0; i < len;) {
unchecked {
sumPrice += priceChanges[indexes[i]].price;
sumTimestamp += priceChanges[indexes[i]].timestamp;
++i;
}
}
return (sumPrice / len, sumTimestamp / len);
}
}
interface IMigrator {
function migrate(address user, bytes calldata data) external payable;
}
/**
House Contract is responsible for managing House funds.
Only games can interact with functions that affect the house balance.
*/
contract House is ApeOwnable, IHouse, IERC20, HouseDataTracking, OnChainYieldManager {
// Trackable User Info
struct UserInfo {
uint256 balance;
uint256 totalStaked;
uint256 totalWithdrawn;
uint256 unlockTime;
bool isFeeExempt;
uint256 maxContribution;
}
// User -> UserInfo
mapping ( address => UserInfo ) public userInfo;
// maps GAME_ID to max payout per game, if zero, use default maxPayoutPerGame variable
mapping ( uint256 => uint256 ) public gameMaxPayout;
// Whether or not staking is open to the public
bool public publicStaking = true;
// Fee Denom
uint256 private constant FEE_DENOM = 10_000;
// total supply of staked units
uint256 public totalShares;
// lock time
uint256 public lockTime = 15 minutes;
// precision factor
uint256 private constant precision = 10**18;
// Max Payout per game percentage
uint256 public maxPayoutPerGame = 250; // 2.5% of total house balance
// Exit Fee, reflected to house participants
uint256 public exitFee = 200; // 2% exit fee, up to 10% max
// Percentage of entry/exit fee that is reflected to the pool
uint256 public reflectPercentage = 5000; // 50%
// Halts Withdrawals While Randomness is being Requested
uint256 public resolutionsPending;
// Determines whether or not halting withdrawals while game resolutions are pending is permitted
bool public enableInGamePausing = false;
// The minimum price the house can fall to before PvH games are disabled
// This value can be re-set if this occurs, allowing PvH games to continue
// The idea for this is to allow time for devs to source a potential issue in a game that allowed the price to fall so low
// This exists to protect house stakers from losing large sums of value too quickly
uint256 public MIN_PRICE;
// Migrator Contract, only will be set if there is a new house contract to migrate into
IMigrator public migrator;
// Log Index
uint256 public logIndex = 5;
// Reentrancy Guard
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
modifier nonReentrant() {
require(_status != _ENTERED, "Reentrancy Guard call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
// Events
event Deposit(address depositor, uint256 amount);
event Withdraw(address withdrawer, uint256 amount);
event Migrate(address withdrawer, uint256 amount);
event HouseWon(uint256 GAME_ID, uint256 profit);
event HouseLost(uint256 GAME_ID, address user, uint256 loss);
constructor() {
// set reentrancy
_status = _NOT_ENTERED;
// enable automatic yield
_configureAutomaticYield();
emit Transfer(address(0), address(0), 0);
}
function name() external pure override returns (string memory) {
return "APE House";
}
function symbol() external pure override returns (string memory) {
return "House APE";
}
function decimals() external pure override returns (uint8) {
return 18;
}
function totalSupply() external view override returns (uint256) {
return address(this).balance;
}
function maxPayout() public view returns (uint256) {
return ( address(this).balance * maxPayoutPerGame ) / FEE_DENOM;
}
function getMaxPayoutForGame(uint256 GAME_ID) public view returns (uint256) {
uint256 maxPayout_ = gameMaxPayout[GAME_ID] > 0 ? gameMaxPayout[GAME_ID] : maxPayoutPerGame;
return ( address(this).balance * maxPayout_ ) / FEE_DENOM;
}
/** Shows The Value In Native Of The Users House Native Tokens */
function balanceOf(address account) public view override returns (uint256) {
return ReflectionsFromContractBalance(userInfo[account].balance);
}
function allowance(address, address) external pure override returns (uint256) {
return 0;
}
function approve(address, uint256) public override returns (bool) {
emit Approval(msg.sender, address(0), 0);
return true;
}
function transfer(address recipient, uint256 amount) external override returns (bool) {
if (recipient == msg.sender) {
withdraw(amount);
}
return true;
}
function transferFrom(address, address recipient, uint256 amount) external override returns (bool) {
if (recipient == msg.sender) {
withdraw(amount);
}
return true;
}
function setLockTime(uint256 newLockTime) external onlyOwner {
require(
newLockTime <= 100 days,
'Lock Time Too Long'
);
lockTime = newLockTime;
}
function setMaxContribution(address user, uint256 max) external onlyOwner {
userInfo[user].maxContribution = max;
}
function setFeeExemption(address user, bool isExempt) external onlyOwner {
userInfo[user].isFeeExempt = isExempt;
}
function setPublicStaking(bool isPublic) external onlyOwner {
publicStaking = isPublic;
}
function setExitFee(uint256 exitFee_) external onlyOwner {
require(
exitFee_ <= FEE_DENOM / 10,
'Exit Fee Too High'
);
exitFee = exitFee_;
}
function setReflectionPercentage(uint256 newPercent) external onlyOwner {
require(
newPercent <= FEE_DENOM,
'Reflect Percent Too High'
);
reflectPercentage = newPercent;
}
/**
Just in case resolutionsPending gets stuck above zero due to an error with VRF, etc
Cannot increase the value greater than it currently is -- that would lock people in the House for forever
Can only reduce the value
*/
function hardSetResolutionsPending(uint256 resolutionsPending_) external onlyOwner {
require(
resolutionsPending_ < resolutionsPending,
'Cannot Manually Increase This Value'
);
resolutionsPending = resolutionsPending_;
}
/**
Enables Pausing withdrawals while games are awaiting resolution from VRF
*/
function setEnableInGamePausing(bool isEnabled) external onlyOwner {
enableInGamePausing = isEnabled;
if (isEnabled) {
resolutionsPending = 0;
}
}
function recoverForeignToken(address token) external onlyOwner {
IERC20(token).transfer(msg.sender, IERC20(token).balanceOf(address(this)));
}
function setMaxPayoutPerGame(uint256 newMaxPayout) external onlyOwner {
require(
newMaxPayout <= FEE_DENOM / 4,
'Max Payout Percentage Too High'
);
maxPayoutPerGame = newMaxPayout;
}
function setGameMaxPayout(uint256 GAME_ID, uint256 newMaxPayout) external onlyOwner {
require(
newMaxPayout <= FEE_DENOM / 4,
'Max Payout Percentage Too High'
);
gameMaxPayout[GAME_ID] = newMaxPayout;
}
function setMinPrice(uint256 percentOfCurrent) external onlyOwner {
require(
percentOfCurrent <= 999,
'Min Price Cannot Exceed 99.9% Of Current Value'
);
MIN_PRICE = ( _calculatePrice() * percentOfCurrent ) / 1_000;
}
function setMigrator(address migrator_) external onlyOwner {
migrator = IMigrator(migrator_);
}
function setLogIndex(uint256 newLogIndex) external onlyOwner {
logIndex = newLogIndex;
}
function migrate(bytes calldata data) external nonReentrant {
require(
address(migrator) != address(0),
'No Migrator'
);
// user amount
uint256 userBalance = userInfo[msg.sender].balance;
require(
userBalance > 0,
'Zero Balance'
);
// native amount from balance
uint256 nativeAmount = ReflectionsFromContractBalance(userBalance);
// burn user balance
_burn(msg.sender, userBalance, nativeAmount);
// increment total withdrawn
unchecked {
userInfo[msg.sender].totalWithdrawn += nativeAmount;
}
// emit Event
emit Migrate(msg.sender, nativeAmount);
// send value to user
migrator.migrate{value: nativeAmount}(msg.sender, data);
}
/**
Deposits Native From Sender
Locks In Contract, Minting Native House Tokens
*/
function deposit() external payable nonReentrant {
require(
msg.value > 0,
'Zero Value'
);
require(
address(migrator) == address(0),
'Migration In Progress'
);
// Track Balance Before Deposit
uint previousBalance = address(this).balance - msg.value;
// mint appropriate balance to recipient
if (totalShares == 0 || previousBalance == 0) {
_registerFirstPurchase(msg.sender, msg.value);
} else {
_mintTo(msg.sender, msg.value, previousBalance);
}
if (publicStaking == false) {
require(
balanceOf(msg.sender) <= userInfo[msg.sender].maxContribution,
'Max Contribution Exceeded'
);
}
}
/**
Redeems `amount` of Native, As Seen From BalanceOf()
*/
function withdraw(uint256 amount) public nonReentrant returns (uint256) {
require(
address(migrator) == address(0),
'Migration In Progress'
);
// check for in-Game Pausing
if (enableInGamePausing == true) {
require(
resolutionsPending == 0,
'Game Resolutions Are Pending'
);
}
// ensure lock time
require(
timeUntilUnlock(msg.sender) == 0,
'Not Yet Time'
);
// get user balance as seen from balanceOf
uint256 userBal = balanceOf(msg.sender);
if (amount > userBal) {
amount = userBal;
}
// Turn Native Amount Into Contract Balance Amount
uint House_Amount = amount == userBal ? userInfo[msg.sender].balance : NativeToContractBalance(amount);
require(
userInfo[msg.sender].balance > 0 &&
userInfo[msg.sender].balance >= House_Amount &&
userBal >= amount &&
amount > 0 &&
House_Amount > 0,
'Insufficient Funds'
);
// burn House Tokens From Sender
_burn(msg.sender, House_Amount, amount);
// increment total withdrawn
unchecked {
userInfo[msg.sender].totalWithdrawn += amount;
}
// emit Event
emit Withdraw(msg.sender, amount);
// if fees exist, apply them
if (exitFee > 0 && userInfo[msg.sender].isFeeExempt == false) {
// split up fee and nonReflected Fee
uint256 fee = ( amount * exitFee ) / FEE_DENOM;
uint256 nonReflectFee = ( fee * reflectPercentage ) / FEE_DENOM;
if (nonReflectFee > 0) {
// send fee to receiver
TransferHelper.safeTransferETH(manager.feeReceiver(), nonReflectFee);
}
// send value to user
TransferHelper.safeTransferETH(msg.sender, amount - fee);
} else {
// send value to user
TransferHelper.safeTransferETH(msg.sender, amount);
}
// log price change
log(_calculatePrice());
// return send amount
return amount;
}
receive() external payable {
require(totalShares > 0, 'Zero Shares');
require(_status != _ENTERED, "Reentrancy Guard call");
}
function randomRequested() external override nonReentrant onlyGame {
require(
_calculatePrice() >= MIN_PRICE,
'PRICE TOO LOW, PvH GAMES PAUSED'
);
// randomly log price approximately every 8 games, no need to be exact
if (block.number % logIndex == 0) {
// log price change
log(_calculatePrice());
}
if (enableInGamePausing == false) {
return;
}
unchecked {
++resolutionsPending;
}
}
function randomRequestResolved() external override nonReentrant onlyGame {
if (enableInGamePausing == false) {
return;
}
// subtract resolutions pending
if (resolutionsPending > 0) {
unchecked {
--resolutionsPending;
}
}
}
/**
Request A Payout from the house from a successful Game.
Only callable by Game Contracts
*/
function payout(uint256 GAME_ID, address user, uint256 value) external override nonReentrant onlyGame {
// get max payout
uint256 maxPayout_ = getMaxPayoutForGame(GAME_ID);
// send amount
uint256 sendAmount = value >= maxPayout_ ? maxPayout_ : value;
// add to user's claim contract balance to avoid reentrancy
IClaimManager(manager.claimManager()).credit{value: sendAmount}(
GAME_ID,
user
);
// emit house lost event
emit HouseLost(GAME_ID, user, sendAmount);
}
function houseProfit(uint256 GAME_ID) external payable override onlyGame nonReentrant {
emit HouseWon(GAME_ID, msg.value);
}
/**
Registers the First Stake
*/
function _registerFirstPurchase(address user, uint received) internal {
// increment total staked
userInfo[user].totalStaked += received;
// mint House Tokens To Sender
_mint(user, received, received);
// log price change
log(_calculatePrice());
emit Deposit(user, received);
}
function _mintTo(address sender, uint256 received, uint256 previousBalance) internal {
// Number Of House Tokens To Mint
uint nToMint = ( totalShares * received ) / previousBalance;
require(
nToMint > 0,
'Zero To Mint'
);
// increment total staked
userInfo[sender].totalStaked += received;
// mint House Tokens To Sender
_mint(sender, nToMint, received);
// log price change
log(_calculatePrice());
emit Deposit(sender, received);
}
/**
* Burns `amount` of Contract Balance Token
*/
function _burn(address from, uint256 amount, uint256 nativeAmount) private {
// update balances
userInfo[from].balance -= amount;
totalShares -= amount;
// emit Transfer
emit Transfer(from, address(0), nativeAmount);
}
/**
* Mints `amount` of Contract Balance Token
*/
function _mint(address to, uint256 amount, uint256 nativeWorth) private {
unchecked {
userInfo[to].balance += amount;
totalShares += amount;
}
userInfo[to].unlockTime = block.timestamp + lockTime;
emit Transfer(address(0), to, nativeWorth);
}
/**
Fetches the time until a user's staked amount can be withdrawn
*/
function timeUntilUnlock(address user) public view returns (uint256) {
return userInfo[user].unlockTime > block.timestamp ? userInfo[user].unlockTime - block.timestamp : 0;
}
/**
Converts A Native Amount Into A House Amount
*/
function NativeToContractBalance(uint256 amount) public view returns (uint256) {
return ( ( amount * precision ) / _calculatePrice() );
}
/**
Converts A House Amount Into A Native Amount
*/
function ReflectionsFromContractBalance(uint256 amount) public view returns (uint256) {
return ( ( amount * _calculatePrice() ) / precision );
}
/** Conversion Ratio For House -> Native */
function calculatePrice() external view returns (uint256) {
return _calculatePrice();
}
/** Returns Total Profit for User In Token From House */
function getTotalProfits(address user) external view returns (int256) {
uint top = balanceOf(user) + userInfo[user].totalWithdrawn;
return int256(top) - int256(userInfo[user].totalStaked);
}
/** Conversion Ratio For House -> Native */
function _calculatePrice() internal view returns (uint256) {
return ( address(this).balance * precision ) / totalShares;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"GAME_ID","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"}],"name":"HouseLost","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"GAME_ID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"HouseWon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MIN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeToContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReflectionsFromContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"batchGetPriceChange","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"enableInGamePausing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"gameMaxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numDataPoints","type":"uint256"},{"internalType":"uint256","name":"averageCount","type":"uint256"}],"name":"getApproxAverageEvenlySplitPriceChanges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"}],"name":"getAverageTimeAndPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numDataPoints","type":"uint256"}],"name":"getEvenlySplitPriceChanges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"}],"name":"getListOfPriceChanges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"GAME_ID","type":"uint256"}],"name":"getMaxPayoutForGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPriceChange","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceChangeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTotalProfits","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resolutionsPending_","type":"uint256"}],"name":"hardSetResolutionsPending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"GAME_ID","type":"uint256"}],"name":"houseProfit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"lockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"logIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayoutPerGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"GAME_ID","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"payout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomRequestResolved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"randomRequested","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"recoverForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolutionsPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"setEnableInGamePausing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"exitFee_","type":"uint256"}],"name":"setExitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"isExempt","type":"bool"}],"name":"setFeeExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"GAME_ID","type":"uint256"},{"internalType":"uint256","name":"newMaxPayout","type":"uint256"}],"name":"setGameMaxPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLockTime","type":"uint256"}],"name":"setLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLogIndex","type":"uint256"}],"name":"setLogIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxContribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPayout","type":"uint256"}],"name":"setMaxPayoutPerGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"migrator_","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentOfCurrent","type":"uint256"}],"name":"setMinPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPublic","type":"bool"}],"name":"setPublicStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"setReflectionPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"timeUntilUnlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"bool","name":"isFeeExempt","type":"bool"},{"internalType":"uint256","name":"maxContribution","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526004805460ff1990811660011790915561038460065560fa60075560c8600855611388600955600b805490911690556005600e55348015604357600080fd5b506001600f55604f608b565b60405160008082529081907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a360df565b60656001600160a01b0316637114177a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801560c657600080fd5b505af115801560d9573d6000803e3d6000fd5b50505050565b613759806100ee6000396000f3fe6080604052600436106103855760003560e01c806370a08231116101d1578063ae2f5d9311610102578063da99f729116100a0578063e5a583a91161006f578063e5a583a914610b09578063ec5bfc8c14610b29578063f804453214610b49578063ff3fd60414610b6957600080fd5b8063da99f72914610a9b578063dd62ed3e14610ab1578063e0176de814610ad4578063e13760e814610ae957600080fd5b8063c7471903116100dc578063c747190314610a48578063d0228e8f14610a5e578063d0e30db014610a7e578063d348b40914610a8657600080fd5b8063ae2f5d93146109f5578063b3cb6f1a14610a15578063b67c527314610a2857600080fd5b80638b3939f21161016f578063a01cc0e711610149578063a01cc0e714610989578063a9059cbb1461099f578063ad9f20a6146109bf578063ae04d45d146109d557600080fd5b80638b3939f21461092d5780638d7fe4781461094257806395d89b411461095757600080fd5b80637cd07e47116101ab5780637cd07e47146108b35780637fb1ffa7146108d35780638763d8e4146108ed5780638932a90d1461090d57600080fd5b806370a082311461085d578063751fd1791461087d5780637bc0c6511461089d57600080fd5b806323cf3118116102b65780633e8e0b3d116102545780636102b6e8116102235780636102b6e8146107e75780636284ae4114610807578063639254411461081d578063676feaf21461083d57600080fd5b80633e8e0b3d1461074d578063481c6a751461076d57806352bb326e146107a75780635ea8cd12146107c757600080fd5b8063313ce56711610290578063313ce567146106b157806337876814146106cd5780633a98ef39146106ed5780633b0b037a1461070357600080fd5b806323cf311814610651578063278984bf146106715780632e1a7d4d1461069157600080fd5b80630d668087116103235780631959a002116102fd5780631959a002146105785780631ab733a3146105fc5780631f581e2a1461061c57806323b872dd1461063157600080fd5b80630d668087146105225780630fe8893f1461053857806318160ddd1461056557600080fd5b806306fdde031161035f57806306fdde031461048757806307b11b76146104c2578063095ea7b3146104e2578063098729db1461050257600080fd5b8063018c195e146103f8578063040bef041461042f57806304decf2e1461045d57600080fd5b366103f3576000600554116103cf5760405162461bcd60e51b815260206004820152600b60248201526a5a65726f2053686172657360a81b60448201526064015b60405180910390fd5b6002600f54036103f15760405162461bcd60e51b81526004016103c6906131c8565b005b600080fd5b34801561040457600080fd5b506104186104133660046131f7565b610b89565b604051610426929190613255565b60405180910390f35b34801561043b57600080fd5b5061044f61044a366004613283565b610dfa565b604051908152602001610426565b34801561046957600080fd5b506004546104779060ff1681565b6040519015158152602001610426565b34801561049357600080fd5b5060408051808201909152600981526841504520486f75736560b81b60208201525b60405161042691906132c0565b3480156104ce57600080fd5b5061044f6104dd366004613283565b610e47565b3480156104ee57600080fd5b506104776104fd366004613308565b610e73565b34801561050e57600080fd5b5061044f61051d366004613283565b610eb6565b34801561052e57600080fd5b5061044f60065481565b34801561054457600080fd5b5061044f610553366004613283565b60036020526000908152604090205481565b34801561057157600080fd5b504761044f565b34801561058457600080fd5b506105cd610593366004613334565b60026020819052600091825260409091208054600182015492820154600383015460048401546005909401549294939192909160ff169086565b6040805196875260208701959095529385019290925260608401521515608083015260a082015260c001610426565b34801561060857600080fd5b5061044f610617366004613334565b610ed3565b34801561062857600080fd5b5060005461044f565b34801561063d57600080fd5b5061047761064c366004613351565b610f2d565b34801561065d57600080fd5b506103f161066c366004613334565b610f54565b34801561067d57600080fd5b506103f161068c366004613308565b611016565b34801561069d57600080fd5b5061044f6106ac366004613283565b6110d5565b3480156106bd57600080fd5b5060405160128152602001610426565b3480156106d957600080fd5b506104186106e8366004613392565b611480565b3480156106f957600080fd5b5061044f60055481565b34801561070f57600080fd5b5061073861071e366004613283565b600090815260016020819052604090912080549101549091565b60408051928352602083019190915201610426565b34801561075957600080fd5b506103f1610768366004613283565b6115cb565b34801561077957600080fd5b5061078f60008051602061370483398151915281565b6040516001600160a01b039091168152602001610426565b3480156107b357600080fd5b506103f16107c2366004613283565b6116cc565b3480156107d357600080fd5b506103f16107e2366004613283565b611771565b3480156107f357600080fd5b506103f1610802366004613417565b6118a0565b34801561081357600080fd5b5061044f60085481565b34801561082957600080fd5b506103f1610838366004613283565b611953565b34801561084957600080fd5b506103f16108583660046131f7565b611a55565b34801561086957600080fd5b5061044f610878366004613334565b611b63565b34801561088957600080fd5b506103f1610898366004613434565b611b85565b3480156108a957600080fd5b5061044f600a5481565b3480156108bf57600080fd5b50600d5461078f906001600160a01b031681565b3480156108df57600080fd5b50600b546104779060ff1681565b3480156108f957600080fd5b506103f1610908366004613417565b611c53565b34801561091957600080fd5b506103f161092836600461346d565b611d13565b34801561093957600080fd5b506103f1611ea8565b34801561094e57600080fd5b506103f1611f7d565b34801561096357600080fd5b50604080518082019091526009815268486f7573652041504560b81b60208201526104b5565b34801561099557600080fd5b5061044f60095481565b3480156109ab57600080fd5b506104776109ba366004613308565b6120c0565b3480156109cb57600080fd5b5061044f600c5481565b3480156109e157600080fd5b506103f16109f0366004613283565b6120e6565b348015610a0157600080fd5b506103f1610a103660046134d1565b6121d3565b6103f1610a23366004613283565b6123d6565b348015610a3457600080fd5b50610418610a433660046131f7565b6124c6565b348015610a5457600080fd5b5061044f60075481565b348015610a6a57600080fd5b5061044f610a79366004613334565b612622565b6103f1612672565b348015610a9257600080fd5b5061044f6127e2565b348015610aa757600080fd5b5061044f600e5481565b348015610abd57600080fd5b5061044f610acc3660046134f8565b600092915050565b348015610ae057600080fd5b5061044f6127f1565b348015610af557600080fd5b50610738610b04366004613392565b61280e565b348015610b1557600080fd5b506103f1610b24366004613283565b6128b2565b348015610b3557600080fd5b506103f1610b44366004613334565b6129a7565b348015610b5557600080fd5b506103f1610b64366004613283565b612b2c565b348015610b7557600080fd5b50610418610b84366004613283565b612c23565b606080600054600003610bdc5760005b604051908082528060200260200182016040528015610bc2578160200160208202803683370190505b506040805160008152602081019091529092509050610df3565b600054841115610bec5760005493505b60008467ffffffffffffffff811115610c0757610c07613526565b604051908082528060200260200182016040528015610c30578160200160208202803683370190505b50905060008567ffffffffffffffff811115610c4e57610c4e613526565b604051908082528060200260200182016040528015610c77578160200160208202803683370190505b5090506000610c87600188613552565b600054610c94919061357b565b9050858111610cab57610ca8600182613552565b95505b60005b610cb9600189613552565b811015610d515760008060005b89811015610cf85783850281016000908152600160208190526040909120805490820154940193929092019101610cc6565b50610d03898361357b565b868481518110610d1557610d1561358f565b6020908102919091010152610d2a898261357b565b858481518110610d3c57610d3c61358f565b60209081029190910101525050600101610cae565b50600160006001600054610d659190613552565b815260208101919091526040016000205483610d8260018a613552565b81518110610d9257610d9261358f565b602002602001018181525050600160006001600054610db19190613552565b81526020019081526020016000206001015482600189610dd19190613552565b81518110610de157610de161358f565b60209081029190910101525090925090505b9250929050565b6000818152600360205260408120548190610e1757600754610e27565b6000838152600360205260409020545b9050612710610e3682476135a5565b610e40919061357b565b9392505050565b6000610e51612e45565b610e63670de0b6b3a7640000846135a5565b610e6d919061357b565b92915050565b604051600080825290819033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259060200160405180910390a350600192915050565b6000670de0b6b3a7640000610ec9612e45565b610e6390846135a5565b6001600160a01b0381166000908152600260208190526040822001548190610efa84611b63565b610f0491906135bc565b6001600160a01b038416600090815260026020526040902060010154909150610e4090826135cf565b6000336001600160a01b03841603610f4a57610f48826110d5565b505b5060019392505050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc491906135f6565b6001600160a01b0316336001600160a01b031614610ff45760405162461bcd60e51b81526004016103c690613613565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108691906135f6565b6001600160a01b0316336001600160a01b0316146110b65760405162461bcd60e51b81526004016103c690613613565b6001600160a01b03909116600090815260026020526040902060050155565b60006002600f54036110f95760405162461bcd60e51b81526004016103c6906131c8565b6002600f55600d546001600160a01b03161561114f5760405162461bcd60e51b81526020600482015260156024820152744d6967726174696f6e20496e2050726f677265737360581b60448201526064016103c6565b600b5460ff1615156001036111ae57600a54156111ae5760405162461bcd60e51b815260206004820152601c60248201527f47616d65205265736f6c7574696f6e73204172652050656e64696e670000000060448201526064016103c6565b6111b733612622565b156111f35760405162461bcd60e51b815260206004820152600c60248201526b4e6f74205965742054696d6560a01b60448201526064016103c6565b60006111fe33611b63565b90508083111561120c578092505b60008184146112235761121e84610e47565b611234565b336000908152600260205260409020545b33600090815260026020526040902054909150158015906112645750336000908152600260205260409020548111155b80156112705750838210155b801561127c5750600084115b80156112885750600081115b6112c95760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b60448201526064016103c6565b6112d4338286612e5d565b33600081815260026020818152604092839020909101805488019055815192835282018690527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a1600060085411801561134a57503360009081526002602052604090206004015460ff16155b156114265760006127106008548661136291906135a5565b61136c919061357b565b905060006127106009548361138191906135a5565b61138b919061357b565b9050801561140c5761140c6000805160206137048339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140691906135f6565b82612eea565b61141f3361141a8489613552565b612eea565b5050611430565b6114303385612eea565b61147561143b612e45565b6040805180820182529182524260208084019182526000805481526001918290529283209351845590519281019290925580549091019055565b50506001600f555090565b6060808260008167ffffffffffffffff81111561149f5761149f613526565b6040519080825280602002602001820160405280156114c8578160200160208202803683370190505b50905060008267ffffffffffffffff8111156114e6576114e6613526565b60405190808252806020026020018201604052801561150f578160200160208202803683370190505b50905060005b838110156115be57600160008989848181106115335761153361358f565b9050602002013581526020019081526020016000206000015483828151811061155e5761155e61358f565b602002602001018181525050600160008989848181106115805761158061358f565b905060200201358152602001908152602001600020600101548282815181106115ab576115ab61358f565b6020908102919091010152600101611515565b5090969095509350505050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163b91906135f6565b6001600160a01b0316336001600160a01b03161461166b5760405162461bcd60e51b81526004016103c690613613565b611678600461271061357b565b8111156116c75760405162461bcd60e51b815260206004820152601e60248201527f4d6178205061796f75742050657263656e7461676520546f6f2048696768000060448201526064016103c6565b600755565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906135f6565b6001600160a01b0316336001600160a01b03161461176c5760405162461bcd60e51b81526004016103c690613613565b600e55565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e191906135f6565b6001600160a01b0316336001600160a01b0316146118115760405162461bcd60e51b81526004016103c690613613565b6103e781111561187a5760405162461bcd60e51b815260206004820152602e60248201527f4d696e2050726963652043616e6e6f74204578636565642039392e3925204f6660448201526d2043757272656e742056616c756560901b60648201526084016103c6565b6103e881611886612e45565b61189091906135a5565b61189a919061357b565b600c5550565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191091906135f6565b6001600160a01b0316336001600160a01b0316146119405760405162461bcd60e51b81526004016103c690613613565b6004805460ff1916911515919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561199f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c391906135f6565b6001600160a01b0316336001600160a01b0316146119f35760405162461bcd60e51b81526004016103c690613613565b600a548110611a505760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74204d616e75616c6c7920496e63726561736520546869732056616044820152626c756560e81b60648201526084016103c6565b600a55565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac591906135f6565b6001600160a01b0316336001600160a01b031614611af55760405162461bcd60e51b81526004016103c690613613565b611b02600461271061357b565b811115611b515760405162461bcd60e51b815260206004820152601e60248201527f4d6178205061796f75742050657263656e7461676520546f6f2048696768000060448201526064016103c6565b60009182526003602052604090912055565b6001600160a01b038116600090815260026020526040812054610e6d90610eb6565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf591906135f6565b6001600160a01b0316336001600160a01b031614611c255760405162461bcd60e51b81526004016103c690613613565b6001600160a01b03919091166000908152600260205260409020600401805460ff1916911515919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc391906135f6565b6001600160a01b0316336001600160a01b031614611cf35760405162461bcd60e51b81526004016103c690613613565b600b805460ff19168215801591909117909155611d10576000600a555b50565b6002600f5403611d355760405162461bcd60e51b81526004016103c6906131c8565b6002600f55600d546001600160a01b0316611d805760405162461bcd60e51b815260206004820152600b60248201526a27379026b4b3b930ba37b960a91b60448201526064016103c6565b3360009081526002602052604090205480611dcc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b60448201526064016103c6565b6000611dd782610eb6565b9050611de4338383612e5d565b33600081815260026020818152604092839020909101805485019055815192835282018390527fa59785389b00cbd19745afbe8d59b28e3161395c6b1e3525861a2b0dede0b90d910160405180910390a1600d5460405163c3fbb6fd60e01b81526001600160a01b039091169063c3fbb6fd908390611e6b90339089908990600401613637565b6000604051808303818588803b158015611e8457600080fd5b505af1158015611e98573d6000803e3d6000fd5b50506001600f5550505050505050565b6002600f5403611eca5760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015611f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3c9190613677565b611f585760405162461bcd60e51b81526004016103c690613694565b600b5460ff1615611f7657600a5415611f7657600a80546000190190555b6001600f55565b6002600f5403611f9f5760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015611fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120119190613677565b61202d5760405162461bcd60e51b81526004016103c690613694565b600c54612038612e45565b10156120865760405162461bcd60e51b815260206004820152601f60248201527f505249434520544f4f204c4f572c205076482047414d4553205041555345440060448201526064016103c6565b600e5461209390436136ba565b6000036120a5576120a561143b612e45565b600b5460ff1615611f7657600a805460010190556001600f55565b6000336001600160a01b038416036120dd576120db826110d5565b505b50600192915050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215691906135f6565b6001600160a01b0316336001600160a01b0316146121865760405162461bcd60e51b81526004016103c690613613565b6283d6008111156121ce5760405162461bcd60e51b81526020600482015260126024820152714c6f636b2054696d6520546f6f204c6f6e6760701b60448201526064016103c6565b600655565b6002600f54036121f55760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613677565b6122835760405162461bcd60e51b81526004016103c690613694565b600061228e84610dfa565b90506000818310156122a057826122a2565b815b90506000805160206137048339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231491906135f6565b6040516304ff60cf60e51b8152600481018790526001600160a01b0386811660248301529190911690639fec19e09083906044016000604051808303818588803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b5050604080518981526001600160a01b03891660208201529081018590527f3f1adb40444b6f3bd9a42ecbad6be967cb5f6381d5a80816bcb77723b6afc8be935060600191506123c29050565b60405180910390a150506001600f55505050565b604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613677565b61245f5760405162461bcd60e51b81526004016103c690613694565b6002600f54036124815760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604080518281523460208201527f871f6417af6eea44386a75fde228e4dc3157276f821e8c2ebe645303ac8f0847910160405180910390a1506001600f55565b6060806000548311156124d95760005492505b82841015806124e85750600054155b156124f4576000610b99565b60006125008585613552565b67ffffffffffffffff81111561251857612518613526565b604051908082528060200260200182016040528015612541578160200160208202803683370190505b50905060006125508686613552565b67ffffffffffffffff81111561256857612568613526565b604051908082528060200260200182016040528015612591578160200160208202803683370190505b509050855b8581101561261657600081815260016020526040902054836125b88984613552565b815181106125c8576125c861358f565b6020908102919091018101919091526000828152600191829052604090200154826125f38984613552565b815181106126035761260361358f565b6020908102919091010152600101612596565b50909590945092505050565b6001600160a01b038116600090815260026020526040812060030154421061264b576000610e6d565b6001600160a01b038216600090815260026020526040902060030154610e6d904290613552565b6002600f54036126945760405162461bcd60e51b81526004016103c6906131c8565b6002600f55346126d35760405162461bcd60e51b815260206004820152600a6024820152695a65726f2056616c756560b01b60448201526064016103c6565b600d546001600160a01b0316156127245760405162461bcd60e51b81526020600482015260156024820152744d6967726174696f6e20496e2050726f677265737360581b60448201526064016103c6565b60006127303447613552565b905060055460001480612741575080155b15612755576127503334612fc9565b612760565b612760333483613056565b60045460ff1615156000036127da57336000818152600260205260409020600501549061278c90611b63565b11156127da5760405162461bcd60e51b815260206004820152601960248201527f4d617820436f6e747269627574696f6e2045786365656465640000000000000060448201526064016103c6565b506001600f55565b60006127ec612e45565b905090565b60006127106007544761280491906135a5565b6127ec919061357b565b600080828180805b8381101561288f57600160008989848181106128345761283461358f565b9050602002013581526020019081526020016000206000015483019250600160008989848181106128675761286761358f565b9050602002013581526020019081526020016000206001015482019150806001019050612816565b5061289a838361357b565b6128a4848361357b565b945094505050509250929050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292291906135f6565b6001600160a01b0316336001600160a01b0316146129525760405162461bcd60e51b81526004016103c690613613565b61295f600a61271061357b565b8111156129a25760405162461bcd60e51b815260206004820152601160248201527008af0d2e8408ccaca40a8dede4090d2ced607b1b60448201526064016103c6565b600855565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1791906135f6565b6001600160a01b0316336001600160a01b031614612a475760405162461bcd60e51b81526004016103c690613613565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015612a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab991906136ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b289190613677565b5050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9c91906135f6565b6001600160a01b0316336001600160a01b031614612bcc5760405162461bcd60e51b81526004016103c690613613565b612710811115612c1e5760405162461bcd60e51b815260206004820152601860248201527f5265666c6563742050657263656e7420546f6f2048696768000000000000000060448201526064016103c6565b600955565b606080600054600003612c4e5750506040805160008082526020820190815281830190925292909150565b600054831115612c5e5760005492505b60008367ffffffffffffffff811115612c7957612c79613526565b604051908082528060200260200182016040528015612ca2578160200160208202803683370190505b50905060008467ffffffffffffffff811115612cc057612cc0613526565b604051908082528060200260200182016040528015612ce9578160200160208202803683370190505b5090506000612cf9600187613552565b600054612d06919061357b565b905060005b612d16600188613552565b811015612d9f5760016000612d2b84846135a5565b815260200190815260200160002060000154848281518110612d4f57612d4f61358f565b602090810291909101015260016000612d6884846135a5565b815260200190815260200160002060010154838281518110612d8c57612d8c61358f565b6020908102919091010152600101612d0b565b50600160006001600054612db39190613552565b815260208101919091526040016000205483612dd0600189613552565b81518110612de057612de061358f565b602002602001018181525050600160006001600054612dff9190613552565b81526020019081526020016000206001015482600188612e1f9190613552565b81518110612e2f57612e2f61358f565b6020908102919091010152509094909350915050565b600554600090612804670de0b6b3a7640000476135a5565b6001600160a01b03831660009081526002602052604081208054849290612e85908490613552565b925050819055508160056000828254612e9e9190613552565b90915550506040518181526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b604080516000808252602082019092526001600160a01b038416908390604051612f1491906136e7565b60006040518083038185875af1925050503d8060008114612f51576040519150601f19603f3d011682016040523d82523d6000602084013e612f56565b606091505b5050905080612fc45760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b60648201526084016103c6565b505050565b6001600160a01b03821660009081526002602052604081206001018054839290612ff49084906135bc565b909155506130059050828280613141565b61301061143b612e45565b604080516001600160a01b0384168152602081018390527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a15050565b6000818360055461306791906135a5565b613071919061357b565b9050600081116130b25760405162461bcd60e51b815260206004820152600c60248201526b16995c9bc8151bc8135a5b9d60a21b60448201526064016103c6565b6001600160a01b038416600090815260026020526040812060010180548592906130dd9084906135bc565b909155506130ee9050848285613141565b6130f961143b612e45565b604080516001600160a01b0386168152602081018590527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a150505050565b6001600160a01b0383166000908152600260205260409020805483019055600580548301905560065461317490426135bc565b6001600160a01b0384166000818152600260205260408082206003019390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612edd9085815260200190565b6020808252601590820152741499595b9d1c985b98de4811dd585c990818d85b1b605a1b604082015260600190565b6000806040838503121561320a57600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561324b57815186526020958601959091019060010161322d565b5093949350505050565b6040815260006132686040830185613219565b828103602084015261327a8185613219565b95945050505050565b60006020828403121561329557600080fd5b5035919050565b60005b838110156132b757818101518382015260200161329f565b50506000910152565b60208152600082518060208401526132df81604085016020870161329c565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611d1057600080fd5b6000806040838503121561331b57600080fd5b8235613326816132f3565b946020939093013593505050565b60006020828403121561334657600080fd5b8135610e40816132f3565b60008060006060848603121561336657600080fd5b8335613371816132f3565b92506020840135613381816132f3565b929592945050506040919091013590565b600080602083850312156133a557600080fd5b823567ffffffffffffffff8111156133bc57600080fd5b8301601f810185136133cd57600080fd5b803567ffffffffffffffff8111156133e457600080fd5b8560208260051b84010111156133f957600080fd5b6020919091019590945092505050565b8015158114611d1057600080fd5b60006020828403121561342957600080fd5b8135610e4081613409565b6000806040838503121561344757600080fd5b8235613452816132f3565b9150602083013561346281613409565b809150509250929050565b6000806020838503121561348057600080fd5b823567ffffffffffffffff81111561349757600080fd5b8301601f810185136134a857600080fd5b803567ffffffffffffffff8111156134bf57600080fd5b8560208284010111156133f957600080fd5b6000806000606084860312156134e657600080fd5b833592506020840135613381816132f3565b6000806040838503121561350b57600080fd5b8235613516816132f3565b91506020830135613462816132f3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610e6d57610e6d61353c565b634e487b7160e01b600052601260045260246000fd5b60008261358a5761358a613565565b500490565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610e6d57610e6d61353c565b80820180821115610e6d57610e6d61353c565b81810360008312801583831316838312821617156135ef576135ef61353c565b5092915050565b60006020828403121561360857600080fd5b8151610e40816132f3565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561368957600080fd5b8151610e4081613409565b6020808252600c908201526b155b905d5d1a1bdc9a5e995960a21b604082015260600190565b6000826136c9576136c9613565565b500690565b6000602082840312156136e057600080fd5b5051919050565b600082516136f981846020870161329c565b919091019291505056fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220d25508a340ffed26ca756d805500d24df88be8a49b508a9cba78a633e8dea7ed64736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106103855760003560e01c806370a08231116101d1578063ae2f5d9311610102578063da99f729116100a0578063e5a583a91161006f578063e5a583a914610b09578063ec5bfc8c14610b29578063f804453214610b49578063ff3fd60414610b6957600080fd5b8063da99f72914610a9b578063dd62ed3e14610ab1578063e0176de814610ad4578063e13760e814610ae957600080fd5b8063c7471903116100dc578063c747190314610a48578063d0228e8f14610a5e578063d0e30db014610a7e578063d348b40914610a8657600080fd5b8063ae2f5d93146109f5578063b3cb6f1a14610a15578063b67c527314610a2857600080fd5b80638b3939f21161016f578063a01cc0e711610149578063a01cc0e714610989578063a9059cbb1461099f578063ad9f20a6146109bf578063ae04d45d146109d557600080fd5b80638b3939f21461092d5780638d7fe4781461094257806395d89b411461095757600080fd5b80637cd07e47116101ab5780637cd07e47146108b35780637fb1ffa7146108d35780638763d8e4146108ed5780638932a90d1461090d57600080fd5b806370a082311461085d578063751fd1791461087d5780637bc0c6511461089d57600080fd5b806323cf3118116102b65780633e8e0b3d116102545780636102b6e8116102235780636102b6e8146107e75780636284ae4114610807578063639254411461081d578063676feaf21461083d57600080fd5b80633e8e0b3d1461074d578063481c6a751461076d57806352bb326e146107a75780635ea8cd12146107c757600080fd5b8063313ce56711610290578063313ce567146106b157806337876814146106cd5780633a98ef39146106ed5780633b0b037a1461070357600080fd5b806323cf311814610651578063278984bf146106715780632e1a7d4d1461069157600080fd5b80630d668087116103235780631959a002116102fd5780631959a002146105785780631ab733a3146105fc5780631f581e2a1461061c57806323b872dd1461063157600080fd5b80630d668087146105225780630fe8893f1461053857806318160ddd1461056557600080fd5b806306fdde031161035f57806306fdde031461048757806307b11b76146104c2578063095ea7b3146104e2578063098729db1461050257600080fd5b8063018c195e146103f8578063040bef041461042f57806304decf2e1461045d57600080fd5b366103f3576000600554116103cf5760405162461bcd60e51b815260206004820152600b60248201526a5a65726f2053686172657360a81b60448201526064015b60405180910390fd5b6002600f54036103f15760405162461bcd60e51b81526004016103c6906131c8565b005b600080fd5b34801561040457600080fd5b506104186104133660046131f7565b610b89565b604051610426929190613255565b60405180910390f35b34801561043b57600080fd5b5061044f61044a366004613283565b610dfa565b604051908152602001610426565b34801561046957600080fd5b506004546104779060ff1681565b6040519015158152602001610426565b34801561049357600080fd5b5060408051808201909152600981526841504520486f75736560b81b60208201525b60405161042691906132c0565b3480156104ce57600080fd5b5061044f6104dd366004613283565b610e47565b3480156104ee57600080fd5b506104776104fd366004613308565b610e73565b34801561050e57600080fd5b5061044f61051d366004613283565b610eb6565b34801561052e57600080fd5b5061044f60065481565b34801561054457600080fd5b5061044f610553366004613283565b60036020526000908152604090205481565b34801561057157600080fd5b504761044f565b34801561058457600080fd5b506105cd610593366004613334565b60026020819052600091825260409091208054600182015492820154600383015460048401546005909401549294939192909160ff169086565b6040805196875260208701959095529385019290925260608401521515608083015260a082015260c001610426565b34801561060857600080fd5b5061044f610617366004613334565b610ed3565b34801561062857600080fd5b5060005461044f565b34801561063d57600080fd5b5061047761064c366004613351565b610f2d565b34801561065d57600080fd5b506103f161066c366004613334565b610f54565b34801561067d57600080fd5b506103f161068c366004613308565b611016565b34801561069d57600080fd5b5061044f6106ac366004613283565b6110d5565b3480156106bd57600080fd5b5060405160128152602001610426565b3480156106d957600080fd5b506104186106e8366004613392565b611480565b3480156106f957600080fd5b5061044f60055481565b34801561070f57600080fd5b5061073861071e366004613283565b600090815260016020819052604090912080549101549091565b60408051928352602083019190915201610426565b34801561075957600080fd5b506103f1610768366004613283565b6115cb565b34801561077957600080fd5b5061078f60008051602061370483398151915281565b6040516001600160a01b039091168152602001610426565b3480156107b357600080fd5b506103f16107c2366004613283565b6116cc565b3480156107d357600080fd5b506103f16107e2366004613283565b611771565b3480156107f357600080fd5b506103f1610802366004613417565b6118a0565b34801561081357600080fd5b5061044f60085481565b34801561082957600080fd5b506103f1610838366004613283565b611953565b34801561084957600080fd5b506103f16108583660046131f7565b611a55565b34801561086957600080fd5b5061044f610878366004613334565b611b63565b34801561088957600080fd5b506103f1610898366004613434565b611b85565b3480156108a957600080fd5b5061044f600a5481565b3480156108bf57600080fd5b50600d5461078f906001600160a01b031681565b3480156108df57600080fd5b50600b546104779060ff1681565b3480156108f957600080fd5b506103f1610908366004613417565b611c53565b34801561091957600080fd5b506103f161092836600461346d565b611d13565b34801561093957600080fd5b506103f1611ea8565b34801561094e57600080fd5b506103f1611f7d565b34801561096357600080fd5b50604080518082019091526009815268486f7573652041504560b81b60208201526104b5565b34801561099557600080fd5b5061044f60095481565b3480156109ab57600080fd5b506104776109ba366004613308565b6120c0565b3480156109cb57600080fd5b5061044f600c5481565b3480156109e157600080fd5b506103f16109f0366004613283565b6120e6565b348015610a0157600080fd5b506103f1610a103660046134d1565b6121d3565b6103f1610a23366004613283565b6123d6565b348015610a3457600080fd5b50610418610a433660046131f7565b6124c6565b348015610a5457600080fd5b5061044f60075481565b348015610a6a57600080fd5b5061044f610a79366004613334565b612622565b6103f1612672565b348015610a9257600080fd5b5061044f6127e2565b348015610aa757600080fd5b5061044f600e5481565b348015610abd57600080fd5b5061044f610acc3660046134f8565b600092915050565b348015610ae057600080fd5b5061044f6127f1565b348015610af557600080fd5b50610738610b04366004613392565b61280e565b348015610b1557600080fd5b506103f1610b24366004613283565b6128b2565b348015610b3557600080fd5b506103f1610b44366004613334565b6129a7565b348015610b5557600080fd5b506103f1610b64366004613283565b612b2c565b348015610b7557600080fd5b50610418610b84366004613283565b612c23565b606080600054600003610bdc5760005b604051908082528060200260200182016040528015610bc2578160200160208202803683370190505b506040805160008152602081019091529092509050610df3565b600054841115610bec5760005493505b60008467ffffffffffffffff811115610c0757610c07613526565b604051908082528060200260200182016040528015610c30578160200160208202803683370190505b50905060008567ffffffffffffffff811115610c4e57610c4e613526565b604051908082528060200260200182016040528015610c77578160200160208202803683370190505b5090506000610c87600188613552565b600054610c94919061357b565b9050858111610cab57610ca8600182613552565b95505b60005b610cb9600189613552565b811015610d515760008060005b89811015610cf85783850281016000908152600160208190526040909120805490820154940193929092019101610cc6565b50610d03898361357b565b868481518110610d1557610d1561358f565b6020908102919091010152610d2a898261357b565b858481518110610d3c57610d3c61358f565b60209081029190910101525050600101610cae565b50600160006001600054610d659190613552565b815260208101919091526040016000205483610d8260018a613552565b81518110610d9257610d9261358f565b602002602001018181525050600160006001600054610db19190613552565b81526020019081526020016000206001015482600189610dd19190613552565b81518110610de157610de161358f565b60209081029190910101525090925090505b9250929050565b6000818152600360205260408120548190610e1757600754610e27565b6000838152600360205260409020545b9050612710610e3682476135a5565b610e40919061357b565b9392505050565b6000610e51612e45565b610e63670de0b6b3a7640000846135a5565b610e6d919061357b565b92915050565b604051600080825290819033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259060200160405180910390a350600192915050565b6000670de0b6b3a7640000610ec9612e45565b610e6390846135a5565b6001600160a01b0381166000908152600260208190526040822001548190610efa84611b63565b610f0491906135bc565b6001600160a01b038416600090815260026020526040902060010154909150610e4090826135cf565b6000336001600160a01b03841603610f4a57610f48826110d5565b505b5060019392505050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc491906135f6565b6001600160a01b0316336001600160a01b031614610ff45760405162461bcd60e51b81526004016103c690613613565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108691906135f6565b6001600160a01b0316336001600160a01b0316146110b65760405162461bcd60e51b81526004016103c690613613565b6001600160a01b03909116600090815260026020526040902060050155565b60006002600f54036110f95760405162461bcd60e51b81526004016103c6906131c8565b6002600f55600d546001600160a01b03161561114f5760405162461bcd60e51b81526020600482015260156024820152744d6967726174696f6e20496e2050726f677265737360581b60448201526064016103c6565b600b5460ff1615156001036111ae57600a54156111ae5760405162461bcd60e51b815260206004820152601c60248201527f47616d65205265736f6c7574696f6e73204172652050656e64696e670000000060448201526064016103c6565b6111b733612622565b156111f35760405162461bcd60e51b815260206004820152600c60248201526b4e6f74205965742054696d6560a01b60448201526064016103c6565b60006111fe33611b63565b90508083111561120c578092505b60008184146112235761121e84610e47565b611234565b336000908152600260205260409020545b33600090815260026020526040902054909150158015906112645750336000908152600260205260409020548111155b80156112705750838210155b801561127c5750600084115b80156112885750600081115b6112c95760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b60448201526064016103c6565b6112d4338286612e5d565b33600081815260026020818152604092839020909101805488019055815192835282018690527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a1600060085411801561134a57503360009081526002602052604090206004015460ff16155b156114265760006127106008548661136291906135a5565b61136c919061357b565b905060006127106009548361138191906135a5565b61138b919061357b565b9050801561140c5761140c6000805160206137048339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140691906135f6565b82612eea565b61141f3361141a8489613552565b612eea565b5050611430565b6114303385612eea565b61147561143b612e45565b6040805180820182529182524260208084019182526000805481526001918290529283209351845590519281019290925580549091019055565b50506001600f555090565b6060808260008167ffffffffffffffff81111561149f5761149f613526565b6040519080825280602002602001820160405280156114c8578160200160208202803683370190505b50905060008267ffffffffffffffff8111156114e6576114e6613526565b60405190808252806020026020018201604052801561150f578160200160208202803683370190505b50905060005b838110156115be57600160008989848181106115335761153361358f565b9050602002013581526020019081526020016000206000015483828151811061155e5761155e61358f565b602002602001018181525050600160008989848181106115805761158061358f565b905060200201358152602001908152602001600020600101548282815181106115ab576115ab61358f565b6020908102919091010152600101611515565b5090969095509350505050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163b91906135f6565b6001600160a01b0316336001600160a01b03161461166b5760405162461bcd60e51b81526004016103c690613613565b611678600461271061357b565b8111156116c75760405162461bcd60e51b815260206004820152601e60248201527f4d6178205061796f75742050657263656e7461676520546f6f2048696768000060448201526064016103c6565b600755565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906135f6565b6001600160a01b0316336001600160a01b03161461176c5760405162461bcd60e51b81526004016103c690613613565b600e55565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e191906135f6565b6001600160a01b0316336001600160a01b0316146118115760405162461bcd60e51b81526004016103c690613613565b6103e781111561187a5760405162461bcd60e51b815260206004820152602e60248201527f4d696e2050726963652043616e6e6f74204578636565642039392e3925204f6660448201526d2043757272656e742056616c756560901b60648201526084016103c6565b6103e881611886612e45565b61189091906135a5565b61189a919061357b565b600c5550565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191091906135f6565b6001600160a01b0316336001600160a01b0316146119405760405162461bcd60e51b81526004016103c690613613565b6004805460ff1916911515919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561199f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c391906135f6565b6001600160a01b0316336001600160a01b0316146119f35760405162461bcd60e51b81526004016103c690613613565b600a548110611a505760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74204d616e75616c6c7920496e63726561736520546869732056616044820152626c756560e81b60648201526084016103c6565b600a55565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac591906135f6565b6001600160a01b0316336001600160a01b031614611af55760405162461bcd60e51b81526004016103c690613613565b611b02600461271061357b565b811115611b515760405162461bcd60e51b815260206004820152601e60248201527f4d6178205061796f75742050657263656e7461676520546f6f2048696768000060448201526064016103c6565b60009182526003602052604090912055565b6001600160a01b038116600090815260026020526040812054610e6d90610eb6565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf591906135f6565b6001600160a01b0316336001600160a01b031614611c255760405162461bcd60e51b81526004016103c690613613565b6001600160a01b03919091166000908152600260205260409020600401805460ff1916911515919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc391906135f6565b6001600160a01b0316336001600160a01b031614611cf35760405162461bcd60e51b81526004016103c690613613565b600b805460ff19168215801591909117909155611d10576000600a555b50565b6002600f5403611d355760405162461bcd60e51b81526004016103c6906131c8565b6002600f55600d546001600160a01b0316611d805760405162461bcd60e51b815260206004820152600b60248201526a27379026b4b3b930ba37b960a91b60448201526064016103c6565b3360009081526002602052604090205480611dcc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b60448201526064016103c6565b6000611dd782610eb6565b9050611de4338383612e5d565b33600081815260026020818152604092839020909101805485019055815192835282018390527fa59785389b00cbd19745afbe8d59b28e3161395c6b1e3525861a2b0dede0b90d910160405180910390a1600d5460405163c3fbb6fd60e01b81526001600160a01b039091169063c3fbb6fd908390611e6b90339089908990600401613637565b6000604051808303818588803b158015611e8457600080fd5b505af1158015611e98573d6000803e3d6000fd5b50506001600f5550505050505050565b6002600f5403611eca5760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015611f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3c9190613677565b611f585760405162461bcd60e51b81526004016103c690613694565b600b5460ff1615611f7657600a5415611f7657600a80546000190190555b6001600f55565b6002600f5403611f9f5760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015611fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120119190613677565b61202d5760405162461bcd60e51b81526004016103c690613694565b600c54612038612e45565b10156120865760405162461bcd60e51b815260206004820152601f60248201527f505249434520544f4f204c4f572c205076482047414d4553205041555345440060448201526064016103c6565b600e5461209390436136ba565b6000036120a5576120a561143b612e45565b600b5460ff1615611f7657600a805460010190556001600f55565b6000336001600160a01b038416036120dd576120db826110d5565b505b50600192915050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215691906135f6565b6001600160a01b0316336001600160a01b0316146121865760405162461bcd60e51b81526004016103c690613613565b6283d6008111156121ce5760405162461bcd60e51b81526020600482015260126024820152714c6f636b2054696d6520546f6f204c6f6e6760701b60448201526064016103c6565b600655565b6002600f54036121f55760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613677565b6122835760405162461bcd60e51b81526004016103c690613694565b600061228e84610dfa565b90506000818310156122a057826122a2565b815b90506000805160206137048339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231491906135f6565b6040516304ff60cf60e51b8152600481018790526001600160a01b0386811660248301529190911690639fec19e09083906044016000604051808303818588803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b5050604080518981526001600160a01b03891660208201529081018590527f3f1adb40444b6f3bd9a42ecbad6be967cb5f6381d5a80816bcb77723b6afc8be935060600191506123c29050565b60405180910390a150506001600f55505050565b604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613677565b61245f5760405162461bcd60e51b81526004016103c690613694565b6002600f54036124815760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604080518281523460208201527f871f6417af6eea44386a75fde228e4dc3157276f821e8c2ebe645303ac8f0847910160405180910390a1506001600f55565b6060806000548311156124d95760005492505b82841015806124e85750600054155b156124f4576000610b99565b60006125008585613552565b67ffffffffffffffff81111561251857612518613526565b604051908082528060200260200182016040528015612541578160200160208202803683370190505b50905060006125508686613552565b67ffffffffffffffff81111561256857612568613526565b604051908082528060200260200182016040528015612591578160200160208202803683370190505b509050855b8581101561261657600081815260016020526040902054836125b88984613552565b815181106125c8576125c861358f565b6020908102919091018101919091526000828152600191829052604090200154826125f38984613552565b815181106126035761260361358f565b6020908102919091010152600101612596565b50909590945092505050565b6001600160a01b038116600090815260026020526040812060030154421061264b576000610e6d565b6001600160a01b038216600090815260026020526040902060030154610e6d904290613552565b6002600f54036126945760405162461bcd60e51b81526004016103c6906131c8565b6002600f55346126d35760405162461bcd60e51b815260206004820152600a6024820152695a65726f2056616c756560b01b60448201526064016103c6565b600d546001600160a01b0316156127245760405162461bcd60e51b81526020600482015260156024820152744d6967726174696f6e20496e2050726f677265737360581b60448201526064016103c6565b60006127303447613552565b905060055460001480612741575080155b15612755576127503334612fc9565b612760565b612760333483613056565b60045460ff1615156000036127da57336000818152600260205260409020600501549061278c90611b63565b11156127da5760405162461bcd60e51b815260206004820152601960248201527f4d617820436f6e747269627574696f6e2045786365656465640000000000000060448201526064016103c6565b506001600f55565b60006127ec612e45565b905090565b60006127106007544761280491906135a5565b6127ec919061357b565b600080828180805b8381101561288f57600160008989848181106128345761283461358f565b9050602002013581526020019081526020016000206000015483019250600160008989848181106128675761286761358f565b9050602002013581526020019081526020016000206001015482019150806001019050612816565b5061289a838361357b565b6128a4848361357b565b945094505050509250929050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292291906135f6565b6001600160a01b0316336001600160a01b0316146129525760405162461bcd60e51b81526004016103c690613613565b61295f600a61271061357b565b8111156129a25760405162461bcd60e51b815260206004820152601160248201527008af0d2e8408ccaca40a8dede4090d2ced607b1b60448201526064016103c6565b600855565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1791906135f6565b6001600160a01b0316336001600160a01b031614612a475760405162461bcd60e51b81526004016103c690613613565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015612a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab991906136ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b289190613677565b5050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9c91906135f6565b6001600160a01b0316336001600160a01b031614612bcc5760405162461bcd60e51b81526004016103c690613613565b612710811115612c1e5760405162461bcd60e51b815260206004820152601860248201527f5265666c6563742050657263656e7420546f6f2048696768000000000000000060448201526064016103c6565b600955565b606080600054600003612c4e5750506040805160008082526020820190815281830190925292909150565b600054831115612c5e5760005492505b60008367ffffffffffffffff811115612c7957612c79613526565b604051908082528060200260200182016040528015612ca2578160200160208202803683370190505b50905060008467ffffffffffffffff811115612cc057612cc0613526565b604051908082528060200260200182016040528015612ce9578160200160208202803683370190505b5090506000612cf9600187613552565b600054612d06919061357b565b905060005b612d16600188613552565b811015612d9f5760016000612d2b84846135a5565b815260200190815260200160002060000154848281518110612d4f57612d4f61358f565b602090810291909101015260016000612d6884846135a5565b815260200190815260200160002060010154838281518110612d8c57612d8c61358f565b6020908102919091010152600101612d0b565b50600160006001600054612db39190613552565b815260208101919091526040016000205483612dd0600189613552565b81518110612de057612de061358f565b602002602001018181525050600160006001600054612dff9190613552565b81526020019081526020016000206001015482600188612e1f9190613552565b81518110612e2f57612e2f61358f565b6020908102919091010152509094909350915050565b600554600090612804670de0b6b3a7640000476135a5565b6001600160a01b03831660009081526002602052604081208054849290612e85908490613552565b925050819055508160056000828254612e9e9190613552565b90915550506040518181526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b604080516000808252602082019092526001600160a01b038416908390604051612f1491906136e7565b60006040518083038185875af1925050503d8060008114612f51576040519150601f19603f3d011682016040523d82523d6000602084013e612f56565b606091505b5050905080612fc45760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b60648201526084016103c6565b505050565b6001600160a01b03821660009081526002602052604081206001018054839290612ff49084906135bc565b909155506130059050828280613141565b61301061143b612e45565b604080516001600160a01b0384168152602081018390527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a15050565b6000818360055461306791906135a5565b613071919061357b565b9050600081116130b25760405162461bcd60e51b815260206004820152600c60248201526b16995c9bc8151bc8135a5b9d60a21b60448201526064016103c6565b6001600160a01b038416600090815260026020526040812060010180548592906130dd9084906135bc565b909155506130ee9050848285613141565b6130f961143b612e45565b604080516001600160a01b0386168152602081018590527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a150505050565b6001600160a01b0383166000908152600260205260409020805483019055600580548301905560065461317490426135bc565b6001600160a01b0384166000818152600260205260408082206003019390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612edd9085815260200190565b6020808252601590820152741499595b9d1c985b98de4811dd585c990818d85b1b605a1b604082015260600190565b6000806040838503121561320a57600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561324b57815186526020958601959091019060010161322d565b5093949350505050565b6040815260006132686040830185613219565b828103602084015261327a8185613219565b95945050505050565b60006020828403121561329557600080fd5b5035919050565b60005b838110156132b757818101518382015260200161329f565b50506000910152565b60208152600082518060208401526132df81604085016020870161329c565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611d1057600080fd5b6000806040838503121561331b57600080fd5b8235613326816132f3565b946020939093013593505050565b60006020828403121561334657600080fd5b8135610e40816132f3565b60008060006060848603121561336657600080fd5b8335613371816132f3565b92506020840135613381816132f3565b929592945050506040919091013590565b600080602083850312156133a557600080fd5b823567ffffffffffffffff8111156133bc57600080fd5b8301601f810185136133cd57600080fd5b803567ffffffffffffffff8111156133e457600080fd5b8560208260051b84010111156133f957600080fd5b6020919091019590945092505050565b8015158114611d1057600080fd5b60006020828403121561342957600080fd5b8135610e4081613409565b6000806040838503121561344757600080fd5b8235613452816132f3565b9150602083013561346281613409565b809150509250929050565b6000806020838503121561348057600080fd5b823567ffffffffffffffff81111561349757600080fd5b8301601f810185136134a857600080fd5b803567ffffffffffffffff8111156134bf57600080fd5b8560208284010111156133f957600080fd5b6000806000606084860312156134e657600080fd5b833592506020840135613381816132f3565b6000806040838503121561350b57600080fd5b8235613516816132f3565b91506020830135613462816132f3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610e6d57610e6d61353c565b634e487b7160e01b600052601260045260246000fd5b60008261358a5761358a613565565b500490565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610e6d57610e6d61353c565b80820180821115610e6d57610e6d61353c565b81810360008312801583831316838312821617156135ef576135ef61353c565b5092915050565b60006020828403121561360857600080fd5b8151610e40816132f3565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561368957600080fd5b8151610e4081613409565b6020808252600c908201526b155b905d5d1a1bdc9a5e995960a21b604082015260600190565b6000826136c9576136c9613565565b500690565b6000602082840312156136e057600080fd5b5051919050565b600082516136f981846020870161329c565b919091019291505056fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220d25508a340ffed26ca756d805500d24df88be8a49b508a9cba78a633e8dea7ed64736f6c634300081c0033
Deployed Bytecode Sourcemap
14089:17141:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26247:1;26233:11;;:15;26225:39;;;;-1:-1:-1;;;26225:39:0;;216:2:1;26225:39:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:41;325:18;;26225:39:0;;;;;;;;;16338:1;26283:7;;:19;26275:53;;;;-1:-1:-1;;;26275:53:0;;;;;;;:::i;:::-;14089:17141;;;;;11559:1761;;;;;;;;;;-1:-1:-1;11559:1761:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;17646:254;;;;;;;;;;-1:-1:-1;17646:254:0;;;;;:::i;:::-;;:::i;:::-;;;2327:25:1;;;2315:2;2300:18;17646:254:0;2181:177:1;14708:32:0;;;;;;;;;;-1:-1:-1;14708:32:0;;;;;;;;;;;2528:14:1;;2521:22;2503:41;;2491:2;2476:18;14708:32:0;2363:187:1;17079:100:0;;;;;;;;;;-1:-1:-1;17153:18:0;;;;;;;;;;;;-1:-1:-1;;;17153:18:0;;;;17079:100;;;;;;;:::i;30198:151::-;;;;;;;;;;-1:-1:-1;30198:151:0;;;;;:::i;:::-;;:::i;18263:147::-;;;;;;;;;;-1:-1:-1;18263:147:0;;;;;:::i;:::-;;:::i;30429:158::-;;;;;;;;;;-1:-1:-1;30429:158:0;;;;;:::i;:::-;;:::i;14909:36::-;;;;;;;;;;;;;;;;14595:51;;;;;;;;;;-1:-1:-1;14595:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;17386:111;;;;;;;;;;-1:-1:-1;17468:21:0;17386:111;;14447:47;;;;;;;;;;-1:-1:-1;14447:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4252:25:1;;;4308:2;4293:18;;4286:34;;;;4336:18;;;4329:34;;;;4394:2;4379:18;;4372:34;4450:14;4443:22;4437:3;4422:19;;4415:51;4497:3;4482:19;;4475:35;4239:3;4224:19;14447:47:0;3971:545:1;30815:213:0;;;;;;;;;;-1:-1:-1;30815:213:0;;;;;:::i;:::-;;:::i;9046:105::-;;;;;;;;;;-1:-1:-1;9100:7:0;9127:16;9046:105;;18624:219;;;;;;;;;;-1:-1:-1;18624:219:0;;;;;:::i;:::-;;:::i;21704:109::-;;;;;;;;;;-1:-1:-1;21704:109:0;;;;;:::i;:::-;;:::i;19063:129::-;;;;;;;;;;-1:-1:-1;19063:129:0;;;;;:::i;:::-;;:::i;23847:2332::-;;;;;;;;;;-1:-1:-1;23847:2332:0;;;;;:::i;:::-;;:::i;17293:87::-;;;;;;;;;;-1:-1:-1;17293:87:0;;17370:2;5356:36:1;;5344:2;5329:18;17293:87:0;5214:184:1;9953:524:0;;;;;;;;;;-1:-1:-1;9953:524:0;;;;;:::i;:::-;;:::i;14856:26::-;;;;;;;;;;;;;;;;8874:164;;;;;;;;;;-1:-1:-1;8874:164:0;;;;;:::i;:::-;8936:7;8973:19;;;:12;:19;;;;;;;;:25;;9000:29;;;8973:25;;8874:164;;;;;6192:25:1;;;6248:2;6233:18;;6226:34;;;;6165:18;8874:164:0;6018:248:1;20905:240:0;;;;;;;;;;-1:-1:-1;20905:240:0;;;;;:::i;:::-;;:::i;1012:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1012:107:0;;;;;-1:-1:-1;;;;;6460:32:1;;;6442:51;;6430:2;6415:18;1012:107:0;6271:228:1;21821:102:0;;;;;;;;;;-1:-1:-1;21821:102:0;;;;;:::i;:::-;;:::i;21421:275::-;;;;;;;;;;-1:-1:-1;21421:275:0;;;;;:::i;:::-;;:::i;19337:103::-;;;;;;;;;;-1:-1:-1;19337:103:0;;;;;:::i;:::-;;:::i;15197:28::-;;;;;;;;;;;;;;;;20152:278;;;;;;;;;;-1:-1:-1;20152:278:0;;;;;:::i;:::-;;:::i;21153:260::-;;;;;;;;;;-1:-1:-1;21153:260:0;;;;;:::i;:::-;;:::i;17979:158::-;;;;;;;;;;-1:-1:-1;17979:158:0;;;;;:::i;:::-;;:::i;19200:129::-;;;;;;;;;;-1:-1:-1;19200:129:0;;;;;:::i;:::-;;:::i;15448:33::-;;;;;;;;;;;;;;;;16141:25;;;;;;;;;;-1:-1:-1;16141:25:0;;;;-1:-1:-1;;;;;16141:25:0;;;15592:39;;;;;;;;;;-1:-1:-1;15592:39:0;;;;;;;;20538:191;;;;;;;;;;-1:-1:-1;20538:191:0;;;;;:::i;:::-;;:::i;21931:870::-;;;;;;;;;;-1:-1:-1;21931:870:0;;;;;:::i;:::-;;:::i;26903:328::-;;;;;;;;;;;;;:::i;26344:551::-;;;;;;;;;;;;;:::i;17185:102::-;;;;;;;;;;-1:-1:-1;17261:18:0;;;;;;;;;;;;-1:-1:-1;;;17261:18:0;;;;17185:102;;15331:39;;;;;;;;;;;;;;;;18420:198;;;;;;;;;;-1:-1:-1;18420:198:0;;;;;:::i;:::-;;:::i;16015:24::-;;;;;;;;;;;;;;;;18851:204;;;;;;;;;;-1:-1:-1;18851:204:0;;;;;:::i;:::-;;:::i;27363:582::-;;;;;;;;;;-1:-1:-1;27363:582:0;;;;;:::i;:::-;;:::i;27953:138::-;;;;;;:::i;:::-;;:::i;9159:786::-;;;;;;;;;;-1:-1:-1;9159:786:0;;;;;:::i;:::-;;:::i;15070:37::-;;;;;;;;;;;;;;;;29930:188;;;;;;;;;;-1:-1:-1;29930:188:0;;;;;:::i;:::-;;:::i;22920:839::-;;;:::i;30644:101::-;;;;;;;;;;;;;:::i;16193:27::-;;;;;;;;;;;;;;;;18145:106;;;;;;;;;;-1:-1:-1;18145:106:0;;;;;:::i;:::-;18214:7;18145:106;;;;;17505:133;;;;;;;;;;;;;:::i;13328:505::-;;;;;;;;;;-1:-1:-1;13328:505:0;;;;;:::i;:::-;;:::i;19448:198::-;;;;;;;;;;-1:-1:-1;19448:198:0;;;;;:::i;:::-;;:::i;20737:156::-;;;;;;;;;;-1:-1:-1;20737:156:0;;;;;:::i;:::-;;:::i;19654:229::-;;;;;;;;;;-1:-1:-1;19654:229:0;;;;;:::i;:::-;;:::i;10485:1066::-;;;;;;;;;;-1:-1:-1;10485:1066:0;;;;;:::i;:::-;;:::i;11559:1761::-;11676:16;11694;11727;;11747:1;11727:21;11723:97;;11787:1;11773:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11773:16:0;-1:-1:-1;11791:16:0;;;11805:1;11791:16;;;;;;;;11765:43;;-1:-1:-1;11791:16:0;-1:-1:-1;11765:43:0;;11723:97;11852:16;;11836:13;:32;11832:97;;;11901:16;;11885:32;;11832:97;11998:23;12038:13;12024:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12024:28:0;;11998:54;;12063:27;12107:13;12093:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12093:28:0;-1:-1:-1;12063:58:0;-1:-1:-1;12193:12:0;12229:17;12245:1;12229:13;:17;:::i;:::-;12208:16;;:40;;;;:::i;:::-;12193:55;;12271:12;12263:4;:20;12259:76;;12315:8;12322:1;12315:4;:8;:::i;:::-;12300:23;;12259:76;12441:9;12436:634;12460:17;12476:1;12460:13;:17;:::i;:::-;12456:1;:21;12436:634;;;12569:16;12604:20;12648:6;12643:274;12664:12;12660:1;:16;12643:274;;;12758:8;;;12757:14;;12744:28;;;;:12;:28;;;;;;;;:34;;12817:38;;;;12732:46;;;12801:54;;;;;12878:3;12643:274;;;-1:-1:-1;12945:23:0;12956:12;12945:8;:23;:::i;:::-;12933:6;12940:1;12933:9;;;;;;;;:::i;:::-;;;;;;;;;;:35;12999:27;13014:12;12999;:27;:::i;:::-;12983:10;12994:1;12983:13;;;;;;;;:::i;:::-;;;;;;;;;;:43;-1:-1:-1;;13053:3:0;;12436:634;;;;13145:12;:34;13177:1;13158:16;;:20;;;;:::i;:::-;13145:34;;;;;;;;;;;-1:-1:-1;13145:34:0;:40;13117:6;13124:17;13140:1;13124:13;:17;:::i;:::-;13117:25;;;;;;;;:::i;:::-;;;;;;:68;;;;;13228:12;:34;13260:1;13241:16;;:20;;;;:::i;:::-;13228:34;;;;;;;;;;;:44;;;13196:10;13223:1;13207:13;:17;;;;:::i;:::-;13196:29;;;;;;;;:::i;:::-;;;;;;;;;;:76;-1:-1:-1;13293:6:0;;-1:-1:-1;13301:10:0;-1:-1:-1;11559:1761:0;;;;;;:::o;17646:254::-;17713:7;17754:22;;;:13;:22;;;;;;17713:7;;17754:70;;17808:16;;17754:70;;;17783:22;;;;:13;:22;;;;;;17754:70;17733:91;-1:-1:-1;14804:6:0;17844:34;17733:91;17844:21;:34;:::i;:::-;17842:50;;;;:::i;:::-;17835:57;17646:254;-1:-1:-1;;;17646:254:0:o;30198:151::-;30268:7;30322:17;:15;:17::i;:::-;30299:18;15016:6;30299;:18;:::i;:::-;30297:42;;;;:::i;:::-;30288:53;30198:151;-1:-1:-1;;30198:151:0:o;18263:147::-;18345:35;;18323:4;2327:25:1;;;18323:4:0;;;18354:10;;18345:35;;2315:2:1;2300:18;18345:35:0;;;;;;;-1:-1:-1;18398:4:0;18263:147;;;;:::o;30429:158::-;30506:7;15016:6;30546:17;:15;:17::i;:::-;30537:26;;:6;:26;:::i;30815:213::-;-1:-1:-1;;;;;30925:14:0;;30877:6;30925:14;;;:8;:14;;;;;;;:29;;30877:6;;30907:15;30934:4;30907:9;:15::i;:::-;:47;;;;:::i;:::-;-1:-1:-1;;;;;30993:14:0;;;;;;:8;:14;;;;;:26;;;30896:58;;-1:-1:-1;30972:48:0;;30896:58;30972:48;:::i;18624:219::-;18717:4;18751:10;-1:-1:-1;;;;;18738:23:0;;;18734:72;;18778:16;18787:6;18778:8;:16::i;:::-;;18734:72;-1:-1:-1;18831:4:0;18624:219;;;;;:::o;21704:109::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21774:8:::1;:31:::0;;-1:-1:-1;;;;;;21774:31:0::1;-1:-1:-1::0;;;;;21774:31:0;;;::::1;::::0;;;::::1;::::0;;21704:109::o;19063:129::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19148:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;:30:::1;;:36:::0;19063:129::o;23847:2332::-;23910:7;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;23960:8:::1;::::0;-1:-1:-1;;;;;23960:8:0::1;23952:31:::0;23930:102:::1;;;::::0;-1:-1:-1;;;23930:102:0;;11243:2:1;23930:102:0::1;::::0;::::1;11225:21:1::0;11282:2;11262:18;;;11255:30;-1:-1:-1;;;11301:18:1;;;11294:51;11362:18;;23930:102:0::1;11041:345:1::0;23930:102:0::1;24087:19;::::0;::::1;;:27;;:19:::0;:27;24083:173:::1;;24157:18;::::0;:23;24131:113:::1;;;::::0;-1:-1:-1;;;24131:113:0;;11593:2:1;24131:113:0::1;::::0;::::1;11575:21:1::0;11632:2;11612:18;;;11605:30;11671;11651:18;;;11644:58;11719:18;;24131:113:0::1;11391:352:1::0;24131:113:0::1;24319:27;24335:10;24319:15;:27::i;:::-;:32:::0;24297:94:::1;;;::::0;-1:-1:-1;;;24297:94:0;;11950:2:1;24297:94:0::1;::::0;::::1;11932:21:1::0;11989:2;11969:18;;;11962:30;-1:-1:-1;;;12008:18:1;;;12001:42;12060:18;;24297:94:0::1;11748:336:1::0;24297:94:0::1;24456:15;24474:21;24484:10;24474:9;:21::i;:::-;24456:39;;24521:7;24512:6;:16;24508:65;;;24554:7;24545:16;;24508:65;24645:17;24675:7;24665:6;:17;:82;;24716:31;24740:6;24716:23;:31::i;:::-;24665:82;;;24694:10;24685:20;::::0;;;:8:::1;:20;::::0;;;;:28;24665:82:::1;24791:10;24813:1;24782:20:::0;;;:8:::1;:20;::::0;;;;:28;24645:102;;-1:-1:-1;24782:32:0;;;;:93:::1;;-1:-1:-1::0;24840:10:0::1;24831:20;::::0;;;:8:::1;:20;::::0;;;;:28;:44;-1:-1:-1;24831:44:0::1;24782:93;:127;;;;;24903:6;24892:7;:17;;24782:127;:154;;;;;24935:1;24926:6;:10;24782:154;:187;;;;;24968:1;24953:12;:16;24782:187;24760:255;;;::::0;-1:-1:-1;;;24760:255:0;;12291:2:1;24760:255:0::1;::::0;::::1;12273:21:1::0;12330:2;12310:18;;;12303:30;-1:-1:-1;;;12349:18:1;;;12342:48;12407:18;;24760:255:0::1;12089:342:1::0;24760:255:0::1;25070:39;25076:10;25088:12;25102:6;25070:5;:39::i;:::-;25194:10;25185:20;::::0;;;:8:::1;:20;::::0;;;;;;;;:35;;::::1;:45:::0;;;::::1;::::0;;25290:28;;12610:51:1;;;12677:18;;12670:34;;;25290:28:0::1;::::0;12583:18:1;25290:28:0::1;;;;;;;25383:1;25373:7;;:11;:56;;;;-1:-1:-1::0;25397:10:0::1;25388:20;::::0;;;:8:::1;:20;::::0;;;;:32:::1;;::::0;::::1;;:41;25373:56;25369:674;;;25498:11;14804:6;25523:7;;25514:6;:16;;;;:::i;:::-;25512:32;;;;:::i;:::-;25498:46;;25559:21;14804:6;25591:17;;25585:3;:23;;;;:::i;:::-;25583:39;;;;:::i;:::-;25559:63:::0;-1:-1:-1;25643:17:0;;25639:167:::1;;25722:68;-1:-1:-1::0;;;;;;;;;;;;;;;;25753:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25776:13;25722:30;:68::i;:::-;25857:56;25888:10;25900:12;25909:3:::0;25900:6;:12:::1;:::i;:::-;25857:30;:56::i;:::-;25431:494;;25369:674;;;25981:50;26012:10;26024:6;25981:30;:50::i;:::-;26084:22;26088:17;:15;:17::i;:::-;8758:35:::0;;;;;;;;;;;8777:15;8758:35;;;;;;;-1:-1:-1;8738:16:0;;8725:30;;:12;:30;;;;;;;:68;;;;;;;;;;;;;8829:18;;;;;;;8677:189;26084:22:::1;-1:-1:-1::0;;16294:1:0;16516:7;:22;-1:-1:-1;26165:6:0;23847:2332::o;9953:524::-;10035:16;;10093:7;10082:8;10093:7;10144:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10144:18:0;;10118:44;;10173:27;10217:3;10203:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10203:18:0;;10173:48;;10239:9;10234:196;10258:3;10254:1;:7;10234:196;;;10291:12;:24;10304:7;;10312:1;10304:10;;;;;;;:::i;:::-;;;;;;;10291:24;;;;;;;;;;;:30;;;10279:6;10286:1;10279:9;;;;;;;;:::i;:::-;;;;;;:42;;;;;10352:12;:24;10365:7;;10373:1;10365:10;;;;;;;:::i;:::-;;;;;;;10352:24;;;;;;;;;;;:34;;;10336:10;10347:1;10336:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;10413:3;;10234:196;;;-1:-1:-1;10450:6:0;;;;-1:-1:-1;9953:524:0;-1:-1:-1;;;;9953:524:0:o;20905:240::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21024:13:::1;21036:1;14804:6;21024:13;:::i;:::-;21008:12;:29;;20986:109;;;::::0;-1:-1:-1;;;20986:109:0;;12917:2:1;20986:109:0::1;::::0;::::1;12899:21:1::0;12956:2;12936:18;;;12929:30;12995:32;12975:18;;;12968:60;13045:18;;20986:109:0::1;12715:354:1::0;20986:109:0::1;21106:16;:31:::0;20905:240::o;21821:102::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21893:8:::1;:22:::0;21821:102::o;21421:275::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21540:3:::1;21520:16;:23;;21498:119;;;::::0;-1:-1:-1;;;21498:119:0;;13276:2:1;21498:119:0::1;::::0;::::1;13258:21:1::0;13315:2;13295:18;;;13288:30;13354:34;13334:18;;;13327:62;-1:-1:-1;;;13405:18:1;;;13398:44;13459:19;;21498:119:0::1;13074:410:1::0;21498:119:0::1;21683:5;21662:16;21642:17;:15;:17::i;:::-;:36;;;;:::i;:::-;21640:48;;;;:::i;:::-;21628:9;:60:::0;-1:-1:-1;21421:275:0:o;19337:103::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;19408:13:::1;:24:::0;;-1:-1:-1;;19408:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19337:103::o;20152:278::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;20290:18:::1;;20268:19;:40;20246:125;;;::::0;-1:-1:-1;;;20246:125:0;;13691:2:1;20246:125:0::1;::::0;::::1;13673:21:1::0;13730:2;13710:18;;;13703:30;13769:34;13749:18;;;13742:62;-1:-1:-1;;;13820:18:1;;;13813:33;13863:19;;20246:125:0::1;13489:399:1::0;20246:125:0::1;20382:18;:40:::0;20152:278::o;21153:260::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21286:13:::1;21298:1;14804:6;21286:13;:::i;:::-;21270:12;:29;;21248:109;;;::::0;-1:-1:-1;;;21248:109:0;;12917:2:1;21248:109:0::1;::::0;::::1;12899:21:1::0;12956:2;12936:18;;;12929:30;12995:32;12975:18;;;12968:60;13045:18;;21248:109:0::1;12715:354:1::0;21248:109:0::1;21368:22;::::0;;;:13:::1;:22;::::0;;;;;:37;21153:260::o;17979:158::-;-1:-1:-1;;;;;18103:17:0;;18045:7;18103:17;;;:8;:17;;;;;:25;18072:57;;:30;:57::i;19200:129::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19284:14:0;;;::::1;;::::0;;;:8:::1;:14;::::0;;;;:26:::1;;:37:::0;;-1:-1:-1;;19284:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19200:129::o;20538:191::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;20616:19:::1;:31:::0;;-1:-1:-1;;20616:31:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;20658:64:::1;;20709:1;20688:18;:22:::0;20658:64:::1;20538:191:::0;:::o;21931:870::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;22032:8:::1;::::0;-1:-1:-1;;;;;22032:8:0::1;22002:92;;;::::0;-1:-1:-1;;;22002:92:0;;14095:2:1;22002:92:0::1;::::0;::::1;14077:21:1::0;14134:2;14114:18;;;14107:30;-1:-1:-1;;;14153:18:1;;;14146:41;14204:18;;22002:92:0::1;13893:335:1::0;22002:92:0::1;22162:10;22131:19;22153:20:::0;;;:8:::1;:20;::::0;;;;:28;22214:15;22192:77:::1;;;::::0;-1:-1:-1;;;22192:77:0;;14435:2:1;22192:77:0::1;::::0;::::1;14417:21:1::0;14474:2;14454:18;;;14447:30;-1:-1:-1;;;14493:18:1;;;14486:42;14545:18;;22192:77:0::1;14233:336:1::0;22192:77:0::1;22321:20;22344:43;22375:11;22344:30;:43::i;:::-;22321:66;;22430:44;22436:10;22448:11;22461:12;22430:5;:44::i;:::-;22559:10;22550:20;::::0;;;:8:::1;:20;::::0;;;;;;;;:35;;::::1;:51:::0;;;::::1;::::0;;22661:33;;12610:51:1;;;12677:18;;12670:34;;;22661:33:0::1;::::0;12583:18:1;22661:33:0::1;;;;;;;22738:8;::::0;:55:::1;::::0;-1:-1:-1;;;22738:55:0;;-1:-1:-1;;;;;22738:8:0;;::::1;::::0;:16:::1;::::0;22762:12;;22738:55:::1;::::0;22776:10:::1;::::0;22788:4;;;;22738:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;16294:1:0;16516:7;:22;-1:-1:-1;;;;;;;21931:870:0:o;26903:328::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;1330:26:::1;::::0;-1:-1:-1;;;1330:26:0;;1345:10:::1;1330:26;::::0;::::1;6442:51:1::0;-1:-1:-1;;;;;;;;;;;1076:42:0;1330:14:::1;::::0;6415:18:1;;1330:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1308:88;;;;-1:-1:-1::0;;;1308:88:0::1;;;;;;;:::i;:::-;26991:19:::2;::::0;::::2;;:28;27036:7;26987:67;27109:18;::::0;:22;27105:119:::2;;27179:18;27177:20:::0;;-1:-1:-1;;27177:20:0;;;27105:119:::2;16294:1:::0;16516:7;:22;26903:328::o;26344:551::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;1330:26:::1;::::0;-1:-1:-1;;;1330:26:0;;1345:10:::1;1330:26;::::0;::::1;6442:51:1::0;-1:-1:-1;;;;;;;;;;;1076:42:0;1330:14:::1;::::0;6415:18:1;;1330:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1308:88;;;;-1:-1:-1::0;;;1308:88:0::1;;;;;;;:::i;:::-;26465:9:::2;;26444:17;:15;:17::i;:::-;:30;;26422:111;;;::::0;-1:-1:-1;;;26422:111:0;;16065:2:1;26422:111:0::2;::::0;::::2;16047:21:1::0;16104:2;16084:18;;;16077:30;16143:33;16123:18;;;16116:61;16194:18;;26422:111:0::2;15863:355:1::0;26422:111:0::2;26645:8;::::0;26630:23:::2;::::0;:12:::2;:23;:::i;:::-;26657:1;26630:28:::0;26626:116:::2;;26708:22;26712:17;:15;:17::i;26708:22::-;26758:19;::::0;::::2;;:28;26803:7;26754:67;26858:18;26856:20:::0;;::::2;;::::0;;16294:1;16516:7;:22;26344:551::o;18420:198::-;18500:4;18534:10;-1:-1:-1;;;;;18521:23:0;;;18517:72;;18561:16;18570:6;18561:8;:16::i;:::-;;18517:72;-1:-1:-1;18606:4:0;18420:198;;;;:::o;18851:204::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;18960:8:::1;18945:11;:23;;18923:91;;;::::0;-1:-1:-1;;;18923:91:0;;16542:2:1;18923:91:0::1;::::0;::::1;16524:21:1::0;16581:2;16561:18;;;16554:30;-1:-1:-1;;;16600:18:1;;;16593:48;16658:18;;18923:91:0::1;16340:342:1::0;18923:91:0::1;19025:8;:22:::0;18851:204::o;27363:582::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;1330:26:::1;::::0;-1:-1:-1;;;1330:26:0;;1345:10:::1;1330:26;::::0;::::1;6442:51:1::0;-1:-1:-1;;;;;;;;;;;1076:42:0;1330:14:::1;::::0;6415:18:1;;1330:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1308:88;;;;-1:-1:-1::0;;;1308:88:0::1;;;;;;;:::i;:::-;27505:18:::2;27526:28;27546:7;27526:19;:28::i;:::-;27505:49;;27591:18;27621:10;27612:5;:19;;:40;;27647:5;27612:40;;;27634:10;27612:40;27591:61;;-1:-1:-1::0;;;;;;;;;;;;;;;;27748:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27734:115;::::0;-1:-1:-1;;;27734:115:0;;::::2;::::0;::::2;16861:25:1::0;;;-1:-1:-1;;;;;16922:32:1;;;16902:18;;;16895:60;27734:44:0;;;::::2;::::0;::::2;::::0;27786:10;;16834:18:1;;27734:115:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;27901:36:0::2;::::0;;17168:25:1;;;-1:-1:-1;;;;;17229:32:1;;17224:2;17209:18;;17202:60;17278:18;;;17271:34;;;27901:36:0::2;::::0;-1:-1:-1;17156:2:1;17141:18;;-1:-1:-1;27901:36:0::2;::::0;-1:-1:-1;16966:345:1;27901:36:0::2;;;;;;;;-1:-1:-1::0;;16294:1:0;16516:7;:22;-1:-1:-1;;;27363:582:0:o;27953:138::-;1330:26;;-1:-1:-1;;;1330:26:0;;1345:10;1330:26;;;6442:51:1;-1:-1:-1;;;;;;;;;;;1076:42:0;1330:14;;6415:18:1;;1330:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1308:88;;;;-1:-1:-1;;;1308:88:0;;;;;;;:::i;:::-;16338:1:::1;16419:7;;:19:::0;16411:53:::1;;;;-1:-1:-1::0;;;16411:53:0::1;;;;;;;:::i;:::-;16338:1;16475:7;:18:::0;28055:28:::2;::::0;;6192:25:1;;;28073:9:0::2;6248:2:1::0;6233:18;;6226:34;28055:28:0::2;::::0;6165:18:1;28055:28:0::2;;;;;;;-1:-1:-1::0;16294:1:0::1;16516:7;:22:::0;27953:138::o;9159:786::-;9249:16;9267;9311;;9300:8;:27;9296:87;;;9355:16;;9344:27;;9296:87;9411:8;9397:10;:22;;:47;;;-1:-1:-1;9423:16:0;;:21;9397:47;9393:123;;;9483:1;9469:16;;9393:123;9528:23;9568:21;9579:10;9568:8;:21;:::i;:::-;9554:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9554:36:0;-1:-1:-1;9528:62:0;-1:-1:-1;9601:27:0;9645:21;9656:10;9645:8;:21;:::i;:::-;9631:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9631:36:0;-1:-1:-1;9601:66:0;-1:-1:-1;9697:10:0;9680:218;9713:8;9709:1;:12;9680:218;;;9764:15;;;;:12;:15;;;;;:21;9739:6;9746:14;9750:10;9777:1;9746:14;:::i;:::-;9739:22;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;;9829:15;;;;:12;:15;;;;;;;:25;;9800:10;9811:14;9815:10;9842:1;9811:14;:::i;:::-;9800:26;;;;;;;;:::i;:::-;;;;;;;;;;:54;9881:3;;9680:218;;;-1:-1:-1;9918:6:0;;;;-1:-1:-1;9159:786:0;-1:-1:-1;;;9159:786:0:o;29930:188::-;-1:-1:-1;;;;;30017:14:0;;29990:7;30017:14;;;:8;:14;;;;;:25;;;30045:15;-1:-1:-1;30017:93:0;;30109:1;30017:93;;;-1:-1:-1;;;;;30063:14:0;;;;;;:8;:14;;;;;:25;;;:43;;30091:15;;30063:43;:::i;22920:839::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;23002:9:::1;22980:73;;;::::0;-1:-1:-1;;;22980:73:0;;17518:2:1;22980:73:0::1;::::0;::::1;17500:21:1::0;17557:2;17537:18;;;17530:30;-1:-1:-1;;;17576:18:1;;;17569:40;17626:18;;22980:73:0::1;17316:334:1::0;22980:73:0::1;23094:8;::::0;-1:-1:-1;;;;;23094:8:0::1;23086:31:::0;23064:102:::1;;;::::0;-1:-1:-1;;;23064:102:0;;11243:2:1;23064:102:0::1;::::0;::::1;11225:21:1::0;11282:2;11262:18;;;11255:30;-1:-1:-1;;;11301:18:1;;;11294:51;11362:18;;23064:102:0::1;11041:345:1::0;23064:102:0::1;23220:20;23243:33;23267:9;23243:21;:33;:::i;:::-;23220:56;;23343:11;;23358:1;23343:16;:40;;;-1:-1:-1::0;23363:20:0;;23343:40:::1;23339:198;;;23400:45;23423:10;23435:9;23400:22;:45::i;:::-;23339:198;;;23478:47;23486:10;23498:9;23509:15;23478:7;:47::i;:::-;23553:13;::::0;::::1;;:22;;:13;:22:::0;23549:203:::1;;23652:10;23643:20;::::0;;;:8:::1;:20;::::0;;;;:36:::1;;::::0;;23618:21:::1;::::0;:9:::1;:21::i;:::-;:61;;23592:148;;;::::0;-1:-1:-1;;;23592:148:0;;17857:2:1;23592:148:0::1;::::0;::::1;17839:21:1::0;17896:2;17876:18;;;17869:30;17935:27;17915:18;;;17908:55;17980:18;;23592:148:0::1;17655:349:1::0;23592:148:0::1;-1:-1:-1::0;16294:1:0;16516:7;:22;22920:839::o;30644:101::-;30693:7;30720:17;:15;:17::i;:::-;30713:24;;30644:101;:::o;17505:133::-;17547:7;14804:6;17600:16;;17576:21;:40;;;;:::i;:::-;17574:56;;;;:::i;13328:505::-;13411:7;;13451;13411;;;13536:234;13560:3;13556:1;:7;13536:234;;;13622:12;:24;13635:7;;13643:1;13635:10;;;;;;;:::i;:::-;;;;;;;13622:24;;;;;;;;;;;:30;;;13610:42;;;;13687:12;:24;13700:7;;13708:1;13700:10;;;;;;;:::i;:::-;;;;;;;13687:24;;;;;;;;;;;:34;;;13671:50;;;;13740:3;;;;;13536:234;;;-1:-1:-1;13790:14:0;13801:3;13790:8;:14;:::i;:::-;13806:18;13821:3;13806:12;:18;:::i;:::-;13782:43;;;;;;;13328:505;;;;;:::o;19448:198::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;19550:14:::1;19562:2;14804:6;19550:14;:::i;:::-;19538:8;:26;;19516:93;;;::::0;-1:-1:-1;;;19516:93:0;;18211:2:1;19516:93:0::1;::::0;::::1;18193:21:1::0;18250:2;18230:18;;;18223:30;-1:-1:-1;;;18269:18:1;;;18262:47;18326:18;;19516:93:0::1;18009:341:1::0;19516:93:0::1;19620:7;:18:::0;19448:198::o;20737:156::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;20846:38:::1;::::0;-1:-1:-1;;;20846:38:0;;20878:4:::1;20846:38;::::0;::::1;6442:51:1::0;-1:-1:-1;;;;;20811:22:0;::::1;::::0;::::1;::::0;20834:10:::1;::::0;20811:22;;20846:23:::1;::::0;6415:18:1;;20846:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20811:74;::::0;-1:-1:-1;;;;;;20811:74:0::1;::::0;;;;;;-1:-1:-1;;;;;12628:32:1;;;20811:74:0::1;::::0;::::1;12610:51:1::0;12677:18;;;12670:34;12583:18;;20811:74:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20737:156:::0;:::o;19654:229::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;14804:6:::1;19759:10;:23;;19737:97;;;::::0;-1:-1:-1;;;19737:97:0;;18746:2:1;19737:97:0::1;::::0;::::1;18728:21:1::0;18785:2;18765:18;;;18758:30;18824:26;18804:18;;;18797:54;18868:18;;19737:97:0::1;18544:348:1::0;19737:97:0::1;19845:17;:30:::0;19654:229::o;10485:1066::-;10567:16;10585;10618;;10638:1;10618:21;10614:97;;-1:-1:-1;;10664:16:0;;;10678:1;10664:16;;;;;;10682;;;;;;;;;10664;;;-1:-1:-1;10485:1066:0:o;10614:97::-;10743:16;;10727:13;:32;10723:97;;;10792:16;;10776:32;;10723:97;10832:23;10872:13;10858:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10858:28:0;;10832:54;;10897:27;10941:13;10927:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10927:28:0;-1:-1:-1;10897:58:0;-1:-1:-1;11027:12:0;11063:17;11079:1;11063:13;:17;:::i;:::-;11042:16;;:40;;;;:::i;:::-;11027:55;;11100:9;11095:206;11119:17;11135:1;11119:13;:17;:::i;:::-;11115:1;:21;11095:206;;;11166:12;:22;11179:8;11183:4;11179:1;:8;:::i;:::-;11166:22;;;;;;;;;;;:28;;;11154:6;11161:1;11154:9;;;;;;;;:::i;:::-;;;;;;;;;;:40;11225:12;:22;11238:8;11242:4;11238:1;:8;:::i;:::-;11225:22;;;;;;;;;;;:32;;;11209:10;11220:1;11209:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;11284:3;;11095:206;;;;11376:12;:34;11408:1;11389:16;;:20;;;;:::i;:::-;11376:34;;;;;;;;;;;-1:-1:-1;11376:34:0;:40;11348:6;11355:17;11371:1;11355:13;:17;:::i;:::-;11348:25;;;;;;;;:::i;:::-;;;;;;:68;;;;;11459:12;:34;11491:1;11472:16;;:20;;;;:::i;:::-;11459:34;;;;;;;;;;;:44;;;11427:10;11454:1;11438:13;:17;;;;:::i;:::-;11427:29;;;;;;;;:::i;:::-;;;;;;;;;;:76;-1:-1:-1;11524:6:0;;11532:10;;-1:-1:-1;10485:1066:0;-1:-1:-1;;10485:1066:0:o;31089:136::-;31206:11;;31139:7;;31168:33;15016:6;31168:21;:33;:::i;29168:280::-;-1:-1:-1;;;;;29284:14:0;;;;;;:8;:14;;;;;:32;;29310:6;;29284:14;:32;;29310:6;;29284:32;:::i;:::-;;;;;;;;29342:6;29327:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;29400:40:0;;2327:25:1;;;29423:1:0;;-1:-1:-1;;;;;29400:40:0;;;;;2315:2:1;2300:18;29400:40:0;;;;;;;;29168:280;;;:::o;6522:217::-;6635:12;;;6595;6635;;;;;;;;;-1:-1:-1;;;;;6613:7:0;;;6628:5;;6613:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6594:54;;;6667:7;6659:72;;;;-1:-1:-1;;;6659:72:0;;19391:2:1;6659:72:0;;;19373:21:1;19430:2;19410:18;;;19403:30;19469:34;19449:18;;;19442:62;-1:-1:-1;;;19520:18:1;;;19513:50;19580:19;;6659:72:0;19189:416:1;6659:72:0;6583:156;6522:217;;:::o;28152:361::-;-1:-1:-1;;;;;28278:14:0;;;;;;:8;:14;;;;;:26;;:38;;28308:8;;28278:14;:38;;28308:8;;28278:38;:::i;:::-;;;;-1:-1:-1;28369:31:0;;-1:-1:-1;28375:4:0;28381:8;;28369:5;:31::i;:::-;28442:22;28446:17;:15;:17::i;28442:22::-;28482:23;;;-1:-1:-1;;;;;12628:32:1;;12610:51;;12692:2;12677:18;;12670:34;;;28482:23:0;;12583:18:1;28482:23:0;;;;;;;28152:361;;:::o;28521:570::-;28660:12;28704:15;28691:8;28677:11;;:22;;;;:::i;:::-;28675:44;;;;:::i;:::-;28660:59;;28762:1;28752:7;:11;28730:73;;;;-1:-1:-1;;;28730:73:0;;19812:2:1;28730:73:0;;;19794:21:1;19851:2;19831:18;;;19824:30;-1:-1:-1;;;19870:18:1;;;19863:42;19922:18;;28730:73:0;19610:336:1;28730:73:0;-1:-1:-1;;;;;28851:16:0;;;;;;:8;:16;;;;;:28;;:40;;28883:8;;28851:16;:40;;28883:8;;28851:40;:::i;:::-;;;;-1:-1:-1;28944:32:0;;-1:-1:-1;28950:6:0;28958:7;28967:8;28944:5;:32::i;:::-;29018:22;29022:17;:15;:17::i;29018:22::-;29058:25;;;-1:-1:-1;;;;;12628:32:1;;12610:51;;12692:2;12677:18;;12670:34;;;29058:25:0;;12583:18:1;29058:25:0;;;;;;;28606:485;28521:570;;;:::o;29523:309::-;-1:-1:-1;;;;;29631:12:0;;;;;;:8;:12;;;;;:30;;;;;;29676:11;:21;;;;;;29763:8;;29745:26;;:15;:26;:::i;:::-;-1:-1:-1;;;;;29719:12:0;;;;;;:8;:12;;;;;;:23;;:52;;;;29787:37;;29719:12;;;29787:37;;;;29812:11;2327:25:1;;2315:2;2300:18;;2181:177;354:345;556:2;538:21;;;595:2;575:18;;;568:30;-1:-1:-1;;;629:2:1;614:18;;607:51;690:2;675:18;;354:345::o;704:346::-;772:6;780;833:2;821:9;812:7;808:23;804:32;801:52;;;849:1;846;839:12;801:52;-1:-1:-1;;894:23:1;;;1014:2;999:18;;;986:32;;-1:-1:-1;704:346:1:o;1055:420::-;1108:3;1146:5;1140:12;1173:6;1168:3;1161:19;1205:4;1200:3;1196:14;1189:21;;1244:4;1237:5;1233:16;1267:1;1277:173;1291:6;1288:1;1285:13;1277:173;;;1352:13;;1340:26;;1395:4;1386:14;;;;1423:17;;;;1313:1;1306:9;1277:173;;;-1:-1:-1;1466:3:1;;1055:420;-1:-1:-1;;;;1055:420:1:o;1480:465::-;1737:2;1726:9;1719:21;1700:4;1763:56;1815:2;1804:9;1800:18;1792:6;1763:56;:::i;:::-;1867:9;1859:6;1855:22;1850:2;1839:9;1835:18;1828:50;1895:44;1932:6;1924;1895:44;:::i;:::-;1887:52;1480:465;-1:-1:-1;;;;;1480:465:1:o;1950:226::-;2009:6;2062:2;2050:9;2041:7;2037:23;2033:32;2030:52;;;2078:1;2075;2068:12;2030:52;-1:-1:-1;2123:23:1;;1950:226;-1:-1:-1;1950:226:1:o;2555:250::-;2640:1;2650:113;2664:6;2661:1;2658:13;2650:113;;;2740:11;;;2734:18;2721:11;;;2714:39;2686:2;2679:10;2650:113;;;-1:-1:-1;;2797:1:1;2779:16;;2772:27;2555:250::o;2810:396::-;2959:2;2948:9;2941:21;2922:4;2991:6;2985:13;3034:6;3029:2;3018:9;3014:18;3007:34;3050:79;3122:6;3117:2;3106:9;3102:18;3097:2;3089:6;3085:15;3050:79;:::i;:::-;3190:2;3169:15;-1:-1:-1;;3165:29:1;3150:45;;;;3197:2;3146:54;;2810:396;-1:-1:-1;;2810:396:1:o;3211:131::-;-1:-1:-1;;;;;3286:31:1;;3276:42;;3266:70;;3332:1;3329;3322:12;3347:367;3415:6;3423;3476:2;3464:9;3455:7;3451:23;3447:32;3444:52;;;3492:1;3489;3482:12;3444:52;3531:9;3518:23;3550:31;3575:5;3550:31;:::i;:::-;3600:5;3678:2;3663:18;;;;3650:32;;-1:-1:-1;;;3347:367:1:o;3719:247::-;3778:6;3831:2;3819:9;3810:7;3806:23;3802:32;3799:52;;;3847:1;3844;3837:12;3799:52;3886:9;3873:23;3905:31;3930:5;3905:31;:::i;4701:508::-;4778:6;4786;4794;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;4902:9;4889:23;4921:31;4946:5;4921:31;:::i;:::-;4971:5;-1:-1:-1;5028:2:1;5013:18;;5000:32;5041:33;5000:32;5041:33;:::i;:::-;4701:508;;5093:7;;-1:-1:-1;;;5173:2:1;5158:18;;;;5145:32;;4701:508::o;5403:610::-;5489:6;5497;5550:2;5538:9;5529:7;5525:23;5521:32;5518:52;;;5566:1;5563;5556:12;5518:52;5606:9;5593:23;5639:18;5631:6;5628:30;5625:50;;;5671:1;5668;5661:12;5625:50;5694:22;;5747:4;5739:13;;5735:27;-1:-1:-1;5725:55:1;;5776:1;5773;5766:12;5725:55;5816:2;5803:16;5842:18;5834:6;5831:30;5828:50;;;5874:1;5871;5864:12;5828:50;5927:7;5922:2;5912:6;5909:1;5905:14;5901:2;5897:23;5893:32;5890:45;5887:65;;;5948:1;5945;5938:12;5887:65;5979:2;5971:11;;;;;6001:6;;-1:-1:-1;5403:610:1;-1:-1:-1;;;5403:610:1:o;6504:118::-;6590:5;6583:13;6576:21;6569:5;6566:32;6556:60;;6612:1;6609;6602:12;6627:241;6683:6;6736:2;6724:9;6715:7;6711:23;6707:32;6704:52;;;6752:1;6749;6742:12;6704:52;6791:9;6778:23;6810:28;6832:5;6810:28;:::i;6873:382::-;6938:6;6946;6999:2;6987:9;6978:7;6974:23;6970:32;6967:52;;;7015:1;7012;7005:12;6967:52;7054:9;7041:23;7073:31;7098:5;7073:31;:::i;:::-;7123:5;-1:-1:-1;7180:2:1;7165:18;;7152:32;7193:30;7152:32;7193:30;:::i;:::-;7242:7;7232:17;;;6873:382;;;;;:::o;7486:586::-;7556:6;7564;7617:2;7605:9;7596:7;7592:23;7588:32;7585:52;;;7633:1;7630;7623:12;7585:52;7673:9;7660:23;7706:18;7698:6;7695:30;7692:50;;;7738:1;7735;7728:12;7692:50;7761:22;;7814:4;7806:13;;7802:27;-1:-1:-1;7792:55:1;;7843:1;7840;7833:12;7792:55;7883:2;7870:16;7909:18;7901:6;7898:30;7895:50;;;7941:1;7938;7931:12;7895:50;7986:7;7981:2;7972:6;7968:2;7964:15;7960:24;7957:37;7954:57;;;8007:1;8004;7997:12;8077:487;8154:6;8162;8170;8223:2;8211:9;8202:7;8198:23;8194:32;8191:52;;;8239:1;8236;8229:12;8191:52;8284:23;;;-1:-1:-1;8383:2:1;8368:18;;8355:32;8396:33;8355:32;8396:33;:::i;8569:388::-;8637:6;8645;8698:2;8686:9;8677:7;8673:23;8669:32;8666:52;;;8714:1;8711;8704:12;8666:52;8753:9;8740:23;8772:31;8797:5;8772:31;:::i;:::-;8822:5;-1:-1:-1;8879:2:1;8864:18;;8851:32;8892:33;8851:32;8892:33;:::i;8962:127::-;9023:10;9018:3;9014:20;9011:1;9004:31;9054:4;9051:1;9044:15;9078:4;9075:1;9068:15;9094:127;9155:10;9150:3;9146:20;9143:1;9136:31;9186:4;9183:1;9176:15;9210:4;9207:1;9200:15;9226:128;9293:9;;;9314:11;;;9311:37;;;9328:18;;:::i;9359:127::-;9420:10;9415:3;9411:20;9408:1;9401:31;9451:4;9448:1;9441:15;9475:4;9472:1;9465:15;9491:120;9531:1;9557;9547:35;;9562:18;;:::i;:::-;-1:-1:-1;9596:9:1;;9491:120::o;9616:127::-;9677:10;9672:3;9668:20;9665:1;9658:31;9708:4;9705:1;9698:15;9732:4;9729:1;9722:15;9748:168;9821:9;;;9852;;9869:15;;;9863:22;;9849:37;9839:71;;9890:18;;:::i;10111:125::-;10176:9;;;10197:10;;;10194:36;;;10210:18;;:::i;10241:200::-;10307:9;;;10280:4;10335:9;;10363:10;;10375:12;;;10359:29;10398:12;;;10390:21;;10356:56;10353:82;;;10415:18;;:::i;:::-;10353:82;10241:200;;;;:::o;10446:251::-;10516:6;10569:2;10557:9;10548:7;10544:23;10540:32;10537:52;;;10585:1;10582;10575:12;10537:52;10617:9;10611:16;10636:31;10661:5;10636:31;:::i;10702:334::-;10904:2;10886:21;;;10943:2;10923:18;;;10916:30;-1:-1:-1;;;10977:2:1;10962:18;;10955:40;11027:2;11012:18;;10702:334::o;14574:485::-;-1:-1:-1;;;;;14759:32:1;;14741:51;;14828:2;14823;14808:18;;14801:30;;;14847:18;;14840:34;;;14867:6;14916;14911:2;14896:18;;14883:48;14980:1;14951:22;;;14975:2;14947:31;;;14940:42;;;;15043:2;15022:15;;;-1:-1:-1;;15018:29:1;15003:45;14999:54;;14574:485;-1:-1:-1;;14574:485:1:o;15272:245::-;15339:6;15392:2;15380:9;15371:7;15367:23;15363:32;15360:52;;;15408:1;15405;15398:12;15360:52;15440:9;15434:16;15459:28;15481:5;15459:28;:::i;15522:336::-;15724:2;15706:21;;;15763:2;15743:18;;;15736:30;-1:-1:-1;;;15797:2:1;15782:18;;15775:42;15849:2;15834:18;;15522:336::o;16223:112::-;16255:1;16281;16271:35;;16286:18;;:::i;:::-;-1:-1:-1;16320:9:1;;16223:112::o;18355:184::-;18425:6;18478:2;18466:9;18457:7;18453:23;18449:32;18446:52;;;18494:1;18491;18484:12;18446:52;-1:-1:-1;18517:16:1;;18355:184;-1:-1:-1;18355:184:1:o;18897:287::-;19026:3;19064:6;19058:13;19080:66;19139:6;19134:3;19127:4;19119:6;19115:17;19080:66;:::i;:::-;19162:16;;;;;18897:287;-1:-1:-1;;18897:287:1:o
Swarm Source
ipfs://d25508a340ffed26ca756d805500d24df88be8a49b508a9cba78a633e8dea7ed
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.