Source Code
Overview
ETH Balance
0.301763399300203202 ETH
Eth Value
$618.38 (@ $2,049.22/ETH)Latest 25 from a total of 154 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Funds | 17320755 | 1035 days ago | IN | 0 ETH | 0.00142 | ||||
| Withdraw Funds | 7023887 | 2632 days ago | IN | 0 ETH | 0.00010583 | ||||
| Withdraw Funds | 7023881 | 2632 days ago | IN | 0 ETH | 0.00007623 | ||||
| Refund Bet | 7023499 | 2632 days ago | IN | 0 ETH | 0.00012566 | ||||
| Refund Bet | 7023485 | 2632 days ago | IN | 0 ETH | 0.00012566 | ||||
| Pay Today Reward | 7017172 | 2633 days ago | IN | 0 ETH | 0.00008328 | ||||
| Place Bet | 7016439 | 2633 days ago | IN | 0.1 ETH | 0.00074951 | ||||
| Place Bet | 7016434 | 2633 days ago | IN | 0.5 ETH | 0.00074951 | ||||
| Settle Bet | 7016431 | 2633 days ago | IN | 0 ETH | 0.0000869 | ||||
| Place Bet | 7016429 | 2633 days ago | IN | 0.1 ETH | 0.00243674 | ||||
| Settle Bet | 7016423 | 2633 days ago | IN | 0 ETH | 0.00008704 | ||||
| Settle Bet | 7016423 | 2633 days ago | IN | 0 ETH | 0.00005219 | ||||
| Place Bet | 7016420 | 2633 days ago | IN | 0.1 ETH | 0.00243533 | ||||
| Place Bet | 7016412 | 2633 days ago | IN | 0.1 ETH | 0.00243674 | ||||
| Place Bet | 7016302 | 2633 days ago | IN | 0.2 ETH | 0.001685 | ||||
| Place Bet | 7016260 | 2633 days ago | IN | 0.2 ETH | 0.0010017 | ||||
| Set Max Profit | 7016249 | 2633 days ago | IN | 0 ETH | 0.0011316 | ||||
| Approve Next Own... | 7016249 | 2633 days ago | IN | 0 ETH | 0.00004735 | ||||
| Withdraw Funds | 7016246 | 2633 days ago | IN | 0 ETH | 0.00076188 | ||||
| Pay Today Reward | 7016246 | 2633 days ago | IN | 0 ETH | 0.000047 | ||||
| Settle Bet | 7016224 | 2633 days ago | IN | 0 ETH | 0.0000869 | ||||
| Place Bet | 7016216 | 2633 days ago | IN | 0.1 ETH | 0.00276674 | ||||
| Settle Bet | 7013640 | 2634 days ago | IN | 0 ETH | 0.00010438 | ||||
| Place Bet | 7013638 | 2634 days ago | IN | 0.1 ETH | 0.00143989 | ||||
| Settle Bet | 7012752 | 2634 days ago | IN | 0 ETH | 0.00013056 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 7023887 | 2632 days ago | 46.6 ETH | ||||
| - | 7017172 | 2633 days ago | 0.0007429 ETH | ||||
| - | 7016431 | 2633 days ago | 0.14264705 ETH | ||||
| - | 7016423 | 2633 days ago | 0.14264705 ETH | ||||
| - | 7016423 | 2633 days ago | 1 wei | ||||
| - | 7016224 | 2633 days ago | 0.14264705 ETH | ||||
| - | 7013640 | 2634 days ago | 1 wei | ||||
| - | 7012752 | 2634 days ago | 0.194 ETH | ||||
| - | 7011550 | 2634 days ago | 0.0004058 ETH | ||||
| - | 7010353 | 2634 days ago | 0.01371428 ETH | ||||
| - | 7006813 | 2635 days ago | 0.06447368 ETH | ||||
| - | 7005998 | 2635 days ago | 0.00070361 ETH | ||||
| - | 7001611 | 2636 days ago | 1 wei | ||||
| - | 7001585 | 2636 days ago | 1 wei | ||||
| - | 7001224 | 2636 days ago | 0.06533333 ETH | ||||
| - | 7001220 | 2636 days ago | 0.098 ETH | ||||
| - | 7001194 | 2636 days ago | 0.13287671 ETH | ||||
| - | 7001094 | 2636 days ago | 0.098 ETH | ||||
| - | 7001092 | 2636 days ago | 0.098 ETH | ||||
| - | 7001069 | 2636 days ago | 0.098 ETH | ||||
| - | 7001066 | 2636 days ago | 1 wei | ||||
| - | 7000932 | 2636 days ago | 0.15645161 ETH | ||||
| - | 7000886 | 2636 days ago | 1 wei | ||||
| - | 7000799 | 2636 days ago | 0.05157894 ETH | ||||
| - | 7000775 | 2636 days ago | 0.05157894 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xc06b5A46...A0B471596 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
AceDice
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-12-07
*/
// solium-disable linebreak-style
pragma solidity ^0.4.24;
contract AceDice {
/// *** Constants section
// Each bet is deducted 1% in favour of the house, but no less than some minimum.
// The lower bound is dictated by gas costs of the settleBet transaction, providing
// headroom for up to 10 Gwei prices.
uint constant HOUSE_EDGE_PERCENT = 2;
uint constant HOUSE_EDGE_MINIMUM_AMOUNT = 0.0004 ether;
// Bets lower than this amount do not participate in jackpot rolls (and are
// not deducted JACKPOT_FEE).
uint constant MIN_JACKPOT_BET = 0.1 ether;
// Chance to win jackpot (currently 0.1%) and fee deducted into jackpot fund.
uint constant JACKPOT_MODULO = 1000;
uint constant JACKPOT_FEE = 0.001 ether;
// There is minimum and maximum bets.
uint constant MIN_BET = 0.01 ether;
uint constant MAX_AMOUNT = 300000 ether;
// Modulo is a number of equiprobable outcomes in a game:
// - 2 for coin flip
// - 6 for dice
// - 6*6 = 36 for double dice
// - 100 for etheroll
// - 37 for roulette
// etc.
// It's called so because 256-bit entropy is treated like a huge integer and
// the remainder of its division by modulo is considered bet outcome.
// uint constant MAX_MODULO = 100;
// For modulos below this threshold rolls are checked against a bit mask,
// thus allowing betting on any combination of outcomes. For example, given
// modulo 6 for dice, 101000 mask (base-2, big endian) means betting on
// 4 and 6; for games with modulos higher than threshold (Etheroll), a simple
// limit is used, allowing betting on any outcome in [0, N) range.
//
// The specific value is dictated by the fact that 256-bit intermediate
// multiplication result allows implementing population count efficiently
// for numbers that are up to 42 bits, and 40 is the highest multiple of
// eight below 42.
uint constant MAX_MASK_MODULO = 40;
// This is a check on bet mask overflow.
uint constant MAX_BET_MASK = 2 ** MAX_MASK_MODULO;
// EVM BLOCKHASH opcode can query no further than 256 blocks into the
// past. Given that settleBet uses block hash of placeBet as one of
// complementary entropy sources, we cannot process bets older than this
// threshold. On rare occasions AceDice croupier may fail to invoke
// settleBet in this timespan due to technical issues or extreme Ethereum
// congestion; such bets can be refunded via invoking refundBet.
uint constant BET_EXPIRATION_BLOCKS = 250;
// Some deliberately invalid address to initialize the secret signer with.
// Forces maintainers to invoke setSecretSigner before processing any bets.
address constant DUMMY_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
// Standard contract ownership transfer.
address public owner;
address private nextOwner;
// Adjustable max bet profit. Used to cap bets against dynamic odds.
uint public maxProfit;
// The address corresponding to a private key used to sign placeBet commits.
address public secretSigner;
// Accumulated jackpot fund.
uint128 public jackpotSize;
uint public todaysRewardSize;
// Funds that are locked in potentially winning bets. Prevents contract from
// committing to bets it cannot pay out.
uint128 public lockedInBets;
// A structure representing a single bet.
struct Bet {
// Wager amount in wei.
uint amount;
// Modulo of a game.
// uint8 modulo;
// Number of winning outcomes, used to compute winning payment (* modulo/rollUnder),
// and used instead of mask for games with modulo > MAX_MASK_MODULO.
uint8 rollUnder;
// Block number of placeBet tx.
uint40 placeBlockNumber;
// Bit mask representing winning bet outcomes (see MAX_MASK_MODULO comment).
uint40 mask;
// Address of a gambler, used to pay out winning bets.
address gambler;
// Address of inviter
address inviter;
}
struct Profile{
// picture index of profile avatar
uint avatarIndex;
// nickname of user
string nickName;
}
// Mapping from commits to all currently active & processed bets.
mapping (uint => Bet) bets;
// Mapping for accumuldated bet amount and users
mapping (address => uint) accuBetAmount;
mapping (address => Profile) profiles;
// Croupier account.
address public croupier;
// Events that are issued to make statistic recovery easier.
event FailedPayment(address indexed beneficiary, uint amount);
event Payment(address indexed beneficiary, uint amount, uint dice, uint rollUnder, uint betAmount);
event JackpotPayment(address indexed beneficiary, uint amount, uint dice, uint rollUnder, uint betAmount);
event VIPPayback(address indexed beneficiary, uint amount);
// This event is emitted in placeBet to record commit in the logs.
event Commit(uint commit);
// 오늘의 랭킹 보상 지급 이벤트
event TodaysRankingPayment(address indexed beneficiary, uint amount);
// Constructor. Deliberately does not take any parameters.
constructor () public {
owner = msg.sender;
secretSigner = DUMMY_ADDRESS;
croupier = DUMMY_ADDRESS;
}
// Standard modifier on methods invokable only by contract owner.
modifier onlyOwner {
require (msg.sender == owner, "OnlyOwner methods called by non-owner.");
_;
}
// Standard modifier on methods invokable only by contract owner.
modifier onlyCroupier {
require (msg.sender == croupier, "OnlyCroupier methods called by non-croupier.");
_;
}
// Standard contract ownership transfer implementation,
function approveNextOwner(address _nextOwner) external onlyOwner {
require (_nextOwner != owner, "Cannot approve current owner.");
nextOwner = _nextOwner;
}
function acceptNextOwner() external {
require (msg.sender == nextOwner, "Can only accept preapproved new owner.");
owner = nextOwner;
}
// Fallback function deliberately left empty. It's primary use case
// is to top up the bank roll.
function () public payable {
}
// See comment for "secretSigner" variable.
function setSecretSigner(address newSecretSigner) external onlyOwner {
secretSigner = newSecretSigner;
}
function getSecretSigner() external onlyOwner view returns(address){
return secretSigner;
}
// Change the croupier address.
function setCroupier(address newCroupier) external onlyOwner {
croupier = newCroupier;
}
// Change max bet reward. Setting this to zero effectively disables betting.
function setMaxProfit(uint _maxProfit) public onlyOwner {
require (_maxProfit < MAX_AMOUNT, "maxProfit should be a sane number.");
maxProfit = _maxProfit;
}
// This function is used to bump up the jackpot fund. Cannot be used to lower it.
function increaseJackpot(uint increaseAmount) external onlyOwner {
require (increaseAmount <= address(this).balance, "Increase amount larger than balance.");
require (jackpotSize + lockedInBets + increaseAmount <= address(this).balance, "Not enough funds.");
jackpotSize += uint128(increaseAmount);
}
// Funds withdrawal to cover costs of AceDice operation.
function withdrawFunds(address beneficiary, uint withdrawAmount) external onlyOwner {
require (withdrawAmount <= address(this).balance, "Increase amount larger than balance.");
require (jackpotSize + lockedInBets + withdrawAmount <= address(this).balance, "Not enough funds.");
sendFunds(beneficiary, withdrawAmount, withdrawAmount, 0, 0, 0);
}
// Contract may be destroyed only when there are no ongoing bets,
// either settled or refunded. All funds are transferred to contract owner.
function kill() external onlyOwner {
require (lockedInBets == 0, "All bets should be processed (settled or refunded) before self-destruct.");
selfdestruct(owner);
}
function encodePacketCommit(uint commitLastBlock, uint commit) private pure returns(bytes memory){
return abi.encodePacked(uint40(commitLastBlock), commit);
}
function verifyCommit(uint commitLastBlock, uint commit, uint8 v, bytes32 r, bytes32 s) private view {
// Check that commit is valid - it has not expired and its signature is valid.
require (block.number <= commitLastBlock, "Commit has expired.");
//bytes32 signatureHash = keccak256(abi.encodePacked(commitLastBlock, commit));
bytes memory prefix = "\x19Ethereum Signed Message:\n32";
bytes memory message = encodePacketCommit(commitLastBlock, commit);
bytes32 messageHash = keccak256(abi.encodePacked(prefix, keccak256(message)));
require (secretSigner == ecrecover(messageHash, v, r, s), "ECDSA signature is not valid.");
}
/// *** Betting logic
// Bet states:
// amount == 0 && gambler == 0 - 'clean' (can place a bet)
// amount != 0 && gambler != 0 - 'active' (can be settled or refunded)
// amount == 0 && gambler != 0 - 'processed' (can clean storage)
//
// NOTE: Storage cleaning is not implemented in this contract version; it will be added
// with the next upgrade to prevent polluting Ethereum state with expired bets.
// Bet placing transaction - issued by the player.
// betMask - bet outcomes bit mask for modulo <= MAX_MASK_MODULO,
// [0, betMask) for larger modulos.
// modulo - game modulo.
// commitLastBlock - number of the maximum block where "commit" is still considered valid.
// commit - Keccak256 hash of some secret "reveal" random number, to be supplied
// by the AceDice croupier bot in the settleBet transaction. Supplying
// "commit" ensures that "reveal" cannot be changed behind the scenes
// after placeBet have been mined.
// r, s - components of ECDSA signature of (commitLastBlock, commit). v is
// guaranteed to always equal 27.
//
// Commit, being essentially random 256-bit number, is used as a unique bet identifier in
// the 'bets' mapping.
//
// Commits are signed with a block limit to ensure that they are used at most once - otherwise
// it would be possible for a miner to place a bet with a known commit/reveal pair and tamper
// with the blockhash. Croupier guarantees that commitLastBlock will always be not greater than
// placeBet block number plus BET_EXPIRATION_BLOCKS. See whitepaper for details.
function placeBet(uint betMask, uint commitLastBlock, uint commit, uint8 v, bytes32 r, bytes32 s) external payable {
// Check that the bet is in 'clean' state.
Bet storage bet = bets[commit];
require (bet.gambler == address(0), "Bet should be in a 'clean' state.");
// Validate input data ranges.
uint amount = msg.value;
//require (modulo > 1 && modulo <= MAX_MODULO, "Modulo should be within range.");
require (amount >= MIN_BET && amount <= MAX_AMOUNT, "Amount should be within range.");
require (betMask > 0 && betMask < MAX_BET_MASK, "Mask should be within range.");
verifyCommit(commitLastBlock, commit, v, r, s);
// uint rollUnder;
uint mask;
// if (modulo <= MAX_MASK_MODULO) {
// // Small modulo games specify bet outcomes via bit mask.
// // rollUnder is a number of 1 bits in this mask (population count).
// // This magic looking formula is an efficient way to compute population
// // count on EVM for numbers below 2**40. For detailed proof consult
// // the AceDice whitepaper.
// rollUnder = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO;
// mask = betMask;
// } else {
// Larger modulos specify the right edge of half-open interval of
// winning bet outcomes.
require (betMask > 0 && betMask <= 100, "High modulo range, betMask larger than modulo.");
// rollUnder = betMask;
// }
// Winning amount and jackpot increase.
uint possibleWinAmount;
uint jackpotFee;
(possibleWinAmount, jackpotFee) = getDiceWinAmount(amount, betMask);
// Enforce max profit limit.
require (possibleWinAmount <= amount + maxProfit, "maxProfit limit violation. ");
// Lock funds.
lockedInBets += uint128(possibleWinAmount);
jackpotSize += uint128(jackpotFee);
// Check whether contract has enough funds to process this bet.
require (jackpotSize + lockedInBets <= address(this).balance, "Cannot afford to lose this bet.");
// Record commit in logs.
emit Commit(commit);
// Store bet parameters on blockchain.
bet.amount = amount;
// bet.modulo = uint8(modulo);
bet.rollUnder = uint8(betMask);
bet.placeBlockNumber = uint40(block.number);
bet.mask = uint40(mask);
bet.gambler = msg.sender;
uint accuAmount = accuBetAmount[msg.sender];
accuAmount = accuAmount + amount;
accuBetAmount[msg.sender] = accuAmount;
}
function applyVIPLevel(address gambler, uint amount) private {
uint accuAmount = accuBetAmount[gambler];
uint rate;
if(accuAmount >= 30 ether && accuAmount < 150 ether){
rate = 1;
} else if(accuAmount >= 150 ether && accuAmount < 300 ether){
rate = 2;
} else if(accuAmount >= 300 ether && accuAmount < 1500 ether){
rate = 4;
} else if(accuAmount >= 1500 ether && accuAmount < 3000 ether){
rate = 6;
} else if(accuAmount >= 3000 ether && accuAmount < 15000 ether){
rate = 8;
} else if(accuAmount >= 15000 ether && accuAmount < 30000 ether){
rate = 10;
} else if(accuAmount >= 30000 ether && accuAmount < 150000 ether){
rate = 12;
} else if(accuAmount >= 150000 ether){
rate = 15;
} else{
return;
}
uint vipPayback = amount * rate / 10000;
if(gambler.send(vipPayback)){
emit VIPPayback(gambler, vipPayback);
}
}
function placeBetWithInviter(uint betMask, uint commitLastBlock, uint commit, uint8 v, bytes32 r, bytes32 s, address inviter) external payable {
// Check that the bet is in 'clean' state.
Bet storage bet = bets[commit];
require (bet.gambler == address(0), "Bet should be in a 'clean' state.");
// Validate input data ranges.
uint amount = msg.value;
// require (modulo > 1 && modulo <= MAX_MODULO, "Modulo should be within range.");
require (amount >= MIN_BET && amount <= MAX_AMOUNT, "Amount should be within range.");
require (betMask > 0 && betMask < MAX_BET_MASK, "Mask should be within range.");
require (address(this) != inviter && inviter != address(0), "cannot invite mysql");
verifyCommit(commitLastBlock, commit, v, r, s);
// uint rollUnder;
uint mask;
// if (modulo <= MAX_MASK_MODULO) {
// // Small modulo games specify bet outcomes via bit mask.
// // rollUnder is a number of 1 bits in this mask (population count).
// // This magic looking formula is an efficient way to compute population
// // count on EVM for numbers below 2**40. For detailed proof consult
// // the AceDice whitepaper.
// rollUnder = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO;
// mask = betMask;
// } else {
// Larger modulos specify the right edge of half-open interval of
// winning bet outcomes.
require (betMask > 0 && betMask <= 100, "High modulo range, betMask larger than modulo.");
// rollUnder = betMask;
// }
// Winning amount and jackpot increase.
uint possibleWinAmount;
uint jackpotFee;
(possibleWinAmount, jackpotFee) = getDiceWinAmount(amount, betMask);
// Enforce max profit limit.
require (possibleWinAmount <= amount + maxProfit, "maxProfit limit violation. ");
// Lock funds.
lockedInBets += uint128(possibleWinAmount);
jackpotSize += uint128(jackpotFee);
// Check whether contract has enough funds to process this bet.
require (jackpotSize + lockedInBets <= address(this).balance, "Cannot afford to lose this bet.");
// Record commit in logs.
emit Commit(commit);
// Store bet parameters on blockchain.
bet.amount = amount;
// bet.modulo = uint8(modulo);
bet.rollUnder = uint8(betMask);
bet.placeBlockNumber = uint40(block.number);
bet.mask = uint40(mask);
bet.gambler = msg.sender;
bet.inviter = inviter;
uint accuAmount = accuBetAmount[msg.sender];
accuAmount = accuAmount + amount;
accuBetAmount[msg.sender] = accuAmount;
}
function getMyAccuAmount() external view returns (uint){
return accuBetAmount[msg.sender];
}
// This is the method used to settle 99% of bets. To process a bet with a specific
// "commit", settleBet should supply a "reveal" number that would Keccak256-hash to
// "commit". "blockHash" is the block hash of placeBet block as seen by croupier; it
// is additionally asserted to prevent changing the bet outcomes on Ethereum reorgs.
function settleBet(uint reveal, bytes32 blockHash) external onlyCroupier {
uint commit = uint(keccak256(abi.encodePacked(reveal)));
Bet storage bet = bets[commit];
uint placeBlockNumber = bet.placeBlockNumber;
// Check that bet has not expired yet (see comment to BET_EXPIRATION_BLOCKS).
require (block.number > placeBlockNumber, "settleBet in the same block as placeBet, or before.");
require (block.number <= placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM.");
require (blockhash(placeBlockNumber) == blockHash);
// Settle bet using reveal and blockHash as entropy sources.
settleBetCommon(bet, reveal, blockHash);
}
// This method is used to settle a bet that was mined into an uncle block. At this
// point the player was shown some bet outcome, but the blockhash at placeBet height
// is different because of Ethereum chain reorg. We supply a full merkle proof of the
// placeBet transaction receipt to provide untamperable evidence that uncle block hash
// indeed was present on-chain at some point.
function settleBetUncleMerkleProof(uint reveal, uint40 canonicalBlockNumber) external onlyCroupier {
// "commit" for bet settlement can only be obtained by hashing a "reveal".
uint commit = uint(keccak256(abi.encodePacked(reveal)));
Bet storage bet = bets[commit];
// Check that canonical block hash can still be verified.
require (block.number <= canonicalBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM.");
// Verify placeBet receipt.
requireCorrectReceipt(4 + 32 + 32 + 4);
// Reconstruct canonical & uncle block hashes from a receipt merkle proof, verify them.
bytes32 canonicalHash;
bytes32 uncleHash;
(canonicalHash, uncleHash) = verifyMerkleProof(commit, 4 + 32 + 32);
require (blockhash(canonicalBlockNumber) == canonicalHash);
// Settle bet using reveal and uncleHash as entropy sources.
settleBetCommon(bet, reveal, uncleHash);
}
// Common settlement code for settleBet & settleBetUncleMerkleProof.
function settleBetCommon(Bet storage bet, uint reveal, bytes32 entropyBlockHash) private {
// Fetch bet parameters into local variables (to save gas).
uint amount = bet.amount;
// uint modulo = bet.modulo;
uint rollUnder = bet.rollUnder;
address gambler = bet.gambler;
// Check that bet is in 'active' state.
require (amount != 0, "Bet should be in an 'active' state");
applyVIPLevel(gambler, amount);
// Move bet into 'processed' state already.
bet.amount = 0;
// The RNG - combine "reveal" and blockhash of placeBet using Keccak256. Miners
// are not aware of "reveal" and cannot deduce it from "commit" (as Keccak256
// preimage is intractable), and house is unable to alter the "reveal" after
// placeBet have been mined (as Keccak256 collision finding is also intractable).
bytes32 entropy = keccak256(abi.encodePacked(reveal, entropyBlockHash));
// Do a roll by taking a modulo of entropy. Compute winning amount.
uint modulo = 100;
uint dice = uint(entropy) % modulo;
uint diceWinAmount;
uint _jackpotFee;
(diceWinAmount, _jackpotFee) = getDiceWinAmount(amount, rollUnder);
uint diceWin = 0;
uint jackpotWin = 0;
// Determine dice outcome.
if (modulo <= MAX_MASK_MODULO) {
// For small modulo games, check the outcome against a bit mask.
if ((2 ** dice) & bet.mask != 0) {
diceWin = diceWinAmount;
}
} else {
// For larger modulos, check inclusion into half-open interval.
if (dice < rollUnder) {
diceWin = diceWinAmount;
}
}
// Unlock the bet amount, regardless of the outcome.
lockedInBets -= uint128(diceWinAmount);
// Roll for a jackpot (if eligible).
if (amount >= MIN_JACKPOT_BET) {
// The second modulo, statistically independent from the "main" dice roll.
// Effectively you are playing two games at once!
// uint jackpotRng = (uint(entropy) / modulo) % JACKPOT_MODULO;
// Bingo!
if ((uint(entropy) / modulo) % JACKPOT_MODULO == 0) {
jackpotWin = jackpotSize;
jackpotSize = 0;
}
}
// Log jackpot win.
if (jackpotWin > 0) {
emit JackpotPayment(gambler, jackpotWin, dice, rollUnder, amount);
}
if(bet.inviter != address(0)){
// 친구 초대하면 친구한대 15% 때어줌
// uint inviterFee = amount * HOUSE_EDGE_PERCENT / 100 * 15 /100;
bet.inviter.transfer(amount * HOUSE_EDGE_PERCENT / 100 * 15 /100);
}
todaysRewardSize += amount * HOUSE_EDGE_PERCENT / 100 * 9 /100;
// Send the funds to gambler.
sendFunds(gambler, diceWin + jackpotWin == 0 ? 1 wei : diceWin + jackpotWin, diceWin, dice, rollUnder, amount);
}
// Refund transaction - return the bet amount of a roll that was not processed in a
// due timeframe. Processing such blocks is not possible due to EVM limitations (see
// BET_EXPIRATION_BLOCKS comment above for details). In case you ever find yourself
// in a situation like this, just contact the AceDice support, however nothing
// precludes you from invoking this method yourself.
function refundBet(uint commit) external {
// Check that bet is in 'active' state.
Bet storage bet = bets[commit];
uint amount = bet.amount;
require (amount != 0, "Bet should be in an 'active' state");
// Check that bet has already expired.
require (block.number > bet.placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM.");
// Move bet into 'processed' state, release funds.
bet.amount = 0;
uint diceWinAmount;
uint jackpotFee;
(diceWinAmount, jackpotFee) = getDiceWinAmount(amount, bet.rollUnder);
lockedInBets -= uint128(diceWinAmount);
jackpotSize -= uint128(jackpotFee);
// Send the refund.
sendFunds(bet.gambler, amount, amount, 0, 0, 0);
}
// Get the expected win amount after house edge is subtracted.
function getDiceWinAmount(uint amount, uint rollUnder) private pure returns (uint winAmount, uint jackpotFee) {
require (0 < rollUnder && rollUnder <= 100, "Win probability out of range.");
jackpotFee = amount >= MIN_JACKPOT_BET ? JACKPOT_FEE : 0;
uint houseEdge = amount * HOUSE_EDGE_PERCENT / 100;
if (houseEdge < HOUSE_EDGE_MINIMUM_AMOUNT) {
houseEdge = HOUSE_EDGE_MINIMUM_AMOUNT;
}
require (houseEdge + jackpotFee <= amount, "Bet doesn't even cover house edge.");
winAmount = (amount - houseEdge - jackpotFee) * 100 / rollUnder;
}
// Helper routine to process the payment.
function sendFunds(address beneficiary, uint amount, uint successLogAmount, uint dice, uint rollUnder, uint betAmount) private {
if (beneficiary.send(amount)) {
emit Payment(beneficiary, successLogAmount, dice, rollUnder, betAmount);
} else {
emit FailedPayment(beneficiary, amount);
}
}
// This are some constants making O(1) population count in placeBet possible.
// See whitepaper for intuition and proofs behind it.
uint constant POPCNT_MULT = 0x0000000000002000000000100000000008000000000400000000020000000001;
uint constant POPCNT_MASK = 0x0001041041041041041041041041041041041041041041041041041041041041;
uint constant POPCNT_MODULO = 0x3F;
// *** Merkle proofs.
// This helpers are used to verify cryptographic proofs of placeBet inclusion into
// uncle blocks. They are used to prevent bet outcome changing on Ethereum reorgs without
// compromising the security of the smart contract. Proof data is appended to the input data
// in a simple prefix length format and does not adhere to the ABI.
// Invariants checked:
// - receipt trie entry contains a (1) successful transaction (2) directed at this smart
// contract (3) containing commit as a payload.
// - receipt trie entry is a part of a valid merkle proof of a block header
// - the block header is a part of uncle list of some block on canonical chain
// The implementation is optimized for gas cost and relies on the specifics of Ethereum internal data structures.
// Read the whitepaper for details.
// Helper to verify a full merkle proof starting from some seedHash (usually commit). "offset" is the location of the proof
// beginning in the calldata.
function verifyMerkleProof(uint seedHash, uint offset) pure private returns (bytes32 blockHash, bytes32 uncleHash) {
// (Safe) assumption - nobody will write into RAM during this method invocation.
uint scratchBuf1; assembly { scratchBuf1 := mload(0x40) }
uint uncleHeaderLength; uint blobLength; uint shift; uint hashSlot;
// Verify merkle proofs up to uncle block header. Calldata layout is:
// - 2 byte big-endian slice length
// - 2 byte big-endian offset to the beginning of previous slice hash within the current slice (should be zeroed)
// - followed by the current slice verbatim
for (;; offset += blobLength) {
assembly { blobLength := and(calldataload(sub(offset, 30)), 0xffff) }
if (blobLength == 0) {
// Zero slice length marks the end of uncle proof.
break;
}
assembly { shift := and(calldataload(sub(offset, 28)), 0xffff) }
require (shift + 32 <= blobLength, "Shift bounds check.");
offset += 4;
assembly { hashSlot := calldataload(add(offset, shift)) }
require (hashSlot == 0, "Non-empty hash slot.");
assembly {
calldatacopy(scratchBuf1, offset, blobLength)
mstore(add(scratchBuf1, shift), seedHash)
seedHash := sha3(scratchBuf1, blobLength)
uncleHeaderLength := blobLength
}
}
// At this moment the uncle hash is known.
uncleHash = bytes32(seedHash);
// Construct the uncle list of a canonical block.
uint scratchBuf2 = scratchBuf1 + uncleHeaderLength;
uint unclesLength; assembly { unclesLength := and(calldataload(sub(offset, 28)), 0xffff) }
uint unclesShift; assembly { unclesShift := and(calldataload(sub(offset, 26)), 0xffff) }
require (unclesShift + uncleHeaderLength <= unclesLength, "Shift bounds check.");
offset += 6;
assembly { calldatacopy(scratchBuf2, offset, unclesLength) }
memcpy(scratchBuf2 + unclesShift, scratchBuf1, uncleHeaderLength);
assembly { seedHash := sha3(scratchBuf2, unclesLength) }
offset += unclesLength;
// Verify the canonical block header using the computed sha3Uncles.
assembly {
blobLength := and(calldataload(sub(offset, 30)), 0xffff)
shift := and(calldataload(sub(offset, 28)), 0xffff)
}
require (shift + 32 <= blobLength, "Shift bounds check.");
offset += 4;
assembly { hashSlot := calldataload(add(offset, shift)) }
require (hashSlot == 0, "Non-empty hash slot.");
assembly {
calldatacopy(scratchBuf1, offset, blobLength)
mstore(add(scratchBuf1, shift), seedHash)
// At this moment the canonical block hash is known.
blockHash := sha3(scratchBuf1, blobLength)
}
}
// Helper to check the placeBet receipt. "offset" is the location of the proof beginning in the calldata.
// RLP layout: [triePath, str([status, cumGasUsed, bloomFilter, [[address, [topics], data]])]
function requireCorrectReceipt(uint offset) view private {
uint leafHeaderByte; assembly { leafHeaderByte := byte(0, calldataload(offset)) }
require (leafHeaderByte >= 0xf7, "Receipt leaf longer than 55 bytes.");
offset += leafHeaderByte - 0xf6;
uint pathHeaderByte; assembly { pathHeaderByte := byte(0, calldataload(offset)) }
if (pathHeaderByte <= 0x7f) {
offset += 1;
} else {
require (pathHeaderByte >= 0x80 && pathHeaderByte <= 0xb7, "Path is an RLP string.");
offset += pathHeaderByte - 0x7f;
}
uint receiptStringHeaderByte; assembly { receiptStringHeaderByte := byte(0, calldataload(offset)) }
require (receiptStringHeaderByte == 0xb9, "Receipt string is always at least 256 bytes long, but less than 64k.");
offset += 3;
uint receiptHeaderByte; assembly { receiptHeaderByte := byte(0, calldataload(offset)) }
require (receiptHeaderByte == 0xf9, "Receipt is always at least 256 bytes long, but less than 64k.");
offset += 3;
uint statusByte; assembly { statusByte := byte(0, calldataload(offset)) }
require (statusByte == 0x1, "Status should be success.");
offset += 1;
uint cumGasHeaderByte; assembly { cumGasHeaderByte := byte(0, calldataload(offset)) }
if (cumGasHeaderByte <= 0x7f) {
offset += 1;
} else {
require (cumGasHeaderByte >= 0x80 && cumGasHeaderByte <= 0xb7, "Cumulative gas is an RLP string.");
offset += cumGasHeaderByte - 0x7f;
}
uint bloomHeaderByte; assembly { bloomHeaderByte := byte(0, calldataload(offset)) }
require (bloomHeaderByte == 0xb9, "Bloom filter is always 256 bytes long.");
offset += 256 + 3;
uint logsListHeaderByte; assembly { logsListHeaderByte := byte(0, calldataload(offset)) }
require (logsListHeaderByte == 0xf8, "Logs list is less than 256 bytes long.");
offset += 2;
uint logEntryHeaderByte; assembly { logEntryHeaderByte := byte(0, calldataload(offset)) }
require (logEntryHeaderByte == 0xf8, "Log entry is less than 256 bytes long.");
offset += 2;
uint addressHeaderByte; assembly { addressHeaderByte := byte(0, calldataload(offset)) }
require (addressHeaderByte == 0x94, "Address is 20 bytes long.");
uint logAddress; assembly { logAddress := and(calldataload(sub(offset, 11)), 0xffffffffffffffffffffffffffffffffffffffff) }
require (logAddress == uint(address(this)));
}
// Memory copy.
function memcpy(uint dest, uint src, uint len) pure private {
// Full 32 byte words
for(; len >= 32; len -= 32) {
assembly { mstore(dest, mload(src)) }
dest += 32; src += 32;
}
// Remaining bytes
uint mask = 256 ** (32 - len) - 1;
assembly {
let srcpart := and(mload(src), not(mask))
let destpart := and(mload(dest), mask)
mstore(dest, or(destpart, srcpart))
}
}
function thisBalance() public view returns(uint) {
return address(this).balance;
}
function setAvatarIndex(uint index) external{
require (index >=0 && index <= 100, "avatar index should be in range");
Profile storage profile = profiles[msg.sender];
profile.avatarIndex = index;
}
function setNickName(string nickName) external{
Profile storage profile = profiles[msg.sender];
profile.nickName = nickName;
}
function getProfile() external view returns(uint, string){
Profile storage profile = profiles[msg.sender];
return (profile.avatarIndex, profile.nickName);
}
function payTodayReward(address to, uint rate) external onlyOwner {
uint prize = todaysRewardSize * rate / 10000;
todaysRewardSize = todaysRewardSize - prize;
if(to.send(prize)){
emit TodaysRankingPayment(to, prize);
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"rate","type":"uint256"}],"name":"payTodayReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"thisBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"index","type":"uint256"}],"name":"setAvatarIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secretSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jackpotSize","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"croupier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"},{"name":"canonicalBlockNumber","type":"uint40"}],"name":"settleBetUncleMerkleProof","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMyAccuAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSecretSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"todaysRewardSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxProfit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"betMask","type":"uint256"},{"name":"commitLastBlock","type":"uint256"},{"name":"commit","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"placeBet","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"withdrawAmount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"nickName","type":"string"}],"name":"setNickName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"},{"name":"blockHash","type":"bytes32"}],"name":"settleBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nextOwner","type":"address"}],"name":"approveNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getProfile","outputs":[{"name":"","type":"uint256"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"increaseAmount","type":"uint256"}],"name":"increaseJackpot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newSecretSigner","type":"address"}],"name":"setSecretSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lockedInBets","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"betMask","type":"uint256"},{"name":"commitLastBlock","type":"uint256"},{"name":"commit","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"inviter","type":"address"}],"name":"placeBetWithInviter","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"commit","type":"uint256"}],"name":"refundBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCroupier","type":"address"}],"name":"setCroupier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxProfit","type":"uint256"}],"name":"setMaxProfit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"FailedPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"dice","type":"uint256"},{"indexed":false,"name":"rollUnder","type":"uint256"},{"indexed":false,"name":"betAmount","type":"uint256"}],"name":"Payment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"dice","type":"uint256"},{"indexed":false,"name":"rollUnder","type":"uint256"},{"indexed":false,"name":"betAmount","type":"uint256"}],"name":"JackpotPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"VIPPayback","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"commit","type":"uint256"}],"name":"Commit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TodaysRankingPayment","type":"event"}]Contract Creation Code
0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614c3c8061010a6000396000f30060806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630ea5edea1461016157806327f3a72a146101ae578063412648bf146101d957806341c0e1b5146102065780634d61537f1461021d57806357246d23146102745780636b5c5f39146102c357806374e048d51461031a5780638da5cb5b146103585780639efedc91146103af578063a43796ce146103da578063b372f93914610431578063b539cd551461045c578063bb5a4f4c14610487578063c1075329146104e4578063c73ea36714610531578063ca722cdc1461056c578063d06c54fb146105a7578063d579fd44146105be578063d6afc9b114610601578063d6d30a5114610698578063d702087f146106c5578063df88126f14610708578063dfea6ec214610757578063e1fdb4b4146107d4578063f8bb201c14610801578063fbd668a914610844575b005b34801561016d57600080fd5b506101ac600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610871565b005b3480156101ba57600080fd5b506101c3610a0a565b6040518082815260200191505060405180910390f35b3480156101e557600080fd5b5061020460048036038101908080359060200190929190505050610a29565b005b34801561021257600080fd5b5061021b610afe565b005b34801561022957600080fd5b50610232610d16565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561028057600080fd5b50610289610d3c565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102cf57600080fd5b506102d8610d5e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561032657600080fd5b5061035660048036038101908080359060200190929190803564ffffffffff169060200190929190505050610d84565b005b34801561036457600080fd5b5061036d611008565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103bb57600080fd5b506103c461102d565b6040518082815260200191505060405180910390f35b3480156103e657600080fd5b506103ef611074565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043d57600080fd5b50610446611188565b6040518082815260200191505060405180910390f35b34801561046857600080fd5b5061047161118e565b6040518082815260200191505060405180910390f35b6104e2600480360381019080803590602001909291908035906020019092919080359060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190505050611194565b005b3480156104f057600080fd5b5061052f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061181b565b005b34801561053d57600080fd5b5061056a600480360381019080803590602001908201803590602001919091929391929390505050611aaf565b005b34801561057857600080fd5b506105a5600480360381019080803590602001909291908035600019169060200190929190505050611b0b565b005b3480156105b357600080fd5b506105bc611e1e565b005b3480156105ca57600080fd5b506105ff600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f6d565b005b34801561060d57600080fd5b50610616612160565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561065c578082015181840152602081019050610641565b50505050905090810190601f1680156106895780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156106a457600080fd5b506106c360048036038101908080359060200190929190505050612255565b005b3480156106d157600080fd5b50610706600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612532565b005b34801561071457600080fd5b5061071d612660565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107d2600480360381019080803590602001909291908035906020019092919080359060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612682565b005b3480156107e057600080fd5b506107ff60048036038101908080359060200190929190505050612e2a565b005b34801561080d57600080fd5b50610842600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130c6565b005b34801561085057600080fd5b5061086f600480360381019080803590602001909291905050506131f4565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561095d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612710826005540281151561096e57fe5b04905080600554036005819055508273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015610a05578273ffffffffffffffffffffffffffffffffffffffff167f875de2816b17269ce10ae748fd72a0243bad5ee5ed409961ac7aea9fc4db80af826040518082815260200191505060405180910390a25b505050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b6000808210158015610a3c575060648211155b1515610ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f61766174617220696e6465782073686f756c6420626520696e2072616e67650081525060200191505060405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600001819055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610be8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600660009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16141515610cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001807f416c6c20626574732073686f756c642062652070726f6365737365642028736581526020017f74746c6564206f7220726566756e64656429206265666f72652073656c662d6481526020017f657374727563742e00000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b85604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083101515610eca5780518252602082019150602081019050602083039250610ea5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004935060076000858152602001908152602001600020925060fa8564ffffffffff16014311151515610fba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610fc4604861338f565b610fcf846044613a75565b809250819350505081600019168564ffffffffff164060001916141515610ff557600080fd5b611000838783613db6565b505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611160576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055481565b60025481565b600080600080600080600760008b81526020019081526020016000209550600073ffffffffffffffffffffffffffffffffffffffff1686600101600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156112a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4265742073686f756c6420626520696e20612027636c65616e2720737461746581526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b349450662386f26fc1000085101580156112c45750693f870857a3e0e38000008511155b1515611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416d6f756e742073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b60008c11801561134b5750602860020a8c105b15156113bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d61736b2073686f756c642062652077697468696e2072616e67652e0000000081525060200191505060405180910390fd5b6113cc8b8b8b8b8b61427e565b60008c1180156113dd575060648c11155b1515611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676581526020017f72207468616e206d6f64756c6f2e00000000000000000000000000000000000081525060400191505060405180910390fd5b611481858d6145d1565b809350819450505060025485018311151515611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d617850726f666974206c696d69742076696f6c6174696f6e2e20000000000081525060200191505060405180910390fd5b82600660008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff1631600660009054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff1611151515611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e0081525060200191505060405180910390fd5b7f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f878a6040518082815260200191505060405180910390a18486600001819055508b8660010160006101000a81548160ff021916908360ff160217905550438660010160016101000a81548164ffffffffff021916908364ffffffffff160217905550838660010160066101000a81548164ffffffffff021916908364ffffffffff1602179055503386600101600b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848101905080600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181111515156119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600660009054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff160111151515611a9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b611aab8282836000806000614766565b5050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508282826001019190611b05929190614b6b565b50505050565b6000806000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b84604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083101515611c505780518252602082019150602081019050602083039250611c2b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900492506007600084815260200190815260200160002091508160010160019054906101000a900464ffffffffff1664ffffffffff1690508043111515611d54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f736574746c6542657420696e207468652073616d6520626c6f636b206173207081526020017f6c6163654265742c206f72206265666f72652e0000000000000000000000000081525060400191505060405180910390fd5b60fa81014311151515611df5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8360001916814060001916141515611e0c57600080fd5b611e17828686613db6565b5050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e206f6e6c792061636365707420707265617070726f766564206e65772081526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612057576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420617070726f76652063757272656e74206f776e65722e00000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060606000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122455780601f1061221a57610100808354040283529160200191612245565b820191906000526020600020905b81548152906001019060200180831161222857829003601f168201915b5050505050905092509250509091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561233f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181111515156123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600660009054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff1601111515156124d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b80600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561261c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600080600080600080600760008c81526020019081526020016000209550600073ffffffffffffffffffffffffffffffffffffffff1686600101600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561278e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4265742073686f756c6420626520696e20612027636c65616e2720737461746581526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b349450662386f26fc1000085101580156127b25750693f870857a3e0e38000008511155b1515612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416d6f756e742073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b60008d1180156128395750602860020a8d105b15156128ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d61736b2073686f756c642062652077697468696e2072616e67652e0000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141580156129165750600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b151561298a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e6e6f7420696e76697465206d7973716c0000000000000000000000000081525060200191505060405180910390fd5b6129978c8c8c8c8c61427e565b60008d1180156129a8575060648d11155b1515612a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676581526020017f72207468616e206d6f64756c6f2e00000000000000000000000000000000000081525060400191505060405180910390fd5b612a4c858e6145d1565b809350819450505060025485018311151515612ad0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d617850726f666974206c696d69742076696f6c6174696f6e2e20000000000081525060200191505060405180910390fd5b82600660008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff1631600660009054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff1611151515612c63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e0081525060200191505060405180910390fd5b7f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f878b6040518082815260200191505060405180910390a18486600001819055508c8660010160006101000a81548160ff021916908360ff160217905550438660010160016101000a81548164ffffffffff021916908364ffffffffff160217905550838660010160066101000a81548164ffffffffff021916908364ffffffffff1602179055503386600101600b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550868660020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848101905080600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050505050505050565b6000806000806007600086815260200190815260200160002093508360000154925060008314151515612eeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60fa8460010160019054906101000a900464ffffffffff1664ffffffffff160143111515612fa7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008460000181905550612fcf838560010160009054906101000a900460ff1660ff166145d1565b809250819350505081600660008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506130bf84600101600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684856000806000614766565b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156131b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b693f870857a3e0e380000081101515613385576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6d617850726f6669742073686f756c6420626520612073616e65206e756d626581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8060028190555050565b60008060008060008060008060008060008b3560001a9a5060f78b10151515613446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f52656365697074206c656166206c6f6e676572207468616e203535206279746581526020017f732e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60f68b038c019b508b3560001a9950607f8a11151561346a5760018c019b506134f9565b60808a1015801561347c575060b78a11155b15156134f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061746820697320616e20524c5020737472696e672e0000000000000000000081525060200191505060405180910390fd5b607f8a038c019b505b8b3560001a985060b9891415156135c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001807f5265636569707420737472696e6720697320616c77617973206174206c65617381526020017f7420323536206279746573206c6f6e672c20627574206c657373207468616e2081526020017f36346b2e0000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b60038c019b508b3560001a975060f98814151561366f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f5265636569707420697320616c77617973206174206c6561737420323536206281526020017f79746573206c6f6e672c20627574206c657373207468616e2036346b2e00000081525060400191505060405180910390fd5b60038c019b508b3560001a96506001871415156136f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5374617475732073686f756c6420626520737563636573732e0000000000000081525060200191505060405180910390fd5b60018c019b508b3560001a9550607f861115156137165760018c019b506137a5565b60808610158015613728575060b78611155b151561379c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43756d756c61746976652067617320697320616e20524c5020737472696e672e81525060200191505060405180910390fd5b607f86038c019b505b8b3560001a945060b98514151561384a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f426c6f6f6d2066696c74657220697320616c776179732032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6101038c019b508b3560001a935060f8841415156138f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6773206c697374206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a925060f8831415156139a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6720656e747279206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a9150609482141515613a26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41646472657373206973203230206279746573206c6f6e672e0000000000000081525060200191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff1681141515613a6757600080fd5b505050505050505050505050565b60008060008060008060008060008060405197505b61ffff601e8c03351695506000861415613aa357613bc8565b61ffff601c8c0335169450856020860111151515613b29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515613bad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b858901528588209b50859650858b019a50613a8a565b8b6001029850868801925061ffff601c8c033516915061ffff601a8c03351690508187820111151515613c63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60068b019a50818b8437613c7a8184018989614862565b8183209b50818b019a5061ffff601e8c033516955061ffff601c8c0335169450856020860111151515613d15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515613d99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b6000806000806000806000806000808c6000015499508c60010160009054906101000a900460ff1660ff1698508c600101600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16975060008a14151515613ea9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613eb3888b6148ad565b60008d600001819055508b8b604051602001808381526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b602083101515613f225780518252602082019150602081019050602083039250613efd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020965060649550858760019004811515613f6457fe5b069450613f718a8a6145d1565b80945081955050506000915060009050602886111515613fbf5760008d60010160069054906101000a900464ffffffffff1664ffffffffff168660020a16141515613fba578391505b613fcc565b88851015613fcb578391505b5b83600660008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555067016345785d8a00008a1015156140cb5760006103e887896001900481151561404b57fe5b0481151561405557fe5b0614156140ca57600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b5b600081111561413b578773ffffffffffffffffffffffffffffffffffffffff167f1bb05166a98fd97ba6a9f1f04f57b119557528458c1378d421b97451e195fd2c82878c8e6040518085815260200184815260200183815260200182815260200194505050505060405180910390a25b600073ffffffffffffffffffffffffffffffffffffffff168d60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561421f578c60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064600f606460028f028115156141e657fe5b04028115156141f157fe5b049081150290604051600060405180830381858888f1935050505015801561421d573d6000803e3d6000fd5b505b60646009606460028d0281151561423257fe5b040281151561423d57fe5b0460056000828254019250508190555061426f8860008385011461426357828401614266565b60015b84888d8f614766565b50505050505050505050505050565b60608060008743111515156142fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f436f6d6d69742068617320657870697265642e0000000000000000000000000081525060200191505060405180910390fd5b6040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250925061433d8888614b0d565b915082826040518082805190602001908083835b6020831015156143765780518252602082019150602081019050602083039250614351565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040516020018083805190602001908083835b6020831015156143db57805182526020820191506020810190506020830392506143b6565b6001836020036101000a0380198251168184511680821785525050505050509050018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b602083101515614453578051825260208201915060208101905060208303925061442e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600181878787604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af11580156144f9573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156145c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4543445341207369676e6174757265206973206e6f742076616c69642e00000081525060200191505060405180910390fd5b5050505050505050565b60008060008360001080156145e7575060648411155b151561465b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f57696e2070726f626162696c697479206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b67016345785d8a000085101561467257600061467b565b66038d7ea4c680005b915060646002860281151561468c57fe5b04905066016bcc41e900008110156146a95766016bcc41e9000090505b8482820111151515614749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f42657420646f65736e2774206576656e20636f76657220686f7573652065646781526020017f652e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b83606483838803030281151561475b57fe5b049250509250929050565b8573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501561480b578573ffffffffffffffffffffffffffffffffffffffff167f9620cef3a3d39af2426e8362381d59ca9ea0f5ae59621986a897d764f66f953e858585856040518085815260200184815260200183815260200182815260200194505050505060405180910390a261485a565b8573ffffffffffffffffffffffffffffffffffffffff167fac464fe4d3a86b9121261ac0a01dd981bfe0777c7c9d9c8f4473d31a9c0f9d2d866040518082815260200191505060405180910390a25b505050505050565b60005b60208210151561488a5782518452602084019350602083019250602082039150614865565b6001826020036101000a0390508019835116818551168181178652505050505050565b6000806000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506801a055690d9db8000083101580156149155750680821ab0d441498000083105b156149235760019150614a6a565b680821ab0d441498000083101580156149445750681043561a882930000083105b156149525760029150614a69565b681043561a882930000083101580156149735750685150ae84a8cdf0000083105b156149815760049150614a68565b685150ae84a8cdf0000083101580156149a2575068a2a15d09519be0000083105b156149b05760069150614a67565b68a2a15d09519be0000083101580156149d2575069032d26d12e980b60000083105b156149e05760089150614a66565b69032d26d12e980b6000008310158015614a03575069065a4da25d3016c0000083105b15614a1157600a9150614a65565b69065a4da25d3016c000008310158015614a345750691fc3842bd1f071c0000083105b15614a4257600c9150614a64565b691fc3842bd1f071c0000083101515614a5e57600f9150614a63565b614b06565b5b5b5b5b5b5b5b612710828502811515614a7957fe5b0490508473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015614b05578473ffffffffffffffffffffffffffffffffffffffff167f63c4a815575db8089483aeea967a8e1205c076ec5ff1eefca70ddb8d93be7eff826040518082815260200191505060405180910390a25b5b5050505050565b60608282604051602001808364ffffffffff1664ffffffffff167b0100000000000000000000000000000000000000000000000000000002815260050182815260200192505050604051602081830303815290604052905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614bac57803560ff1916838001178555614bda565b82800160010185558215614bda579182015b82811115614bd9578235825591602001919060010190614bbe565b5b509050614be79190614beb565b5090565b614c0d91905b80821115614c09576000816000905550600101614bf1565b5090565b905600a165627a7a723058200fcd4ddab150580192ff48387232ad9768a30779f1ce1d68ba5e4dd4b5c321bd0029
Deployed Bytecode
0x60806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630ea5edea1461016157806327f3a72a146101ae578063412648bf146101d957806341c0e1b5146102065780634d61537f1461021d57806357246d23146102745780636b5c5f39146102c357806374e048d51461031a5780638da5cb5b146103585780639efedc91146103af578063a43796ce146103da578063b372f93914610431578063b539cd551461045c578063bb5a4f4c14610487578063c1075329146104e4578063c73ea36714610531578063ca722cdc1461056c578063d06c54fb146105a7578063d579fd44146105be578063d6afc9b114610601578063d6d30a5114610698578063d702087f146106c5578063df88126f14610708578063dfea6ec214610757578063e1fdb4b4146107d4578063f8bb201c14610801578063fbd668a914610844575b005b34801561016d57600080fd5b506101ac600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610871565b005b3480156101ba57600080fd5b506101c3610a0a565b6040518082815260200191505060405180910390f35b3480156101e557600080fd5b5061020460048036038101908080359060200190929190505050610a29565b005b34801561021257600080fd5b5061021b610afe565b005b34801561022957600080fd5b50610232610d16565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561028057600080fd5b50610289610d3c565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102cf57600080fd5b506102d8610d5e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561032657600080fd5b5061035660048036038101908080359060200190929190803564ffffffffff169060200190929190505050610d84565b005b34801561036457600080fd5b5061036d611008565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103bb57600080fd5b506103c461102d565b6040518082815260200191505060405180910390f35b3480156103e657600080fd5b506103ef611074565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043d57600080fd5b50610446611188565b6040518082815260200191505060405180910390f35b34801561046857600080fd5b5061047161118e565b6040518082815260200191505060405180910390f35b6104e2600480360381019080803590602001909291908035906020019092919080359060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190505050611194565b005b3480156104f057600080fd5b5061052f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061181b565b005b34801561053d57600080fd5b5061056a600480360381019080803590602001908201803590602001919091929391929390505050611aaf565b005b34801561057857600080fd5b506105a5600480360381019080803590602001909291908035600019169060200190929190505050611b0b565b005b3480156105b357600080fd5b506105bc611e1e565b005b3480156105ca57600080fd5b506105ff600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f6d565b005b34801561060d57600080fd5b50610616612160565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561065c578082015181840152602081019050610641565b50505050905090810190601f1680156106895780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156106a457600080fd5b506106c360048036038101908080359060200190929190505050612255565b005b3480156106d157600080fd5b50610706600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612532565b005b34801561071457600080fd5b5061071d612660565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107d2600480360381019080803590602001909291908035906020019092919080359060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612682565b005b3480156107e057600080fd5b506107ff60048036038101908080359060200190929190505050612e2a565b005b34801561080d57600080fd5b50610842600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130c6565b005b34801561085057600080fd5b5061086f600480360381019080803590602001909291905050506131f4565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561095d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612710826005540281151561096e57fe5b04905080600554036005819055508273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015610a05578273ffffffffffffffffffffffffffffffffffffffff167f875de2816b17269ce10ae748fd72a0243bad5ee5ed409961ac7aea9fc4db80af826040518082815260200191505060405180910390a25b505050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b6000808210158015610a3c575060648211155b1515610ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f61766174617220696e6465782073686f756c6420626520696e2072616e67650081525060200191505060405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600001819055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610be8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600660009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16141515610cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001807f416c6c20626574732073686f756c642062652070726f6365737365642028736581526020017f74746c6564206f7220726566756e64656429206265666f72652073656c662d6481526020017f657374727563742e00000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b85604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083101515610eca5780518252602082019150602081019050602083039250610ea5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004935060076000858152602001908152602001600020925060fa8564ffffffffff16014311151515610fba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610fc4604861338f565b610fcf846044613a75565b809250819350505081600019168564ffffffffff164060001916141515610ff557600080fd5b611000838783613db6565b505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611160576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055481565b60025481565b600080600080600080600760008b81526020019081526020016000209550600073ffffffffffffffffffffffffffffffffffffffff1686600101600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156112a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4265742073686f756c6420626520696e20612027636c65616e2720737461746581526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b349450662386f26fc1000085101580156112c45750693f870857a3e0e38000008511155b1515611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416d6f756e742073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b60008c11801561134b5750602860020a8c105b15156113bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d61736b2073686f756c642062652077697468696e2072616e67652e0000000081525060200191505060405180910390fd5b6113cc8b8b8b8b8b61427e565b60008c1180156113dd575060648c11155b1515611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676581526020017f72207468616e206d6f64756c6f2e00000000000000000000000000000000000081525060400191505060405180910390fd5b611481858d6145d1565b809350819450505060025485018311151515611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d617850726f666974206c696d69742076696f6c6174696f6e2e20000000000081525060200191505060405180910390fd5b82600660008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff1631600660009054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff1611151515611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e0081525060200191505060405180910390fd5b7f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f878a6040518082815260200191505060405180910390a18486600001819055508b8660010160006101000a81548160ff021916908360ff160217905550438660010160016101000a81548164ffffffffff021916908364ffffffffff160217905550838660010160066101000a81548164ffffffffff021916908364ffffffffff1602179055503386600101600b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848101905080600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181111515156119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600660009054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff160111151515611a9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b611aab8282836000806000614766565b5050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508282826001019190611b05929190614b6b565b50505050565b6000806000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b84604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083101515611c505780518252602082019150602081019050602083039250611c2b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900492506007600084815260200190815260200160002091508160010160019054906101000a900464ffffffffff1664ffffffffff1690508043111515611d54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f736574746c6542657420696e207468652073616d6520626c6f636b206173207081526020017f6c6163654265742c206f72206265666f72652e0000000000000000000000000081525060400191505060405180910390fd5b60fa81014311151515611df5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8360001916814060001916141515611e0c57600080fd5b611e17828686613db6565b5050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e206f6e6c792061636365707420707265617070726f766564206e65772081526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612057576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420617070726f76652063757272656e74206f776e65722e00000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060606000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122455780601f1061221a57610100808354040283529160200191612245565b820191906000526020600020905b81548152906001019060200180831161222857829003601f168201915b5050505050905092509250509091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561233f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181111515156123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600660009054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff1601111515156124d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b80600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561261c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600080600080600080600760008c81526020019081526020016000209550600073ffffffffffffffffffffffffffffffffffffffff1686600101600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561278e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4265742073686f756c6420626520696e20612027636c65616e2720737461746581526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b349450662386f26fc1000085101580156127b25750693f870857a3e0e38000008511155b1515612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416d6f756e742073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b60008d1180156128395750602860020a8d105b15156128ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d61736b2073686f756c642062652077697468696e2072616e67652e0000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141580156129165750600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b151561298a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e6e6f7420696e76697465206d7973716c0000000000000000000000000081525060200191505060405180910390fd5b6129978c8c8c8c8c61427e565b60008d1180156129a8575060648d11155b1515612a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676581526020017f72207468616e206d6f64756c6f2e00000000000000000000000000000000000081525060400191505060405180910390fd5b612a4c858e6145d1565b809350819450505060025485018311151515612ad0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d617850726f666974206c696d69742076696f6c6174696f6e2e20000000000081525060200191505060405180910390fd5b82600660008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff1631600660009054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff1611151515612c63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e0081525060200191505060405180910390fd5b7f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f878b6040518082815260200191505060405180910390a18486600001819055508c8660010160006101000a81548160ff021916908360ff160217905550438660010160016101000a81548164ffffffffff021916908364ffffffffff160217905550838660010160066101000a81548164ffffffffff021916908364ffffffffff1602179055503386600101600b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550868660020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848101905080600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050505050505050565b6000806000806007600086815260200190815260200160002093508360000154925060008314151515612eeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60fa8460010160019054906101000a900464ffffffffff1664ffffffffff160143111515612fa7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008460000181905550612fcf838560010160009054906101000a900460ff1660ff166145d1565b809250819350505081600660008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506130bf84600101600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684856000806000614766565b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156131b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b693f870857a3e0e380000081101515613385576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6d617850726f6669742073686f756c6420626520612073616e65206e756d626581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8060028190555050565b60008060008060008060008060008060008b3560001a9a5060f78b10151515613446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f52656365697074206c656166206c6f6e676572207468616e203535206279746581526020017f732e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60f68b038c019b508b3560001a9950607f8a11151561346a5760018c019b506134f9565b60808a1015801561347c575060b78a11155b15156134f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061746820697320616e20524c5020737472696e672e0000000000000000000081525060200191505060405180910390fd5b607f8a038c019b505b8b3560001a985060b9891415156135c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001807f5265636569707420737472696e6720697320616c77617973206174206c65617381526020017f7420323536206279746573206c6f6e672c20627574206c657373207468616e2081526020017f36346b2e0000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b60038c019b508b3560001a975060f98814151561366f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f5265636569707420697320616c77617973206174206c6561737420323536206281526020017f79746573206c6f6e672c20627574206c657373207468616e2036346b2e00000081525060400191505060405180910390fd5b60038c019b508b3560001a96506001871415156136f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5374617475732073686f756c6420626520737563636573732e0000000000000081525060200191505060405180910390fd5b60018c019b508b3560001a9550607f861115156137165760018c019b506137a5565b60808610158015613728575060b78611155b151561379c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43756d756c61746976652067617320697320616e20524c5020737472696e672e81525060200191505060405180910390fd5b607f86038c019b505b8b3560001a945060b98514151561384a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f426c6f6f6d2066696c74657220697320616c776179732032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6101038c019b508b3560001a935060f8841415156138f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6773206c697374206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a925060f8831415156139a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6720656e747279206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a9150609482141515613a26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41646472657373206973203230206279746573206c6f6e672e0000000000000081525060200191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff1681141515613a6757600080fd5b505050505050505050505050565b60008060008060008060008060008060405197505b61ffff601e8c03351695506000861415613aa357613bc8565b61ffff601c8c0335169450856020860111151515613b29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515613bad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b858901528588209b50859650858b019a50613a8a565b8b6001029850868801925061ffff601c8c033516915061ffff601a8c03351690508187820111151515613c63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60068b019a50818b8437613c7a8184018989614862565b8183209b50818b019a5061ffff601e8c033516955061ffff601c8c0335169450856020860111151515613d15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515613d99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b6000806000806000806000806000808c6000015499508c60010160009054906101000a900460ff1660ff1698508c600101600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16975060008a14151515613ea9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613eb3888b6148ad565b60008d600001819055508b8b604051602001808381526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b602083101515613f225780518252602082019150602081019050602083039250613efd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020965060649550858760019004811515613f6457fe5b069450613f718a8a6145d1565b80945081955050506000915060009050602886111515613fbf5760008d60010160069054906101000a900464ffffffffff1664ffffffffff168660020a16141515613fba578391505b613fcc565b88851015613fcb578391505b5b83600660008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555067016345785d8a00008a1015156140cb5760006103e887896001900481151561404b57fe5b0481151561405557fe5b0614156140ca57600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b5b600081111561413b578773ffffffffffffffffffffffffffffffffffffffff167f1bb05166a98fd97ba6a9f1f04f57b119557528458c1378d421b97451e195fd2c82878c8e6040518085815260200184815260200183815260200182815260200194505050505060405180910390a25b600073ffffffffffffffffffffffffffffffffffffffff168d60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561421f578c60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064600f606460028f028115156141e657fe5b04028115156141f157fe5b049081150290604051600060405180830381858888f1935050505015801561421d573d6000803e3d6000fd5b505b60646009606460028d0281151561423257fe5b040281151561423d57fe5b0460056000828254019250508190555061426f8860008385011461426357828401614266565b60015b84888d8f614766565b50505050505050505050505050565b60608060008743111515156142fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f436f6d6d69742068617320657870697265642e0000000000000000000000000081525060200191505060405180910390fd5b6040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250925061433d8888614b0d565b915082826040518082805190602001908083835b6020831015156143765780518252602082019150602081019050602083039250614351565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040516020018083805190602001908083835b6020831015156143db57805182526020820191506020810190506020830392506143b6565b6001836020036101000a0380198251168184511680821785525050505050509050018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b602083101515614453578051825260208201915060208101905060208303925061442e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600181878787604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af11580156144f9573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156145c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4543445341207369676e6174757265206973206e6f742076616c69642e00000081525060200191505060405180910390fd5b5050505050505050565b60008060008360001080156145e7575060648411155b151561465b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f57696e2070726f626162696c697479206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b67016345785d8a000085101561467257600061467b565b66038d7ea4c680005b915060646002860281151561468c57fe5b04905066016bcc41e900008110156146a95766016bcc41e9000090505b8482820111151515614749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f42657420646f65736e2774206576656e20636f76657220686f7573652065646781526020017f652e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b83606483838803030281151561475b57fe5b049250509250929050565b8573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501561480b578573ffffffffffffffffffffffffffffffffffffffff167f9620cef3a3d39af2426e8362381d59ca9ea0f5ae59621986a897d764f66f953e858585856040518085815260200184815260200183815260200182815260200194505050505060405180910390a261485a565b8573ffffffffffffffffffffffffffffffffffffffff167fac464fe4d3a86b9121261ac0a01dd981bfe0777c7c9d9c8f4473d31a9c0f9d2d866040518082815260200191505060405180910390a25b505050505050565b60005b60208210151561488a5782518452602084019350602083019250602082039150614865565b6001826020036101000a0390508019835116818551168181178652505050505050565b6000806000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506801a055690d9db8000083101580156149155750680821ab0d441498000083105b156149235760019150614a6a565b680821ab0d441498000083101580156149445750681043561a882930000083105b156149525760029150614a69565b681043561a882930000083101580156149735750685150ae84a8cdf0000083105b156149815760049150614a68565b685150ae84a8cdf0000083101580156149a2575068a2a15d09519be0000083105b156149b05760069150614a67565b68a2a15d09519be0000083101580156149d2575069032d26d12e980b60000083105b156149e05760089150614a66565b69032d26d12e980b6000008310158015614a03575069065a4da25d3016c0000083105b15614a1157600a9150614a65565b69065a4da25d3016c000008310158015614a345750691fc3842bd1f071c0000083105b15614a4257600c9150614a64565b691fc3842bd1f071c0000083101515614a5e57600f9150614a63565b614b06565b5b5b5b5b5b5b5b612710828502811515614a7957fe5b0490508473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015614b05578473ffffffffffffffffffffffffffffffffffffffff167f63c4a815575db8089483aeea967a8e1205c076ec5ff1eefca70ddb8d93be7eff826040518082815260200191505060405180910390a25b5b5050505050565b60608282604051602001808364ffffffffff1664ffffffffff167b0100000000000000000000000000000000000000000000000000000002815260050182815260200192505050604051602081830303815290604052905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614bac57803560ff1916838001178555614bda565b82800160010185558215614bda579182015b82811115614bd9578235825591602001919060010190614bbe565b5b509050614be79190614beb565b5090565b614c0d91905b80821115614c09576000816000905550600101614bf1565b5090565b905600a165627a7a723058200fcd4ddab150580192ff48387232ad9768a30779f1ce1d68ba5e4dd4b5c321bd0029
Swarm Source
bzzr://0fcd4ddab150580192ff48387232ad9768a30779f1ce1d68ba5e4dd4b5c321bd
Loading...
Loading
Loading...
Loading
Net Worth in USD
$618.38
Net Worth in ETH
0.301763
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,049.22 | 0.3018 | $618.38 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.