Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 5,523 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 23425291 | 152 days ago | IN | 0 ETH | 0.0000175 | ||||
| Set Approval For... | 22838085 | 234 days ago | IN | 0 ETH | 0.00009004 | ||||
| Set Approval For... | 20637337 | 541 days ago | IN | 0 ETH | 0.0000361 | ||||
| Set Approval For... | 16243737 | 1157 days ago | IN | 0 ETH | 0.00027294 | ||||
| Set Approval For... | 16094451 | 1178 days ago | IN | 0 ETH | 0.00037276 | ||||
| Set Approval For... | 15998346 | 1191 days ago | IN | 0 ETH | 0.00046426 | ||||
| Set Approval For... | 15299950 | 1294 days ago | IN | 0 ETH | 0.00032715 | ||||
| Set Approval For... | 14882645 | 1362 days ago | IN | 0 ETH | 0.00094902 | ||||
| Set Approval For... | 14415327 | 1436 days ago | IN | 0 ETH | 0.00046824 | ||||
| Owner Withdraw | 14384724 | 1441 days ago | IN | 0 ETH | 0.00060672 | ||||
| Confirm Hit | 14268848 | 1459 days ago | IN | 0 ETH | 0.00213604 | ||||
| Confirm Hit | 14268847 | 1459 days ago | IN | 0 ETH | 0.00475828 | ||||
| Confirm Hit | 14268255 | 1459 days ago | IN | 0 ETH | 0.0045727 | ||||
| Confirm Hit | 14267880 | 1459 days ago | IN | 0 ETH | 0.00347775 | ||||
| Confirm Hit | 14267661 | 1459 days ago | IN | 0 ETH | 0.00686806 | ||||
| Confirm Hit | 14267400 | 1459 days ago | IN | 0 ETH | 0.00680655 | ||||
| Confirm Hit | 14265720 | 1459 days ago | IN | 0 ETH | 0.00570243 | ||||
| Confirm Hit | 14265275 | 1459 days ago | IN | 0 ETH | 0.00498883 | ||||
| Confirm Hit | 14265241 | 1459 days ago | IN | 0 ETH | 0.00660768 | ||||
| Confirm Hit | 14264884 | 1459 days ago | IN | 0 ETH | 0.0031746 | ||||
| Confirm Hit | 14263216 | 1459 days ago | IN | 0 ETH | 0.00380902 | ||||
| Confirm Hit | 14261041 | 1460 days ago | IN | 0 ETH | 0.00195378 | ||||
| Reinforce | 14260927 | 1460 days ago | IN | 2.56 ETH | 0.00240101 | ||||
| Confirm Hit | 14260926 | 1460 days ago | IN | 0 ETH | 0.00261005 | ||||
| Confirm Hit | 14260926 | 1460 days ago | IN | 0 ETH | 0.00261005 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 14384724 | 1441 days ago | 25.216 ETH | ||||
| - | 14296821 | 1454 days ago | 254.99157514 ETH | ||||
| - | 14268847 | 1459 days ago | 0.01 ETH | ||||
| - | 14268255 | 1459 days ago | 0.01 ETH | ||||
| - | 14267880 | 1459 days ago | 0.01 ETH | ||||
| - | 14267661 | 1459 days ago | 0.01 ETH | ||||
| - | 14267400 | 1459 days ago | 0.01 ETH | ||||
| - | 14265720 | 1459 days ago | 0.01 ETH | ||||
| - | 14265275 | 1459 days ago | 0.01 ETH | ||||
| - | 14265275 | 1459 days ago | 0.01 ETH | ||||
| - | 14265275 | 1459 days ago | 0.01 ETH | ||||
| - | 14265274 | 1459 days ago | 1.52387046 ETH | ||||
| - | 14265240 | 1459 days ago | 0.01 ETH | ||||
| - | 14265240 | 1459 days ago | 0.01 ETH | ||||
| - | 14264884 | 1459 days ago | 0.01 ETH | ||||
| - | 14264474 | 1459 days ago | 10.24 ETH | ||||
| - | 14263216 | 1459 days ago | 0.01 ETH | ||||
| - | 14262335 | 1460 days ago | 5.12 ETH | ||||
| - | 14262327 | 1460 days ago | 5.12 ETH | ||||
| - | 14262306 | 1460 days ago | 1.40741889 ETH | ||||
| - | 14261042 | 1460 days ago | 0.01 ETH | ||||
| - | 14261042 | 1460 days ago | 0.01 ETH | ||||
| - | 14261041 | 1460 days ago | 0.01 ETH | ||||
| - | 14260924 | 1460 days ago | 0.01 ETH | ||||
| - | 14260924 | 1460 days ago | 0.01 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Doomsday
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Cool kids only
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "./interfaces/IERC165.sol";
import "./interfaces/IERC721.sol";
import "./interfaces/IERC721Metadata.sol";
import "./interfaces/IERC721TokenReceiver.sol";
contract Doomsday is IERC721, IERC165, IERC721Metadata{
constructor(bytes32 _cityRoot, address _earlyAccessHolders){
supportedInterfaces[0x80ac58cd] = true; //ERC721
supportedInterfaces[0x5b5e139f] = true; //ERC721Metadata
// supportedInterfaces[0x780e9d63] = true; //ERC721Enumerable
supportedInterfaces[0x01ffc9a7] = true; //ERC165
owner = msg.sender;
cityRoot = _cityRoot;
earlyAccessHolders = _earlyAccessHolders;
}
address public owner;
address earlyAccessHolders;
//////===721 Implementation
mapping(address => uint256) internal balances;
mapping (uint256 => address) internal allowance;
mapping (address => mapping (address => bool)) internal authorised;
uint16[] tokenIndexToCity; //Array of all tokens [cityId,cityId,...]
mapping(uint256 => address) owners; //Mapping of owners
// keep owners mapping
// use tokenIndexToCity for isValidToken
// METADATA VARS
string private __name = "Doomsday NFT";
string private __symbol = "BUNKER";
bytes private __uriBase = bytes("https://gateway.pinata.cloud/ipfs/QmUwPH9PmTQrT67M633AJRXACsecmRTihf4DUbJZb9y83M/");
bytes private __uriSuffix = bytes(".json");
// Game vars
uint constant MAX_CITIES = 38611; //from table
int64 constant MAP_WIDTH = 4320000; //map units
int64 constant MAP_HEIGHT = 2588795; //map units
int64 constant BASE_BLAST_RADIUS = 100000; //map units
uint constant MINT_COST = 0.04 ether;
uint constant MINT_PERCENT_WINNER = 50;
uint constant MINT_PERCENT_CALLER = 25;
uint constant MINT_PERCENT_CREATOR = 25;
uint constant REINFORCE_PERCENT_WINNER = 90;
uint constant REINFORCE_PERCENT_CREATOR = 10;
uint constant IMPACT_BLOCK_INTERVAL = 120;
mapping(uint16 => uint) public cityToToken;
mapping(uint16 => int64[2]) coordinates;
bytes32 cityRoot;
event Inhabit(uint16 indexed _cityId, uint256 indexed _tokenId);
event Reinforce(uint256 indexed _tokenId);
event Impact(uint256 indexed _tokenId);
mapping(uint => bytes32) structuralData;
function getStructuralData(uint _tokenId) public view returns (uint8 reinforcement, uint8 damage, bytes32 lastImpact){
bytes32 _data = structuralData[_tokenId];
reinforcement = uint8(uint(((_data << 248) >> 248)));
damage = uint8(uint(((_data << 240) >> 240) >> 8));
lastImpact = (_data >> 16);
return (reinforcement, damage, lastImpact);
}
function setStructuralData(uint _tokenId, uint8 reinforcement, uint8 damage, bytes32 lastImpact) internal{
bytes32 _reinforcement = bytes32(uint(reinforcement));
bytes32 _damage = bytes32(uint(damage)) << 8;
bytes32 _lastImpact = encodeImpact(lastImpact) << 16;
structuralData[_tokenId] = _reinforcement ^ _damage ^ _lastImpact;
}
function encodeImpact(bytes32 _impact) internal pure returns(bytes32){
return (_impact << 16) >> 16;
}
uint public reinforcements;
uint public destroyed;
uint public evacuatedFunds;
uint ownerWithdrawn;
bool winnerWithdrawn;
function tokenToCity(uint _tokenId) public view returns(uint16){
return tokenIndexToCity[_tokenId - 1];
}
uint public startTime;
uint SALE_TIME = 7 days;
uint EARLY_ACCESS_TIME = 1 days;
function startPreApocalypse() public{
require(msg.sender == owner,"owner");
require(startTime == 0,"started");
startTime = block.timestamp;
}
enum Stage {Initial,PreApocalypse,Apocalypse,PostApocalypse}
function stage() public view returns(Stage){
if(startTime == 0){
return Stage.Initial;
}else if(block.timestamp < startTime + SALE_TIME && tokenIndexToCity.length < MAX_CITIES){
return Stage.PreApocalypse;
}else if(destroyed < tokenIndexToCity.length - 1){
return Stage.Apocalypse;
}else{
return Stage.PostApocalypse;
}
}
function inhabit(uint16 _cityId, int64[2] calldata _coordinates, bytes32[] memory proof) public payable{
require(stage() == Stage.PreApocalypse,"stage");
if(block.timestamp < startTime + EARLY_ACCESS_TIME){
//First day is insiders list
require(IERC721(earlyAccessHolders).balanceOf(msg.sender) > 0,"early");
}
bytes32 leaf = keccak256(abi.encodePacked(_cityId,_coordinates[0],_coordinates[1]));
require(MerkleProof.verify(proof, cityRoot, leaf),"proof");
require(cityToToken[_cityId] == 0 && coordinates[_cityId][0] == 0 && coordinates[_cityId][1] == 0,"inhabited");
require(
_coordinates[0] >= -MAP_WIDTH/2 &&
_coordinates[0] <= MAP_WIDTH/2 &&
_coordinates[1] >= -MAP_HEIGHT/2 &&
_coordinates[1] <= MAP_HEIGHT/2,
"off map"
); //Not strictly necessary but proves the whitelist hasnt been fucked with
require(msg.value == MINT_COST,"cost");
coordinates[_cityId] = _coordinates;
tokenIndexToCity.push(_cityId);
uint _tokenId = tokenIndexToCity.length;
balances[msg.sender]++;
owners[_tokenId] = msg.sender;
cityToToken[_cityId] = _tokenId;
emit Inhabit(_cityId, _tokenId);
emit Transfer(address(0),msg.sender,_tokenId);
}
function isUninhabited(uint16 _cityId) public view returns(bool){
return coordinates[_cityId][0] == 0 && coordinates[_cityId][1] == 0;
}
function reinforce(uint _tokenId) public payable{
Stage _stage = stage();
require(_stage == Stage.PreApocalypse || _stage == Stage.Apocalypse,"stage");
require(ownerOf(_tokenId) == msg.sender,"owner");
//Covered by ownerOf
// require(isValidToken(_tokenId),"invalid");
(uint8 _reinforcement, uint8 _damage, bytes32 _lastImpact) = getStructuralData(_tokenId);
if(_stage == Stage.Apocalypse){
require(!checkVulnerable(_tokenId,_lastImpact),"vulnerable");
}
// covered by isValidToken
//require(_damage <= _reinforcement,"eliminated" );
require(msg.value == (2 ** _reinforcement) * MINT_COST,"cost");
setStructuralData(_tokenId,_reinforcement+1,_damage,_lastImpact);
reinforcements += msg.value - (MINT_COST * MINT_PERCENT_CALLER / 100);
emit Reinforce(_tokenId);
}
function evacuate(uint _tokenId) public{
Stage _stage = stage();
require(_stage == Stage.PreApocalypse || _stage == Stage.Apocalypse,"stage");
require(ownerOf(_tokenId) == msg.sender,"owner");
// covered by isValidToken in ownerOf
// require(_damage <= _reinforcement,"eliminated" );
if(_stage == Stage.Apocalypse){
require(!isVulnerable(_tokenId),"vulnerable");
}
uint cityCount = tokenIndexToCity.length;
uint fromPool =
//Winner fee from mints less evacuated funds
((MINT_COST * cityCount * MINT_PERCENT_WINNER / 100 - evacuatedFunds)
//Divided by remaining tokens
/ totalSupply())
//Divided by two
/ 2;
//Also give them the admin fee
uint toWithdraw = fromPool + getEvacuationRebate(_tokenId);
balances[owners[_tokenId]]--;
delete cityToToken[tokenToCity(_tokenId)];
destroyed++;
//Doesnt' include admin fees in evacedFunds
evacuatedFunds += fromPool;
emit Transfer(owners[_tokenId],address(0),_tokenId);
payable(msg.sender).send(
toWithdraw
);
}
function getEvacuationRebate(uint _tokenId) public view returns(uint) {
(uint8 _reinforcement, uint8 _damage, bytes32 _lastImpact) = getStructuralData(_tokenId);
_lastImpact;
return MINT_COST * (1 + _reinforcement - _damage) * MINT_PERCENT_CALLER / 100;
}
function confirmHit(uint _tokenId) public{
require(stage() == Stage.Apocalypse,"stage");
require(isValidToken(_tokenId),"invalid");
(uint8 _reinforcement, uint8 _damage, bytes32 _lastImpact) = getStructuralData(_tokenId);
// covered by isValidToken
// require(_damage <= _reinforcement,"eliminated" );
require(checkVulnerable(_tokenId,_lastImpact),"vulnerable");
(int64[2] memory _coordinates, int64 _radius, bytes32 _impactId) = currentImpact();
_coordinates;_radius;
_impactId = encodeImpact(_impactId);
emit Impact(_tokenId);
if(_damage < _reinforcement){
_damage++;
setStructuralData(_tokenId,_reinforcement,_damage,_impactId);
}else{
balances[owners[_tokenId]]--;
delete cityToToken[tokenToCity(_tokenId)];
destroyed++;
emit Transfer(owners[_tokenId],address(0),_tokenId);
}
payable(msg.sender).send(MINT_COST * MINT_PERCENT_CALLER / 100);
}
function winnerWithdraw(uint _winnerTokenId) public{
require(stage() == Stage.PostApocalypse,"stage");
require(isValidToken(_winnerTokenId),"invalid");
// Implicitly makes sure its the right token since all others don't exist
require(msg.sender == ownerOf(_winnerTokenId),"ownerOf");
require(!winnerWithdrawn,"withdrawn");
winnerWithdrawn = true;
uint toWithdraw = winnerPrize(_winnerTokenId);
if(toWithdraw > address(this).balance){
//Catch rounding errors
toWithdraw = address(this).balance;
}
payable(msg.sender).send(toWithdraw);
}
function ownerWithdraw() public{
require(msg.sender == owner,"owner");
uint cityCount = tokenIndexToCity.length;
// Dev and creator portion of all mint fees collected
uint toWithdraw = MINT_COST * cityCount * (MINT_PERCENT_CREATOR) / 100
//plus reinforcement for creator
+ reinforcements * REINFORCE_PERCENT_CREATOR / 100
//less what has already been withdrawn;
- ownerWithdrawn;
require(toWithdraw > 0,"empty");
if(toWithdraw > address(this).balance){
//Catch rounding errors
toWithdraw = address(this).balance;
}
ownerWithdrawn += toWithdraw;
payable(msg.sender).send(toWithdraw);
}
function currentImpact() public view returns (int64[2] memory _coordinates, int64 _radius, bytes32 impactId){
uint eliminationBlock = block.number - (block.number % IMPACT_BLOCK_INTERVAL) - 5;
int hash = int(uint(blockhash(eliminationBlock))%uint(type(int).max) );
//Min radius is half map height divided by num
int o = MAP_HEIGHT/2/int(totalSupply()+1);
//Limited in smallness to about 8% of map height
if(o < BASE_BLAST_RADIUS){
o = BASE_BLAST_RADIUS;
}
//Max radius is twice this
_coordinates[0] = int64(hash%MAP_WIDTH - MAP_WIDTH/2);
_coordinates[1] = int64((hash/MAP_WIDTH)%MAP_HEIGHT - MAP_HEIGHT/2);
_radius = int64((hash/MAP_WIDTH/MAP_HEIGHT)%o + o);
return(_coordinates,_radius, keccak256(abi.encodePacked(_coordinates,_radius)));
}
function checkVulnerable(uint _tokenId, bytes32 _lastImpact) internal view returns(bool){
(int64[2] memory _coordinates, int64 _radius, bytes32 _impactId) = currentImpact();
if(_lastImpact == encodeImpact(_impactId)) return false;
uint16 _cityId = tokenToCity(_tokenId);
int64 dx = coordinates[_cityId][0] - _coordinates[0];
int64 dy = coordinates[_cityId][1] - _coordinates[1];
return (dx**2 + dy**2 < _radius**2) ||
((dx + MAP_WIDTH )**2 + dy**2 < _radius**2) ||
((dx - MAP_WIDTH )**2 + dy**2 < _radius**2);
}
function isVulnerable(uint _tokenId) public view returns(bool){
(uint8 _reinforcement, uint8 _damage, bytes32 _lastImpact) = getStructuralData(_tokenId);
_reinforcement;_damage;
return checkVulnerable(_tokenId,_lastImpact);
}
function getFallen(uint _tokenId) public view returns(uint16 _cityId, address _owner){
_cityId = tokenToCity(_tokenId);
_owner = owners[_tokenId];
require(cityToToken[_cityId] == 0 && _owner != address(0),"survives");
return (_cityId,owners[_tokenId]);
}
function currentPrize() public view returns(uint){
uint cityCount = tokenIndexToCity.length;
// 50% of all mint fees collected
return MINT_COST * cityCount * MINT_PERCENT_WINNER / 100
//minus fees removed
- evacuatedFunds
//plus reinforcement * 90%
+ reinforcements * REINFORCE_PERCENT_WINNER / 100;
}
function winnerPrize(uint _tokenId) public view returns(uint){
return currentPrize() + getEvacuationRebate(_tokenId);
}
///ERC 721:
function isValidToken(uint256 _tokenId) internal view returns(bool){
if(_tokenId == 0) return false;
return cityToToken[tokenToCity(_tokenId)] != 0;
}
function balanceOf(address _owner) external override view returns (uint256){
return balances[_owner];
}
function ownerOf(uint256 _tokenId) public override view returns(address){
require(isValidToken(_tokenId),"invalid");
return owners[_tokenId];
}
function approve(address _approved, uint256 _tokenId) external override {
address _owner = ownerOf(_tokenId);
require( _owner == msg.sender //Require Sender Owns Token
|| authorised[_owner][msg.sender] // or is approved for all.
,"permission");
emit Approval(_owner, _approved, _tokenId);
allowance[_tokenId] = _approved;
}
function getApproved(uint256 _tokenId) external override view returns (address) {
require(isValidToken(_tokenId),"invalid");
return allowance[_tokenId];
}
function isApprovedForAll(address _owner, address _operator) external override view returns (bool) {
return authorised[_owner][_operator];
}
function setApprovalForAll(address _operator, bool _approved) external override {
emit ApprovalForAll(msg.sender,_operator, _approved);
authorised[msg.sender][_operator] = _approved;
}
function transferFrom(address _from, address _to, uint256 _tokenId) public override {
//Check Transferable
//There is a token validity check in ownerOf
address _owner = ownerOf(_tokenId);
require ( _owner == msg.sender //Require sender owns token
//Doing the two below manually instead of referring to the external methods saves gas
|| allowance[_tokenId] == msg.sender //or is approved for this token
|| authorised[_owner][msg.sender] //or is approved for all
,"permission");
require(_owner == _from,"owner");
require(_to != address(0),"zero");
require(!isVulnerable(_tokenId),"vulnerable");
emit Transfer(_from, _to, _tokenId);
owners[_tokenId] =_to;
balances[_from]--;
balances[_to]++;
//Reset approved if there is one
if(allowance[_tokenId] != address(0)){
delete allowance[_tokenId];
}
}
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) public override {
transferFrom(_from, _to, _tokenId);
//Get size of "_to" address, if 0 it's a wallet
uint32 size;
assembly {
size := extcodesize(_to)
}
if(size > 0){
IERC721TokenReceiver receiver = IERC721TokenReceiver(_to);
require(receiver.onERC721Received(msg.sender,_from,_tokenId,data) == bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")),"receiver");
}
}
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external override {
safeTransferFrom(_from,_to,_tokenId,"");
}
// METADATA FUNCTIONS
function tokenURI(uint256 _tokenId) public override view returns (string memory){
//Note: changed visibility to public
require(isValidToken(_tokenId),'tokenId');
uint _cityId = tokenToCity(_tokenId);
uint _i = _cityId;
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len;
while (_i != 0) {
k = k-1;
uint8 temp = (48 + uint8(_i - _i / 10 * 10));
bytes1 b1 = bytes1(temp);
bstr[k] = b1;
_i /= 10;
}
return string(abi.encodePacked(__uriBase,bstr,__uriSuffix));
}
function name() external override view returns (string memory _name){
return __name;
}
function symbol() external override view returns (string memory _symbol){
return __symbol;
}
// ENUMERABLE FUNCTIONS
function totalSupply() public view returns (uint256){
return tokenIndexToCity.length - destroyed;
}
// End 721 Implementation
///////===165 Implementation
mapping (bytes4 => bool) internal supportedInterfaces;
function supportsInterface(bytes4 interfaceID) external override view returns (bool){
return supportedInterfaces[interfaceID];
}
///==End 165
//Admin
function setOwner(address newOwner) public{
require(msg.sender == owner,"owner");
owner = newOwner;
}
function setUriComponents(string calldata _newBase, string calldata _newSuffix) public{
require(msg.sender == owner,"owner");
__uriBase = bytes(_newBase);
__uriSuffix = bytes(_newSuffix);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Trees proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
} else {
// Hash(current element of the proof + current computed hash)
computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
}
}
// Check if the computed hash (root) is equal to the provided root
return computedHash == root;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IERC165 {
/// @notice Query if a contract implements an interface
/// @param interfaceID The interface identifier, as specified in ERC-165
/// @dev Interface identification is specified in ERC-165. This function
/// uses less than 30,000 gas.
/// @return `true` if the contract implements `interfaceID` and
/// `interfaceID` is not 0xffffffff, `false` otherwise
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 /* is ERC165 */ {
/// @dev This emits when ownership of any NFT changes by any mechanism.
/// This event emits when NFTs are created (`from` == 0) and destroyed
/// (`to` == 0). Exception: during contract creation, any number of NFTs
/// may be created and assigned without emitting Transfer. At the time of
/// any transfer, the approved address for that NFT (if any) is reset to none.
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
/// @dev This emits when the approved address for an NFT is changed or
/// reaffirmed. The zero address indicates there is no approved address.
/// When a Transfer event emits, this also indicates that the approved
/// address for that NFT (if any) is reset to none.
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
/// @dev This emits when an operator is enabled or disabled for an owner.
/// The operator can manage all NFTs of the owner.
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
/// @notice Count all NFTs assigned to an owner
/// @dev NFTs assigned to the zero address are considered invalid, and this
/// function throws for queries about the zero address.
/// @param _owner An address for whom to query the balance
/// @return The number of NFTs owned by `_owner`, possibly zero
function balanceOf(address _owner) external view returns (uint256);
/// @notice Find the owner of an NFT
/// @dev NFTs assigned to zero address are considered invalid, and queries
/// about them do throw.
/// @param _tokenId The identifier for an NFT
/// @return The address of the owner of the NFT
function ownerOf(uint256 _tokenId) external view returns (address);
/// @notice Transfers the ownership of an NFT from one address to another address
/// @dev Throws unless `msg.sender` is the current owner, an authorized
/// operator, or the approved address for this NFT. Throws if `_from` is
/// not the current owner. Throws if `_to` is the zero address. Throws if
/// `_tokenId` is not a valid NFT. When transfer is complete, this function
/// checks if `_to` is a smart contract (code size > 0). If so, it calls
/// `onERC721Received` on `_to` and throws if the return value is not
/// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
/// @param _from The current owner of the NFT
/// @param _to The new owner
/// @param _tokenId The NFT to transfer
/// @param data Additional data with no specified format, sent in call to `_to`
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external;
/// @notice Transfers the ownership of an NFT from one address to another address
/// @dev This works identically to the other function with an extra data parameter,
/// except this function just sets data to "".
/// @param _from The current owner of the NFT
/// @param _to The new owner
/// @param _tokenId The NFT to transfer
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
/// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
/// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
/// THEY MAY BE PERMANENTLY LOST
/// @dev Throws unless `msg.sender` is the current owner, an authorized
/// operator, or the approved address for this NFT. Throws if `_from` is
/// not the current owner. Throws if `_to` is the zero address. Throws if
/// `_tokenId` is not a valid NFT.
/// @param _from The current owner of the NFT
/// @param _to The new owner
/// @param _tokenId The NFT to transfer
function transferFrom(address _from, address _to, uint256 _tokenId) external;
/// @notice Change or reaffirm the approved address for an NFT
/// @dev The zero address indicates there is no approved address.
/// Throws unless `msg.sender` is the current NFT owner, or an authorized
/// operator of the current owner.
/// @param _approved The new approved NFT controller
/// @param _tokenId The NFT to approve
function approve(address _approved, uint256 _tokenId) external;
/// @notice Enable or disable approval for a third party ("operator") to manage
/// all of `msg.sender`'s assets
/// @dev Emits the ApprovalForAll event. The contract MUST allow
/// multiple operators per owner.
/// @param _operator Address to add to the set of authorized operators
/// @param _approved True if the operator is approved, false to revoke approval
function setApprovalForAll(address _operator, bool _approved) external;
/// @notice Get the approved address for a single NFT
/// @dev Throws if `_tokenId` is not a valid NFT.
/// @param _tokenId The NFT to find the approved address for
/// @return The approved address for this NFT, or the zero address if there is none
function getApproved(uint256 _tokenId) external view returns (address);
/// @notice Query if an address is an authorized operator for another address
/// @param _owner The address that owns the NFTs
/// @param _operator The address that acts on behalf of the owner
/// @return True if `_operator` is an approved operator for `_owner`, false otherwise
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface IERC721Metadata /* is ERC721 */ {
/// @notice A descriptive name for a collection of NFTs in this contract
function name() external view returns (string memory _name);
/// @notice An abbreviated name for NFTs in this contract
function symbol() external view returns (string memory _symbol);
/// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
/// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
/// 3986. The URI may point to a JSON file that conforms to the "ERC721
/// Metadata JSON Schema".
function tokenURI(uint256 _tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
/// @notice Handle the receipt of an NFT
/// @dev The ERC721 smart contract calls this function on the recipient
/// after a `transfer`. This function MAY throw to revert and reject the
/// transfer. Return of other than the magic value MUST result in the
/// transaction being reverted.
/// Note: the contract address is always the message sender.
/// @param _operator The address which called `safeTransferFrom` function
/// @param _from The address which previously owned the token
/// @param _tokenId The NFT identifier which is being transferred
/// @param _data Additional data with no specified format
/// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
/// unless throwing
function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"bytes32","name":"_cityRoot","type":"bytes32"},{"internalType":"address","name":"_earlyAccessHolders","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Impact","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_cityId","type":"uint16"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Inhabit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Reinforce","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"cityToToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"confirmHit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentImpact","outputs":[{"internalType":"int64[2]","name":"_coordinates","type":"int64[2]"},{"internalType":"int64","name":"_radius","type":"int64"},{"internalType":"bytes32","name":"impactId","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"destroyed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"evacuate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evacuatedFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getEvacuationRebate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFallen","outputs":[{"internalType":"uint16","name":"_cityId","type":"uint16"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getStructuralData","outputs":[{"internalType":"uint8","name":"reinforcement","type":"uint8"},{"internalType":"uint8","name":"damage","type":"uint8"},{"internalType":"bytes32","name":"lastImpact","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_cityId","type":"uint16"},{"internalType":"int64[2]","name":"_coordinates","type":"int64[2]"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"inhabit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_cityId","type":"uint16"}],"name":"isUninhabited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isVulnerable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reinforce","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"reinforcements","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBase","type":"string"},{"internalType":"string","name":"_newSuffix","type":"string"}],"name":"setUriComponents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"enum Doomsday.Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPreApocalypse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenToCity","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"winnerPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_winnerTokenId","type":"uint256"}],"name":"winnerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526040518060400160405280600c81526020017f446f6f6d73646179204e465400000000000000000000000000000000000000008152506007908051906020019062000051929190620002e7565b506040518060400160405280600681526020017f42554e4b45520000000000000000000000000000000000000000000000000000815250600890805190602001906200009f929190620002e7565b50604051806080016040528060518152602001620063746051913960099080519060200190620000d192919062000378565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200011f92919062000378565b5062093a80601555620151806016553480156200013b57600080fd5b50604051620063c5380380620063c5833981810160405281019062000161919062000456565b6001601760006380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601760006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d8190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200056e565b828054620002f590620004d5565b90600052602060002090601f01602090048101928262000319576000855562000365565b82601f106200033457805160ff191683800117855562000365565b8280016001018555821562000365579182015b828111156200036457825182559160200191906001019062000347565b5b50905062000374919062000409565b5090565b8280546200038690620004d5565b90600052602060002090601f016020900481019282620003aa5760008555620003f6565b82601f10620003c557805160ff1916838001178555620003f6565b82800160010185558215620003f6579182015b82811115620003f5578251825591602001919060010190620003d8565b5b50905062000405919062000409565b5090565b5b80821115620004245760008160009055506001016200040a565b5090565b60008151905062000439816200053a565b92915050565b600081519050620004508162000554565b92915050565b600080604083850312156200046a57600080fd5b60006200047a858286016200043f565b92505060206200048d8582860162000428565b9150509250929050565b6000620004a482620004b5565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620004ee57607f821691505b602082108114156200050557620005046200050b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620005458162000497565b81146200055157600080fd5b50565b6200055f81620004ab565b81146200056b57600080fd5b50565b615df6806200057e6000396000f3fe6080604052600436106102305760003560e01c8063766e54ac1161012e578063ad9e8723116100ab578063c60a71bf1161006f578063c60a71bf14610860578063c87b56dd14610889578063d1bec3ad146108c6578063e43333e214610903578063e985e9c51461092c57610230565b8063ad9e87231461079c578063b1bbd453146107b8578063b88d4fde146107e1578063c040e6b81461080a578063c42b42a01461083557610230565b80638da5cb5b116100f25780638da5cb5b146106b557806391f66ce8146106e057806395d89b411461070b5780639c756c0714610736578063a22cb4651461077357610230565b8063766e54ac1461059357806377e54008146105d057806378e979251461060e5780637a11359a1461063957806380b5462d1461067657610230565b806342842e0e116101bc57806358b3753f1161018057806358b3753f146104845780636352211e146104c157806370a08231146104fe578063743f71fe1461053b578063758c91151461056857610230565b806342842e0e146103e85780634311de8f14610411578063440c9bba146104285780634c5361061461043f578063589fb1001461045b57610230565b806313af40351161020357806313af40351461030357806318160ddd1461032c57806323b872dd14610357578063277a8e2514610380578063359cbbc9146103bd57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190614227565b610969565b6040516102699190614aae565b60405180910390f35b34801561027e57600080fd5b506102876109d1565b6040516102949190614ae4565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906143a7565b610a63565b6040516102d19190614a10565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906141eb565b610ae8565b005b34801561030f57600080fd5b5061032a60048036038101906103259190614080565b610ca6565b005b34801561033857600080fd5b50610341610d77565b60405161034e9190614d8a565b60405180910390f35b34801561036357600080fd5b5061037e600480360381019061037991906140e5565b610d91565b005b34801561038c57600080fd5b506103a760048036038101906103a29190614317565b611228565b6040516103b49190614aae565b60405180910390f35b3480156103c957600080fd5b506103d261131e565b6040516103df9190614d8a565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a91906140e5565b611324565b005b34801561041d57600080fd5b50610426611344565b005b34801561043457600080fd5b5061043d6114df565b005b610459600480360381019061045491906143a7565b6115bb565b005b34801561046757600080fd5b50610482600480360381019061047d91906143a7565b611932565b005b34801561049057600080fd5b506104ab60048036038101906104a691906143a7565b611dcd565b6040516104b89190614d8a565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e391906143a7565b611e31565b6040516104f59190614a10565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190614080565b611eb6565b6040516105329190614d8a565b60405180910390f35b34801561054757600080fd5b50610550611eff565b60405161055f93929190614a77565b60405180910390f35b34801561057457600080fd5b5061057d61212c565b60405161058a9190614d8a565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906143a7565b612132565b6040516105c79190614d46565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906143a7565b6121a5565b604051610605929190614d61565b60405180910390f35b34801561061a57600080fd5b506106236122be565b6040516106309190614d8a565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b91906143a7565b6122c4565b60405161066d9190614aae565b60405180910390f35b34801561068257600080fd5b5061069d600480360381019061069891906143a7565b6122ed565b6040516106ac93929190614da5565b60405180910390f35b3480156106c157600080fd5b506106ca612336565b6040516106d79190614a10565b60405180910390f35b3480156106ec57600080fd5b506106f561235a565b6040516107029190614d8a565b60405180910390f35b34801561071757600080fd5b50610720612360565b60405161072d9190614ae4565b60405180910390f35b34801561074257600080fd5b5061075d600480360381019061075891906143a7565b6123f2565b60405161076a9190614d8a565b60405180910390f35b34801561077f57600080fd5b5061079a600480360381019061079591906141af565b612416565b005b6107b660048036038101906107b19190614340565b612513565b005b3480156107c457600080fd5b506107df60048036038101906107da91906143a7565b612d5a565b005b3480156107ed57600080fd5b5061080860048036038101906108039190614134565b612f8f565b005b34801561081657600080fd5b5061081f6130ed565b60405161082c9190614ac9565b60405180910390f35b34801561084157600080fd5b5061084a613160565b6040516108579190614d8a565b60405180910390f35b34801561086c57600080fd5b50610887600480360381019061088291906142a2565b6131ce565b005b34801561089557600080fd5b506108b060048036038101906108ab91906143a7565b613286565b6040516108bd9190614ae4565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190614317565b613499565b6040516108fa9190614d8a565b60405180910390f35b34801561090f57600080fd5b5061092a600480360381019061092591906143a7565b6134b1565b005b34801561093857600080fd5b50610953600480360381019061094e91906140a9565b61383d565b6040516109609190614aae565b60405180910390f35b600060176000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600780546109e090615757565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0c90615757565b8015610a595780601f10610a2e57610100808354040283529160200191610a59565b820191906000526020600020905b815481529060010190602001808311610a3c57829003601f168201915b5050505050905090565b6000610a6e826138d1565b610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490614d26565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af382611e31565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610bb55750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90614ba6565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4826003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90614b06565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601054600580549050610d8c91906155ae565b905090565b6000610d9c82611e31565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610e3657503373ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610ec75750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90614ba6565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614b06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb90614b46565b60405180910390fd5b610fed826122c4565b1561102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490614b26565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061112a9061572d565b9190505550600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061117f906157ba565b9190505550600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611222576003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50505050565b600080600c60008461ffff1661ffff16815260200190815260200160002060006002811061127f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b14801561131757506000600c60008461ffff1661ffff1681526020019081526020016000206001600281106112f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b9050919050565b60105481565b61133f83838360405180602001604052806000815250612f8f565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614b06565b60405180910390fd5b6000600580549050905060006012546064600a600f546113f29190615444565b6113fc919061515f565b6064601985668e1bc9bf0400006114139190615444565b61141d9190615444565b611427919061515f565b6114319190614ffe565b61143b91906155ae565b905060008111611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790614c06565b60405180910390fd5b4781111561148c574790505b806012600082825461149e9190614ffe565b925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614b06565b60405180910390fd5b6000601454146115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990614ce6565b60405180910390fd5b42601481905550565b60006115c56130ed565b905060016003811115611601577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600381111561163a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14806116b657506002600381111561167b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160038111156116b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b6116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b66565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661171583611e31565b73ffffffffffffffffffffffffffffffffffffffff161461176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176290614b06565b60405180910390fd5b6000806000611779856122ed565b925092509250600260038111156117b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8460038111156117f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611843576118028582613914565b15611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990614b26565b60405180910390fd5b5b668e1bc9bf0400008360026118589190615326565b6118629190615444565b34146118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90614c46565b60405180910390fd5b6118bb856001856118b49190615054565b8484613ba6565b60646019668e1bc9bf0400006118d19190615444565b6118db919061515f565b346118e691906155ae565b600f60008282546118f79190614ffe565b92505081905550847f497d25ccff55cdf3b091a4d19054e291083d2a35c8cc511dfbab6b6a972ca29d60405160405180910390a25050505050565b600061193c6130ed565b905060016003811115611978577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160038111156119b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1480611a2d5750600260038111156119f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611a2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390614b66565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611a8c83611e31565b73ffffffffffffffffffffffffffffffffffffffff1614611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614b06565b60405180910390fd5b60026003811115611b1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611b55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611ba557611b64826122c4565b15611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90614b26565b60405180910390fd5b5b6000600580549050905060006002611bbb610d77565b6011546064603286668e1bc9bf040000611bd59190615444565b611bdf9190615444565b611be9919061515f565b611bf391906155ae565b611bfd919061515f565b611c07919061515f565b90506000611c1485611dcd565b82611c1f9190614ffe565b9050600260006006600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611ca49061572d565b9190505550600b6000611cb687612132565b61ffff1661ffff1681526020019081526020016000206000905560106000815480929190611ce3906157ba565b91905055508160116000828254611cfa9190614ffe565b9250508190555084600073ffffffffffffffffffffffffffffffffffffffff166006600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050505050565b600080600080611ddc856122ed565b9250925092506064601983856001611df49190615054565b611dfe91906155e2565b60ff16668e1bc9bf040000611e139190615444565b611e1d9190615444565b611e27919061515f565b9350505050919050565b6000611e3c826138d1565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614d26565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f07613ce3565b60008060006005607843611f1b919061588c565b43611f2691906155ae565b611f3091906155ae565b905060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff824060001c611f64919061588c565b905060006001611f72610d77565b611f7c9190614ffe565b60026227807b611f8c91906150f5565b60070b611f99919061508b565b9050620186a060070b811215611fb357620186a060070b90505b60026241eb00611fc391906150f5565b60070b6241eb0060070b83611fd8919061585b565b611fe2919061549e565b8660006002811061201c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060070b908160070b8152505060026227807b61203d91906150f5565b60070b6227807b60070b6241eb0060070b84612059919061508b565b612063919061585b565b61206d919061549e565b866001600281106120a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060070b908160070b8152505080816227807b60070b6241eb0060070b856120d3919061508b565b6120dd919061508b565b6120e7919061585b565b6120f19190614eee565b94508585878760405160200161210892919061494a565b60405160208183030381529060405280519060200120955095509550505050909192565b60115481565b6000600560018361214391906155ae565b8154811061217a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050919050565b6000806121b183612132565b91506006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600b60008461ffff1661ffff168152602001908152602001600020541480156122415750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227790614c86565b60405180910390fd5b816006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509150915091565b60145481565b6000806000806122d3856122ed565b9250925092506122e38582613914565b9350505050919050565b600080600080600e600086815260200190815260200160002054905060f88082901b901c60001c9350600860f08083901b901c901c60001c9250601081901c9150509193909250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60606008805461236f90615757565b80601f016020809104026020016040519081016040528092919081815260200182805461239b90615757565b80156123e85780601f106123bd576101008083540402835291602001916123e8565b820191906000526020600020905b8154815290600101906020018083116123cb57829003601f168201915b5050505050905090565b60006123fd82611dcd565b612405613160565b61240f9190614ffe565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124739190614aae565b60405180910390a380600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001600381111561254d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6125556130ed565b600381111561258d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c490614b66565b60405180910390fd5b6016546014546125dd9190614ffe565b4210156126d2576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016126419190614a10565b60206040518083038186803b15801561265957600080fd5b505afa15801561266d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269191906143d0565b116126d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c890614c26565b60405180910390fd5b5b6000838360006002811061270f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020160208101906127229190614279565b8460016002811061275c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201602081019061276f9190614279565b604051602001612781939291906149d3565b6040516020818303038152906040528051906020012090506127a682600d5483613bf6565b6127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90614ca6565b60405180910390fd5b6000600b60008661ffff1661ffff1681526020019081526020016000205414801561287f57506000600c60008661ffff1661ffff168152602001908152602001600020600060028110612861577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b80156128fa57506000600c60008661ffff1661ffff1681526020019081526020016000206001600281106128dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293090614cc6565b60405180910390fd5b60026241eb00612948906158bd565b61295291906150f5565b60070b8360006002811061298f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020160208101906129a29190614279565b60070b12158015612a14575060026241eb006129be91906150f5565b60070b836000600281106129fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612a0e9190614279565b60070b13155b8015612a8a575060026227807b612a2a906158bd565b612a3491906150f5565b60070b83600160028110612a71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612a849190614279565b60070b12155b8015612af7575060026227807b612aa191906150f5565b60070b83600160028110612ade577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612af19190614279565b60070b13155b612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614b86565b60405180910390fd5b668e1bc9bf0400003414612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614c46565b60405180910390fd5b82600c60008661ffff1661ffff168152602001908152602001600020906002612ba9929190613d05565b5060058490806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff16021790555060006005805490509050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c4e906157ba565b9190505550336006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008761ffff1661ffff16815260200190815260200160002081905550808561ffff167fc678d7c6bd4d7281f2061bc3c9d9b0a8126543c59834a0b1a6199947189573e560405160405180910390a3803373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600380811115612d93577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b612d9b6130ed565b6003811115612dd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a90614b66565b60405180910390fd5b612e1c816138d1565b612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614d26565b60405180910390fd5b612e6481611e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec890614c66565b60405180910390fd5b601360009054906101000a900460ff1615612f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1890614d06565b60405180910390fd5b6001601360006101000a81548160ff0219169083151502179055506000612f47826123f2565b905047811115612f55574790505b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050565b612f9a848484610d91565b6000833b905060008163ffffffff1611156130e65760008490507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b81526004016130339493929190614a2b565b602060405180830381600087803b15801561304d57600080fd5b505af1158015613061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130859190614250565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130db90614be6565b60405180910390fd5b505b5050505050565b6000806014541415613102576000905061315d565b6015546014546131129190614ffe565b4210801561312657506196d3600580549050105b15613134576001905061315d565b600160058054905061314691906155ae565b6010541015613158576002905061315d565b600390505b90565b60008060058054905090506064605a600f5461317c9190615444565b613186919061515f565b6011546064603284668e1bc9bf0400006131a09190615444565b6131aa9190615444565b6131b4919061515f565b6131be91906155ae565b6131c89190614ffe565b91505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461325c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325390614b06565b60405180910390fd5b83836009919061326d929190613dba565b508181600a919061327f929190613dba565b5050505050565b6060613291826138d1565b6132d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c790614bc6565b60405180910390fd5b60006132db83612132565b61ffff1690506000819050600081905060005b60008214613318578080613301906157ba565b915050600a82613311919061515f565b91506132ee565b60008167ffffffffffffffff81111561335a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561338c5781602001600182028036833780820191505090505b50905060008290505b60008514613466576001816133aa91906155ae565b90506000600a80876133bc919061515f565b6133c69190615444565b866133d191906155ae565b60306133dd9190615054565b905060008160f81b905080848481518110613421577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8761345d919061515f565b96505050613395565b600982600a60405160200161347d939291906149a2565b6040516020818303038152906040529650505050505050919050565b600b6020528060005260406000206000915090505481565b600260038111156134eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6134f36130ed565b600381111561352b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461356b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356290614b66565b60405180910390fd5b613574816138d1565b6135b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135aa90614d26565b60405180910390fd5b60008060006135c1846122ed565b9250925092506135d18482613914565b613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360790614b26565b60405180910390fd5b600080600061361d611eff565b92509250925061362c81613cd2565b9050867f287c3b40cb7d7950236aa90ed97e4245eed94845734e1f48ececacf164c16cf260405160405180910390a28560ff168560ff16101561368857848061367490615803565b95505061368387878784613ba6565b6137df565b60026000600660008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061370b9061572d565b9190505550600b600061371d89612132565b61ffff1661ffff168152602001908152602001600020600090556010600081548092919061374a906157ba565b919050555086600073ffffffffffffffffffffffffffffffffffffffff16600660008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b3373ffffffffffffffffffffffffffffffffffffffff166108fc60646019668e1bc9bf04000061380f9190615444565b613819919061515f565b9081150290604051600060405180830381858888f193505050505050505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000808214156138e4576000905061390f565b6000600b60006138f385612132565b61ffff1661ffff16815260200190815260200160002054141590505b919050565b600080600080613922611eff565b92509250925061393181613cd2565b8514156139445760009350505050613ba0565b600061394f87612132565b905060008460006002811061398d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600c60008461ffff1661ffff1681526020019081526020016000206000600281106139e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b613a099190615532565b9050600085600160028110613a47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600c60008561ffff1661ffff168152602001908152602001600020600160028110613aa0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b613ac39190615532565b9050600285613ad291906152d2565b60070b600282613ae291906152d2565b600284613aef91906152d2565b613af99190614f82565b60070b1280613b4a5750600285613b1091906152d2565b60070b600282613b2091906152d2565b60026241eb0085613b319190614f82565b613b3b91906152d2565b613b459190614f82565b60070b125b80613b975750600285613b5d91906152d2565b60070b600282613b6d91906152d2565b60026241eb0085613b7e9190615532565b613b8891906152d2565b613b929190614f82565b60070b125b96505050505050505b92915050565b60008360ff1660001b9050600060088460ff1660001b901b905060006010613bcd85613cd2565b901b90508082841818600e60008981526020019081526020016000208190555050505050505050565b60008082905060005b8551811015613cc4576000868281518110613c43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613c84578281604051602001613c67929190614976565b604051602081830303815290604052805190602001209250613cb0565b8083604051602001613c97929190614976565b6040516020818303038152906040528051906020012092505b508080613cbc906157ba565b915050613bff565b508381149150509392505050565b600060108083901b901c9050919050565b6040518060400160405280600290602082028036833780820191505090505090565b826002600301600490048101928215613da95791602002820160005b83821115613d7357833560070b83826101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055509260200192600801602081600701049283019260010302613d21565b8015613da75782816101000a81549067ffffffffffffffff0219169055600801602081600701049283019260010302613d73565b505b509050613db69190613e40565b5090565b828054613dc690615757565b90600052602060002090601f016020900481019282613de85760008555613e2f565b82601f10613e0157803560ff1916838001178555613e2f565b82800160010185558215613e2f579182015b82811115613e2e578235825591602001919060010190613e13565b5b509050613e3c9190613e40565b5090565b5b80821115613e59576000816000905550600101613e41565b5090565b6000613e70613e6b84614e01565b614ddc565b90508083825260208201905082856020860282011115613e8f57600080fd5b60005b85811015613ebf5781613ea58882613f79565b845260208401935060208301925050600181019050613e92565b5050509392505050565b6000613edc613ed784614e2d565b614ddc565b905082815260208101848484011115613ef457600080fd5b613eff8482856156eb565b509392505050565b600081359050613f1681615d1f565b92915050565b600082601f830112613f2d57600080fd5b8135613f3d848260208601613e5d565b91505092915050565b600081905082602060020282011115613f5e57600080fd5b92915050565b600081359050613f7381615d36565b92915050565b600081359050613f8881615d4d565b92915050565b600081359050613f9d81615d64565b92915050565b600081519050613fb281615d64565b92915050565b600082601f830112613fc957600080fd5b8135613fd9848260208601613ec9565b91505092915050565b600081359050613ff181615d7b565b92915050565b60008083601f84011261400957600080fd5b8235905067ffffffffffffffff81111561402257600080fd5b60208301915083600182028301111561403a57600080fd5b9250929050565b60008135905061405081615d92565b92915050565b60008135905061406581615da9565b92915050565b60008151905061407a81615da9565b92915050565b60006020828403121561409257600080fd5b60006140a084828501613f07565b91505092915050565b600080604083850312156140bc57600080fd5b60006140ca85828601613f07565b92505060206140db85828601613f07565b9150509250929050565b6000806000606084860312156140fa57600080fd5b600061410886828701613f07565b935050602061411986828701613f07565b925050604061412a86828701614056565b9150509250925092565b6000806000806080858703121561414a57600080fd5b600061415887828801613f07565b945050602061416987828801613f07565b935050604061417a87828801614056565b925050606085013567ffffffffffffffff81111561419757600080fd5b6141a387828801613fb8565b91505092959194509250565b600080604083850312156141c257600080fd5b60006141d085828601613f07565b92505060206141e185828601613f64565b9150509250929050565b600080604083850312156141fe57600080fd5b600061420c85828601613f07565b925050602061421d85828601614056565b9150509250929050565b60006020828403121561423957600080fd5b600061424784828501613f8e565b91505092915050565b60006020828403121561426257600080fd5b600061427084828501613fa3565b91505092915050565b60006020828403121561428b57600080fd5b600061429984828501613fe2565b91505092915050565b600080600080604085870312156142b857600080fd5b600085013567ffffffffffffffff8111156142d257600080fd5b6142de87828801613ff7565b9450945050602085013567ffffffffffffffff8111156142fd57600080fd5b61430987828801613ff7565b925092505092959194509250565b60006020828403121561432957600080fd5b600061433784828501614041565b91505092915050565b60008060006080848603121561435557600080fd5b600061436386828701614041565b935050602061437486828701613f46565b925050606084013567ffffffffffffffff81111561439157600080fd5b61439d86828701613f1c565b9150509250925092565b6000602082840312156143b957600080fd5b60006143c784828501614056565b91505092915050565b6000602082840312156143e257600080fd5b60006143f08482850161406b565b91505092915050565b60006144058383614613565b60208301905092915050565b600061441d8383614631565b60208301905092915050565b61443281615616565b82525050565b61444181614e7d565b61444b8184614eab565b925061445682614e5e565b8060005b8381101561448757815161446e87826143f9565b965061447983614e9e565b92505060018101905061445a565b505050505050565b61449881614e7d565b6144a28184614eb6565b92506144ad82614e5e565b8060005b838110156144de5781516144c58782614411565b96506144d083614e9e565b9250506001810190506144b1565b505050505050565b6144ef81615628565b82525050565b6144fe81615634565b82525050565b61451561451082615634565b61582d565b82525050565b600061452682614e88565b6145308185614ec1565b93506145408185602086016156fa565b614549816159f1565b840191505092915050565b600061455f82614e88565b6145698185614ed2565b93506145798185602086016156fa565b80840191505092915050565b6000815461459281615757565b61459c8186614ed2565b945060018216600081146145b757600181146145c8576145fb565b60ff198316865281860193506145fb565b6145d185614e68565b60005b838110156145f3578154818901526001820191506020810190506145d4565b838801955050505b50505092915050565b61460d816156d9565b82525050565b61461c81615687565b82525050565b61462b81615687565b82525050565b61463a81615687565b82525050565b61465161464c82615687565b615837565b82525050565b600061466282614e93565b61466c8185614edd565b935061467c8185602086016156fa565b614685816159f1565b840191505092915050565b600061469d600583614edd565b91506146a882615a29565b602082019050919050565b60006146c0600a83614edd565b91506146cb82615a52565b602082019050919050565b60006146e3600483614edd565b91506146ee82615a7b565b602082019050919050565b6000614706600583614edd565b915061471182615aa4565b602082019050919050565b6000614729600783614edd565b915061473482615acd565b602082019050919050565b600061474c600a83614edd565b915061475782615af6565b602082019050919050565b600061476f600783614edd565b915061477a82615b1f565b602082019050919050565b6000614792600883614edd565b915061479d82615b48565b602082019050919050565b60006147b5600583614edd565b91506147c082615b71565b602082019050919050565b60006147d8600583614edd565b91506147e382615b9a565b602082019050919050565b60006147fb600483614edd565b915061480682615bc3565b602082019050919050565b600061481e600783614edd565b915061482982615bec565b602082019050919050565b6000614841600883614edd565b915061484c82615c15565b602082019050919050565b6000614864600583614edd565b915061486f82615c3e565b602082019050919050565b6000614887600983614edd565b915061489282615c67565b602082019050919050565b60006148aa600783614edd565b91506148b582615c90565b602082019050919050565b60006148cd600983614edd565b91506148d882615cb9565b602082019050919050565b60006148f0600783614edd565b91506148fb82615ce2565b602082019050919050565b61490f81615694565b82525050565b61492661492182615694565b615849565b82525050565b614935816156c2565b82525050565b614944816156cc565b82525050565b6000614956828561448f565b6040820191506149668284614640565b6008820191508190509392505050565b60006149828285614504565b6020820191506149928284614504565b6020820191508190509392505050565b60006149ae8286614585565b91506149ba8285614554565b91506149c68284614585565b9150819050949350505050565b60006149df8286614915565b6002820191506149ef8285614640565b6008820191506149ff8284614640565b600882019150819050949350505050565b6000602082019050614a256000830184614429565b92915050565b6000608082019050614a406000830187614429565b614a4d6020830186614429565b614a5a604083018561492c565b8181036060830152614a6c818461451b565b905095945050505050565b6000608082019050614a8c6000830186614438565b614a996040830185614622565b614aa660608301846144f5565b949350505050565b6000602082019050614ac360008301846144e6565b92915050565b6000602082019050614ade6000830184614604565b92915050565b60006020820190508181036000830152614afe8184614657565b905092915050565b60006020820190508181036000830152614b1f81614690565b9050919050565b60006020820190508181036000830152614b3f816146b3565b9050919050565b60006020820190508181036000830152614b5f816146d6565b9050919050565b60006020820190508181036000830152614b7f816146f9565b9050919050565b60006020820190508181036000830152614b9f8161471c565b9050919050565b60006020820190508181036000830152614bbf8161473f565b9050919050565b60006020820190508181036000830152614bdf81614762565b9050919050565b60006020820190508181036000830152614bff81614785565b9050919050565b60006020820190508181036000830152614c1f816147a8565b9050919050565b60006020820190508181036000830152614c3f816147cb565b9050919050565b60006020820190508181036000830152614c5f816147ee565b9050919050565b60006020820190508181036000830152614c7f81614811565b9050919050565b60006020820190508181036000830152614c9f81614834565b9050919050565b60006020820190508181036000830152614cbf81614857565b9050919050565b60006020820190508181036000830152614cdf8161487a565b9050919050565b60006020820190508181036000830152614cff8161489d565b9050919050565b60006020820190508181036000830152614d1f816148c0565b9050919050565b60006020820190508181036000830152614d3f816148e3565b9050919050565b6000602082019050614d5b6000830184614906565b92915050565b6000604082019050614d766000830185614906565b614d836020830184614429565b9392505050565b6000602082019050614d9f600083018461492c565b92915050565b6000606082019050614dba600083018661493b565b614dc7602083018561493b565b614dd460408301846144f5565b949350505050565b6000614de6614df7565b9050614df28282615789565b919050565b6000604051905090565b600067ffffffffffffffff821115614e1c57614e1b6159c2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e4857614e476159c2565b5b614e51826159f1565b9050602081019050919050565b6000819050919050565b60008190508160005260206000209050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614ef98261567d565b9150614f048361567d565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614f3f57614f3e615906565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614f7757614f76615906565b5b828201905092915050565b6000614f8d82615687565b9150614f9883615687565b925081677fffffffffffffff03831360008312151615614fbb57614fba615906565b5b817fffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000038312600083121615614ff357614ff2615906565b5b828201905092915050565b6000615009826156c2565b9150615014836156c2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561504957615048615906565b5b828201905092915050565b600061505f826156cc565b915061506a836156cc565b92508260ff038211156150805761507f615906565b5b828201905092915050565b60006150968261567d565b91506150a18361567d565b9250826150b1576150b0615935565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156150ea576150e9615906565b5b828205905092915050565b600061510082615687565b915061510b83615687565b92508261511b5761511a615935565b5b600160000383147fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008314161561515457615153615906565b5b828205905092915050565b600061516a826156c2565b9150615175836156c2565b92508261518557615184615935565b5b828204905092915050565b6000808291508390505b60018511156151da578086048111156151b6576151b5615906565b5b60018516156151c55780820291505b80810290506151d385615a1c565b945061519a565b94509492505050565b600082600081146151fb57600181146152055761520e565b60019150506152ca565b829150506152ca565b508161521d57600090506152ca565b60019050600082136001811461523a576000811461525257615266565b82860483111561524d5761524c615906565b5b615266565b82860583121561526557615264615906565b5b5b506001831615615274578190505b818202915061528283615a1c565b925061529085848484615190565b9250905081850481116000821316156152ac576152ab615906565b5b81840581126000821216156152c4576152c3615906565b5b81810290505b949350505050565b60006152dd82615687565b91506152e8836156cc565b925061531e677fffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000085856151e3565b905092915050565b6000615331826156c2565b915061533c836156cc565b92506153697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615371565b905092915050565b600082615381576001905061543d565b8161538f576000905061543d565b81600181146153a557600281146153af576153de565b600191505061543d565b60ff8411156153c1576153c0615906565b5b8360020a9150848211156153d8576153d7615906565b5b5061543d565b5060208310610133831016604e8410600b84101617156154135782820a90508381111561540e5761540d615906565b5b61543d565b6154208484846001615190565b9250905081840481111561543757615436615906565b5b81810290505b9392505050565b600061544f826156c2565b915061545a836156c2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561549357615492615906565b5b828202905092915050565b60006154a98261567d565b91506154b48361567d565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156154ef576154ee615906565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561552757615526615906565b5b828203905092915050565b600061553d82615687565b915061554883615687565b9250827fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000182126000841215161561558357615582615906565b5b82677fffffffffffffff0182136000841216156155a3576155a2615906565b5b828203905092915050565b60006155b9826156c2565b91506155c4836156c2565b9250828210156155d7576155d6615906565b5b828203905092915050565b60006155ed826156cc565b91506155f8836156cc565b92508282101561560b5761560a615906565b5b828203905092915050565b6000615621826156a2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061567882615d0b565b919050565b6000819050919050565b60008160070b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006156e48261566a565b9050919050565b82818337600083830152505050565b60005b838110156157185780820151818401526020810190506156fd565b83811115615727576000848401525b50505050565b6000615738826156c2565b9150600082141561574c5761574b615906565b5b600182039050919050565b6000600282049050600182168061576f57607f821691505b6020821081141561578357615782615993565b5b50919050565b615792826159f1565b810181811067ffffffffffffffff821117156157b1576157b06159c2565b5b80604052505050565b60006157c5826156c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157f8576157f7615906565b5b600182019050919050565b600061580e826156cc565b915060ff82141561582257615821615906565b5b600182019050919050565b6000819050919050565b600061584282615a02565b9050919050565b600061585482615a0f565b9050919050565b60006158668261567d565b91506158718361567d565b92508261588157615880615935565b5b828207905092915050565b6000615897826156c2565b91506158a2836156c2565b9250826158b2576158b1615935565b5b828206905092915050565b60006158c882615687565b91507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008214156158fb576158fa615906565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160c01b9050919050565b60008160f01b9050919050565b60008160011c9050919050565b7f6f776e6572000000000000000000000000000000000000000000000000000000600082015250565b7f76756c6e657261626c6500000000000000000000000000000000000000000000600082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f7374616765000000000000000000000000000000000000000000000000000000600082015250565b7f6f6666206d617000000000000000000000000000000000000000000000000000600082015250565b7f7065726d697373696f6e00000000000000000000000000000000000000000000600082015250565b7f746f6b656e496400000000000000000000000000000000000000000000000000600082015250565b7f7265636569766572000000000000000000000000000000000000000000000000600082015250565b7f656d707479000000000000000000000000000000000000000000000000000000600082015250565b7f6561726c79000000000000000000000000000000000000000000000000000000600082015250565b7f636f737400000000000000000000000000000000000000000000000000000000600082015250565b7f6f776e65724f6600000000000000000000000000000000000000000000000000600082015250565b7f7375727669766573000000000000000000000000000000000000000000000000600082015250565b7f70726f6f66000000000000000000000000000000000000000000000000000000600082015250565b7f696e686162697465640000000000000000000000000000000000000000000000600082015250565b7f7374617274656400000000000000000000000000000000000000000000000000600082015250565b7f77697468647261776e0000000000000000000000000000000000000000000000600082015250565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60048110615d1c57615d1b615964565b5b50565b615d2881615616565b8114615d3357600080fd5b50565b615d3f81615628565b8114615d4a57600080fd5b50565b615d5681615634565b8114615d6157600080fd5b50565b615d6d8161563e565b8114615d7857600080fd5b50565b615d8481615687565b8114615d8f57600080fd5b50565b615d9b81615694565b8114615da657600080fd5b50565b615db2816156c2565b8114615dbd57600080fd5b5056fea26469706673582212201f87b34436c48c9e3c6e95c6b5aeeca9b09d60f7c84ebf57b204b8b4f4fce38d64736f6c6343000804003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5577504839506d5451725436374d363333414a525841437365636d5254696866344455624a5a62397938334d2f430a7680ca49d499ba2515b1658b7f69e3717b89f68a5f738c35cb01132f961a0000000000000000000000009abb7bddc43fa67c76a62d8c016513827f59be1b
Deployed Bytecode
0x6080604052600436106102305760003560e01c8063766e54ac1161012e578063ad9e8723116100ab578063c60a71bf1161006f578063c60a71bf14610860578063c87b56dd14610889578063d1bec3ad146108c6578063e43333e214610903578063e985e9c51461092c57610230565b8063ad9e87231461079c578063b1bbd453146107b8578063b88d4fde146107e1578063c040e6b81461080a578063c42b42a01461083557610230565b80638da5cb5b116100f25780638da5cb5b146106b557806391f66ce8146106e057806395d89b411461070b5780639c756c0714610736578063a22cb4651461077357610230565b8063766e54ac1461059357806377e54008146105d057806378e979251461060e5780637a11359a1461063957806380b5462d1461067657610230565b806342842e0e116101bc57806358b3753f1161018057806358b3753f146104845780636352211e146104c157806370a08231146104fe578063743f71fe1461053b578063758c91151461056857610230565b806342842e0e146103e85780634311de8f14610411578063440c9bba146104285780634c5361061461043f578063589fb1001461045b57610230565b806313af40351161020357806313af40351461030357806318160ddd1461032c57806323b872dd14610357578063277a8e2514610380578063359cbbc9146103bd57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190614227565b610969565b6040516102699190614aae565b60405180910390f35b34801561027e57600080fd5b506102876109d1565b6040516102949190614ae4565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906143a7565b610a63565b6040516102d19190614a10565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906141eb565b610ae8565b005b34801561030f57600080fd5b5061032a60048036038101906103259190614080565b610ca6565b005b34801561033857600080fd5b50610341610d77565b60405161034e9190614d8a565b60405180910390f35b34801561036357600080fd5b5061037e600480360381019061037991906140e5565b610d91565b005b34801561038c57600080fd5b506103a760048036038101906103a29190614317565b611228565b6040516103b49190614aae565b60405180910390f35b3480156103c957600080fd5b506103d261131e565b6040516103df9190614d8a565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a91906140e5565b611324565b005b34801561041d57600080fd5b50610426611344565b005b34801561043457600080fd5b5061043d6114df565b005b610459600480360381019061045491906143a7565b6115bb565b005b34801561046757600080fd5b50610482600480360381019061047d91906143a7565b611932565b005b34801561049057600080fd5b506104ab60048036038101906104a691906143a7565b611dcd565b6040516104b89190614d8a565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e391906143a7565b611e31565b6040516104f59190614a10565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190614080565b611eb6565b6040516105329190614d8a565b60405180910390f35b34801561054757600080fd5b50610550611eff565b60405161055f93929190614a77565b60405180910390f35b34801561057457600080fd5b5061057d61212c565b60405161058a9190614d8a565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906143a7565b612132565b6040516105c79190614d46565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906143a7565b6121a5565b604051610605929190614d61565b60405180910390f35b34801561061a57600080fd5b506106236122be565b6040516106309190614d8a565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b91906143a7565b6122c4565b60405161066d9190614aae565b60405180910390f35b34801561068257600080fd5b5061069d600480360381019061069891906143a7565b6122ed565b6040516106ac93929190614da5565b60405180910390f35b3480156106c157600080fd5b506106ca612336565b6040516106d79190614a10565b60405180910390f35b3480156106ec57600080fd5b506106f561235a565b6040516107029190614d8a565b60405180910390f35b34801561071757600080fd5b50610720612360565b60405161072d9190614ae4565b60405180910390f35b34801561074257600080fd5b5061075d600480360381019061075891906143a7565b6123f2565b60405161076a9190614d8a565b60405180910390f35b34801561077f57600080fd5b5061079a600480360381019061079591906141af565b612416565b005b6107b660048036038101906107b19190614340565b612513565b005b3480156107c457600080fd5b506107df60048036038101906107da91906143a7565b612d5a565b005b3480156107ed57600080fd5b5061080860048036038101906108039190614134565b612f8f565b005b34801561081657600080fd5b5061081f6130ed565b60405161082c9190614ac9565b60405180910390f35b34801561084157600080fd5b5061084a613160565b6040516108579190614d8a565b60405180910390f35b34801561086c57600080fd5b50610887600480360381019061088291906142a2565b6131ce565b005b34801561089557600080fd5b506108b060048036038101906108ab91906143a7565b613286565b6040516108bd9190614ae4565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190614317565b613499565b6040516108fa9190614d8a565b60405180910390f35b34801561090f57600080fd5b5061092a600480360381019061092591906143a7565b6134b1565b005b34801561093857600080fd5b50610953600480360381019061094e91906140a9565b61383d565b6040516109609190614aae565b60405180910390f35b600060176000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600780546109e090615757565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0c90615757565b8015610a595780601f10610a2e57610100808354040283529160200191610a59565b820191906000526020600020905b815481529060010190602001808311610a3c57829003601f168201915b5050505050905090565b6000610a6e826138d1565b610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490614d26565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af382611e31565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610bb55750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90614ba6565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4826003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90614b06565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601054600580549050610d8c91906155ae565b905090565b6000610d9c82611e31565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610e3657503373ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610ec75750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90614ba6565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614b06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb90614b46565b60405180910390fd5b610fed826122c4565b1561102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490614b26565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061112a9061572d565b9190505550600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061117f906157ba565b9190505550600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611222576003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50505050565b600080600c60008461ffff1661ffff16815260200190815260200160002060006002811061127f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b14801561131757506000600c60008461ffff1661ffff1681526020019081526020016000206001600281106112f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b9050919050565b60105481565b61133f83838360405180602001604052806000815250612f8f565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614b06565b60405180910390fd5b6000600580549050905060006012546064600a600f546113f29190615444565b6113fc919061515f565b6064601985668e1bc9bf0400006114139190615444565b61141d9190615444565b611427919061515f565b6114319190614ffe565b61143b91906155ae565b905060008111611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790614c06565b60405180910390fd5b4781111561148c574790505b806012600082825461149e9190614ffe565b925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614b06565b60405180910390fd5b6000601454146115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990614ce6565b60405180910390fd5b42601481905550565b60006115c56130ed565b905060016003811115611601577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600381111561163a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14806116b657506002600381111561167b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160038111156116b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b6116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b66565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661171583611e31565b73ffffffffffffffffffffffffffffffffffffffff161461176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176290614b06565b60405180910390fd5b6000806000611779856122ed565b925092509250600260038111156117b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8460038111156117f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611843576118028582613914565b15611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990614b26565b60405180910390fd5b5b668e1bc9bf0400008360026118589190615326565b6118629190615444565b34146118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90614c46565b60405180910390fd5b6118bb856001856118b49190615054565b8484613ba6565b60646019668e1bc9bf0400006118d19190615444565b6118db919061515f565b346118e691906155ae565b600f60008282546118f79190614ffe565b92505081905550847f497d25ccff55cdf3b091a4d19054e291083d2a35c8cc511dfbab6b6a972ca29d60405160405180910390a25050505050565b600061193c6130ed565b905060016003811115611978577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160038111156119b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1480611a2d5750600260038111156119f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611a2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390614b66565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611a8c83611e31565b73ffffffffffffffffffffffffffffffffffffffff1614611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614b06565b60405180910390fd5b60026003811115611b1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611b55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611ba557611b64826122c4565b15611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90614b26565b60405180910390fd5b5b6000600580549050905060006002611bbb610d77565b6011546064603286668e1bc9bf040000611bd59190615444565b611bdf9190615444565b611be9919061515f565b611bf391906155ae565b611bfd919061515f565b611c07919061515f565b90506000611c1485611dcd565b82611c1f9190614ffe565b9050600260006006600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611ca49061572d565b9190505550600b6000611cb687612132565b61ffff1661ffff1681526020019081526020016000206000905560106000815480929190611ce3906157ba565b91905055508160116000828254611cfa9190614ffe565b9250508190555084600073ffffffffffffffffffffffffffffffffffffffff166006600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050505050565b600080600080611ddc856122ed565b9250925092506064601983856001611df49190615054565b611dfe91906155e2565b60ff16668e1bc9bf040000611e139190615444565b611e1d9190615444565b611e27919061515f565b9350505050919050565b6000611e3c826138d1565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614d26565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f07613ce3565b60008060006005607843611f1b919061588c565b43611f2691906155ae565b611f3091906155ae565b905060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff824060001c611f64919061588c565b905060006001611f72610d77565b611f7c9190614ffe565b60026227807b611f8c91906150f5565b60070b611f99919061508b565b9050620186a060070b811215611fb357620186a060070b90505b60026241eb00611fc391906150f5565b60070b6241eb0060070b83611fd8919061585b565b611fe2919061549e565b8660006002811061201c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060070b908160070b8152505060026227807b61203d91906150f5565b60070b6227807b60070b6241eb0060070b84612059919061508b565b612063919061585b565b61206d919061549e565b866001600281106120a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060070b908160070b8152505080816227807b60070b6241eb0060070b856120d3919061508b565b6120dd919061508b565b6120e7919061585b565b6120f19190614eee565b94508585878760405160200161210892919061494a565b60405160208183030381529060405280519060200120955095509550505050909192565b60115481565b6000600560018361214391906155ae565b8154811061217a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050919050565b6000806121b183612132565b91506006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600b60008461ffff1661ffff168152602001908152602001600020541480156122415750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227790614c86565b60405180910390fd5b816006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509150915091565b60145481565b6000806000806122d3856122ed565b9250925092506122e38582613914565b9350505050919050565b600080600080600e600086815260200190815260200160002054905060f88082901b901c60001c9350600860f08083901b901c901c60001c9250601081901c9150509193909250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60606008805461236f90615757565b80601f016020809104026020016040519081016040528092919081815260200182805461239b90615757565b80156123e85780601f106123bd576101008083540402835291602001916123e8565b820191906000526020600020905b8154815290600101906020018083116123cb57829003601f168201915b5050505050905090565b60006123fd82611dcd565b612405613160565b61240f9190614ffe565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124739190614aae565b60405180910390a380600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001600381111561254d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6125556130ed565b600381111561258d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c490614b66565b60405180910390fd5b6016546014546125dd9190614ffe565b4210156126d2576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016126419190614a10565b60206040518083038186803b15801561265957600080fd5b505afa15801561266d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269191906143d0565b116126d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c890614c26565b60405180910390fd5b5b6000838360006002811061270f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020160208101906127229190614279565b8460016002811061275c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201602081019061276f9190614279565b604051602001612781939291906149d3565b6040516020818303038152906040528051906020012090506127a682600d5483613bf6565b6127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90614ca6565b60405180910390fd5b6000600b60008661ffff1661ffff1681526020019081526020016000205414801561287f57506000600c60008661ffff1661ffff168152602001908152602001600020600060028110612861577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b80156128fa57506000600c60008661ffff1661ffff1681526020019081526020016000206001600281106128dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293090614cc6565b60405180910390fd5b60026241eb00612948906158bd565b61295291906150f5565b60070b8360006002811061298f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020160208101906129a29190614279565b60070b12158015612a14575060026241eb006129be91906150f5565b60070b836000600281106129fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612a0e9190614279565b60070b13155b8015612a8a575060026227807b612a2a906158bd565b612a3491906150f5565b60070b83600160028110612a71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612a849190614279565b60070b12155b8015612af7575060026227807b612aa191906150f5565b60070b83600160028110612ade577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612af19190614279565b60070b13155b612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614b86565b60405180910390fd5b668e1bc9bf0400003414612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614c46565b60405180910390fd5b82600c60008661ffff1661ffff168152602001908152602001600020906002612ba9929190613d05565b5060058490806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff16021790555060006005805490509050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c4e906157ba565b9190505550336006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008761ffff1661ffff16815260200190815260200160002081905550808561ffff167fc678d7c6bd4d7281f2061bc3c9d9b0a8126543c59834a0b1a6199947189573e560405160405180910390a3803373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600380811115612d93577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b612d9b6130ed565b6003811115612dd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a90614b66565b60405180910390fd5b612e1c816138d1565b612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614d26565b60405180910390fd5b612e6481611e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec890614c66565b60405180910390fd5b601360009054906101000a900460ff1615612f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1890614d06565b60405180910390fd5b6001601360006101000a81548160ff0219169083151502179055506000612f47826123f2565b905047811115612f55574790505b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050565b612f9a848484610d91565b6000833b905060008163ffffffff1611156130e65760008490507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b81526004016130339493929190614a2b565b602060405180830381600087803b15801561304d57600080fd5b505af1158015613061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130859190614250565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130db90614be6565b60405180910390fd5b505b5050505050565b6000806014541415613102576000905061315d565b6015546014546131129190614ffe565b4210801561312657506196d3600580549050105b15613134576001905061315d565b600160058054905061314691906155ae565b6010541015613158576002905061315d565b600390505b90565b60008060058054905090506064605a600f5461317c9190615444565b613186919061515f565b6011546064603284668e1bc9bf0400006131a09190615444565b6131aa9190615444565b6131b4919061515f565b6131be91906155ae565b6131c89190614ffe565b91505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461325c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325390614b06565b60405180910390fd5b83836009919061326d929190613dba565b508181600a919061327f929190613dba565b5050505050565b6060613291826138d1565b6132d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c790614bc6565b60405180910390fd5b60006132db83612132565b61ffff1690506000819050600081905060005b60008214613318578080613301906157ba565b915050600a82613311919061515f565b91506132ee565b60008167ffffffffffffffff81111561335a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561338c5781602001600182028036833780820191505090505b50905060008290505b60008514613466576001816133aa91906155ae565b90506000600a80876133bc919061515f565b6133c69190615444565b866133d191906155ae565b60306133dd9190615054565b905060008160f81b905080848481518110613421577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8761345d919061515f565b96505050613395565b600982600a60405160200161347d939291906149a2565b6040516020818303038152906040529650505050505050919050565b600b6020528060005260406000206000915090505481565b600260038111156134eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6134f36130ed565b600381111561352b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461356b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356290614b66565b60405180910390fd5b613574816138d1565b6135b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135aa90614d26565b60405180910390fd5b60008060006135c1846122ed565b9250925092506135d18482613914565b613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360790614b26565b60405180910390fd5b600080600061361d611eff565b92509250925061362c81613cd2565b9050867f287c3b40cb7d7950236aa90ed97e4245eed94845734e1f48ececacf164c16cf260405160405180910390a28560ff168560ff16101561368857848061367490615803565b95505061368387878784613ba6565b6137df565b60026000600660008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061370b9061572d565b9190505550600b600061371d89612132565b61ffff1661ffff168152602001908152602001600020600090556010600081548092919061374a906157ba565b919050555086600073ffffffffffffffffffffffffffffffffffffffff16600660008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b3373ffffffffffffffffffffffffffffffffffffffff166108fc60646019668e1bc9bf04000061380f9190615444565b613819919061515f565b9081150290604051600060405180830381858888f193505050505050505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000808214156138e4576000905061390f565b6000600b60006138f385612132565b61ffff1661ffff16815260200190815260200160002054141590505b919050565b600080600080613922611eff565b92509250925061393181613cd2565b8514156139445760009350505050613ba0565b600061394f87612132565b905060008460006002811061398d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600c60008461ffff1661ffff1681526020019081526020016000206000600281106139e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b613a099190615532565b9050600085600160028110613a47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600c60008561ffff1661ffff168152602001908152602001600020600160028110613aa0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b613ac39190615532565b9050600285613ad291906152d2565b60070b600282613ae291906152d2565b600284613aef91906152d2565b613af99190614f82565b60070b1280613b4a5750600285613b1091906152d2565b60070b600282613b2091906152d2565b60026241eb0085613b319190614f82565b613b3b91906152d2565b613b459190614f82565b60070b125b80613b975750600285613b5d91906152d2565b60070b600282613b6d91906152d2565b60026241eb0085613b7e9190615532565b613b8891906152d2565b613b929190614f82565b60070b125b96505050505050505b92915050565b60008360ff1660001b9050600060088460ff1660001b901b905060006010613bcd85613cd2565b901b90508082841818600e60008981526020019081526020016000208190555050505050505050565b60008082905060005b8551811015613cc4576000868281518110613c43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613c84578281604051602001613c67929190614976565b604051602081830303815290604052805190602001209250613cb0565b8083604051602001613c97929190614976565b6040516020818303038152906040528051906020012092505b508080613cbc906157ba565b915050613bff565b508381149150509392505050565b600060108083901b901c9050919050565b6040518060400160405280600290602082028036833780820191505090505090565b826002600301600490048101928215613da95791602002820160005b83821115613d7357833560070b83826101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055509260200192600801602081600701049283019260010302613d21565b8015613da75782816101000a81549067ffffffffffffffff0219169055600801602081600701049283019260010302613d73565b505b509050613db69190613e40565b5090565b828054613dc690615757565b90600052602060002090601f016020900481019282613de85760008555613e2f565b82601f10613e0157803560ff1916838001178555613e2f565b82800160010185558215613e2f579182015b82811115613e2e578235825591602001919060010190613e13565b5b509050613e3c9190613e40565b5090565b5b80821115613e59576000816000905550600101613e41565b5090565b6000613e70613e6b84614e01565b614ddc565b90508083825260208201905082856020860282011115613e8f57600080fd5b60005b85811015613ebf5781613ea58882613f79565b845260208401935060208301925050600181019050613e92565b5050509392505050565b6000613edc613ed784614e2d565b614ddc565b905082815260208101848484011115613ef457600080fd5b613eff8482856156eb565b509392505050565b600081359050613f1681615d1f565b92915050565b600082601f830112613f2d57600080fd5b8135613f3d848260208601613e5d565b91505092915050565b600081905082602060020282011115613f5e57600080fd5b92915050565b600081359050613f7381615d36565b92915050565b600081359050613f8881615d4d565b92915050565b600081359050613f9d81615d64565b92915050565b600081519050613fb281615d64565b92915050565b600082601f830112613fc957600080fd5b8135613fd9848260208601613ec9565b91505092915050565b600081359050613ff181615d7b565b92915050565b60008083601f84011261400957600080fd5b8235905067ffffffffffffffff81111561402257600080fd5b60208301915083600182028301111561403a57600080fd5b9250929050565b60008135905061405081615d92565b92915050565b60008135905061406581615da9565b92915050565b60008151905061407a81615da9565b92915050565b60006020828403121561409257600080fd5b60006140a084828501613f07565b91505092915050565b600080604083850312156140bc57600080fd5b60006140ca85828601613f07565b92505060206140db85828601613f07565b9150509250929050565b6000806000606084860312156140fa57600080fd5b600061410886828701613f07565b935050602061411986828701613f07565b925050604061412a86828701614056565b9150509250925092565b6000806000806080858703121561414a57600080fd5b600061415887828801613f07565b945050602061416987828801613f07565b935050604061417a87828801614056565b925050606085013567ffffffffffffffff81111561419757600080fd5b6141a387828801613fb8565b91505092959194509250565b600080604083850312156141c257600080fd5b60006141d085828601613f07565b92505060206141e185828601613f64565b9150509250929050565b600080604083850312156141fe57600080fd5b600061420c85828601613f07565b925050602061421d85828601614056565b9150509250929050565b60006020828403121561423957600080fd5b600061424784828501613f8e565b91505092915050565b60006020828403121561426257600080fd5b600061427084828501613fa3565b91505092915050565b60006020828403121561428b57600080fd5b600061429984828501613fe2565b91505092915050565b600080600080604085870312156142b857600080fd5b600085013567ffffffffffffffff8111156142d257600080fd5b6142de87828801613ff7565b9450945050602085013567ffffffffffffffff8111156142fd57600080fd5b61430987828801613ff7565b925092505092959194509250565b60006020828403121561432957600080fd5b600061433784828501614041565b91505092915050565b60008060006080848603121561435557600080fd5b600061436386828701614041565b935050602061437486828701613f46565b925050606084013567ffffffffffffffff81111561439157600080fd5b61439d86828701613f1c565b9150509250925092565b6000602082840312156143b957600080fd5b60006143c784828501614056565b91505092915050565b6000602082840312156143e257600080fd5b60006143f08482850161406b565b91505092915050565b60006144058383614613565b60208301905092915050565b600061441d8383614631565b60208301905092915050565b61443281615616565b82525050565b61444181614e7d565b61444b8184614eab565b925061445682614e5e565b8060005b8381101561448757815161446e87826143f9565b965061447983614e9e565b92505060018101905061445a565b505050505050565b61449881614e7d565b6144a28184614eb6565b92506144ad82614e5e565b8060005b838110156144de5781516144c58782614411565b96506144d083614e9e565b9250506001810190506144b1565b505050505050565b6144ef81615628565b82525050565b6144fe81615634565b82525050565b61451561451082615634565b61582d565b82525050565b600061452682614e88565b6145308185614ec1565b93506145408185602086016156fa565b614549816159f1565b840191505092915050565b600061455f82614e88565b6145698185614ed2565b93506145798185602086016156fa565b80840191505092915050565b6000815461459281615757565b61459c8186614ed2565b945060018216600081146145b757600181146145c8576145fb565b60ff198316865281860193506145fb565b6145d185614e68565b60005b838110156145f3578154818901526001820191506020810190506145d4565b838801955050505b50505092915050565b61460d816156d9565b82525050565b61461c81615687565b82525050565b61462b81615687565b82525050565b61463a81615687565b82525050565b61465161464c82615687565b615837565b82525050565b600061466282614e93565b61466c8185614edd565b935061467c8185602086016156fa565b614685816159f1565b840191505092915050565b600061469d600583614edd565b91506146a882615a29565b602082019050919050565b60006146c0600a83614edd565b91506146cb82615a52565b602082019050919050565b60006146e3600483614edd565b91506146ee82615a7b565b602082019050919050565b6000614706600583614edd565b915061471182615aa4565b602082019050919050565b6000614729600783614edd565b915061473482615acd565b602082019050919050565b600061474c600a83614edd565b915061475782615af6565b602082019050919050565b600061476f600783614edd565b915061477a82615b1f565b602082019050919050565b6000614792600883614edd565b915061479d82615b48565b602082019050919050565b60006147b5600583614edd565b91506147c082615b71565b602082019050919050565b60006147d8600583614edd565b91506147e382615b9a565b602082019050919050565b60006147fb600483614edd565b915061480682615bc3565b602082019050919050565b600061481e600783614edd565b915061482982615bec565b602082019050919050565b6000614841600883614edd565b915061484c82615c15565b602082019050919050565b6000614864600583614edd565b915061486f82615c3e565b602082019050919050565b6000614887600983614edd565b915061489282615c67565b602082019050919050565b60006148aa600783614edd565b91506148b582615c90565b602082019050919050565b60006148cd600983614edd565b91506148d882615cb9565b602082019050919050565b60006148f0600783614edd565b91506148fb82615ce2565b602082019050919050565b61490f81615694565b82525050565b61492661492182615694565b615849565b82525050565b614935816156c2565b82525050565b614944816156cc565b82525050565b6000614956828561448f565b6040820191506149668284614640565b6008820191508190509392505050565b60006149828285614504565b6020820191506149928284614504565b6020820191508190509392505050565b60006149ae8286614585565b91506149ba8285614554565b91506149c68284614585565b9150819050949350505050565b60006149df8286614915565b6002820191506149ef8285614640565b6008820191506149ff8284614640565b600882019150819050949350505050565b6000602082019050614a256000830184614429565b92915050565b6000608082019050614a406000830187614429565b614a4d6020830186614429565b614a5a604083018561492c565b8181036060830152614a6c818461451b565b905095945050505050565b6000608082019050614a8c6000830186614438565b614a996040830185614622565b614aa660608301846144f5565b949350505050565b6000602082019050614ac360008301846144e6565b92915050565b6000602082019050614ade6000830184614604565b92915050565b60006020820190508181036000830152614afe8184614657565b905092915050565b60006020820190508181036000830152614b1f81614690565b9050919050565b60006020820190508181036000830152614b3f816146b3565b9050919050565b60006020820190508181036000830152614b5f816146d6565b9050919050565b60006020820190508181036000830152614b7f816146f9565b9050919050565b60006020820190508181036000830152614b9f8161471c565b9050919050565b60006020820190508181036000830152614bbf8161473f565b9050919050565b60006020820190508181036000830152614bdf81614762565b9050919050565b60006020820190508181036000830152614bff81614785565b9050919050565b60006020820190508181036000830152614c1f816147a8565b9050919050565b60006020820190508181036000830152614c3f816147cb565b9050919050565b60006020820190508181036000830152614c5f816147ee565b9050919050565b60006020820190508181036000830152614c7f81614811565b9050919050565b60006020820190508181036000830152614c9f81614834565b9050919050565b60006020820190508181036000830152614cbf81614857565b9050919050565b60006020820190508181036000830152614cdf8161487a565b9050919050565b60006020820190508181036000830152614cff8161489d565b9050919050565b60006020820190508181036000830152614d1f816148c0565b9050919050565b60006020820190508181036000830152614d3f816148e3565b9050919050565b6000602082019050614d5b6000830184614906565b92915050565b6000604082019050614d766000830185614906565b614d836020830184614429565b9392505050565b6000602082019050614d9f600083018461492c565b92915050565b6000606082019050614dba600083018661493b565b614dc7602083018561493b565b614dd460408301846144f5565b949350505050565b6000614de6614df7565b9050614df28282615789565b919050565b6000604051905090565b600067ffffffffffffffff821115614e1c57614e1b6159c2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e4857614e476159c2565b5b614e51826159f1565b9050602081019050919050565b6000819050919050565b60008190508160005260206000209050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614ef98261567d565b9150614f048361567d565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614f3f57614f3e615906565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614f7757614f76615906565b5b828201905092915050565b6000614f8d82615687565b9150614f9883615687565b925081677fffffffffffffff03831360008312151615614fbb57614fba615906565b5b817fffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000038312600083121615614ff357614ff2615906565b5b828201905092915050565b6000615009826156c2565b9150615014836156c2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561504957615048615906565b5b828201905092915050565b600061505f826156cc565b915061506a836156cc565b92508260ff038211156150805761507f615906565b5b828201905092915050565b60006150968261567d565b91506150a18361567d565b9250826150b1576150b0615935565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156150ea576150e9615906565b5b828205905092915050565b600061510082615687565b915061510b83615687565b92508261511b5761511a615935565b5b600160000383147fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008314161561515457615153615906565b5b828205905092915050565b600061516a826156c2565b9150615175836156c2565b92508261518557615184615935565b5b828204905092915050565b6000808291508390505b60018511156151da578086048111156151b6576151b5615906565b5b60018516156151c55780820291505b80810290506151d385615a1c565b945061519a565b94509492505050565b600082600081146151fb57600181146152055761520e565b60019150506152ca565b829150506152ca565b508161521d57600090506152ca565b60019050600082136001811461523a576000811461525257615266565b82860483111561524d5761524c615906565b5b615266565b82860583121561526557615264615906565b5b5b506001831615615274578190505b818202915061528283615a1c565b925061529085848484615190565b9250905081850481116000821316156152ac576152ab615906565b5b81840581126000821216156152c4576152c3615906565b5b81810290505b949350505050565b60006152dd82615687565b91506152e8836156cc565b925061531e677fffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000085856151e3565b905092915050565b6000615331826156c2565b915061533c836156cc565b92506153697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615371565b905092915050565b600082615381576001905061543d565b8161538f576000905061543d565b81600181146153a557600281146153af576153de565b600191505061543d565b60ff8411156153c1576153c0615906565b5b8360020a9150848211156153d8576153d7615906565b5b5061543d565b5060208310610133831016604e8410600b84101617156154135782820a90508381111561540e5761540d615906565b5b61543d565b6154208484846001615190565b9250905081840481111561543757615436615906565b5b81810290505b9392505050565b600061544f826156c2565b915061545a836156c2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561549357615492615906565b5b828202905092915050565b60006154a98261567d565b91506154b48361567d565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156154ef576154ee615906565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561552757615526615906565b5b828203905092915050565b600061553d82615687565b915061554883615687565b9250827fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000182126000841215161561558357615582615906565b5b82677fffffffffffffff0182136000841216156155a3576155a2615906565b5b828203905092915050565b60006155b9826156c2565b91506155c4836156c2565b9250828210156155d7576155d6615906565b5b828203905092915050565b60006155ed826156cc565b91506155f8836156cc565b92508282101561560b5761560a615906565b5b828203905092915050565b6000615621826156a2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061567882615d0b565b919050565b6000819050919050565b60008160070b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006156e48261566a565b9050919050565b82818337600083830152505050565b60005b838110156157185780820151818401526020810190506156fd565b83811115615727576000848401525b50505050565b6000615738826156c2565b9150600082141561574c5761574b615906565b5b600182039050919050565b6000600282049050600182168061576f57607f821691505b6020821081141561578357615782615993565b5b50919050565b615792826159f1565b810181811067ffffffffffffffff821117156157b1576157b06159c2565b5b80604052505050565b60006157c5826156c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157f8576157f7615906565b5b600182019050919050565b600061580e826156cc565b915060ff82141561582257615821615906565b5b600182019050919050565b6000819050919050565b600061584282615a02565b9050919050565b600061585482615a0f565b9050919050565b60006158668261567d565b91506158718361567d565b92508261588157615880615935565b5b828207905092915050565b6000615897826156c2565b91506158a2836156c2565b9250826158b2576158b1615935565b5b828206905092915050565b60006158c882615687565b91507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008214156158fb576158fa615906565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160c01b9050919050565b60008160f01b9050919050565b60008160011c9050919050565b7f6f776e6572000000000000000000000000000000000000000000000000000000600082015250565b7f76756c6e657261626c6500000000000000000000000000000000000000000000600082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f7374616765000000000000000000000000000000000000000000000000000000600082015250565b7f6f6666206d617000000000000000000000000000000000000000000000000000600082015250565b7f7065726d697373696f6e00000000000000000000000000000000000000000000600082015250565b7f746f6b656e496400000000000000000000000000000000000000000000000000600082015250565b7f7265636569766572000000000000000000000000000000000000000000000000600082015250565b7f656d707479000000000000000000000000000000000000000000000000000000600082015250565b7f6561726c79000000000000000000000000000000000000000000000000000000600082015250565b7f636f737400000000000000000000000000000000000000000000000000000000600082015250565b7f6f776e65724f6600000000000000000000000000000000000000000000000000600082015250565b7f7375727669766573000000000000000000000000000000000000000000000000600082015250565b7f70726f6f66000000000000000000000000000000000000000000000000000000600082015250565b7f696e686162697465640000000000000000000000000000000000000000000000600082015250565b7f7374617274656400000000000000000000000000000000000000000000000000600082015250565b7f77697468647261776e0000000000000000000000000000000000000000000000600082015250565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60048110615d1c57615d1b615964565b5b50565b615d2881615616565b8114615d3357600080fd5b50565b615d3f81615628565b8114615d4a57600080fd5b50565b615d5681615634565b8114615d6157600080fd5b50565b615d6d8161563e565b8114615d7857600080fd5b50565b615d8481615687565b8114615d8f57600080fd5b50565b615d9b81615694565b8114615da657600080fd5b50565b615db2816156c2565b8114615dbd57600080fd5b5056fea26469706673582212201f87b34436c48c9e3c6e95c6b5aeeca9b09d60f7c84ebf57b204b8b4f4fce38d64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
430a7680ca49d499ba2515b1658b7f69e3717b89f68a5f738c35cb01132f961a0000000000000000000000009abb7bddc43fa67c76a62d8c016513827f59be1b
-----Decoded View---------------
Arg [0] : _cityRoot (bytes32): 0x430a7680ca49d499ba2515b1658b7f69e3717b89f68a5f738c35cb01132f961a
Arg [1] : _earlyAccessHolders (address): 0x9Abb7BdDc43FA67c76a62d8C016513827f59bE1b
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 430a7680ca49d499ba2515b1658b7f69e3717b89f68a5f738c35cb01132f961a
Arg [1] : 0000000000000000000000009abb7bddc43fa67c76a62d8c016513827f59be1b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.