ERC-721
NFT
Overview
Max Total Supply
6,237 DRKNS
Holders
677
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 DRKNSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DragonCore
Compiler Version
v0.5.10+commit.5a6ea5b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-05 */ // File: contracts/Ownable.sol pragma solidity ^0.5.10; contract Ownable { address public owner; /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { if (newOwner != address(0)) { owner = newOwner; } } } // File: contracts/Pausable.sol pragma solidity ^0.5.10; contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev modifier to allow actions only when the contract IS paused */ modifier whenNotPaused() { require(!paused); _; } /** * @dev modifier to allow actions only when the contract IS NOT paused */ modifier whenPaused { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyOwner whenNotPaused returns (bool) { paused = true; emit Pause(); return true; } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyOwner whenPaused returns (bool) { paused = false; emit Unpause(); return true; } } // File: contracts/DragonAccessControl.sol pragma solidity ^0.5.10; contract DragonAccessControl { /// @dev Emited when contract is upgraded - See README.md for updgrade plan event ContractUpgrade(address newContract); // The addresses of the accounts (or contracts) that can execute actions within each roles. address payable public ceoAddress; address payable public cioAddress; address payable public cmoAddress; address payable public cooAddress; address payable public cfoAddress; // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked bool public paused = false; /// @dev Access modifier for CEO-only functionality modifier onlyCEO() { require(msg.sender == ceoAddress); _; } /// @dev Access modifier for CIO-only functionality modifier onlyCIO() { require(msg.sender == cioAddress); _; } /// @dev Access modifier for CMO-only functionality modifier onlyCMO() { require(msg.sender == cmoAddress); _; } /// @dev Access modifier for COO-only functionality modifier onlyCOO() { require(msg.sender == cooAddress); _; } /// @dev Access modifier for CFO-only functionality modifier onlyCFO() { require(msg.sender == cfoAddress); _; } modifier onlyCLevel() { require( msg.sender == ceoAddress || msg.sender == cioAddress || msg.sender == cmoAddress || msg.sender == cooAddress || msg.sender == cfoAddress ); _; } /// @dev Assigns a new address to act as the CEO. Only available to the current CEO. /// @param _newCEO The address of the new CEO function setCEO(address payable _newCEO) external onlyCEO { require(_newCEO != address(0)); ceoAddress = _newCEO; } /// @dev Assigns a new address to act as the CIO. Only available to the current CEO. /// @param _newCIO The address of the new CIO function setCIO(address payable _newCIO) external onlyCEO { require(_newCIO != address(0)); cioAddress = _newCIO; } /// @dev Assigns a new address to act as the CMO. Only available to the current CEO. /// @param _newCMO The address of the new CMO function setCMO(address payable _newCMO) external onlyCEO { require(_newCMO != address(0)); cmoAddress = _newCMO; } /// @dev Assigns a new address to act as the COO. Only available to the current CEO. /// @param _newCOO The address of the new COO function setCOO(address payable _newCOO) external onlyCEO { require(_newCOO != address(0)); cooAddress = _newCOO; } /// @dev Assigns a new address to act as the CFO. Only available to the current CEO. /// @param _newCFO The address of the new CFO function setCFO(address payable _newCFO) external onlyCEO { require(_newCFO != address(0)); cfoAddress = _newCFO; } /// @dev Modifier to allow actions only when the contract IS NOT paused modifier whenNotPaused() { require(!paused); _; } /// @dev Modifier to allow actions only when the contract IS paused modifier whenPaused { require(paused); _; } /// @dev Called by any "C-level" role to pause the contract. Used only when /// a bug or exploit is detected and we need to limit damage. function pause() external onlyCLevel whenNotPaused { paused = true; } /// @dev Unpauses the smart contract. Can only be called by the CEO, since /// one reason we may pause the contract is when CIO or CMO accounts are /// compromised. /// @notice This is public rather than external so it can be called by /// derived contracts. function unpause() public onlyCEO whenPaused { // can't unpause if contract was upgraded paused = false; } } // File: contracts/DragonERC721.sol pragma solidity ^0.5.10; /// @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 ERC721 /* 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 payable; /// @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 payable; /// @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 payable; /// @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 payable; /// @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); } interface ERC165 { /// @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); } interface ERC721TokenReceiver { /// @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); } /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md /// Note: the ERC-165 identifier for this interface is 0x5b5e139f interface ERC721Metadata /* is IERC721Base */ { /// @notice A descriptive name for a collection of NFTs in this contract function name() external pure returns (string memory _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external pure 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); } /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x780e9d63. interface ERC721Enumerable /* is ERC721 */ { /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() external view returns (uint256); /// @notice Enumerate valid NFTs /// @dev Throws if `_index` >= `totalSupply()`. /// @param _index A counter less than `totalSupply()` /// @return The token identifier for the `_index`th NFT, /// (sort order not specified) function tokenByIndex(uint256 _index) external view returns (uint256); /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `_index` >= `balanceOf(_owner)` or if /// `_owner` is the zero address, representing invalid NFTs. /// @param _owner An address where we are interested in NFTs owned by them /// @param _index A counter less than `balanceOf(_owner)` /// @return The token identifier for the `_index`th NFT assigned to `_owner`, /// (sort order not specified) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); } //contract DragonERC721 is IERC721, ERC721Metadata, ERC721TokenReceiver, ERC721Enumerable { contract DragonERC721 is ERC165, ERC721, ERC721Metadata, ERC721TokenReceiver, ERC721Enumerable { mapping (bytes4 => bool) internal supportedInterfaces; string public tokenURIPrefix = "https://www.drakons.io/server/api/dragon/metadata/"; string public tokenURISuffix = ""; function name() external pure returns (string memory) { return "Drakons"; } function symbol() external pure returns (string memory) { return "DRKNS"; } function supportsInterface(bytes4 interfaceID) external view returns (bool) { return supportedInterfaces[interfaceID]; } function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4){ return bytes4(keccak256("onERC721Received(address,uint256,bytes)")); } } // File: contracts/ClockAuctionBase.sol pragma solidity ^0.5.10; contract ClockAuctionBase { // Represents an auction on an NFT struct Auction { // Current owner of NFT address payable seller; // Price (in wei) at beginning of auction uint128 startingPrice; // Price (in wei) at end of auction uint128 endingPrice; // Duration (in seconds) of auction uint64 duration; // Time when auction started // NOTE: 0 if this auction has been concluded uint64 startedAt; } // Reference to contract tracking NFT ownership DragonERC721 public nonFungibleContract; // Cut owner takes on each auction, measured in basis points (1/100 of a percent). // Values 0-10,000 map to 0%-100% uint256 public ownerCut; address payable public ceoAddress; address payable public cfoAddress; modifier onlyCEOCFO() { require( msg.sender == ceoAddress || msg.sender == cfoAddress ); _; } modifier onlyCEO() { require(msg.sender == ceoAddress); _; } // Map from token ID to their corresponding auction. mapping (uint256 => Auction) tokenIdToAuction; event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration); event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address buyer, address seller); event AuctionCancelled(uint256 tokenId); function setCEO(address payable _newCEO) external onlyCEO { require(_newCEO != address(0)); ceoAddress = _newCEO; } function setCFO(address payable _newCFO) external onlyCEO { require(_newCFO != address(0)); cfoAddress = _newCFO; } /// @dev Returns true if the claimant owns the token. /// @param _claimant - Address claiming to own the token. /// @param _tokenId - ID of token whose ownership to verify. function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) { return (nonFungibleContract.ownerOf(_tokenId) == _claimant); } /// @dev Escrows the NFT, assigning ownership to this contract. /// Throws if the escrow fails. /// @param _owner - Current owner address of token to escrow. /// @param _tokenId - ID of token whose approval to verify. function _escrow(address _owner, uint256 _tokenId) internal { // it will throw if transfer fails nonFungibleContract.transferFrom(_owner, address(this), _tokenId); } /// @dev Transfers an NFT owned by this contract to another address. /// Returns true if the transfer succeeds. /// @param _receiver - Address to transfer NFT to. /// @param _tokenId - ID of token to transfer. function _transfer(address _receiver, uint256 _tokenId) internal { // it will throw if transfer fails //nonFungibleContract.transfer(_receiver, _tokenId); nonFungibleContract.transferFrom(address(this), _receiver, _tokenId); } /// @dev Adds an auction to the list of open auctions. Also fires the /// AuctionCreated event. /// @param _tokenId The ID of the token to be put on auction. /// @param _auction Auction to add. function _addAuction(uint256 _tokenId, Auction memory _auction) internal { // Require that all auctions have a duration of // at least one minute. (Keeps our math from getting hairy!) require(_auction.duration >= 1 minutes); tokenIdToAuction[_tokenId] = _auction; //cpt added emit emit AuctionCreated( uint256(_tokenId), uint256(_auction.startingPrice), uint256(_auction.endingPrice), uint256(_auction.duration) ); } /// @dev Cancels an auction unconditionally. function _cancelAuction(uint256 _tokenId, address _seller) internal { _removeAuction(_tokenId); _transfer(_seller, _tokenId); emit AuctionCancelled(_tokenId); } /// @dev Computes the price and transfers winnings. /// Does NOT transfer ownership of token. function _bid(uint256 _tokenId, uint256 _bidAmount) internal returns (uint256) { // Get a reference to the auction struct Auction storage auction = tokenIdToAuction[_tokenId]; // Explicitly check that this auction is currently live. // (Because of how Ethereum mappings work, we can't just count // on the lookup above failing. An invalid _tokenId will just // return an auction object that is all zeros.) require(_isOnAuction(auction)); // Check that the bid is greater than or equal to the current price uint256 price = _currentPrice(auction); require(_bidAmount >= price); // Grab a reference to the seller before the auction struct // gets deleted. address payable seller = auction.seller; // The bid is good! Remove the auction before sending the fees // to the sender so we can't have a reentrancy attack. _removeAuction(_tokenId); // Transfer proceeds to seller (if there are any!) if (price > 0) { // Calculate the auctioneer's cut. // (NOTE: _computeCut() is guaranteed to return a // value <= price, so this subtraction can't go negative.) uint256 auctioneerCut = _computeCut(price); uint256 sellerProceeds = price - auctioneerCut; // NOTE: Doing a transfer() in the middle of a complex // method like this is generally discouraged because of // reentrancy attacks and DoS attacks if the seller is // a contract with an invalid fallback function. We explicitly // guard against reentrancy attacks by removing the auction // before calling transfer(), and the only thing the seller // can DoS is the sale of their own asset! (And if it's an // accident, they can call cancelAuction(). ) seller.transfer(sellerProceeds); } // Calculate any excess funds included with the bid. If the excess // is anything worth worrying about, transfer it back to bidder. // NOTE: We checked above that the bid amount is greater than or // equal to the price so this cannot underflow. uint256 bidExcess = _bidAmount - price; // Return the funds. Similar to the previous transfer, this is // not susceptible to a re-entry attack because the auction is // removed before any transfers occur. msg.sender.transfer(bidExcess); // Tell the world! emit AuctionSuccessful(_tokenId, price, msg.sender, seller); return price; } /// @dev Removes an auction from the list of open auctions. /// @param _tokenId - ID of NFT on auction. function _removeAuction(uint256 _tokenId) internal { delete tokenIdToAuction[_tokenId]; } /// @dev Returns true if the NFT is on auction. /// @param _auction - Auction to check. function _isOnAuction(Auction storage _auction) internal view returns (bool) { return (_auction.startedAt > 0); } /// @dev Returns current price of an NFT on auction. Broken into two /// functions (this one, that computes the duration from the auction /// structure, and the other that does the price computation) so we /// can easily test that the price computation works correctly. function _currentPrice(Auction storage _auction) internal view returns (uint256) { uint256 secondsPassed = 0; // A bit of insurance against negative values (or wraparound). // Probably not necessary (since Ethereum guarnatees that the // now variable doesn't ever go backwards). if (now > _auction.startedAt) { secondsPassed = now - _auction.startedAt; } return _computeCurrentPrice( _auction.startingPrice, _auction.endingPrice, _auction.duration, secondsPassed ); } /// @dev Computes the current price of an auction. Factored out /// from _currentPrice so we can run extensive unit tests. /// When testing, make this function public and turn on /// `Current price computation` test suite. function _computeCurrentPrice( uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, uint256 _secondsPassed ) internal pure returns (uint256) { // NOTE: We don't use SafeMath (or similar) in this function because // all of our public functions carefully cap the maximum values for // time (at 64-bits) and currency (at 128-bits). _duration is // also known to be non-zero (see the require() statement in // _addAuction()) if (_secondsPassed >= _duration) { // We've reached the end of the dynamic pricing portion // of the auction, just return the end price. return _endingPrice; } else { // Starting price can be higher than ending price (and often is!), so // this delta can be negative. int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice); // This multiplication can't overflow, _secondsPassed will easily fit within // 64-bits, and totalPriceChange will easily fit within 128-bits, their product // will always fit within 256-bits. int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration); // currentPriceChange can be negative, but if so, will have a magnitude // less that _startingPrice. Thus, this result will always end up positive. int256 currentPrice = int256(_startingPrice) + currentPriceChange; return uint256(currentPrice); } } /// @dev Computes owner's cut of a sale. /// @param _price - Sale price of NFT. function _computeCut(uint256 _price) internal view returns (uint256) { // NOTE: We don't use SafeMath (or similar) in this function because // all of our entry functions carefully cap the maximum values for // currency (at 128-bits), and ownerCut <= 10000 (see the require() // statement in the ClockAuction constructor). The result of this // function is always guaranteed to be <= _price. return _price * ownerCut / 10000; } } // File: contracts/ClockAuction.sol pragma solidity ^0.5.10; contract ClockAuction is Pausable, ClockAuctionBase { /// @dev The ERC-165 interface signature for ERC-721. /// Ref: https://github.com/ethereum/EIPs/issues/165 /// Ref: https://github.com/ethereum/EIPs/issues/721 //bytes4 constant InterfaceSignature_ERC721 = bytes4(0x5b5e139f); bytes4 constant InterfaceSignature_ERC721 = bytes4(0x80ac58cd); /// @dev Constructor creates a reference to the NFT ownership contract /// and verifies the owner cut is in the valid range. /// @param _nftAddress - address of a deployed contract implementing /// the Nonfungible Interface. /// @param _cut - percent cut the owner takes on each auction, must be /// between 0-10,000. constructor (address _nftAddress, uint256 _cut) public { require(_cut <= 10000); ownerCut = _cut; ceoAddress = msg.sender; cfoAddress = msg.sender; DragonERC721 candidateContract = DragonERC721(_nftAddress); //require(candidateContract.supportsInterface(InterfaceSignature_ERC721)); nonFungibleContract = candidateContract; } /// @dev Remove all Ether from the contract, which is the owner's cuts /// as well as any Ether sent directly to the contract address. /// Always transfers to the NFT contract, but can be called either by /// the owner or the NFT contract. function withdrawBalance() external { address payable nftAddress = address(uint160(address(nonFungibleContract))); require( msg.sender == owner || msg.sender == nftAddress ); // We are using this boolean method to make sure that even if one fails it will still work //bool res = nftAddress.send(address(this).balance); nftAddress.transfer(address(this).balance); } /// @dev Creates and begins a new auction. /// @param _tokenId - ID of token to auction, sender must be owner. /// @param _startingPrice - Price of item (in wei) at beginning of auction. /// @param _endingPrice - Price of item (in wei) at end of auction. /// @param _duration - Length of time to move between starting /// price and ending price (in seconds). /// @param _seller - Seller, if not the message sender function createAuction( uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address payable _seller ) external whenNotPaused { // Sanity check that no inputs overflow how many bits we've allocated // to store them in the auction struct. require(_startingPrice == uint256(uint128(_startingPrice))); require(_endingPrice == uint256(uint128(_endingPrice))); require(_duration == uint256(uint64(_duration))); require(_owns(msg.sender, _tokenId)); _escrow(msg.sender, _tokenId); Auction memory auction = Auction( _seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(now) ); _addAuction(_tokenId, auction); } /// @dev Bids on an open auction, completing the auction and transferring /// ownership of the NFT if enough Ether is supplied. /// @param _tokenId - ID of token to bid on. function bid(uint256 _tokenId) external payable whenNotPaused { // _bid will throw if the bid or funds transfer fails _bid(_tokenId, msg.value); _transfer(msg.sender, _tokenId); } /// @dev Cancels an auction that hasn't been won yet. /// Returns the NFT to original owner. /// @notice This is a state-modifying function that can /// be called while the contract is paused. /// @param _tokenId - ID of token on auction function cancelAuction(uint256 _tokenId) external { Auction storage auction = tokenIdToAuction[_tokenId]; require(_isOnAuction(auction)); address seller = auction.seller; require(msg.sender == seller || msg.sender == address(nonFungibleContract)); _cancelAuction(_tokenId, seller); } /// @dev Cancels an auction when the contract is paused. /// Only the owner may do this, and NFTs are returned to /// the seller. This should only be used in emergencies. /// @param _tokenId - ID of the NFT on auction to cancel. function cancelAuctionWhenPaused(uint256 _tokenId) whenPaused onlyOwner external { Auction storage auction = tokenIdToAuction[_tokenId]; require(_isOnAuction(auction)); _cancelAuction(_tokenId, auction.seller); } /// @dev Returns auction info for an NFT on auction. /// @param _tokenId - ID of NFT on auction. function getAuction(uint256 _tokenId) external view returns ( address payable seller, uint256 startingPrice, uint256 endingPrice, uint256 duration, uint256 startedAt ) { Auction storage auction = tokenIdToAuction[_tokenId]; require(_isOnAuction(auction)); return ( auction.seller, auction.startingPrice, auction.endingPrice, auction.duration, auction.startedAt ); } /// @dev Returns the current price of an auction. /// @param _tokenId - ID of the token price we are checking. function getCurrentPrice(uint256 _tokenId) external view returns (uint256) { Auction storage auction = tokenIdToAuction[_tokenId]; require(_isOnAuction(auction)); return _currentPrice(auction); } } // File: contracts/SaleClockAuction.sol pragma solidity ^0.5.10; contract SaleClockAuction is ClockAuction { // @dev Sanity check that allows us to ensure that we are pointing to the // right auction in our setSaleAuctionAddress() call. bool public isSaleClockAuction = true; // Delegate constructor constructor(address _nftAddr, uint256 _cut) public ClockAuction(_nftAddr, _cut) {} /// @dev Creates and begins a new auction. /// @param _tokenId - ID of token to auction, sender must be owner. /// @param _startingPrice - Price of item (in wei) at beginning of auction. /// @param _endingPrice - Price of item (in wei) at end of auction. /// @param _duration - Length of auction (in seconds). /// @param _seller - Seller, if not the message sender function createAuction( uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address payable _seller ) external { // Sanity check that no inputs overflow how many bits we've allocated // to store them in the auction struct. require(_startingPrice == uint256(uint128(_startingPrice))); require(_endingPrice == uint256(uint128(_endingPrice))); require(_duration == uint256(uint64(_duration))); require(msg.sender == address(nonFungibleContract)); _escrow(_seller, _tokenId); Auction memory auction = Auction( _seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(now) ); _addAuction(_tokenId, auction); } /// @dev Updates lastSalePrice if seller is the nft contract /// Otherwise, works the same as default bid method. function bid(uint256 _tokenId) external payable { // _bid verifies token ID size _bid(_tokenId, msg.value); _transfer(msg.sender, _tokenId); } function setOwnerCut(uint256 val) external onlyCEOCFO { ownerCut = val; } } // File: contracts/SiringClockAuction.sol pragma solidity ^0.5.10; contract SiringClockAuction is ClockAuction { // @dev Sanity check that allows us to ensure that we are pointing to the // right auction in our setSiringAuctionAddress() call. bool public isSiringClockAuction = true; // Delegate constructor constructor(address _nftAddr, uint256 _cut) public ClockAuction(_nftAddr, _cut) {} /// @dev Creates and begins a new auction. Since this function is wrapped, /// require sender to be DragonCore contract. /// @param _tokenId - ID of token to auction, sender must be owner. /// @param _startingPrice - Price of item (in wei) at beginning of auction. /// @param _endingPrice - Price of item (in wei) at end of auction. /// @param _duration - Length of auction (in seconds). /// @param _seller - Seller, if not the message sender function createAuction( uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address payable _seller ) external { // Sanity check that no inputs overflow how many bits we've allocated // to store them in the auction struct. require(_startingPrice == uint256(uint128(_startingPrice))); require(_endingPrice == uint256(uint128(_endingPrice))); require(_duration == uint256(uint64(_duration))); require(msg.sender == address(nonFungibleContract)); _escrow(_seller, _tokenId); Auction memory auction = Auction( _seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(now) ); _addAuction(_tokenId, auction); } /// @dev Places a bid for siring. Requires the sender /// is the DragonCore contract because all bid methods /// should be wrapped. Also returns the Dragon to the /// seller rather than the winner. function bid(uint256 _tokenId) external payable { require(msg.sender == address(nonFungibleContract)); address seller = tokenIdToAuction[_tokenId].seller; // _bid checks that token ID is valid and will throw if bid fails _bid(_tokenId, msg.value); // We transfer the dragon back to the seller, the winner will get // the offspring _transfer(seller, _tokenId); } function setOwnerCut(uint256 val) external onlyCEOCFO { ownerCut = val; } } // File: contracts/DragonBase.sol pragma solidity ^0.5.10; contract DragonBase is DragonAccessControl, DragonERC721 { event Birth(address owner, uint256 dragonId, uint256 matronId, uint256 sireId, uint256 dna, uint32 generation, uint64 runeLevel); event DragonAssetsUpdated(uint256 _dragonId, uint64 _rune, uint64 _agility, uint64 _strength, uint64 _intelligence); event DragonAssetRequest(uint256 _dragonId); //event Transfer(address from, address to, uint256 tokenId, uint32 generation); struct Dragon { // The Dragon's genetic code is packed into these 256-bits. uint256 dna; uint64 birthTime; uint64 breedTime; uint32 matronId; uint32 sireId; uint32 siringWithId; uint32 generation; } struct DragonAssets { uint64 runeLevel; uint64 agility; uint64 strength; uint64 intelligence; } Dragon[] dragons; mapping (uint256 => address) public dragonIndexToOwner; mapping (address => uint256) ownershipTokenCount; mapping (uint256 => address) public dragonIndexToApproved; mapping (uint256 => address) public sireAllowedToAddress; mapping (uint256 => DragonAssets) public dragonAssets; mapping (address => mapping (address => bool)) internal authorised; uint256 public updateAssetFee = 8 finney; SaleClockAuction public saleAuction; SiringClockAuction public siringAuction; modifier isValidToken(uint256 _tokenId) { require(dragonIndexToOwner[_tokenId] != address(0)); _; } /// @dev Assigns ownership of a specific Dragon to an address. function _transfer(address _from, address _to, uint256 _tokenId) internal { // Since the number of dragons is capped to 2^32 we can't overflow this // Declaration: mapping (address => uint256) ownershipTokenCount; ownershipTokenCount[_to]++; // transfer ownership // Declaration: mapping (uint256 => address) public dragonIndexToOwner; dragonIndexToOwner[_tokenId] = _to; // When creating new dragons _from is 0x0, but we can't account that address. if (_from != address(0)) { ownershipTokenCount[_from]--; // once the dragon is transferred also clear sire allowances delete sireAllowedToAddress[_tokenId]; // clear any previously approved ownership exchange delete dragonIndexToApproved[_tokenId]; } //Dragon storage dragon = dragons[_tokenId]; // Emit the transfer event. emit Transfer(_from, _to, _tokenId); } /// @dev An internal method that creates a new dragon and stores it. This /// method doesn't do any checking and should only be called when the /// input data is known to be valid. Will generate both a Birth event /// and a Transfer event. /// @param _matronId The dragon ID of the matron of this dragon (zero for firstGen) /// @param _sireId The dragon ID of the sire of this dragon (zero for firstGen) /// @param _generation The generation number of this dragon, must be computed by caller. /// @param _dna The dragon's genetic code. /// @param _agility The dragon's agility /// @param _strength The dragon's strength /// @param _intelligence The dragon's intelligence /// @param _runelevel The dragon's rune level /// @param _owner The inital owner of this dragon, must be non-zero (except for the mythical beast, ID 0) function _createDragon( uint256 _matronId, uint256 _sireId, uint256 _generation, uint256 _dna, uint64 _agility, uint64 _strength, uint64 _intelligence, uint64 _runelevel, address _owner ) internal returns (uint) { require(_matronId == uint256(uint32(_matronId))); require(_sireId == uint256(uint32(_sireId))); require(_generation == uint256(uint32(_generation))); Dragon memory _dragon = Dragon({ dna: _dna, birthTime: uint64(now), breedTime: 0, matronId: uint32(_matronId), sireId: uint32(_sireId), siringWithId: 0, generation: uint32(_generation) }); DragonAssets memory _dragonAssets = DragonAssets({ runeLevel: _runelevel, agility: _agility, strength: _strength, intelligence: _intelligence }); uint256 newDragonId = dragons.push(_dragon) - 1; dragonAssets[newDragonId] = _dragonAssets; // It's probably never going to happen, 4 billion dragons is A LOT, but // let's just be 100% sure we never let this happen. require(newDragonId == uint256(uint32(newDragonId))); // emit the birth event emit Birth( _owner, newDragonId, uint256(_dragon.matronId), uint256(_dragon.sireId), _dragon.dna, _dragon.generation, _runelevel ); // This will assign ownership, and also emit the Transfer event as // per ERC721 draft _transfer(address(0), _owner, newDragonId); return newDragonId; } function setUpdateAssetFee(uint256 newFee) external onlyCLevel { updateAssetFee = newFee; } function updateDragonAsset(uint256 _dragonId, uint64 _rune, uint64 _agility, uint64 _strength, uint64 _intelligence) external whenNotPaused onlyCOO { DragonAssets storage currentDragonAsset = dragonAssets[_dragonId]; require(_rune > currentDragonAsset.runeLevel); require(_agility >= currentDragonAsset.agility); require(_strength >= currentDragonAsset.strength); require(_intelligence >= currentDragonAsset.intelligence); DragonAssets memory _dragonAsset = DragonAssets({ runeLevel: _rune, agility: _agility, strength: _strength, intelligence: _intelligence }); dragonAssets[_dragonId] = _dragonAsset; msg.sender.transfer(updateAssetFee); emit DragonAssetsUpdated(_dragonId, _rune, _agility, _strength, _intelligence); } function requestAssetUpdate(uint256 _dragonId, uint256 _rune) external payable whenNotPaused { require(msg.value >= updateAssetFee); DragonAssets storage currentDragonAsset = dragonAssets[_dragonId]; require(_rune > currentDragonAsset.runeLevel); emit DragonAssetRequest(_dragonId); //assetManagement.requestAssetUpdate.value(msg.value)(_dragonId); } /// @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) { return authorised[_owner][_operator]; } /// @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 { emit ApprovalForAll(msg.sender,_operator, _approved); authorised[msg.sender][_operator] = _approved; } function tokenURI(uint256 _tokenId) external view isValidToken(_tokenId) returns (string memory) { uint maxlength = 78; bytes memory reversed = new bytes(maxlength); uint i = 0; uint _tmpTokenId = _tokenId; uint _offset = 48; bytes memory _uriBase; _uriBase = bytes(tokenURIPrefix); while (_tmpTokenId != 0) { uint remainder = _tmpTokenId % 10; _tmpTokenId = _tmpTokenId / 10; reversed[i++] = byte(uint8(_offset + remainder)); } bytes memory s = new bytes(_uriBase.length + i); uint j; //add the base to the final array for (j = 0; j < _uriBase.length; j++) { s[j] = _uriBase[j]; } //add the tokenId to the final array for (j = 0; j < i; j++) { s[j + _uriBase.length] = reversed[i - 1 - j]; } //turn it into a string and return it return string(s); } } // File: contracts/DragonOwnership.sol pragma solidity ^0.5.10; /// @title The facet of the BlockDragons core contract that manages ownership, ERC-721 (draft) compliant. /// @author Zynappse Corporation (https://www.zynapse.com) /// @dev Ref: https://github.com/ethereum/EIPs/issues/721 /// @dev Refer to the Dragon contract documentation for details in contract interactions. contract DragonOwnership is DragonBase { /// @notice Name and symbol of the non fungible token, as defined in ERC721. string public constant name = "Drakons"; string public constant symbol = "DRKNS"; //bytes4 constant InterfaceSignature_ERC165 = bytes4(keccak256('supportsInterface(bytes4)')); //bytes4 constant InterfaceSignature_ERC721 = //bytes4(keccak256('name()')) ^ //bytes4(keccak256('symbol()')) ^ //bytes4(keccak256('totalSupply()')) ^ //bytes4(keccak256('balanceOf(address)')) ^ //bytes4(keccak256('ownerOf(uint256)')) ^ //bytes4(keccak256('approve(address,uint256)')) ^ //bytes4(keccak256('transfer(address,uint256)')) ^ //bytes4(keccak256('transferFrom(address,address,uint256)')) ^ //bytes4(keccak256('tokensOfOwner(address)')) ^ //bytes4(keccak256('tokenMetadata(uint256,string)')); /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165). /// Returns true for any standardized interfaces implemented by this contract. We implement /// ERC-165 (obviously!) and ERC-721. //function supportsInterface(bytes4 _interfaceID) external view returns (bool) //{ // return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721)); //} function setTokenURIAffixes(string calldata _prefix, string calldata _suffix) external onlyCEO { tokenURIPrefix = _prefix; tokenURISuffix = _suffix; } /// @dev Checks if a given address is the current owner of a particular Dragon. /// @param _claimant the address we are validating against. /// @param _tokenId dragon id, only valid when > 0 function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) { return dragonIndexToOwner[_tokenId] == _claimant; } /// @dev Checks if a given address currently has transferApproval for a particular Dragon. /// @param _claimant the address we are confirming dragon is approved for. /// @param _tokenId dragon id, only valid when > 0 function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) { return dragonIndexToApproved[_tokenId] == _claimant; } /// @dev Marks an address as being approved for transferFrom(), overwriting any previous /// approval. Setting _approved to address(0) clears all transfer approval. /// NOTE: _approve() does NOT send the Approval event. This is intentional because /// _approve() and transferFrom() are used together for putting Dragons on auction, and /// there is no value in spamming the log with Approval events in that case. function _approve(uint256 _tokenId, address _approved) internal { dragonIndexToApproved[_tokenId] = _approved; } /// @notice Returns the number of Dragons owned by a specific address. /// @param _owner The owner address to check. /// @dev Required for ERC-721 compliance function balanceOf(address _owner) public view returns (uint256 count) { return ownershipTokenCount[_owner]; } /// @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 memory data) public payable { require(_to != address(0)); require(_to != address(this)); require(_to != address(saleAuction)); require(_to != address(siringAuction)); // Check for approval and valid ownership //require(_approvedFor(msg.sender, _tokenId)); //require(_owns(_from, _tokenId)); address owner = ownerOf(_tokenId); require(owner == _from); require (owner == msg.sender || dragonIndexToApproved[_tokenId] == msg.sender || authorised[owner][msg.sender]); // Reassign ownership, clearing pending approvals and emitting Transfer event. _transfer(_from, _to, _tokenId); uint32 size; assembly { size := extcodesize(_to) } if(size > 0) { ERC721TokenReceiver receiver = ERC721TokenReceiver(_to); require(receiver.onERC721Received(msg.sender,_from,_tokenId,data) == bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))); } } /// @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 payable { safeTransferFrom(_from, _to, _tokenId, ""); } /// @notice Transfers a Dragon to another address. If transferring to a smart /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or /// BlockDragonz specifically) or your Dragon may be lost forever. Seriously. /// @param _to The address of the recipient, can be a user or contract. /// @param _tokenId The ID of the Dragon to transfer. function transfer( address _to, uint256 _tokenId ) external whenNotPaused { // Safety check to prevent against an unexpected 0x0 default. require(_to != address(0)); // Disallow transfers to this contract to prevent accidental misuse. // The contract should never own any dragons (except very briefly // after a firstGen dragon is created and before it goes on auction). require(_to != address(this)); // Disallow transfers to the auction contracts to prevent accidental // misuse. Auction contracts should only take ownership of dragons // through the allow + transferFrom flow. require(_to != address(saleAuction)); require(_to != address(siringAuction)); // You can only send your own dragon. require(_owns(msg.sender, _tokenId)); // Reassign ownership, clear pending approvals, emit Transfer event. _transfer(msg.sender, _to, _tokenId); } /// @notice Returns the address currently assigned ownership of a given Dragon. /// @dev Required for ERC-721 compliance. function ownerOf(uint256 _tokenId) public view isValidToken(_tokenId) returns (address) { return dragonIndexToOwner[_tokenId]; } /// @notice Grant another address the right to transfer a specific Dragon via /// transferFrom(). This is the preferred flow for transfering NFTs to contracts. /// @param _approved The address to be granted transfer approval. Pass address(0) to /// clear all approvals. /// @param _tokenId The ID of the Dragon that can be transferred if this call succeeds. /// @dev Required for ERC-721 compliance. //function approve( address _to, uint256 _tokenId) external whenNotPaused { function approve(address _approved, uint256 _tokenId) external payable whenNotPaused { // Only an owner can grant transfer approval. //require(_owns(msg.sender, _tokenId) || authorised[owner][msg.sender]); address owner = dragonIndexToOwner[_tokenId]; require(owner == msg.sender || authorised[owner][msg.sender]); // Register the approval (replacing any previous approval). _approve(_tokenId, _approved); // Emit approval event. //emit Approval(msg.sender, _approved, _tokenId); emit Approval(owner, _approved, _tokenId); } /// @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 isValidToken(_tokenId) returns (address) { return dragonIndexToApproved[_tokenId]; } /// @notice Transfer a Dragon owned by another address, for which the calling address /// has previously been granted transfer approval by the owner. /// @param _from The address that owns the Dragon to be transfered. /// @param _to The address that should take ownership of the Dragon. Can be any address, /// including the caller. /// @param _tokenId The ID of the Dragon to be transferred. /// @dev Required for ERC-721 compliance. function transferFrom(address _from, address _to, uint256 _tokenId) external payable whenNotPaused { // Safety check to prevent against an unexpected 0x0 default. require(_to != address(0)); // Disallow transfers to this contract to prevent accidental misuse. // The contract should never own any dragons (except very briefly // after a firstGen dragon is created and before it goes on auction). require(_to != address(this)); // Check for approval and valid ownership //require(_approvedFor(msg.sender, _tokenId)); //require(_owns(_from, _tokenId)); address owner = ownerOf(_tokenId); require(owner == _from); require (owner == msg.sender || dragonIndexToApproved[_tokenId] == msg.sender || authorised[owner][msg.sender]); // Reassign ownership (also clears pending approvals and emits Transfer event). _transfer(_from, _to, _tokenId); } /// @notice Returns the total number of Dragons currently in existence. /// @dev Required for ERC-721 compliance. function totalSupply() public view returns (uint) { return dragons.length - 1; } /// @notice Returns a list of all Dragon IDs assigned to an address. /// @param _owner The owner whose Dragons we are interested in. /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly /// expensive (it walks the entire Dragon array looking for dragons belonging to owner), /// but it also returns a dynamic array, which is only supported for web3 calls, and /// not contract-to-contract calls. function tokensOfOwner(address _owner) external view returns(uint256[] memory ownerTokens) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 totalDragons = totalSupply(); uint256 resultIndex = 0; // We count on the fact that all dragons have IDs starting at 1 and increasing // sequentially up to the totalDragon count. uint256 dragonId; for (dragonId = 1; dragonId <= totalDragons; dragonId++) { if (dragonIndexToOwner[dragonId] == _owner) { result[resultIndex] = dragonId; resultIndex++; } } return result; } } /// @notice Enumerate valid NFTs /// @dev Throws if `_index` >= `totalSupply()`. /// @param _index A counter less than `totalSupply()` /// @return The token identifier for the `_index`th NFT, /// (sort order not specified) function tokenByIndex(uint256 _index) external view returns (uint256) { return _index; } /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `_index` >= `balanceOf(_owner)` or if /// `_owner` is the zero address, representing invalid NFTs. /// @param _owner An address where we are interested in NFTs owned by them /// @param _index A counter less than `balanceOf(_owner)` /// @return The token identifier for the `_index`th NFT assigned to `_owner`, /// (sort order not specified) //function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 dragonId) { uint256 count = 0; for (uint256 i = 1; i <= totalSupply(); ++i) { if (dragonIndexToOwner[i] == _owner) { if (count == _index) { return i; } else { count++; } } } revert(); } } // File: contracts/DragonBreeding.sol pragma solidity ^0.5.10; /// @title DragonCore that manages Dragon siring, gestation, and birth. /// @author Zynappse Corporation (https://www.zynapse.com) /// @dev See the DragonCore contract documentation to understand how the various contract facets are arranged. contract DragonBreeding is DragonOwnership { /// @dev The Pregnant event is fired when two dragons successfully breed and the pregnancy timer begins for the matron. event Pregnant(address owner, uint256 matronId, uint256 sireId); /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by /// the CIO role as the gas price changes. uint256 public autoBirthFee = 2 finney; // Keeps track of number of pregnant dragons. uint256 public pregnantDragons; uint32 public BREEDING_LIMIT = 3; mapping(uint256 => uint64) breeding; /// @dev The address of the sibling contract that is used to implement the sooper-sekret genetic combination algorithm. //GeneScienceInterface public geneScience; /// @dev Update the address of the genetic contract, can only be called by the CEO. /// @param _address An address of a GeneScience contract instance to be used from this point forward. //function setGeneScienceAddress(address _address) external onlyCEO { // GeneScienceInterface candidateContract = GeneScienceInterface(_address); // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117 // require(candidateContract.isGeneScience()); // Set the new contract address // geneScience = candidateContract; //} /// @dev Checks that a given Dragon is able to breed. Requires that the /// current cooldown is finished (for sires) and also checks that there is /// no pending pregnancy. function _isReadyToBreed(Dragon storage _dragon) internal view returns (bool) { // In addition to checking the cooldownEndBlock, we also need to check to see if // the dragon has a pending birth; there can be some period of time between the end // of the pregnacy timer and the birth event. return (_dragon.siringWithId == 0); } /// @dev Check if a sire has authorized breeding with this matron. True if both sire /// and matron have the same owner, or if the sire has given siring permission to /// the matron's owner (via approveSiring()). function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) { address matronOwner = dragonIndexToOwner[_matronId]; address sireOwner = dragonIndexToOwner[_sireId]; // Siring is okay if they have same owner, or if the matron's owner was given // permission to breed with this sire. return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner); } /// @notice Grants approval to another user to sire with one of your Dragons. /// @param _addr The address that will be able to sire with your Dragon. Set to /// address(0) to clear all siring approvals for this Dragon. /// @param _sireId A Dragon that you own that _addr will now be able to sire with. function approveSiring(address _addr, uint256 _sireId) external whenNotPaused { require(_owns(msg.sender, _sireId)); sireAllowedToAddress[_sireId] = _addr; } /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only /// be called by the CMO address. (This fee is used to offset the gas cost incurred /// by the autobirth daemon). function setAutoBirthFee(uint256 val) external onlyCLevel { autoBirthFee = val; } /// @dev Checks to see if a given Dragon is pregnant and (if so) if the gestation period has passed. function _isReadyToGiveBirth(Dragon storage _matron) private view returns (bool) { return (_matron.siringWithId != 0); } /// @notice Checks that a given dragon is able to breed (i.e. it is not pregnant or /// in the middle of a siring cooldown). /// @param _dragonId reference the id of the dragon, any user can inquire about it function isReadyToBreed(uint256 _dragonId) public view returns (bool) { require(_dragonId > 0); Dragon storage dragon = dragons[_dragonId]; return _isReadyToBreed(dragon); } /// @dev Checks whether a dragon is currently pregnant. /// @param _dragonId reference the id of the dragon, any user can inquire about it function isPregnant(uint256 _dragonId) public view returns (bool) { require(_dragonId > 0); // A dragon is pregnant if and only if this field is set return dragons[_dragonId].siringWithId != 0; } /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT /// check ownership permissions (that is up to the caller). /// @param _matron A reference to the Dragon struct of the potential matron. /// @param _matronId The matron's ID. /// @param _sire A reference to the Dragon struct of the potential sire. /// @param _sireId The sire's ID function _isValidMatingPair( Dragon storage _matron, uint256 _matronId, Dragon storage _sire, uint256 _sireId ) private view returns(bool) { if(breeding[_matronId] >= BREEDING_LIMIT) { return false; } uint256 sireElement = _sire.dna / 1e34; uint256 matronElement = _matron.dna / 1e34; if (sireElement != matronElement) { return false; } // A Dragon can't breed with itself! if (_matronId == _sireId) { return false; } // Dragons can't breed with their parents. if (_matron.matronId == _sireId || _matron.sireId == _sireId) { return false; } if (_sire.matronId == _matronId || _sire.sireId == _matronId) { return false; } // We can short circuit the sibling check (below) if either dragon is first generation (has a matron ID of zero). if (_sire.matronId == 0 || _matron.matronId == 0) { return true; } // Dragons can't breed with full or half siblings. if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) { return false; } if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) { return false; } // Everything seems cool! Let's get DTF. return true; } /// @dev Internal check to see if a given sire and matron are a valid mating pair for /// breeding via auction (i.e. skips ownership and siring approval checks). function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId) internal view returns (bool) { Dragon storage matron = dragons[_matronId]; Dragon storage sire = dragons[_sireId]; return _isValidMatingPair(matron, _matronId, sire, _sireId); } /// @notice Checks to see if two dragons can breed together, including checks for /// ownership and siring approvals. Does NOT check that both dragons are ready for /// breeding (i.e. breedWith could still fail until the cooldowns are finished). /// TODO: Shouldn't this check pregnancy and cooldowns?!? /// @param _matronId The ID of the proposed matron. /// @param _sireId The ID of the proposed sire. function canBreedWith(uint256 _matronId, uint256 _sireId) external view returns(bool) { require(_matronId > 0); require(_sireId > 0); Dragon storage matron = dragons[_matronId]; Dragon storage sire = dragons[_sireId]; return _isValidMatingPair(matron, _matronId, sire, _sireId) && _isSiringPermitted(_sireId, _matronId); } /// @dev Internal utility function to initiate breeding, assumes that all breeding /// requirements have been checked. function _breedWith(uint256 _matronId, uint256 _sireId) internal { // Grab a reference to the Dragons from storage. // Dragon storage sire = dragons[_sireId]; Dragon storage matron = dragons[_matronId]; // Mark the matron as pregnant, keeping track of who the sire is. matron.siringWithId = uint32(_sireId); // Trigger the cooldown for both parents. // _triggerCooldown(sire); // _triggerCooldown(matron); // Clear siring permission for both parents. This may not be strictly necessary but it's likely to avoid confusion! delete sireAllowedToAddress[_matronId]; delete sireAllowedToAddress[_sireId]; // Every time a dragon gets pregnant, counter is incremented. pregnantDragons++; // Emit the pregnancy event. emit Pregnant(dragonIndexToOwner[_matronId], _matronId, _sireId); } /// @notice Breed a Dragon you own (as matron) with a sire that you own, or for which you /// have previously been given Siring approval. Will either make your dragon pregnant, or will /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth() /// @param _matronId The ID of the Dragon acting as matron (will end up pregnant if successful) /// @param _sireId The ID of the Dragon acting as sire (will begin its siring cooldown if successful) function breedWithAuto(uint256 _matronId, uint256 _sireId) external payable whenNotPaused { // Checks for payment. require(msg.value >= autoBirthFee); // Caller must own the matron. require(_owns(msg.sender, _matronId)); // Neither sire nor matron are allowed to be on auction during a normal // breeding operation, but we don't need to check that explicitly. // For matron: The caller of this function can't be the owner of the matron // because the owner of a Dragon on auction is the auction house, and the // auction house will never call breedWith(). // For sire: Similarly, a sire on auction will be owned by the auction house // and the act of transferring ownership will have cleared any oustanding // siring approval. // Thus we don't need to spend gas explicitly checking to see if either dragon // is on auction. // Check that matron and sire are both owned by caller, or that the sire // has given siring permission to caller (i.e. matron's owner). // Will fail for _sireId = 0 require(_isSiringPermitted(_sireId, _matronId)); // Grab a reference to the potential matron Dragon storage matron = dragons[_matronId]; // Make sure matron isn't pregnant, or in the middle of a siring cooldown require(_isReadyToBreed(matron)); // Grab a reference to the potential sire Dragon storage sire = dragons[_sireId]; // Make sure sire isn't pregnant, or in the middle of a siring cooldown require(_isReadyToBreed(sire)); // Update the breedTime matron.breedTime = uint64(now); // Test that these dragons are a valid mating pair. require(_isValidMatingPair( matron, _matronId, sire, _sireId )); // All checks passed, dragon gets pregnant! _breedWith(_matronId, _sireId); } /// @notice Have a pregnant Dragon give birth! /// @param _matronId A Dragon ready to give birth. /// @param _dna Dragon's DNA /// @param _agility Dragon's agility initial value /// @param _strength Dragon's Strenght initial value /// @param _intelligence Dragon's Intelligence initial value /// @param _runelevel Dragon's Rune Level initial value /// @return The Dragon ID of the new dragon. /// @dev Looks at a given Dragon and, if pregnant and if the gestation period has passed, /// combines the genes of the two parents to create a new dragon. The new Dragon is assigned /// to the current owner of the matron. Upon successful completion, both the matron and the /// new dragon will be ready to breed again. Note that anyone can call this function (if they /// are willing to pay the gas!), but the new dragon always goes to the mother's owner. function giveBirth(uint256 _matronId, uint256 _dna, uint64 _agility, uint64 _strength, uint64 _intelligence, uint64 _runelevel) external whenNotPaused onlyCOO returns(uint256) { // Grab a reference to the matron in storage. Dragon storage matron = dragons[_matronId]; // Check that the dragon is a valid dragon. require(matron.birthTime != 0); // Check that the matron is pregnant, and that its time has come! require(_isReadyToGiveBirth(matron)); // Grab a reference to the sire in storage. uint256 sireId = matron.siringWithId; Dragon storage sire = dragons[sireId]; // Determine the higher generation number of the two parents uint32 parentGen = matron.generation; if (sire.generation > matron.generation) { parentGen = sire.generation; } // Call the sooper-sekret gene mixing operation. uint256 matronId = _matronId; uint64 agility = _agility; uint64 strength = _strength; uint64 intelligence = _intelligence; uint64 runelevel = _runelevel; uint256 childDNA = _dna; // Make the new dragon! address owner = dragonIndexToOwner[matronId]; //uint256 dragonId = _createDragon(_matronId, matron.siringWithId, parentGen + 1, childDNA, _agility, _strength, _intelligence, _runelevel, owner); uint256 dragonId = _createDragon(matronId, sireId, parentGen + 1, childDNA, agility, strength, intelligence, runelevel, owner); //increment the breeding for the matron breeding[matronId]++; // Clear the reference to sire from the matron (REQUIRED! Having siringWithId // set is what marks a matron as being pregnant.) delete matron.siringWithId; // Every time a dragon gives birth counter is decremented. pregnantDragons--; // Send the balance fee to the person who made birth happen. //msg.sender.send(autoBirthFee); msg.sender.transfer(autoBirthFee); // return the new dragon's ID return dragonId; } function getPregnantDragons() external view returns(uint256[] memory pregnantDragonsList) { if (pregnantDragons == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](pregnantDragons); uint256 totalDragons = totalSupply(); uint256 resultIndex = 0; uint256 dragonId; for (dragonId = 1; dragonId <= totalDragons; dragonId++) { if (isPregnant(dragonId)) { result[resultIndex] = dragonId; resultIndex++; } } return result; } } function setBreedingLimit(uint32 _value) external onlyCLevel { BREEDING_LIMIT = _value; } } // File: contracts/DragonAuction.sol pragma solidity ^0.5.10; /// @title Handles creating auctions for sale and siring of dragons. /// @author Zynappse Corporation (https://www.zynapse.com) /// This wrapper of ReverseAuction exists only so that users can create /// auctions with only one transaction. contract DragonAuction is DragonBreeding { // @notice The auction contract variables are defined in DragonBase to allow // us to refer to them in DragonOwnership to prevent accidental transfers. // `saleAuction` refers to the auction for gen0 and p2p sale of dragons. // `siringAuction` refers to the auction for siring rights of dragons. /// @dev Sets the reference to the sale auction. /// @param _address - Address of sale contract. function setSaleAuctionAddress(address _address) external onlyCEO { SaleClockAuction candidateContract = SaleClockAuction(_address); // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117 require(candidateContract.isSaleClockAuction()); // Set the new contract address saleAuction = candidateContract; } /// @dev Sets the reference to the siring auction. /// @param _address - Address of siring contract. function setSiringAuctionAddress(address _address) external onlyCEO { SiringClockAuction candidateContract = SiringClockAuction(_address); // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117 require(candidateContract.isSiringClockAuction()); // Set the new contract address siringAuction = candidateContract; } /// @dev Put a dragon up for auction. /// Does some ownership trickery to create auctions in one tx. function createSaleAuction( uint256 _dragonId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration ) external whenNotPaused { // Auction contract checks input sizes // If dragon is already on any auction, this will throw // because it will be owned by the auction contract. require(_owns(msg.sender, _dragonId)); // Ensure the dragon is not pregnant to prevent the auction // contract accidentally receiving ownership of the child. // NOTE: the dragon IS allowed to be in a cooldown. require(!isPregnant(_dragonId)); _approve(_dragonId, address(saleAuction)); // Sale auction throws if inputs are invalid and clears // transfer and sire approval after escrowing the dragon. saleAuction.createAuction( _dragonId, _startingPrice, _endingPrice, _duration, msg.sender ); } /// @dev Put a dragon up for auction to be sire. /// Performs checks to ensure the dragon can be sired, then /// delegates to reverse auction. function createSiringAuction( uint256 _dragonId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration ) external whenNotPaused { // Auction contract checks input sizes // If dragon is already on any auction, this will throw // because it will be owned by the auction contract. require(_owns(msg.sender, _dragonId)); require(isReadyToBreed(_dragonId)); _approve(_dragonId, address(siringAuction)); // Siring auction throws if inputs are invalid and clears // transfer and sire approval after escrowing the dragon. siringAuction.createAuction( _dragonId, _startingPrice, _endingPrice, _duration, msg.sender ); } /// @dev Completes a siring auction by bidding. /// Immediately breeds the winning matron with the sire on auction. /// @param _sireId - ID of the sire on auction. /// @param _matronId - ID of the matron owned by the bidder. function bidOnSiringAuction( uint256 _sireId, uint256 _matronId ) external payable whenNotPaused { // Auction contract checks input sizes require(_owns(msg.sender, _matronId)); require(isReadyToBreed(_matronId)); require(_canBreedWithViaAuction(_matronId, _sireId)); // Define the current price of the auction. uint256 currentPrice = siringAuction.getCurrentPrice(_sireId); require(msg.value >= currentPrice + autoBirthFee); // Siring auction will throw if the bid fails. siringAuction.bid.value(msg.value - autoBirthFee)(_sireId); _breedWith(uint32(_matronId), uint32(_sireId)); } /// @dev Transfers the balance of the sale auction contract /// to the DragonCore contract. We use two-step withdrawal to /// prevent two transfer calls in the auction bid function. function withdrawAuctionBalances() external onlyCLevel { saleAuction.withdrawBalance(); siringAuction.withdrawBalance(); } /// @dev Shows the balance of the auction contracts. function getAuctionBalances() external view onlyCLevel returns (uint256, uint256) { return ( address(saleAuction).balance, address(siringAuction).balance ); } } // File: contracts/DragonMinting.sol pragma solidity ^0.5.10; /// @title all functions related to creating dragons contract DragonMinting is DragonAuction { /// @dev we can create promo dragons, up to a limit. Only callable by CMO /// @param _dna the encoded genes of the dragons to be created, any value is accepted /// @param _owner the future owner of the created dragons. Default to contract CMO function createPromoDragon( uint256 _dna, uint64 _agility, uint64 _strength, uint64 _intelligence, uint64 _runelevel, address _owner) external onlyCLevel { address dragonOwner = _owner; if (dragonOwner == address(0)) { dragonOwner = cmoAddress; } _createDragon(0, 0, 0, _dna, _agility, _strength, _intelligence, _runelevel, dragonOwner); } /// @dev Creates a new gen0 dragon with the given dna and /// creates an auction for it. function createGen0Auction( uint256 _dna, uint256 _startingPrice, uint256 _endingPrice, uint64 _agility, uint64 _strength, uint64 _intelligence, uint256 _duration ) external onlyCLevel { //require(gen0CreatedCount < GEN0_CREATION_LIMIT); uint256 dragonId = _createDragon(0, 0, 0, _dna, _agility, _strength, _intelligence, 0, address(this)); _approve(dragonId, address(saleAuction)); saleAuction.createAuction( dragonId, _startingPrice, _endingPrice, _duration, address(uint160(address(this))) ); //gen0CreatedCount++; } } // File: contracts/DragonCore.sol pragma solidity ^0.5.10; contract DragonCore is DragonMinting { // Set in case the core contract is broken and an upgrade is required address public newContractAddress; /// @notice Creates the main BlockDragonz smart contract instance. constructor () public { // Starts paused. paused = true; // the creator of the contract is the initial CEO ceoAddress = msg.sender; // the creator of the contract is also the initial CMO cmoAddress = msg.sender; // the creator of the contract is also the initial CIO cioAddress = msg.sender; // the creator of the contract is also the initial CFO cfoAddress = msg.sender; // the creator of the contract is also the initial COO cooAddress = msg.sender; // ERC-165 Base supportedInterfaces[0x01ffc9a7] = true; // ERC-721 Base supportedInterfaces[0x80ac58cd] = true; // ERC-721 Metadata supportedInterfaces[0x5b5e139f] = true; // ERC-721 Enumerable supportedInterfaces[0x780e9d63] = true; //ERC-721 Receiver supportedInterfaces[0x150b7a02] = true; // start with the mythical dragon 0 - so we don't have generation-0 parent issues _createDragon(0, 0, 0, uint256(-1), 0,0,0,0, address(0)); } function setNewAddress(address _newAddress) external onlyCEO whenPaused { newContractAddress = _newAddress; emit ContractUpgrade(_newAddress); } /// @notice No tipping! /// @dev Reject all Ether from being sent here, unless it's from one of the /// two auction contracts. (Hopefully, we can prevent user accidents.) function() external payable { require( msg.sender == address(saleAuction) || msg.sender == address(siringAuction) ); } /// @notice Returns all the relevant information about a specific dragon. /// @param _id The ID of the dragon of interest. function getDragon(uint256 _id) external view returns ( uint256 dna, uint256 birthTime, uint256 breedTime, uint256 matronId, uint256 sireId, uint256 siringWithId, uint256 generation, uint256 runeLevel, uint256 agility, uint256 strength, uint256 intelligence ) { Dragon storage dragon = dragons[_id]; DragonAssets storage dragonAsset = dragonAssets[_id]; dna = dragon.dna; birthTime = uint256(dragon.birthTime); breedTime = uint256(dragon.breedTime); matronId = uint256(dragon.matronId); sireId = uint256(dragon.sireId); siringWithId = uint256(dragon.siringWithId); generation = uint256(dragon.generation); runeLevel = dragonAsset.runeLevel; agility = dragonAsset.agility; strength = dragonAsset.strength; intelligence = dragonAsset.intelligence; } /// @dev Override unpause so it requires all external contract addresses /// to be set before contract can be unpaused. Also, we can't have /// newContractAddress set either, because then the contract was upgraded. /// @notice This is public rather than external so we can call super.unpause /// without using an expensive CALL. function unpause() public onlyCEO whenPaused { require(address(saleAuction) != address(0)); require(address(siringAuction) != address(0)); require(newContractAddress == address(0)); // Actually unpause the contract. super.unpause(); } // @dev Allows the CIO to capture the balance available to the contract. function withdrawBalance() external onlyCLevel { uint256 balance = address(this).balance; // Subtract all the currently pregnant dragons we have, plus 1 of margin. uint256 subtractFees = (pregnantDragons + 1) * autoBirthFee; if (balance > subtractFees) { //cioAddress.send(balance - subtractFees); cfoAddress.transfer(balance - subtractFees); } } /// @dev Shows the contract's current balance. function getBalance() external view onlyCLevel returns (uint256) { return address(this).balance; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newFee","type":"uint256"}],"name":"setUpdateAssetFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pregnantDragons","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonAssets","outputs":[{"name":"runeLevel","type":"uint64"},{"name":"agility","type":"uint64"},{"name":"strength","type":"uint64"},{"name":"intelligence","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSiringAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_from","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_rune","type":"uint64"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"}],"name":"updateDragonAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_dragonId","type":"uint256"}],"name":"isPregnant","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCMO","type":"address"}],"name":"setCMO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"siringAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dna","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_duration","type":"uint256"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPregnantDragons","outputs":[{"name":"pregnantDragonsList","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"dragonId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCIO","type":"address"}],"name":"setCIO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sireAllowedToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSiringAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setAutoBirthFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_sireId","type":"uint256"}],"name":"approveSiring","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cioAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setNewAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dna","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_runelevel","type":"uint64"},{"name":"_owner","type":"address"}],"name":"createPromoDragon","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BREEDING_LIMIT","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cmoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint32"}],"name":"setBreedingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"autoBirthFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_dna","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_runelevel","type":"uint64"}],"name":"giveBirth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_dragonId","type":"uint256"}],"name":"isReadyToBreed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenURISuffix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getDragon","outputs":[{"name":"dna","type":"uint256"},{"name":"birthTime","type":"uint256"},{"name":"breedTime","type":"uint256"},{"name":"matronId","type":"uint256"},{"name":"sireId","type":"uint256"},{"name":"siringWithId","type":"uint256"},{"name":"generation","type":"uint256"},{"name":"runeLevel","type":"uint256"},{"name":"agility","type":"uint256"},{"name":"strength","type":"uint256"},{"name":"intelligence","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionBalances","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"updateAssetFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sireId","type":"uint256"},{"name":"_matronId","type":"uint256"}],"name":"bidOnSiringAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"breedWithAuto","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_rune","type":"uint256"}],"name":"requestAssetUpdate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_prefix","type":"string"},{"name":"_suffix","type":"string"}],"name":"setTokenURIAffixes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"matronId","type":"uint256"},{"indexed":false,"name":"sireId","type":"uint256"}],"name":"Pregnant","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"dragonId","type":"uint256"},{"indexed":false,"name":"matronId","type":"uint256"},{"indexed":false,"name":"sireId","type":"uint256"},{"indexed":false,"name":"dna","type":"uint256"},{"indexed":false,"name":"generation","type":"uint32"},{"indexed":false,"name":"runeLevel","type":"uint64"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_dragonId","type":"uint256"},{"indexed":false,"name":"_rune","type":"uint64"},{"indexed":false,"name":"_agility","type":"uint64"},{"indexed":false,"name":"_strength","type":"uint64"},{"indexed":false,"name":"_intelligence","type":"uint64"}],"name":"DragonAssetsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_dragonId","type":"uint256"}],"name":"DragonAssetRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]
Contract Creation Code
6004805460ff60a01b1916905560e060405260326080818152906200471c60a0398051620000369160069160209091019062000687565b50604080516020810191829052600090819052620000579160079162000687565b50661c6bf526340000600f5566071afd498d00006012556014805463ffffffff191660031790553480156200008b57600080fd5b5060048054600080546001600160a01b0319908116339081178355600280548316821790556001805483168217815560ff60a01b199094167401000000000000000000000000000000000000000017821681179094556003805490911690931790925560056020527fc01909ce2b517f8cd3a46ae0cfde9179f9b675cf633d3d84c8226585cc73c156805460ff1990811683179091557f072ad3113145b5af48d301e3b9fc3bd1c97c3f26a14f5d44904b71469875631e80548216831790557f3b767bd59d7164fff7ec5b80ca1165d9d6e12ee8656896fac4159b0760bfd9f780548216831790557f32dafcc0428d2ef4307d6da1e032ab9698665546cb7ff0633ca92092b13651e180548216831790557f150b7a020000000000000000000000000000000000000000000000000000000083527f12c5c367f8ba71e59ab2ab375660f9954a1433014a379b64972328607af9c30080549091169091179055620001ff908080600019818080808062000206565b506200078f565b60008963ffffffff168a146200021b57600080fd5b8863ffffffff1689146200022e57600080fd5b8763ffffffff1688146200024157600080fd5b6200024b6200070c565b506040805160e0810182528881526001600160401b0342166020820152600091810182905263ffffffff808d1660608301528b8116608083015260a082019290925290891660c08201526200029f62000748565b6040518060800160405280866001600160401b03168152602001896001600160401b03168152602001886001600160401b03168152602001876001600160401b0316815250905060006001600884908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548163ffffffff021916908363ffffffff160217905550505003905081600d600083815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160106101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160186101000a8154816001600160401b0302191690836001600160401b031602179055509050508063ffffffff168114620004fb57600080fd5b606080840151608080860151865160c080890151604080516001600160a01b038e168152602081018a905263ffffffff9788168183015294871697850197909752938301919091529190921660a08301526001600160401b0389169082015290517fdf8d8992e7e860a8605ceb50aa640d5209227db91bcd9ec915a1d4c56d68a5b99181900360e00190a16200059d600086836001600160e01b03620005ad16565b9c9b505050505050505050505050565b6001600160a01b038083166000818152600a60209081526040808320805460010190558583526009909152902080546001600160a01b031916909117905583161562000641576001600160a01b0383166000908152600a602090815260408083208054600019019055838352600c825280832080546001600160a01b0319908116909155600b909252909120805490911690555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006ca57805160ff1916838001178555620006fa565b82800160010185558215620006fa579182015b82811115620006fa578251825591602001919060010190620006dd565b50620007089291506200076f565b5090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6200078c91905b8082111562000708576000815560010162000776565b90565b613f7d806200079f6000396000f3fe6080604052600436106104105760003560e01c80635d64aa681161021e578063a9059cbb11610123578063e0bb933b116100ab578063e985e9c51161007a578063e985e9c51461119a578063ed60ade6146111d5578063f7d8c883146111f8578063faa0ae531461121b578063faf421251461123e57610410565b8063e0bb933b146110c2578063e6be9b5614611142578063e6cbe35114611170578063e8de704d1461118557610410565b8063c0ac9983116100f2578063c0ac998314610fed578063c87b56dd14611002578063d1741a8c1461102c578063d3e6f49f14611083578063dbbc853b146110ad57610410565b8063a9059cbb14610ec6578063b047fb5014610eff578063b0c35c0514610f14578063b88d4fde14610f2957610410565b806378c234e0116101a65780638c267b97116101755780638c267b9714610e1c57806391876e5714610e3157806392695a8814610e4657806395d89b4114610e76578063a22cb46514610e8b57610410565b806378c234e014610d435780638368071c14610da65780638456cb5914610dd45780638462151c14610de957610410565b80636af04a57116101ed5780636af04a5714610c6b5780636fbde40d14610c8057806370a0823114610cb35780637158798814610ce657806371f7aaca14610d1957610410565b80635d64aa6814610bed5780635fd8c71014610c175780636059c38414610c2c5780636352211e14610c4157610410565b806323b872dd1161032457806342842e0e116102ac5780634b85fd551161027b5780634b85fd5514610b185780634dfff04f14610b425780634e0a337914610b7b5780634f6ccce714610bae5780635c975abb14610bd857610410565b806342842e0e14610a4c57806346116e6f14610a8257806346d22c7014610aac5780634ad8c93814610adc57610410565b80632e1699d7116102f35780632e1699d71461092a5780632f745c591461098f5780633d7d3f5a146109c85780633f4ba83a14610a04578063416da14514610a1957610410565b806323b872dd1461083357806327d7874c146108695780632a896ece1461089c5780632ba73c15146108f757610410565b8063100b2783116103a757806315437dfb1161037657806315437dfb1461075b57806318160ddd146107ac5780631940a936146107c15780632072863b146107eb57806321717ebf1461081e57610410565b8063100b2783146105fd57806312065fe01461065b57806314001f4c14610670578063150b7a02146106a357610410565b806306fdde03116103e357806306fdde0314610508578063081812fc14610592578063095ea7b3146105bc5780630a0f8168146105e857610410565b806301ffc9a71461043e5780630304b213146104865780630519ce79146104b057806305ea0668146104e1575b6010546001600160a01b031633148061043357506011546001600160a01b031633145b61043c57600080fd5b005b34801561044a57600080fd5b506104726004803603602081101561046157600080fd5b50356001600160e01b031916611309565b604080519115158252519081900360200190f35b34801561049257600080fd5b5061043c600480360360208110156104a957600080fd5b503561132c565b3480156104bc57600080fd5b506104c561139c565b604080516001600160a01b039092168252519081900360200190f35b3480156104ed57600080fd5b506104f66113ab565b60408051918252519081900360200190f35b34801561051457600080fd5b5061051d6113b1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561055757818101518382015260200161053f565b50505050905090810190601f1680156105845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561059e57600080fd5b506104c5600480360360208110156105b557600080fd5b50356113d4565b61043c600480360360408110156105d257600080fd5b506001600160a01b038135169060200135611414565b3480156105f457600080fd5b506104c56114cd565b34801561060957600080fd5b506106276004803603602081101561062057600080fd5b50356114dc565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b34801561066757600080fd5b506104f6611516565b34801561067c57600080fd5b5061043c6004803603602081101561069357600080fd5b50356001600160a01b0316611589565b3480156106af57600080fd5b5061073e600480360360808110156106c657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460018302840111600160201b8311171561073357600080fd5b509092509050611636565b604080516001600160e01b03199092168252519081900360200190f35b34801561076757600080fd5b5061043c600480360360a081101561077e57600080fd5b508035906001600160401b03602082013581169160408101358216916060820135811691608001351661165b565b3480156107b857600080fd5b506104f6611862565b3480156107cd57600080fd5b50610472600480360360208110156107e457600080fd5b503561186c565b3480156107f757600080fd5b5061043c6004803603602081101561080e57600080fd5b50356001600160a01b03166118b0565b34801561082a57600080fd5b506104c56118fc565b61043c6004803603606081101561084957600080fd5b506001600160a01b0381358116916020810135909116906040013561190b565b34801561087557600080fd5b5061043c6004803603602081101561088c57600080fd5b50356001600160a01b03166119eb565b3480156108a857600080fd5b5061043c600480360360e08110156108bf57600080fd5b508035906020810135906040810135906001600160401b036060820135811691608081013582169160a0820135169060c00135611a37565b34801561090357600080fd5b5061043c6004803603602081101561091a57600080fd5b50356001600160a01b0316611b5c565b34801561093657600080fd5b5061093f611ba8565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561097b578181015183820152602001610963565b505050509050019250505060405180910390f35b34801561099b57600080fd5b506104f6600480360360408110156109b257600080fd5b506001600160a01b038135169060200135611c54565b3480156109d457600080fd5b5061043c600480360360808110156109eb57600080fd5b5080359060208101359060408101359060600135611cb6565b348015610a1057600080fd5b5061043c611d90565b348015610a2557600080fd5b5061043c60048036036020811015610a3c57600080fd5b50356001600160a01b0316611e07565b61043c60048036036060811015610a6257600080fd5b506001600160a01b03813581169160208101359091169060400135611e53565b348015610a8e57600080fd5b506104c560048036036020811015610aa557600080fd5b5035611e73565b348015610ab857600080fd5b5061047260048036036040811015610acf57600080fd5b5080359060200135611e8e565b348015610ae857600080fd5b5061043c60048036036080811015610aff57600080fd5b5080359060208101359060408101359060600135611f0d565b348015610b2457600080fd5b5061043c60048036036020811015610b3b57600080fd5b5035611fc8565b348015610b4e57600080fd5b5061043c60048036036040811015610b6557600080fd5b506001600160a01b038135169060200135612038565b348015610b8757600080fd5b5061043c60048036036020811015610b9e57600080fd5b50356001600160a01b0316612090565b348015610bba57600080fd5b506104f660048036036020811015610bd157600080fd5b5035611586565b348015610be457600080fd5b506104726120dc565b348015610bf957600080fd5b506104c560048036036020811015610c1057600080fd5b50356120ec565b348015610c2357600080fd5b5061043c612107565b348015610c3857600080fd5b506104c56121c8565b348015610c4d57600080fd5b506104c560048036036020811015610c6457600080fd5b50356121d7565b348015610c7757600080fd5b506104c5612217565b348015610c8c57600080fd5b5061043c60048036036020811015610ca357600080fd5b50356001600160a01b0316612226565b348015610cbf57600080fd5b506104f660048036036020811015610cd657600080fd5b50356001600160a01b03166122d3565b348015610cf257600080fd5b5061043c60048036036020811015610d0957600080fd5b50356001600160a01b03166122ee565b348015610d2557600080fd5b506104c560048036036020811015610d3c57600080fd5b503561236f565b348015610d4f57600080fd5b5061043c600480360360c0811015610d6657600080fd5b5080359060208101356001600160401b03908116916040810135821691606082013581169160808101359091169060a001356001600160a01b031661238a565b348015610db257600080fd5b50610dbb612425565b6040805163ffffffff9092168252519081900360200190f35b348015610de057600080fd5b5061043c612431565b348015610df557600080fd5b5061093f60048036036020811015610e0c57600080fd5b50356001600160a01b03166124c8565b348015610e2857600080fd5b506104c561258f565b348015610e3d57600080fd5b5061043c61259e565b348015610e5257600080fd5b5061043c60048036036020811015610e6957600080fd5b503563ffffffff166126d5565b348015610e8257600080fd5b5061051d61275c565b348015610e9757600080fd5b5061043c60048036036040811015610eae57600080fd5b506001600160a01b038135169060200135151561277d565b348015610ed257600080fd5b5061043c60048036036040811015610ee957600080fd5b506001600160a01b0381351690602001356127f7565b348015610f0b57600080fd5b506104c561288b565b348015610f2057600080fd5b506104f661289a565b61043c60048036036080811015610f3f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610f7957600080fd5b820183602082011115610f8b57600080fd5b803590602001918460018302840111600160201b83111715610fac57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128a0945050505050565b348015610ff957600080fd5b5061051d612add565b34801561100e57600080fd5b5061051d6004803603602081101561102557600080fd5b5035612b6b565b34801561103857600080fd5b506104f6600480360360c081101561104f57600080fd5b508035906020810135906001600160401b0360408201358116916060810135821691608082013581169160a0013516612d75565b34801561108f57600080fd5b50610472600480360360208110156110a657600080fd5b5035612f5e565b3480156110b957600080fd5b5061051d612f9b565b3480156110ce57600080fd5b506110ec600480360360208110156110e557600080fd5b5035612ff6565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b34801561114e57600080fd5b5061115761319a565b6040805192835260208301919091528051918290030190f35b34801561117c57600080fd5b506104c5613223565b34801561119157600080fd5b506104f6613232565b3480156111a657600080fd5b50610472600480360360408110156111bd57600080fd5b506001600160a01b0381358116916020013516613238565b61043c600480360360408110156111eb57600080fd5b5080359060200135613266565b61043c6004803603604081101561120e57600080fd5b50803590602001356133c3565b61043c6004803603604081101561123157600080fd5b50803590602001356134b7565b34801561124a57600080fd5b5061043c6004803603604081101561126157600080fd5b810190602081018135600160201b81111561127b57600080fd5b82018360208201111561128d57600080fd5b803590602001918460018302840111600160201b831117156112ae57600080fd5b919390929091602081019035600160201b8111156112cb57600080fd5b8201836020820111156112dd57600080fd5b803590602001918460018302840111600160201b831117156112fe57600080fd5b509092509050613539565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b6000546001600160a01b031633148061134f57506001546001600160a01b031633145b8061136457506002546001600160a01b031633145b8061137957506003546001600160a01b031633145b8061138e57506004546001600160a01b031633145b61139757600080fd5b600f55565b6004546001600160a01b031681565b60135481565b604051806040016040528060078152602001664472616b6f6e7360c81b81525081565b60008181526009602052604081205482906001600160a01b03166113f757600080fd5b50506000908152600b60205260409020546001600160a01b031690565b600454600160a01b900460ff161561142b57600080fd5b6000818152600960205260409020546001600160a01b03163381148061147457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61147d57600080fd5b6114878284613570565b81836001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000546001600160a01b031681565b600d602052600090815260409020546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b600080546001600160a01b031633148061153a57506001546001600160a01b031633145b8061154f57506002546001600160a01b031633145b8061156457506003546001600160a01b031633145b8061157957506004546001600160a01b031633145b61158257600080fd5b5030315b90565b6000546001600160a01b031633146115a057600080fd5b6000819050806001600160a01b03166376190f8f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d602081101561160857600080fd5b505161161357600080fd5b601180546001600160a01b0319166001600160a01b039290921691909117905550565b60006040518080613f2260279139604051908190036027019020979650505050505050565b600454600160a01b900460ff161561167257600080fd5b6003546001600160a01b0316331461168957600080fd5b6000858152600d6020526040902080546001600160401b03908116908616116116b157600080fd5b80546001600160401b03600160401b909104811690851610156116d357600080fd5b80546001600160401b03600160801b909104811690841610156116f557600080fd5b80546001600160401b03600160c01b9091048116908316101561171757600080fd5b61171f613df7565b50604080516080810182526001600160401b03878116825286811660208084019182528783168486019081528784166060860190815260008d8152600d9093528683208651815495519351925167ffffffffffffffff199096169087161767ffffffffffffffff60401b1916600160401b938716939093029290921767ffffffffffffffff60801b1916600160801b91861691909102176001600160c01b0316600160c01b9390941692909202929092179055600f549251919233926108fc82150292818181858888f193505050501580156117ff573d6000803e3d6000fd5b50604080518881526001600160401b0380891660208301528088168284015280871660608301528516608082015290517f98677f77088375bf66a28fd8e22fe9e5bcdf31183e2f80c9cd9b92170df1b11e9181900360a00190a150505050505050565b6008546000190190565b600080821161187a57600080fd5b6008828154811061188757fe5b6000918252602090912060029091020160010154600160c01b900463ffffffff16151592915050565b6000546001600160a01b031633146118c757600080fd5b6001600160a01b0381166118da57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b600454600160a01b900460ff161561192257600080fd5b6001600160a01b03821661193557600080fd5b6001600160a01b03821630141561194b57600080fd5b6000611956826121d7565b9050836001600160a01b0316816001600160a01b03161461197657600080fd5b6001600160a01b0381163314806119a357506000828152600b60205260409020546001600160a01b031633145b806119d157506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b6119da57600080fd5b6119e584848461359e565b50505050565b6000546001600160a01b03163314611a0257600080fd5b6001600160a01b038116611a1557600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480611a5a57506001546001600160a01b031633145b80611a6f57506002546001600160a01b031633145b80611a8457506003546001600160a01b031633145b80611a9957506004546001600160a01b031633145b611aa257600080fd5b6000611ab860008060008b898989600030613677565b601054909150611ad29082906001600160a01b0316613570565b601054604080516313f5f20560e11b815260048101849052602481018a9052604481018990526064810185905230608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611b3a57600080fd5b505af1158015611b4e573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b03163314611b7357600080fd5b6001600160a01b038116611b8657600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b606060135460001415611bca5750604080516000815260208101909152611586565b6060601354604051908082528060200260200182016040528015611bf8578160200160208202803883390190505b5090506000611c05611862565b9050600060015b828111611c4857611c1c8161186c565b15611c405780848381518110611c2e57fe5b60209081029190910101526001909101905b600101611c0c565b83945050505050611586565b60008060015b611c62611862565b8111611caa576000818152600960205260409020546001600160a01b0386811691161415611ca25783821415611c9b579150611cb09050565b6001909101905b600101611c5a565b50600080fd5b92915050565b600454600160a01b900460ff1615611ccd57600080fd5b611cd73385613a0b565b611ce057600080fd5b611ce98461186c565b15611cf357600080fd5b601054611d0a9085906001600160a01b0316613570565b601054604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b03163314611da757600080fd5b600454600160a01b900460ff16611dbd57600080fd5b6010546001600160a01b0316611dd257600080fd5b6011546001600160a01b0316611de757600080fd5b6016546001600160a01b031615611dfd57600080fd5b611e05613a2b565b565b6000546001600160a01b03163314611e1e57600080fd5b6001600160a01b038116611e3157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b611e6e838383604051806020016040528060008152506128a0565b505050565b600c602052600090815260409020546001600160a01b031681565b6000808311611e9c57600080fd5b60008211611ea957600080fd5b600060088481548110611eb857fe5b90600052602060002090600202019050600060088481548110611ed757fe5b90600052602060002090600202019050611ef382868387613a67565b8015611f045750611f048486613c59565b95945050505050565b600454600160a01b900460ff1615611f2457600080fd5b611f2e3385613a0b565b611f3757600080fd5b611f4084612f5e565b611f4957600080fd5b601154611f609085906001600160a01b0316613570565b601154604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b6000546001600160a01b0316331480611feb57506001546001600160a01b031633145b8061200057506002546001600160a01b031633145b8061201557506003546001600160a01b031633145b8061202a57506004546001600160a01b031633145b61203357600080fd5b601255565b600454600160a01b900460ff161561204f57600080fd5b6120593382613a0b565b61206257600080fd5b6000908152600c6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120a757600080fd5b6001600160a01b0381166120ba57600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b600454600160a01b900460ff1681565b6009602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061212a57506001546001600160a01b031633145b8061213f57506002546001600160a01b031633145b8061215457506003546001600160a01b031633145b8061216957506004546001600160a01b031633145b61217257600080fd5b601254601354303191600190910102808211156121c4576004546040516001600160a01b039091169082840380156108fc02916000818181858888f19350505050158015611e6e573d6000803e3d6000fd5b5050565b6001546001600160a01b031681565b60008181526009602052604081205482906001600160a01b03166121fa57600080fd5b50506000908152600960205260409020546001600160a01b031690565b6016546001600160a01b031681565b6000546001600160a01b0316331461223d57600080fd5b6000819050806001600160a01b03166385b861886040518163ffffffff1660e01b815260040160206040518083038186803b15801561227b57600080fd5b505afa15801561228f573d6000803e3d6000fd5b505050506040513d60208110156122a557600080fd5b50516122b057600080fd5b601080546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03166000908152600a602052604090205490565b6000546001600160a01b0316331461230557600080fd5b600454600160a01b900460ff1661231b57600080fd5b601680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b600b602052600090815260409020546001600160a01b031681565b6000546001600160a01b03163314806123ad57506001546001600160a01b031633145b806123c257506002546001600160a01b031633145b806123d757506003546001600160a01b031633145b806123ec57506004546001600160a01b031633145b6123f557600080fd5b806001600160a01b03811661241257506002546001600160a01b03165b611d8660008060008a8a8a8a8a89613677565b60145463ffffffff1681565b6000546001600160a01b031633148061245457506001546001600160a01b031633145b8061246957506002546001600160a01b031633145b8061247e57506003546001600160a01b031633145b8061249357506004546001600160a01b031633145b61249c57600080fd5b600454600160a01b900460ff16156124b357600080fd5b6004805460ff60a01b1916600160a01b179055565b606060006124d5836122d3565b9050806124f2575050604080516000815260208101909152611327565b60608160405190808252806020026020018201604052801561251e578160200160208202803883390190505b509050600061252b611862565b9050600060015b828111612582576000818152600960205260409020546001600160a01b038881169116141561257a578084838151811061256857fe5b60209081029190910101526001909101905b600101612532565b8395505050505050611327565b6002546001600160a01b031681565b6000546001600160a01b03163314806125c157506001546001600160a01b031633145b806125d657506002546001600160a01b031633145b806125eb57506003546001600160a01b031633145b8061260057506004546001600160a01b031633145b61260957600080fd5b601060009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561265957600080fd5b505af115801561266d573d6000803e3d6000fd5b50505050601160009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156126c157600080fd5b505af11580156119e5573d6000803e3d6000fd5b6000546001600160a01b03163314806126f857506001546001600160a01b031633145b8061270d57506002546001600160a01b031633145b8061272257506003546001600160a01b031633145b8061273757506004546001600160a01b031633145b61274057600080fd5b6014805463ffffffff191663ffffffff92909216919091179055565b6040518060400160405280600581526020016444524b4e5360d81b81525081565b60408051821515815290516001600160a01b0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a3336000908152600e602090815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b600454600160a01b900460ff161561280e57600080fd5b6001600160a01b03821661282157600080fd5b6001600160a01b03821630141561283757600080fd5b6010546001600160a01b038381169116141561285257600080fd5b6011546001600160a01b038381169116141561286d57600080fd5b6128773382613a0b565b61288057600080fd5b6121c433838361359e565b6003546001600160a01b031681565b60125481565b6001600160a01b0383166128b357600080fd5b6001600160a01b0383163014156128c957600080fd5b6010546001600160a01b03848116911614156128e457600080fd5b6011546001600160a01b03848116911614156128ff57600080fd5b600061290a836121d7565b9050846001600160a01b0316816001600160a01b03161461292a57600080fd5b6001600160a01b03811633148061295757506000838152600b60205260409020546001600160a01b031633145b8061298557506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61298e57600080fd5b61299985858561359e565b833b63ffffffff811615612ad557604051859080602f613ef3823960405190819003602f018120630a85bd0160e11b825233600483018181526001600160a01b038c81166024860152604485018b90526080606486019081528a5160848701528a516001600160e01b031990951696509087169463150b7a02948e938d938d939192909160a40190602085019080838360005b83811015612a44578181015183820152602001612a2c565b50505050905090810190601f168015612a715780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505050506040513d6020811015612abd57600080fd5b50516001600160e01b03191614612ad357600080fd5b505b505050505050565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b820191906000526020600020905b815481529060010190602001808311612b4657829003601f168201915b505050505081565b60008181526009602052604090205460609082906001600160a01b0316612b9157600080fd5b60408051604e80825260808201909252606090826020820181803883390190505060068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529394506000938993603093606093830182828015612c455780601f10612c1a57610100808354040283529160200191612c45565b820191906000526020600020905b815481529060010190602001808311612c2857829003601f168201915b505050505090505b8215612c905784516001850194600a80860495069184830160f81b9188918110612c7357fe5b60200101906001600160f81b031916908160001a90535050612c4d565b6060848251016040519080825280601f01601f191660200182016040528015612cc0576020820181803883390190505b50905060005b8251811015612d1157828181518110612cdb57fe5b602001015160f81c60f81b828281518110612cf257fe5b60200101906001600160f81b031916908160001a905350600101612cc6565b5060005b85811015612d67578681600188030381518110612d2e57fe5b602001015160f81c60f81b828451830181518110612d4857fe5b60200101906001600160f81b031916908160001a905350600101612d15565b509998505050505050505050565b600454600090600160a01b900460ff1615612d8f57600080fd5b6003546001600160a01b03163314612da657600080fd5b600060088881548110612db557fe5b6000918252602090912060029091020160018101549091506001600160401b0316612ddf57600080fd5b612de881613cae565b612df157600080fd5b600181015460088054600160c01b90920463ffffffff16916000919083908110612e1757fe5b6000918252602090912060018086015460029093029091019081015490925063ffffffff600160e01b9283900481169290910416811015612e6657506001810154600160e01b900463ffffffff165b60008b905060008a905060008a905060008a905060008a905060008f905060006009600088815260200190815260200160002060009054906101000a90046001600160a01b031690506000612ecb888c8b60010163ffffffff16868b8b8b8b8a613677565b600089815260156020526040808220805467ffffffffffffffff19811660016001600160401b039283168101909216179091558f01805463ffffffff60c01b1916905560138054600019019055601254905192935033926108fc82150292818181858888f19350505050158015612f46573d6000803e3d6000fd5b509b5050505050505050505050509695505050505050565b6000808211612f6c57600080fd5b600060088381548110612f7b57fe5b90600052602060002090600202019050612f9481613cc4565b9392505050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b60008060008060008060008060008060008060088d8154811061301557fe5b906000526020600020906002020190506000600d60008f8152602001908152602001600020905081600001549c508160010160009054906101000a90046001600160401b03166001600160401b03169b508160010160089054906101000a90046001600160401b03166001600160401b03169a508160010160109054906101000a900463ffffffff1663ffffffff1699508160010160149054906101000a900463ffffffff1663ffffffff1698508160010160189054906101000a900463ffffffff1663ffffffff16975081600101601c9054906101000a900463ffffffff1663ffffffff1696508060000160009054906101000a90046001600160401b03166001600160401b031695508060000160089054906101000a90046001600160401b03166001600160401b031694508060000160109054906101000a90046001600160401b03166001600160401b031693508060000160189054906101000a90046001600160401b03166001600160401b03169250505091939597999b90929496989a50565b6000805481906001600160a01b03163314806131c057506001546001600160a01b031633145b806131d557506002546001600160a01b031633145b806131ea57506003546001600160a01b031633145b806131ff57506004546001600160a01b031633145b61320857600080fd5b50506010546011546001600160a01b03918216319116319091565b6010546001600160a01b031681565b600f5481565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b600454600160a01b900460ff161561327d57600080fd5b6132873382613a0b565b61329057600080fd5b61329981612f5e565b6132a257600080fd5b6132ac8183613cd9565b6132b557600080fd5b601154604080516362ae87ab60e11b81526004810185905290516000926001600160a01b03169163c55d0f56916024808301926020929190829003018186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d602081101561332b57600080fd5b5051601254909150810134101561334157600080fd5b6011546012546040805163454a2ab360e01b81526004810187905290516001600160a01b039093169263454a2ab39234039160248082019260009290919082900301818588803b15801561339457600080fd5b505af11580156133a8573d6000803e3d6000fd5b5050505050611e6e8263ffffffff168463ffffffff16613d24565b600454600160a01b900460ff16156133da57600080fd5b6012543410156133e957600080fd5b6133f33383613a0b565b6133fc57600080fd5b6134068183613c59565b61340f57600080fd5b60006008838154811061341e57fe5b9060005260206000209060020201905061343781613cc4565b61344057600080fd5b60006008838154811061344f57fe5b9060005260206000209060020201905061346881613cc4565b61347157600080fd5b60018201805467ffffffffffffffff60401b1916600160401b426001600160401b0316021790556134a482858386613a67565b6134ad57600080fd5b6119e58484613d24565b600454600160a01b900460ff16156134ce57600080fd5b600f543410156134dd57600080fd5b6000828152600d6020526040902080546001600160401b0316821161350157600080fd5b6040805184815290517f191e0543c66edcea968f62447117864399037ec1d189931eee2ddcbd5d45489d9181900360200190a1505050565b6000546001600160a01b0316331461355057600080fd5b61355c60068585613e1e565b5061356960078383613e1e565b5050505050565b6000918252600b602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038083166000818152600a60209081526040808320805460010190558583526009909152902080546001600160a01b0319169091179055831615613631576001600160a01b0383166000908152600a602090815260408083208054600019019055838352600c825280832080546001600160a01b0319908116909155600b909252909120805490911690555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008963ffffffff168a1461368b57600080fd5b8863ffffffff16891461369d57600080fd5b8763ffffffff1688146136af57600080fd5b6136b7613e9c565b506040805160e0810182528881526001600160401b0342166020820152600091810182905263ffffffff808d1660608301528b8116608083015260a082019290925290891660c0820152613709613df7565b6040518060800160405280866001600160401b03168152602001896001600160401b03168152602001886001600160401b03168152602001876001600160401b0316815250905060006001600884908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548163ffffffff021916908363ffffffff160217905550505003905081600d600083815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160106101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160186101000a8154816001600160401b0302191690836001600160401b031602179055509050508063ffffffff16811461396457600080fd5b606080840151608080860151865160c080890151604080516001600160a01b038e168152602081018a905263ffffffff9788168183015294871697850197909752938301919091529190921660a08301526001600160401b0389169082015290517fdf8d8992e7e860a8605ceb50aa640d5209227db91bcd9ec915a1d4c56d68a5b99181900360e00190a16139fb6000868361359e565b9c9b505050505050505050505050565b6000908152600960205260409020546001600160a01b0391821691161490565b6000546001600160a01b03163314613a4257600080fd5b600454600160a01b900460ff16613a5857600080fd5b6004805460ff60a01b19169055565b601454600084815260156020526040812054909163ffffffff166001600160401b0390911610613a9957506000613c51565b825485546e01ed09bead87c0378d8e640000000091829004919004808214613ac657600092505050613c51565b83861415613ad957600092505050613c51565b6001870154600160801b900463ffffffff16841480613b0857506001870154600160a01b900463ffffffff1684145b15613b1857600092505050613c51565b6001850154600160801b900463ffffffff16861480613b4757506001850154600160a01b900463ffffffff1686145b15613b5757600092505050613c51565b6001850154600160801b900463ffffffff161580613b8457506001870154600160801b900463ffffffff16155b15613b9457600192505050613c51565b60018781015490860154600160801b9182900463ffffffff90811692909104161480613bdf575060018088015490860154600160801b900463ffffffff908116600160a01b90920416145b15613bef57600092505050613c51565b60018088015490860154600160a01b900463ffffffff908116600160801b909204161480613c3a575060018781015490860154600160a01b9182900463ffffffff9081169290910416145b15613c4a57600092505050613c51565b6001925050505b949350505050565b60008181526009602052604080822054848352908220546001600160a01b03918216911680821480611f0457506000858152600c60205260409020546001600160a01b03908116908316149250505092915050565b60010154600160c01b900463ffffffff16151590565b60010154600160c01b900463ffffffff161590565b60008060088481548110613ce957fe5b90600052602060002090600202019050600060088481548110613d0857fe5b90600052602060002090600202019050611f0482868387613a67565b600060088381548110613d3357fe5b600091825260208083206001600290930201828101805463ffffffff8816600160c01b0263ffffffff60c01b19909116179055868452600c8252604080852080546001600160a01b0319908116909155878652818620805490911690556013805490940190935586845260098252928290205482516001600160a01b0391909116815290810186905280820185905290519192507f6b4808987a5cecdf67d54ca5dc20664fafca80ef7195097800c12549245ab20d919081900360600190a1505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e5f5782800160ff19823516178555613e8c565b82800160010185558215613e8c579182015b82811115613e8c578235825591602001919060010190613e71565b50613e98929150613ed8565b5090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b61158691905b80821115613e985760008155600101613ede56fe6f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c6279746573296f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a265627a7a72305820a2519486d7e80a0b5f8dc4d89b1b059c0dc278b9f2a407309cb4f51303a42b3864736f6c634300050a003268747470733a2f2f7777772e6472616b6f6e732e696f2f7365727665722f6170692f647261676f6e2f6d657461646174612f
Deployed Bytecode
0x6080604052600436106104105760003560e01c80635d64aa681161021e578063a9059cbb11610123578063e0bb933b116100ab578063e985e9c51161007a578063e985e9c51461119a578063ed60ade6146111d5578063f7d8c883146111f8578063faa0ae531461121b578063faf421251461123e57610410565b8063e0bb933b146110c2578063e6be9b5614611142578063e6cbe35114611170578063e8de704d1461118557610410565b8063c0ac9983116100f2578063c0ac998314610fed578063c87b56dd14611002578063d1741a8c1461102c578063d3e6f49f14611083578063dbbc853b146110ad57610410565b8063a9059cbb14610ec6578063b047fb5014610eff578063b0c35c0514610f14578063b88d4fde14610f2957610410565b806378c234e0116101a65780638c267b97116101755780638c267b9714610e1c57806391876e5714610e3157806392695a8814610e4657806395d89b4114610e76578063a22cb46514610e8b57610410565b806378c234e014610d435780638368071c14610da65780638456cb5914610dd45780638462151c14610de957610410565b80636af04a57116101ed5780636af04a5714610c6b5780636fbde40d14610c8057806370a0823114610cb35780637158798814610ce657806371f7aaca14610d1957610410565b80635d64aa6814610bed5780635fd8c71014610c175780636059c38414610c2c5780636352211e14610c4157610410565b806323b872dd1161032457806342842e0e116102ac5780634b85fd551161027b5780634b85fd5514610b185780634dfff04f14610b425780634e0a337914610b7b5780634f6ccce714610bae5780635c975abb14610bd857610410565b806342842e0e14610a4c57806346116e6f14610a8257806346d22c7014610aac5780634ad8c93814610adc57610410565b80632e1699d7116102f35780632e1699d71461092a5780632f745c591461098f5780633d7d3f5a146109c85780633f4ba83a14610a04578063416da14514610a1957610410565b806323b872dd1461083357806327d7874c146108695780632a896ece1461089c5780632ba73c15146108f757610410565b8063100b2783116103a757806315437dfb1161037657806315437dfb1461075b57806318160ddd146107ac5780631940a936146107c15780632072863b146107eb57806321717ebf1461081e57610410565b8063100b2783146105fd57806312065fe01461065b57806314001f4c14610670578063150b7a02146106a357610410565b806306fdde03116103e357806306fdde0314610508578063081812fc14610592578063095ea7b3146105bc5780630a0f8168146105e857610410565b806301ffc9a71461043e5780630304b213146104865780630519ce79146104b057806305ea0668146104e1575b6010546001600160a01b031633148061043357506011546001600160a01b031633145b61043c57600080fd5b005b34801561044a57600080fd5b506104726004803603602081101561046157600080fd5b50356001600160e01b031916611309565b604080519115158252519081900360200190f35b34801561049257600080fd5b5061043c600480360360208110156104a957600080fd5b503561132c565b3480156104bc57600080fd5b506104c561139c565b604080516001600160a01b039092168252519081900360200190f35b3480156104ed57600080fd5b506104f66113ab565b60408051918252519081900360200190f35b34801561051457600080fd5b5061051d6113b1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561055757818101518382015260200161053f565b50505050905090810190601f1680156105845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561059e57600080fd5b506104c5600480360360208110156105b557600080fd5b50356113d4565b61043c600480360360408110156105d257600080fd5b506001600160a01b038135169060200135611414565b3480156105f457600080fd5b506104c56114cd565b34801561060957600080fd5b506106276004803603602081101561062057600080fd5b50356114dc565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b34801561066757600080fd5b506104f6611516565b34801561067c57600080fd5b5061043c6004803603602081101561069357600080fd5b50356001600160a01b0316611589565b3480156106af57600080fd5b5061073e600480360360808110156106c657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460018302840111600160201b8311171561073357600080fd5b509092509050611636565b604080516001600160e01b03199092168252519081900360200190f35b34801561076757600080fd5b5061043c600480360360a081101561077e57600080fd5b508035906001600160401b03602082013581169160408101358216916060820135811691608001351661165b565b3480156107b857600080fd5b506104f6611862565b3480156107cd57600080fd5b50610472600480360360208110156107e457600080fd5b503561186c565b3480156107f757600080fd5b5061043c6004803603602081101561080e57600080fd5b50356001600160a01b03166118b0565b34801561082a57600080fd5b506104c56118fc565b61043c6004803603606081101561084957600080fd5b506001600160a01b0381358116916020810135909116906040013561190b565b34801561087557600080fd5b5061043c6004803603602081101561088c57600080fd5b50356001600160a01b03166119eb565b3480156108a857600080fd5b5061043c600480360360e08110156108bf57600080fd5b508035906020810135906040810135906001600160401b036060820135811691608081013582169160a0820135169060c00135611a37565b34801561090357600080fd5b5061043c6004803603602081101561091a57600080fd5b50356001600160a01b0316611b5c565b34801561093657600080fd5b5061093f611ba8565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561097b578181015183820152602001610963565b505050509050019250505060405180910390f35b34801561099b57600080fd5b506104f6600480360360408110156109b257600080fd5b506001600160a01b038135169060200135611c54565b3480156109d457600080fd5b5061043c600480360360808110156109eb57600080fd5b5080359060208101359060408101359060600135611cb6565b348015610a1057600080fd5b5061043c611d90565b348015610a2557600080fd5b5061043c60048036036020811015610a3c57600080fd5b50356001600160a01b0316611e07565b61043c60048036036060811015610a6257600080fd5b506001600160a01b03813581169160208101359091169060400135611e53565b348015610a8e57600080fd5b506104c560048036036020811015610aa557600080fd5b5035611e73565b348015610ab857600080fd5b5061047260048036036040811015610acf57600080fd5b5080359060200135611e8e565b348015610ae857600080fd5b5061043c60048036036080811015610aff57600080fd5b5080359060208101359060408101359060600135611f0d565b348015610b2457600080fd5b5061043c60048036036020811015610b3b57600080fd5b5035611fc8565b348015610b4e57600080fd5b5061043c60048036036040811015610b6557600080fd5b506001600160a01b038135169060200135612038565b348015610b8757600080fd5b5061043c60048036036020811015610b9e57600080fd5b50356001600160a01b0316612090565b348015610bba57600080fd5b506104f660048036036020811015610bd157600080fd5b5035611586565b348015610be457600080fd5b506104726120dc565b348015610bf957600080fd5b506104c560048036036020811015610c1057600080fd5b50356120ec565b348015610c2357600080fd5b5061043c612107565b348015610c3857600080fd5b506104c56121c8565b348015610c4d57600080fd5b506104c560048036036020811015610c6457600080fd5b50356121d7565b348015610c7757600080fd5b506104c5612217565b348015610c8c57600080fd5b5061043c60048036036020811015610ca357600080fd5b50356001600160a01b0316612226565b348015610cbf57600080fd5b506104f660048036036020811015610cd657600080fd5b50356001600160a01b03166122d3565b348015610cf257600080fd5b5061043c60048036036020811015610d0957600080fd5b50356001600160a01b03166122ee565b348015610d2557600080fd5b506104c560048036036020811015610d3c57600080fd5b503561236f565b348015610d4f57600080fd5b5061043c600480360360c0811015610d6657600080fd5b5080359060208101356001600160401b03908116916040810135821691606082013581169160808101359091169060a001356001600160a01b031661238a565b348015610db257600080fd5b50610dbb612425565b6040805163ffffffff9092168252519081900360200190f35b348015610de057600080fd5b5061043c612431565b348015610df557600080fd5b5061093f60048036036020811015610e0c57600080fd5b50356001600160a01b03166124c8565b348015610e2857600080fd5b506104c561258f565b348015610e3d57600080fd5b5061043c61259e565b348015610e5257600080fd5b5061043c60048036036020811015610e6957600080fd5b503563ffffffff166126d5565b348015610e8257600080fd5b5061051d61275c565b348015610e9757600080fd5b5061043c60048036036040811015610eae57600080fd5b506001600160a01b038135169060200135151561277d565b348015610ed257600080fd5b5061043c60048036036040811015610ee957600080fd5b506001600160a01b0381351690602001356127f7565b348015610f0b57600080fd5b506104c561288b565b348015610f2057600080fd5b506104f661289a565b61043c60048036036080811015610f3f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610f7957600080fd5b820183602082011115610f8b57600080fd5b803590602001918460018302840111600160201b83111715610fac57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128a0945050505050565b348015610ff957600080fd5b5061051d612add565b34801561100e57600080fd5b5061051d6004803603602081101561102557600080fd5b5035612b6b565b34801561103857600080fd5b506104f6600480360360c081101561104f57600080fd5b508035906020810135906001600160401b0360408201358116916060810135821691608082013581169160a0013516612d75565b34801561108f57600080fd5b50610472600480360360208110156110a657600080fd5b5035612f5e565b3480156110b957600080fd5b5061051d612f9b565b3480156110ce57600080fd5b506110ec600480360360208110156110e557600080fd5b5035612ff6565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b34801561114e57600080fd5b5061115761319a565b6040805192835260208301919091528051918290030190f35b34801561117c57600080fd5b506104c5613223565b34801561119157600080fd5b506104f6613232565b3480156111a657600080fd5b50610472600480360360408110156111bd57600080fd5b506001600160a01b0381358116916020013516613238565b61043c600480360360408110156111eb57600080fd5b5080359060200135613266565b61043c6004803603604081101561120e57600080fd5b50803590602001356133c3565b61043c6004803603604081101561123157600080fd5b50803590602001356134b7565b34801561124a57600080fd5b5061043c6004803603604081101561126157600080fd5b810190602081018135600160201b81111561127b57600080fd5b82018360208201111561128d57600080fd5b803590602001918460018302840111600160201b831117156112ae57600080fd5b919390929091602081019035600160201b8111156112cb57600080fd5b8201836020820111156112dd57600080fd5b803590602001918460018302840111600160201b831117156112fe57600080fd5b509092509050613539565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b6000546001600160a01b031633148061134f57506001546001600160a01b031633145b8061136457506002546001600160a01b031633145b8061137957506003546001600160a01b031633145b8061138e57506004546001600160a01b031633145b61139757600080fd5b600f55565b6004546001600160a01b031681565b60135481565b604051806040016040528060078152602001664472616b6f6e7360c81b81525081565b60008181526009602052604081205482906001600160a01b03166113f757600080fd5b50506000908152600b60205260409020546001600160a01b031690565b600454600160a01b900460ff161561142b57600080fd5b6000818152600960205260409020546001600160a01b03163381148061147457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61147d57600080fd5b6114878284613570565b81836001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000546001600160a01b031681565b600d602052600090815260409020546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b600080546001600160a01b031633148061153a57506001546001600160a01b031633145b8061154f57506002546001600160a01b031633145b8061156457506003546001600160a01b031633145b8061157957506004546001600160a01b031633145b61158257600080fd5b5030315b90565b6000546001600160a01b031633146115a057600080fd5b6000819050806001600160a01b03166376190f8f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d602081101561160857600080fd5b505161161357600080fd5b601180546001600160a01b0319166001600160a01b039290921691909117905550565b60006040518080613f2260279139604051908190036027019020979650505050505050565b600454600160a01b900460ff161561167257600080fd5b6003546001600160a01b0316331461168957600080fd5b6000858152600d6020526040902080546001600160401b03908116908616116116b157600080fd5b80546001600160401b03600160401b909104811690851610156116d357600080fd5b80546001600160401b03600160801b909104811690841610156116f557600080fd5b80546001600160401b03600160c01b9091048116908316101561171757600080fd5b61171f613df7565b50604080516080810182526001600160401b03878116825286811660208084019182528783168486019081528784166060860190815260008d8152600d9093528683208651815495519351925167ffffffffffffffff199096169087161767ffffffffffffffff60401b1916600160401b938716939093029290921767ffffffffffffffff60801b1916600160801b91861691909102176001600160c01b0316600160c01b9390941692909202929092179055600f549251919233926108fc82150292818181858888f193505050501580156117ff573d6000803e3d6000fd5b50604080518881526001600160401b0380891660208301528088168284015280871660608301528516608082015290517f98677f77088375bf66a28fd8e22fe9e5bcdf31183e2f80c9cd9b92170df1b11e9181900360a00190a150505050505050565b6008546000190190565b600080821161187a57600080fd5b6008828154811061188757fe5b6000918252602090912060029091020160010154600160c01b900463ffffffff16151592915050565b6000546001600160a01b031633146118c757600080fd5b6001600160a01b0381166118da57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b600454600160a01b900460ff161561192257600080fd5b6001600160a01b03821661193557600080fd5b6001600160a01b03821630141561194b57600080fd5b6000611956826121d7565b9050836001600160a01b0316816001600160a01b03161461197657600080fd5b6001600160a01b0381163314806119a357506000828152600b60205260409020546001600160a01b031633145b806119d157506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b6119da57600080fd5b6119e584848461359e565b50505050565b6000546001600160a01b03163314611a0257600080fd5b6001600160a01b038116611a1557600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480611a5a57506001546001600160a01b031633145b80611a6f57506002546001600160a01b031633145b80611a8457506003546001600160a01b031633145b80611a9957506004546001600160a01b031633145b611aa257600080fd5b6000611ab860008060008b898989600030613677565b601054909150611ad29082906001600160a01b0316613570565b601054604080516313f5f20560e11b815260048101849052602481018a9052604481018990526064810185905230608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611b3a57600080fd5b505af1158015611b4e573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b03163314611b7357600080fd5b6001600160a01b038116611b8657600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b606060135460001415611bca5750604080516000815260208101909152611586565b6060601354604051908082528060200260200182016040528015611bf8578160200160208202803883390190505b5090506000611c05611862565b9050600060015b828111611c4857611c1c8161186c565b15611c405780848381518110611c2e57fe5b60209081029190910101526001909101905b600101611c0c565b83945050505050611586565b60008060015b611c62611862565b8111611caa576000818152600960205260409020546001600160a01b0386811691161415611ca25783821415611c9b579150611cb09050565b6001909101905b600101611c5a565b50600080fd5b92915050565b600454600160a01b900460ff1615611ccd57600080fd5b611cd73385613a0b565b611ce057600080fd5b611ce98461186c565b15611cf357600080fd5b601054611d0a9085906001600160a01b0316613570565b601054604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b03163314611da757600080fd5b600454600160a01b900460ff16611dbd57600080fd5b6010546001600160a01b0316611dd257600080fd5b6011546001600160a01b0316611de757600080fd5b6016546001600160a01b031615611dfd57600080fd5b611e05613a2b565b565b6000546001600160a01b03163314611e1e57600080fd5b6001600160a01b038116611e3157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b611e6e838383604051806020016040528060008152506128a0565b505050565b600c602052600090815260409020546001600160a01b031681565b6000808311611e9c57600080fd5b60008211611ea957600080fd5b600060088481548110611eb857fe5b90600052602060002090600202019050600060088481548110611ed757fe5b90600052602060002090600202019050611ef382868387613a67565b8015611f045750611f048486613c59565b95945050505050565b600454600160a01b900460ff1615611f2457600080fd5b611f2e3385613a0b565b611f3757600080fd5b611f4084612f5e565b611f4957600080fd5b601154611f609085906001600160a01b0316613570565b601154604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b6000546001600160a01b0316331480611feb57506001546001600160a01b031633145b8061200057506002546001600160a01b031633145b8061201557506003546001600160a01b031633145b8061202a57506004546001600160a01b031633145b61203357600080fd5b601255565b600454600160a01b900460ff161561204f57600080fd5b6120593382613a0b565b61206257600080fd5b6000908152600c6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120a757600080fd5b6001600160a01b0381166120ba57600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b600454600160a01b900460ff1681565b6009602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061212a57506001546001600160a01b031633145b8061213f57506002546001600160a01b031633145b8061215457506003546001600160a01b031633145b8061216957506004546001600160a01b031633145b61217257600080fd5b601254601354303191600190910102808211156121c4576004546040516001600160a01b039091169082840380156108fc02916000818181858888f19350505050158015611e6e573d6000803e3d6000fd5b5050565b6001546001600160a01b031681565b60008181526009602052604081205482906001600160a01b03166121fa57600080fd5b50506000908152600960205260409020546001600160a01b031690565b6016546001600160a01b031681565b6000546001600160a01b0316331461223d57600080fd5b6000819050806001600160a01b03166385b861886040518163ffffffff1660e01b815260040160206040518083038186803b15801561227b57600080fd5b505afa15801561228f573d6000803e3d6000fd5b505050506040513d60208110156122a557600080fd5b50516122b057600080fd5b601080546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03166000908152600a602052604090205490565b6000546001600160a01b0316331461230557600080fd5b600454600160a01b900460ff1661231b57600080fd5b601680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b600b602052600090815260409020546001600160a01b031681565b6000546001600160a01b03163314806123ad57506001546001600160a01b031633145b806123c257506002546001600160a01b031633145b806123d757506003546001600160a01b031633145b806123ec57506004546001600160a01b031633145b6123f557600080fd5b806001600160a01b03811661241257506002546001600160a01b03165b611d8660008060008a8a8a8a8a89613677565b60145463ffffffff1681565b6000546001600160a01b031633148061245457506001546001600160a01b031633145b8061246957506002546001600160a01b031633145b8061247e57506003546001600160a01b031633145b8061249357506004546001600160a01b031633145b61249c57600080fd5b600454600160a01b900460ff16156124b357600080fd5b6004805460ff60a01b1916600160a01b179055565b606060006124d5836122d3565b9050806124f2575050604080516000815260208101909152611327565b60608160405190808252806020026020018201604052801561251e578160200160208202803883390190505b509050600061252b611862565b9050600060015b828111612582576000818152600960205260409020546001600160a01b038881169116141561257a578084838151811061256857fe5b60209081029190910101526001909101905b600101612532565b8395505050505050611327565b6002546001600160a01b031681565b6000546001600160a01b03163314806125c157506001546001600160a01b031633145b806125d657506002546001600160a01b031633145b806125eb57506003546001600160a01b031633145b8061260057506004546001600160a01b031633145b61260957600080fd5b601060009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561265957600080fd5b505af115801561266d573d6000803e3d6000fd5b50505050601160009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156126c157600080fd5b505af11580156119e5573d6000803e3d6000fd5b6000546001600160a01b03163314806126f857506001546001600160a01b031633145b8061270d57506002546001600160a01b031633145b8061272257506003546001600160a01b031633145b8061273757506004546001600160a01b031633145b61274057600080fd5b6014805463ffffffff191663ffffffff92909216919091179055565b6040518060400160405280600581526020016444524b4e5360d81b81525081565b60408051821515815290516001600160a01b0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a3336000908152600e602090815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b600454600160a01b900460ff161561280e57600080fd5b6001600160a01b03821661282157600080fd5b6001600160a01b03821630141561283757600080fd5b6010546001600160a01b038381169116141561285257600080fd5b6011546001600160a01b038381169116141561286d57600080fd5b6128773382613a0b565b61288057600080fd5b6121c433838361359e565b6003546001600160a01b031681565b60125481565b6001600160a01b0383166128b357600080fd5b6001600160a01b0383163014156128c957600080fd5b6010546001600160a01b03848116911614156128e457600080fd5b6011546001600160a01b03848116911614156128ff57600080fd5b600061290a836121d7565b9050846001600160a01b0316816001600160a01b03161461292a57600080fd5b6001600160a01b03811633148061295757506000838152600b60205260409020546001600160a01b031633145b8061298557506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61298e57600080fd5b61299985858561359e565b833b63ffffffff811615612ad557604051859080602f613ef3823960405190819003602f018120630a85bd0160e11b825233600483018181526001600160a01b038c81166024860152604485018b90526080606486019081528a5160848701528a516001600160e01b031990951696509087169463150b7a02948e938d938d939192909160a40190602085019080838360005b83811015612a44578181015183820152602001612a2c565b50505050905090810190601f168015612a715780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505050506040513d6020811015612abd57600080fd5b50516001600160e01b03191614612ad357600080fd5b505b505050505050565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b820191906000526020600020905b815481529060010190602001808311612b4657829003601f168201915b505050505081565b60008181526009602052604090205460609082906001600160a01b0316612b9157600080fd5b60408051604e80825260808201909252606090826020820181803883390190505060068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529394506000938993603093606093830182828015612c455780601f10612c1a57610100808354040283529160200191612c45565b820191906000526020600020905b815481529060010190602001808311612c2857829003601f168201915b505050505090505b8215612c905784516001850194600a80860495069184830160f81b9188918110612c7357fe5b60200101906001600160f81b031916908160001a90535050612c4d565b6060848251016040519080825280601f01601f191660200182016040528015612cc0576020820181803883390190505b50905060005b8251811015612d1157828181518110612cdb57fe5b602001015160f81c60f81b828281518110612cf257fe5b60200101906001600160f81b031916908160001a905350600101612cc6565b5060005b85811015612d67578681600188030381518110612d2e57fe5b602001015160f81c60f81b828451830181518110612d4857fe5b60200101906001600160f81b031916908160001a905350600101612d15565b509998505050505050505050565b600454600090600160a01b900460ff1615612d8f57600080fd5b6003546001600160a01b03163314612da657600080fd5b600060088881548110612db557fe5b6000918252602090912060029091020160018101549091506001600160401b0316612ddf57600080fd5b612de881613cae565b612df157600080fd5b600181015460088054600160c01b90920463ffffffff16916000919083908110612e1757fe5b6000918252602090912060018086015460029093029091019081015490925063ffffffff600160e01b9283900481169290910416811015612e6657506001810154600160e01b900463ffffffff165b60008b905060008a905060008a905060008a905060008a905060008f905060006009600088815260200190815260200160002060009054906101000a90046001600160a01b031690506000612ecb888c8b60010163ffffffff16868b8b8b8b8a613677565b600089815260156020526040808220805467ffffffffffffffff19811660016001600160401b039283168101909216179091558f01805463ffffffff60c01b1916905560138054600019019055601254905192935033926108fc82150292818181858888f19350505050158015612f46573d6000803e3d6000fd5b509b5050505050505050505050509695505050505050565b6000808211612f6c57600080fd5b600060088381548110612f7b57fe5b90600052602060002090600202019050612f9481613cc4565b9392505050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b60008060008060008060008060008060008060088d8154811061301557fe5b906000526020600020906002020190506000600d60008f8152602001908152602001600020905081600001549c508160010160009054906101000a90046001600160401b03166001600160401b03169b508160010160089054906101000a90046001600160401b03166001600160401b03169a508160010160109054906101000a900463ffffffff1663ffffffff1699508160010160149054906101000a900463ffffffff1663ffffffff1698508160010160189054906101000a900463ffffffff1663ffffffff16975081600101601c9054906101000a900463ffffffff1663ffffffff1696508060000160009054906101000a90046001600160401b03166001600160401b031695508060000160089054906101000a90046001600160401b03166001600160401b031694508060000160109054906101000a90046001600160401b03166001600160401b031693508060000160189054906101000a90046001600160401b03166001600160401b03169250505091939597999b90929496989a50565b6000805481906001600160a01b03163314806131c057506001546001600160a01b031633145b806131d557506002546001600160a01b031633145b806131ea57506003546001600160a01b031633145b806131ff57506004546001600160a01b031633145b61320857600080fd5b50506010546011546001600160a01b03918216319116319091565b6010546001600160a01b031681565b600f5481565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b600454600160a01b900460ff161561327d57600080fd5b6132873382613a0b565b61329057600080fd5b61329981612f5e565b6132a257600080fd5b6132ac8183613cd9565b6132b557600080fd5b601154604080516362ae87ab60e11b81526004810185905290516000926001600160a01b03169163c55d0f56916024808301926020929190829003018186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d602081101561332b57600080fd5b5051601254909150810134101561334157600080fd5b6011546012546040805163454a2ab360e01b81526004810187905290516001600160a01b039093169263454a2ab39234039160248082019260009290919082900301818588803b15801561339457600080fd5b505af11580156133a8573d6000803e3d6000fd5b5050505050611e6e8263ffffffff168463ffffffff16613d24565b600454600160a01b900460ff16156133da57600080fd5b6012543410156133e957600080fd5b6133f33383613a0b565b6133fc57600080fd5b6134068183613c59565b61340f57600080fd5b60006008838154811061341e57fe5b9060005260206000209060020201905061343781613cc4565b61344057600080fd5b60006008838154811061344f57fe5b9060005260206000209060020201905061346881613cc4565b61347157600080fd5b60018201805467ffffffffffffffff60401b1916600160401b426001600160401b0316021790556134a482858386613a67565b6134ad57600080fd5b6119e58484613d24565b600454600160a01b900460ff16156134ce57600080fd5b600f543410156134dd57600080fd5b6000828152600d6020526040902080546001600160401b0316821161350157600080fd5b6040805184815290517f191e0543c66edcea968f62447117864399037ec1d189931eee2ddcbd5d45489d9181900360200190a1505050565b6000546001600160a01b0316331461355057600080fd5b61355c60068585613e1e565b5061356960078383613e1e565b5050505050565b6000918252600b602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038083166000818152600a60209081526040808320805460010190558583526009909152902080546001600160a01b0319169091179055831615613631576001600160a01b0383166000908152600a602090815260408083208054600019019055838352600c825280832080546001600160a01b0319908116909155600b909252909120805490911690555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008963ffffffff168a1461368b57600080fd5b8863ffffffff16891461369d57600080fd5b8763ffffffff1688146136af57600080fd5b6136b7613e9c565b506040805160e0810182528881526001600160401b0342166020820152600091810182905263ffffffff808d1660608301528b8116608083015260a082019290925290891660c0820152613709613df7565b6040518060800160405280866001600160401b03168152602001896001600160401b03168152602001886001600160401b03168152602001876001600160401b0316815250905060006001600884908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548163ffffffff021916908363ffffffff160217905550505003905081600d600083815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160106101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160186101000a8154816001600160401b0302191690836001600160401b031602179055509050508063ffffffff16811461396457600080fd5b606080840151608080860151865160c080890151604080516001600160a01b038e168152602081018a905263ffffffff9788168183015294871697850197909752938301919091529190921660a08301526001600160401b0389169082015290517fdf8d8992e7e860a8605ceb50aa640d5209227db91bcd9ec915a1d4c56d68a5b99181900360e00190a16139fb6000868361359e565b9c9b505050505050505050505050565b6000908152600960205260409020546001600160a01b0391821691161490565b6000546001600160a01b03163314613a4257600080fd5b600454600160a01b900460ff16613a5857600080fd5b6004805460ff60a01b19169055565b601454600084815260156020526040812054909163ffffffff166001600160401b0390911610613a9957506000613c51565b825485546e01ed09bead87c0378d8e640000000091829004919004808214613ac657600092505050613c51565b83861415613ad957600092505050613c51565b6001870154600160801b900463ffffffff16841480613b0857506001870154600160a01b900463ffffffff1684145b15613b1857600092505050613c51565b6001850154600160801b900463ffffffff16861480613b4757506001850154600160a01b900463ffffffff1686145b15613b5757600092505050613c51565b6001850154600160801b900463ffffffff161580613b8457506001870154600160801b900463ffffffff16155b15613b9457600192505050613c51565b60018781015490860154600160801b9182900463ffffffff90811692909104161480613bdf575060018088015490860154600160801b900463ffffffff908116600160a01b90920416145b15613bef57600092505050613c51565b60018088015490860154600160a01b900463ffffffff908116600160801b909204161480613c3a575060018781015490860154600160a01b9182900463ffffffff9081169290910416145b15613c4a57600092505050613c51565b6001925050505b949350505050565b60008181526009602052604080822054848352908220546001600160a01b03918216911680821480611f0457506000858152600c60205260409020546001600160a01b03908116908316149250505092915050565b60010154600160c01b900463ffffffff16151590565b60010154600160c01b900463ffffffff161590565b60008060088481548110613ce957fe5b90600052602060002090600202019050600060088481548110613d0857fe5b90600052602060002090600202019050611f0482868387613a67565b600060088381548110613d3357fe5b600091825260208083206001600290930201828101805463ffffffff8816600160c01b0263ffffffff60c01b19909116179055868452600c8252604080852080546001600160a01b0319908116909155878652818620805490911690556013805490940190935586845260098252928290205482516001600160a01b0391909116815290810186905280820185905290519192507f6b4808987a5cecdf67d54ca5dc20664fafca80ef7195097800c12549245ab20d919081900360600190a1505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e5f5782800160ff19823516178555613e8c565b82800160010185558215613e8c579182015b82811115613e8c578235825591602001919060010190613e71565b50613e98929150613ed8565b5090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b61158691905b80821115613e985760008155600101613ede56fe6f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c6279746573296f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a265627a7a72305820a2519486d7e80a0b5f8dc4d89b1b059c0dc278b9f2a407309cb4f51303a42b3864736f6c634300050a0032
Deployed Bytecode Sourcemap
83928:4367:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85746:11;;-1:-1:-1;;;;;85746:11:0;85724:10;:34;;:87;;-1:-1:-1;85797:13:0;;-1:-1:-1;;;;;85797:13:0;85775:10;:36;85724:87;85702:120;;;;;;83928:4367;16132:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16132:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16132:134:0;-1:-1:-1;;;;;;16132:134:0;;:::i;:::-;;;;;;;;;;;;;;;;;;43311:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43311:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43311:105:0;;:::i;2308:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2308:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;2308:33:0;;;;;;;;;;;;;;61510:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61510:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;47364:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47364:39:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47364:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56022:156;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56022:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56022:156:0;;:::i;55131:614::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;55131:614:0;;;;;;;;:::i;2148:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2148:33:0;;;:::i;39123:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39123:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39123:53:0;;:::i;:::-;;;;-1:-1:-1;;;;;39123:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88180:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;88180:112:0;;;:::i;77889:485::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77889:485:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77889:485:0;-1:-1:-1;;;;;77889:485:0;;:::i;16274:210::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16274:210:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;16274:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;16274:210:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16274:210:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;16274:210:0;;-1:-1:-1;16274:210:0;-1:-1:-1;16274:210:0;:::i;:::-;;;;-1:-1:-1;;;;;;16274:210:0;;;;;;;;;;;;;;43426:902;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43426:902:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43426:902:0;;;-1:-1:-1;;;;;43426:902:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57768:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57768:94:0;;;:::i;65449:247::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65449:247:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65449:247:0;;:::i;4227:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4227:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4227:140:0;-1:-1:-1;;;;;4227:140:0;;:::i;39351:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39351:39:0;;;:::i;56660:976::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;56660:976:0;;;;;;;;;;;;;;;;;:::i;3649:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3649:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3649:140:0;-1:-1:-1;;;;;3649:140:0;;:::i;83129:725::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83129:725:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;83129:725:0;;;;;;;;;;;;;-1:-1:-1;;;;;83129:725:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;4516:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4516:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4516:140:0;-1:-1:-1;;;;;4516:140:0;;:::i;75715:670::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75715:670:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;75715:670:0;;;;;;;;;;;;;;;;;60164:442;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60164:442:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;60164:442:0;;;;;;;;:::i;78494:1023::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78494:1023:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;78494:1023:0;;;;;;;;;;;;;;;;;:::i;87324:286::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;87324:286:0;;;:::i;3938:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3938:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3938:140:0;-1:-1:-1;;;;;3938:140:0;;:::i;52756:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;52756:155:0;;;;;;;;;;;;;;;;;:::i;39060:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39060:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39060:56:0;;:::i;68523:401::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68523:401:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;68523:401:0;;;;;;;:::i;79685:836::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79685:836:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;79685:836:0;;;;;;;;;;;;;;;;;:::i;64492:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64492:95:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64492:95:0;;:::i;64074:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64074:195:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;64074:195:0;;;;;;;;:::i;4805:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4805:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4805:140:0;-1:-1:-1;;;;;4805:140:0;;:::i;59503:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59503:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59503:107:0;;:::i;2451:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2451:26:0;;;:::i;38880:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38880:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38880:54:0;;:::i;87696:424::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;87696:424:0;;;:::i;2188:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2188:33:0;;;:::i;54463:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54463:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54463:147:0;;:::i;84049:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84049:33:0;;;:::i;77295:475::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77295:475:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77295:475:0;-1:-1:-1;;;;;77295:475:0;;:::i;50270:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50270:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50270:124:0;-1:-1:-1;;;;;50270:124:0;;:::i;85301:167::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;85301:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85301:167:0;-1:-1:-1;;;;;85301:167:0;;:::i;38996:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38996:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38996:57:0;;:::i;82561:460::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;82561:460:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;82561:460:0;;;;;;;-1:-1:-1;;;;;82561:460:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;82561:460:0;;:::i;61549:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61549:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5406:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5406:83:0;;;:::i;58331:915::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58331:915:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58331:915:0;-1:-1:-1;;;;;58331:915:0;;:::i;2228:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2228:33:0;;;:::i;81705:145::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81705:145:0;;;:::i;76393:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76393:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76393:103:0;;;;:::i;47410:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47410:39:0;;;:::i;45622:203::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45622:203:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45622:203:0;;;;;;;;;;:::i;53299:1024::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53299:1024:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;53299:1024:0;;;;;;;;:::i;2268:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2268:33:0;;;:::i;61412:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61412:38:0;;;:::i;51259:1130::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;51259:1130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;51259:1130:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51259:1130:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51259:1130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51259:1130:0;;-1:-1:-1;51259:1130:0;;-1:-1:-1;;;;;51259:1130:0:i;15810:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15810:83:0;;;:::i;45833:1004::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45833:1004:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45833:1004:0;;:::i;73527:2180::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73527:2180:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;73527:2180:0;;;;;;;;-1:-1:-1;;;;;73527:2180:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;65067:225::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65067:225:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65067:225:0;;:::i;15900:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15900:33:0;;;:::i;85969:990::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;85969:990:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85969:990:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81916:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81916:207:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39309:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39309:35:0;;;:::i;39260:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39260:40:0;;;:::i;45069:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45069:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45069:150:0;;;;;;;;;;:::i;80777:723::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;80777:723:0;;;;;;;:::i;70505:2095::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70505:2095:0;;;;;;;:::i;44336:426::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44336:426:0;;;;;;;:::i;48580:173::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48580:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48580:173:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48580:173:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48580:173:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;48580:173:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48580:173:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48580:173:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;48580:173:0;;-1:-1:-1;48580:173:0;-1:-1:-1;48580:173:0;:::i;16132:134::-;-1:-1:-1;;;;;;16226:32:0;;16202:4;16226:32;;;:19;:32;;;;;;;;16132:134;;;;:::o;43311:105::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;43385:14;:23;43311:105::o;2308:33::-;;;-1:-1:-1;;;;;2308:33:0;;:::o;61510:30::-;;;;:::o;47364:39::-;;;;;;;;;;;;;;-1:-1:-1;;;47364:39:0;;;;:::o;56022:156::-;56107:7;39458:28;;;:18;:28;;;;;;56088:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;-1:-1:-1;;56139:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;56139:31:0;;56022:156::o;55131:614::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;55364:13;55380:28;;;:18;:28;;;;;;-1:-1:-1;;;;;55380:28:0;55436:10;55427:19;;;:52;;-1:-1:-1;;;;;;55450:17:0;;;;;;:10;:17;;;;;;;;55468:10;55450:29;;;;;;;;;;55427:52;55419:61;;;;;;55562:29;55571:8;55581:9;55562:8;:29::i;:::-;55728:8;55717:9;-1:-1:-1;;;;;55701:36:0;55710:5;-1:-1:-1;;;;;55701:36:0;;;;;;;;;;;5093:1;55131:614;;:::o;2148:33::-;;;-1:-1:-1;;;;;2148:33:0;;:::o;39123:53::-;;;;;;;;;;;;-1:-1:-1;;;;;39123:53:0;;;;-1:-1:-1;;;39123:53:0;;;;;-1:-1:-1;;;39123:53:0;;;;;-1:-1:-1;;;39123:53:0;;;;:::o;88180:112::-;88236:7;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;-1:-1:-1;88271:4:0;88263:21;3491:1;88180:112;:::o;77889:485::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;77968:36;78026:8;77968:67;;78238:17;-1:-1:-1;;;;;78238:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78238:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78238:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78238:40:0;78230:49;;;;;;78333:13;:33;;-1:-1:-1;;;;;;78333:33:0;-1:-1:-1;;;;;78333:33:0;;;;;;;;;;-1:-1:-1;77889:485:0:o;16274:210::-;16391:6;16423:52;;;;;;;;;;;;;;;;;;;16274:210;-1:-1:-1;;;;;;;16274:210:0:o;43426:902::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;3039:10;;-1:-1:-1;;;;;3039:10:0;3025;:24;3017:33;;;;;;43607:39;43649:23;;;:12;:23;;;;;43701:28;;-1:-1:-1;;;;;43701:28:0;;;43693:36;;;;43685:45;;;;;;43761:26;;-1:-1:-1;;;;;;;;43761:26:0;;;;;43749:38;;;;;43741:47;;;;;;43820:27;;-1:-1:-1;;;;;;;;43820:27:0;;;;;43807:40;;;;;43799:49;;;;;;43884:31;;-1:-1:-1;;;;;;;;43884:31:0;;;;;43867:48;;;;;43859:57;;;;;;43929:32;;:::i;:::-;-1:-1:-1;43964:168:0;;;;;;;;-1:-1:-1;;;;;43964:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44145:23:0;;;:12;:23;;;;;;:38;;;;;;;;;;-1:-1:-1;;44145:38:0;;;;;;;-1:-1:-1;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;;;;-1:-1:-1;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;-1:-1:-1;;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;;;;;;;44214:14;;44194:35;;43964:168;;44194:10;;:35;;;;;;-1:-1:-1;44194:35:0;44214:14;44194:10;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;44245:73:0;;;;;;-1:-1:-1;;;;;44245:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3061:1;;43426:902;;;;;:::o;57768:94::-;57836:7;:14;-1:-1:-1;;57836:18:0;57768:94;:::o;65449:247::-;65524:4;65566:1;65554:9;:13;65546:22;;;;;;65652:7;65660:9;65652:18;;;;;;;;;;;;;;;;;;;;;:31;;;-1:-1:-1;;;65652:31:0;;;;:36;;;65449:247;-1:-1:-1;;65449:247:0:o;4227:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4304:21:0;;4296:30;;;;;;4339:10;:20;;-1:-1:-1;;;;;;4339:20:0;-1:-1:-1;;;;;4339:20:0;;;;;;;;;;4227:140::o;39351:39::-;;;-1:-1:-1;;;;;39351:39:0;;:::o;56660:976::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;-1:-1:-1;;;;;56854:17:0;;56846:26;;;;;;-1:-1:-1;;;;;57123:20:0;;57138:4;57123:20;;57115:29;;;;;;57306:13;57322:17;57330:8;57322:7;:17::i;:::-;57306:33;;57367:5;-1:-1:-1;;;;;57358:14:0;:5;-1:-1:-1;;;;;57358:14:0;;57350:23;;;;;;-1:-1:-1;;;;;57393:19:0;;57402:10;57393:19;;:68;;-1:-1:-1;57416:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;57416:31:0;57451:10;57416:45;57393:68;:101;;;-1:-1:-1;;;;;;57465:17:0;;;;;;:10;:17;;;;;;;;57483:10;57465:29;;;;;;;;;;57393:101;57384:111;;;;;;57597:31;57607:5;57614:3;57619:8;57597:9;:31::i;:::-;5093:1;56660:976;;;:::o;3649:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;3726:21:0;;3718:30;;;;;;3761:10;:20;;-1:-1:-1;;;;;;3761:20:0;-1:-1:-1;;;;;3761:20:0;;;;;;;;;;3649:140::o;83129:725::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;83463:16;83482:82;83496:1;83499;83502;83505:4;83511:8;83521:9;83532:13;83547:1;83558:4;83482:13;:82::i;:::-;83602:11;;83463:101;;-1:-1:-1;83575:40:0;;83463:101;;-1:-1:-1;;;;;83602:11:0;83575:8;:40::i;:::-;83628:11;;:185;;;-1:-1:-1;;;83628:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;83795:4;83628:185;;;;;;-1:-1:-1;;;;;83628:11:0;;;;:25;;:185;;;;;:11;;:185;;;;;;;;:11;;:185;;;5:2:-1;;;;30:1;27;20:12;5:2;83628:185:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;83628:185:0;;;;3491:1;83129:725;;;;;;;:::o;4516:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4593:21:0;;4585:30;;;;;;4628:10;:20;;-1:-1:-1;;;;;;4628:20:0;-1:-1:-1;;;;;4628:20:0;;;;;;;;;;4516:140::o;75715:670::-;75767:36;75822:15;;75841:1;75822:20;75818:560;;;-1:-1:-1;75866:16:0;;;75880:1;75866:16;;;;;;;;75859:23;;75818:560;75915:23;75955:15;;75941:30;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;75941:30:0;;75915:56;;75986:20;76009:13;:11;:13::i;:::-;75986:36;-1:-1:-1;76037:19:0;76127:1;76111:226;76142:12;76130:8;:24;76111:226;;76191:20;76202:8;76191:10;:20::i;:::-;76187:135;;;76258:8;76236:6;76243:11;76236:19;;;;;;;;;;;;;;;;;:30;76289:13;;;;;76187:135;76156:10;;76111:226;;;76360:6;76353:13;;;;;;;;60164:442;60248:16;;60327:1;60310:270;60335:13;:11;:13::i;:::-;60330:1;:18;60310:270;;60374:21;;;;:18;:21;;;;;;-1:-1:-1;;;;;60374:31:0;;;:21;;:31;60370:199;;;60439:6;60430:5;:15;60426:128;;;60477:1;-1:-1:-1;60470:8:0;;-1:-1:-1;60470:8:0;60426:128;60527:7;;;;;60426:128;60350:3;;60310:270;;;;60590:8;;;60164:442;;;;;:::o;78494:1023::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;78880:28;78886:10;78898:9;78880:5;:28::i;:::-;78872:37;;;;;;79127:21;79138:9;79127:10;:21::i;:::-;79126:22;79118:31;;;;;;79188:11;;79160:41;;79169:9;;-1:-1:-1;;;;;79188:11:0;79160:8;:41::i;:::-;79344:11;;:165;;;-1:-1:-1;;;79344:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;79488:10;79344:165;;;;;;-1:-1:-1;;;;;79344:11:0;;;;:25;;:165;;;;;:11;;:165;;;;;;;;:11;;:165;;;5:2:-1;;;;30:1;27;20:12;5:2;79344:165:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79344:165:0;;;;78494:1023;;;;:::o;87324:286::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;87396:11;;-1:-1:-1;;;;;87396:11:0;87380:43;;;;;;87450:13;;-1:-1:-1;;;;;87450:13:0;87434:45;;;;;;87498:18;;-1:-1:-1;;;;;87498:18:0;:32;87490:41;;;;;;87587:15;:13;:15::i;:::-;87324:286::o;3938:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4015:21:0;;4007:30;;;;;;4050:10;:20;;-1:-1:-1;;;;;;4050:20:0;-1:-1:-1;;;;;4050:20:0;;;;;;;;;;3938:140::o;52756:155::-;52861:42;52878:5;52885:3;52890:8;52861:42;;;;;;;;;;;;:16;:42::i;:::-;52756:155;;;:::o;39060:56::-;;;;;;;;;;;;-1:-1:-1;;;;;39060:56:0;;:::o;68523:401::-;68618:4;68660:1;68648:9;:13;68640:22;;;;;;68691:1;68681:7;:11;68673:20;;;;;;68704:21;68728:7;68736:9;68728:18;;;;;;;;;;;;;;;;;;68704:42;;68757:19;68779:7;68787;68779:16;;;;;;;;;;;;;;;;;;68757:38;;68813:52;68832:6;68840:9;68851:4;68857:7;68813:18;:52::i;:::-;:103;;;;;68878:38;68897:7;68906:9;68878:18;:38::i;:::-;68806:110;68523:401;-1:-1:-1;;;;;68523:401:0:o;79685:836::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;80073:28;80079:10;80091:9;80073:5;:28::i;:::-;80065:37;;;;;;80121:25;80136:9;80121:14;:25::i;:::-;80113:34;;;;;;80186:13;;80158:43;;80167:9;;-1:-1:-1;;;;;80186:13:0;80158:8;:43::i;:::-;80346:13;;:167;;;-1:-1:-1;;;80346:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;80492:10;80346:167;;;;;;-1:-1:-1;;;;;80346:13:0;;;;:27;;:167;;;;;:13;;:167;;;;;;;;:13;;:167;;;5:2:-1;;;;30:1;27;20:12;64492:95:0;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;64561:12;:18;64492:95::o;64074:195::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;64186:26;64192:10;64204:7;64186:5;:26::i;:::-;64178:35;;;;;;64224:29;;;;:20;:29;;;;;:37;;-1:-1:-1;;;;;;64224:37:0;-1:-1:-1;;;;;64224:37:0;;;;;;;;;;64074:195::o;4805:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4882:21:0;;4874:30;;;;;;4917:10;:20;;-1:-1:-1;;;;;;4917:20:0;-1:-1:-1;;;;;4917:20:0;;;;;;;;;;4805:140::o;2451:26::-;;;-1:-1:-1;;;2451:26:0;;;;;:::o;38880:54::-;;;;;;;;;;;;-1:-1:-1;;;;;38880:54:0;;:::o;87696:424::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;87934:12;;87911:15;;87780:4;87772:21;;87929:1;87911:19;;;87910:36;87963:22;;;87959:154;;;88058:10;;:43;;-1:-1:-1;;;;;88058:10:0;;;;88078:22;;;88058:43;;;;;:10;:43;:10;:43;88078:22;88058:10;:43;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;87959:154:0;3491:1;;87696:424::o;2188:33::-;;;-1:-1:-1;;;;;2188:33:0;;:::o;54463:147::-;54542:7;39458:28;;;:18;:28;;;;;;54523:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;-1:-1:-1;;54574:28:0;;;;:18;:28;;;;;;-1:-1:-1;;;;;54574:28:0;;54463:147::o;84049:33::-;;;-1:-1:-1;;;;;84049:33:0;;:::o;77295:475::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;77372:34;77426:8;77372:63;;77638:17;-1:-1:-1;;;;;77638:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77638:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;77638:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77638:38:0;77630:47;;;;;;77731:11;:31;;-1:-1:-1;;;;;;77731:31:0;-1:-1:-1;;;;;77731:31:0;;;;;;;;;;-1:-1:-1;77295:475:0:o;50270:124::-;-1:-1:-1;;;;;50359:27:0;50326:13;50359:27;;;:19;:27;;;;;;;50270:124::o;85301:167::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;85384:18;:32;;-1:-1:-1;;;;;85384:32:0;;-1:-1:-1;;;;;;85384:32:0;;;;;;;;85432:28;;;;;;;;;;;;;;;;85301:167;:::o;38996:57::-;;;;;;;;;;;;-1:-1:-1;;;;;38996:57:0;;:::o;82561:460::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;82813:6;-1:-1:-1;;;;;82834:25:0;;82830:82;;-1:-1:-1;82890:10:0;;-1:-1:-1;;;;;82890:10:0;82830:82;82924:89;82938:1;82941;82944;82947:4;82953:8;82963:9;82974:13;82989:10;83001:11;82924:13;:89::i;61549:32::-;;;;;;:::o;5406:83::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;5468:6;:13;;-1:-1:-1;;;;5468:13:0;-1:-1:-1;;;5468:13:0;;;5406:83::o;58331:915::-;58392:28;58433:18;58454:17;58464:6;58454:9;:17::i;:::-;58433:38;-1:-1:-1;58488:15:0;58484:755;;-1:-1:-1;;58565:16:0;;;58579:1;58565:16;;;;;;;;58558:23;;58484:755;58614:23;58654:10;58640:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;58640:25:0;;58614:51;;58680:20;58703:13;:11;:13::i;:::-;58680:36;-1:-1:-1;58731:19:0;58970:1;58954:244;58985:12;58973:8;:24;58954:244;;59034:28;;;;:18;:28;;;;;;-1:-1:-1;;;;;59034:38:0;;;:28;;:38;59030:153;;;59119:8;59097:6;59104:11;59097:19;;;;;;;;;;;;;;;;;:30;59150:13;;;;;59030:153;58999:10;;58954:244;;;59221:6;59214:13;;;;;;;;;2228:33;;;-1:-1:-1;;;;;2228:33:0;;:::o;81705:145::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;81771:11;;;;;;;;;-1:-1:-1;;;;;81771:11:0;-1:-1:-1;;;;;81771:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81771:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81771:29:0;;;;81811:13;;;;;;;;;-1:-1:-1;;;;;81811:13:0;-1:-1:-1;;;;;81811:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81811:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;76393:103:0;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;76465:14;:23;;-1:-1:-1;;76465:23:0;;;;;;;;;;;;76393:103::o;47410:39::-;;;;;;;;;;;;;;-1:-1:-1;;;47410:39:0;;;;:::o;45622:203::-;45714:47;;;;;;;;;;-1:-1:-1;;;;;45714:47:0;;;45729:10;;45714:47;;;;;;;;;45783:10;45772:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;45772:33:0;;;;;;;;;;;;;:45;;-1:-1:-1;;45772:45:0;;;;;;;;;;45622:203::o;53299:1024::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;-1:-1:-1;;;;;53501:17:0;;53493:26;;;;;;-1:-1:-1;;;;;53770:20:0;;53785:4;53770:20;;53762:29;;;;;;54030:11;;-1:-1:-1;;;;;54015:27:0;;;54030:11;;54015:27;;54007:36;;;;;;54077:13;;-1:-1:-1;;;;;54062:29:0;;;54077:13;;54062:29;;54054:38;;;;;;54160:27;54166:10;54178:8;54160:5;:27::i;:::-;54152:36;;;;;;54279;54289:10;54301:3;54306:8;54279:9;:36::i;2268:33::-;;;-1:-1:-1;;;;;2268:33:0;;:::o;61412:38::-;;;;:::o;51259:1130::-;-1:-1:-1;;;;;51389:17:0;;51381:26;;;;;;-1:-1:-1;;;;;51426:20:0;;51441:4;51426:20;;51418:29;;;;;;51481:11;;-1:-1:-1;;;;;51466:27:0;;;51481:11;;51466:27;;51458:36;;;;;;51528:13;;-1:-1:-1;;;;;51513:29:0;;;51528:13;;51513:29;;51505:38;;;;;;51707:13;51723:17;51731:8;51723:7;:17::i;:::-;51707:33;;51768:5;-1:-1:-1;;;;;51759:14:0;:5;-1:-1:-1;;;;;51759:14:0;;51751:23;;;;;;-1:-1:-1;;;;;51794:19:0;;51803:10;51794:19;;:68;;-1:-1:-1;51817:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;51817:31:0;51852:10;51817:45;51794:68;:101;;;-1:-1:-1;;;;;;51866:17:0;;;;;;:10;:17;;;;;;;;51884:10;51866:29;;;;;;;;;;51794:101;51785:111;;;;;;51997:31;52007:5;52014:3;52019:8;51997:9;:31::i;:::-;52095:16;;52137:8;;;;52134:248;;52308:60;;52213:3;;52308:60;;;;;;;;;;;;;;;-1:-1:-1;;;52240:57:0;;52266:10;52240:57;;;;;;-1:-1:-1;;;;;52240:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52240:129:0;;;;-1:-1:-1;52240:25:0;;;;;;52277:5;;52283:8;;52292:4;;52240:57;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52240:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52240:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52240:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52240:57:0;-1:-1:-1;;;;;;52240:129:0;;52232:138;;;;;;52134:248;;51259:1130;;;;;;:::o;15810:83::-;;;;;;;;;;;;;;;-1:-1:-1;;15810:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45833:1004::-;39498:1;39458:28;;;:18;:28;;;;;;45915:13;;45896:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;46000:20;;;45963:2;46000:20;;;;;;;;;45976:21;;45963:2;46000:20;;;21:6:-1;;104:10;46000:20:0;87:34:-1;135:17;;-1:-1;;46169:14:0;46152:32;;;;;;;;-1:-1:-1;;46152:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45976:44;;-1:-1:-1;46031:6:0;;46071:8;;46105:2;;46120:21;;46152:32;;46169:14;46152:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46197:193;46204:16;;46197:193;;46330:13;;46339:3;;;;46268:2;46299:16;;;;46254;;46357:19;;;46346:32;;;46330:8;;:13;;;;;;;;;:48;-1:-1:-1;;;;;46330:48:0;;;;;;;;;46197:193;;;;46402:14;46447:1;46429:8;:15;:19;46419:30;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46419:30:0;87:34:-1;135:17;;-1:-1;46419:30:0;-1:-1:-1;46402:47:0;-1:-1:-1;46460:6:0;46522:83;46538:8;:15;46534:1;:19;46522:83;;;46582:8;46591:1;46582:11;;;;;;;;;;;;;;;;46575:1;46577;46575:4;;;;;;;;;;;:18;-1:-1:-1;;;;;46575:18:0;;;;;;;;-1:-1:-1;46555:3:0;;46522:83;;;-1:-1:-1;46670:1:0;46661:95;46677:1;46673;:5;46661:95;;;46725:8;46742:1;46738;46734;:5;:9;46725:19;;;;;;;;;;;;;;;;46700:1;46706:8;:15;46702:1;:19;46700:22;;;;;;;;;;;:44;-1:-1:-1;;;;;46700:44:0;;;;;;;;-1:-1:-1;46680:3:0;;46661:95;;;-1:-1:-1;46827:1:0;45833:1004;-1:-1:-1;;;;;;;;;45833:1004:0:o;73527:2180::-;5075:6;;73714:7;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;3039:10;;-1:-1:-1;;;;;3039:10:0;3025;:24;3017:33;;;;;;73794:21;73818:7;73826:9;73818:18;;;;;;;;;;;;;;;;;;;;;73910:16;;;;73818:18;;-1:-1:-1;;;;;;73910:16:0;73902:30;;;;;;74028:27;74048:6;74028:19;:27::i;:::-;74020:36;;;;;;74139:19;;;;74191:7;:15;;-1:-1:-1;;;74139:19:0;;;;;;74122:14;;74191:7;74139:19;;74191:15;;;;;;;;;;;;;;74308:17;;;;;74191:15;;;;;;;74340;;;;74191;;-1:-1:-1;74308:17:0;-1:-1:-1;;;74308:17:0;;;;;;;74340:15;;;;:35;-1:-1:-1;74336:95:0;;;-1:-1:-1;74404:15:0;;;;-1:-1:-1;;;74404:15:0;;;;74336:95;74501:16;74520:9;74501:28;;74540:14;74557:8;74540:25;;74576:15;74594:9;74576:27;;74614:19;74636:13;74614:35;;74660:16;74679:10;74660:29;;74702:16;74721:4;74702:23;;74771:13;74787:18;:28;74806:8;74787:28;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74787:28:0;74771:44;;74983:16;75002:107;75016:8;75026:6;75034:9;75046:1;75034:13;75002:107;;75049:8;75059:7;75068:8;75078:12;75092:9;75103:5;75002:13;:107::i;:::-;75171:18;;;;:8;:18;;;;;;:20;;-1:-1:-1;;75171:20:0;;;-1:-1:-1;;;;;75171:20:0;;;;;;;;;;;;75357:19;;75350:26;;-1:-1:-1;;;;75350:26:0;;;75457:15;:17;;-1:-1:-1;;75457:17:0;;;75619:12;;75599:33;;74983:126;;-1:-1:-1;75599:10:0;;:33;;;;;;75171:18;75599:33;75619:12;75599:10;:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;75691:8:0;-1:-1:-1;;;;;;;;;;;;73527:2180:0;;;;;;;;:::o;65067:225::-;65146:4;65188:1;65176:9;:13;65168:22;;;;;;65201:21;65225:7;65233:9;65225:18;;;;;;;;;;;;;;;;;;65201:42;;65261:23;65277:6;65261:15;:23::i;:::-;65254:30;65067:225;-1:-1:-1;;;65067:225:0:o;15900:33::-;;;;;;;;;;;;;;;-1:-1:-1;;15900:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85969:990;86049:11;86071:17;86099;86127:16;86154:14;86179:20;86210:18;86239:17;86267:15;86293:16;86320:20;86359:21;86383:7;86391:3;86383:12;;;;;;;;;;;;;;;;;;86359:36;;86406:32;86441:12;:17;86454:3;86441:17;;;;;;;;;;;86406:52;;86477:6;:10;;;86471:16;;86518:6;:16;;;;;;;;;;-1:-1:-1;;;;;86518:16:0;-1:-1:-1;;;;;86510:25:0;86498:37;;86566:6;:16;;;;;;;;;;-1:-1:-1;;;;;86566:16:0;-1:-1:-1;;;;;86558:25:0;86546:37;;86613:6;:15;;;;;;;;;;;;86605:24;;86594:35;;86657:6;:13;;;;;;;;;;;;86649:22;;86640:31;;86705:6;:19;;;;;;;;;;;;86697:28;;86682:43;;86757:6;:17;;;;;;;;;;;;86749:26;;86736:39;;86798:11;:21;;;;;;;;;;-1:-1:-1;;;;;86798:21:0;-1:-1:-1;;;;;86786:33:0;;;86840:11;:19;;;;;;;;;;-1:-1:-1;;;;;86840:19:0;-1:-1:-1;;;;;86830:29:0;;;86881:11;:20;;;;;;;;;;-1:-1:-1;;;;;86881:20:0;-1:-1:-1;;;;;86870:31:0;;;86927:11;:24;;;;;;;;;;-1:-1:-1;;;;;86927:24:0;-1:-1:-1;;;;;86912:39:0;;;85969:990;;;;;;;;;;;;;;;:::o;81916:207::-;81980:7;3295:10;;81980:7;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;-1:-1:-1;;82039:11:0;;82082:13;;-1:-1:-1;;;;;82039:11:0;;;82031:28;;82082:13;82074:30;81916:207;;:::o;39309:35::-;;;-1:-1:-1;;;;;39309:35:0;;:::o;39260:40::-;;;;:::o;45069:150::-;-1:-1:-1;;;;;45182:18:0;;;45153:4;45182:18;;;:10;:18;;;;;;;;:29;;;;;;;;;;;;;;;45069:150::o;80777:723::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;80984:28;80990:10;81002:9;80984:5;:28::i;:::-;80976:37;;;;;;81032:25;81047:9;81032:14;:25::i;:::-;81024:34;;;;;;81077:43;81101:9;81112:7;81077:23;:43::i;:::-;81069:52;;;;;;81210:13;;:38;;;-1:-1:-1;;;81210:38:0;;;;;;;;;;81187:20;;-1:-1:-1;;;;;81210:13:0;;:29;;:38;;;;;;;;;;;;;;:13;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;81210:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81210:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;81210:38:0;81295:12;;81210:38;;-1:-1:-1;81280:27:0;;81267:9;:40;;81259:49;;;;;;81377:13;;81413:12;;81377:58;;;-1:-1:-1;;;81377:58:0;;;;;;;;;;-1:-1:-1;;;;;81377:13:0;;;;:17;;81401:9;:24;;81377:58;;;;;:13;;:58;;;;;;;;81401:24;81377:13;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;81377:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81377:58:0;;;;;81446:46;81464:9;81446:46;;81483:7;81446:46;;:10;:46::i;70505:2095::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;70679:12;;70666:9;:25;;70658:34;;;;;;70753:28;70759:10;70771:9;70753:5;:28::i;:::-;70745:37;;;;;;71699:38;71718:7;71727:9;71699:18;:38::i;:::-;71691:47;;;;;;71804:21;71828:7;71836:9;71828:18;;;;;;;;;;;;;;;;;;71804:42;;71950:23;71966:6;71950:15;:23::i;:::-;71942:32;;;;;;72038:19;72060:7;72068;72060:16;;;;;;;;;;;;;;;;;;72038:38;;72178:21;72194:4;72178:15;:21::i;:::-;72170:30;;;;;;72246:16;;;:30;;-1:-1:-1;;;;72246:30:0;-1:-1:-1;;;72272:3:0;-1:-1:-1;;;;;72246:30:0;;;;;72358:135;72246:16;72420:9;72448:4;72471:7;72358:18;:135::i;:::-;72350:144;;;;;;72562:30;72573:9;72584:7;72562:10;:30::i;44336:426::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;44481:14;;44468:9;:27;;44460:36;;;;;;44509:39;44551:23;;;:12;:23;;;;;44601:28;;-1:-1:-1;;;;;44601:28:0;44593:36;;44585:45;;;;;;44648:29;;;;;;;;;;;;;;;;;5093:1;44336:426;;:::o;48580:173::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;48686:24;:14;48703:7;;48686:24;:::i;:::-;-1:-1:-1;48721:24:0;:14;48738:7;;48721:24;:::i;:::-;;48580:173;;;;:::o;49963:126::-;50038:31;;;;:21;:31;;;;;;:43;;-1:-1:-1;;;;;;50038:43:0;-1:-1:-1;;;;;50038:43:0;;;;;;;;;49963:126::o;39597:994::-;-1:-1:-1;;;;;39838:24:0;;;;;;;:19;:24;;;;;;;;:26;;;;;;39987:28;;;:18;:28;;;;;:34;;-1:-1:-1;;;;;;39987:34:0;;;;;;40123:19;;;40119:324;;-1:-1:-1;;;;;40159:26:0;;;;;;:19;:26;;;;;;;;:28;;-1:-1:-1;;40159:28:0;;;40283:30;;;:20;:30;;;;;40276:37;;-1:-1:-1;;;;;;40276:37:0;;;;;;40400:21;:31;;;;;;40393:38;;;;;;;40119:324;40574:8;40569:3;-1:-1:-1;;;;;40553:30:0;40562:5;-1:-1:-1;;;;;40553:30:0;;;;;;;;;;;39597:994;;;:::o;41490:1813::-;41792:4;41850:9;41835:26;;41822:9;:39;41814:48;;;;;;41907:7;41892:24;;41881:7;:35;41873:44;;;;;;41966:11;41951:28;;41936:11;:43;41928:52;;;;;;41993:21;;:::i;:::-;-1:-1:-1;42017:267:0;;;;;;;;;;;-1:-1:-1;;;;;42081:3:0;42017:267;;;;;-1:-1:-1;42017:267:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42297:33;;:::i;:::-;42333:173;;;;;;;;42372:10;-1:-1:-1;;;;;42333:173:0;;;;;42406:8;-1:-1:-1;;;;;42333:173:0;;;;;42439:9;-1:-1:-1;;;;;42333:173:0;;;;;42477:13;-1:-1:-1;;;;;42333:173:0;;;;42297:209;;42519:19;42565:1;42541:7;42554;42541:21;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;42541:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42541:21:0;;;;;-1:-1:-1;;;;;42541:21:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42541:21:0;;;;;-1:-1:-1;;;;;42541:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;42519:47;;42607:13;42579:12;:25;42592:11;42579:25;;;;;;;;;;;:41;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;42814:11;42799:28;;42784:11;:43;42776:52;;;;;;42954:16;;;;;42994:14;;;;;43024:11;;43050:18;;;;;42879:225;;;-1:-1:-1;;;;;42879:225:0;;;;;;;;;;42946:25;;;;42879:225;;;;42986:23;;;42879:225;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42879:225:0;;;;;;;;;;;;;;;;;43222:42;43240:1;43244:6;43252:11;43222:9;:42::i;:::-;43284:11;41490:1813;-1:-1:-1;;;;;;;;;;;;41490:1813:0:o;48967:148::-;49042:4;49066:28;;;:18;:28;;;;;;-1:-1:-1;;;;;49066:41:0;;;:28;;:41;;48967:148::o;5784:129::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;5891:6;:14;;-1:-1:-1;;;;5891:14:0;;;5784:129::o;66107:1492::-;66344:14;;66296:4;66321:19;;;:8;:19;;;;;;66296:4;;66344:14;;-1:-1:-1;;;;;66321:19:0;;;:37;66318:81;;-1:-1:-1;66382:5:0;66375:12;;66318:81;66433:9;;66484:11;;66445:4;66433:16;;;;;66484:18;;66519:28;;;66515:71;;66569:5;66562:12;;;;;;66515:71;66661:7;66648:9;:20;66644:65;;;66692:5;66685:12;;;;;;66644:65;66777:16;;;;-1:-1:-1;;;66777:16:0;;;;:27;;;:56;;-1:-1:-1;66808:14:0;;;;-1:-1:-1;;;66808:14:0;;;;:25;;66777:56;66773:101;;;66857:5;66850:12;;;;;;66773:101;66890:14;;;;-1:-1:-1;;;66890:14:0;;;;:27;;;:56;;-1:-1:-1;66921:12:0;;;;-1:-1:-1;;;66921:12:0;;;;:25;;66890:56;66886:101;;;66970:5;66963:12;;;;;;66886:101;67126:14;;;;-1:-1:-1;;;67126:14:0;;;;:19;;:44;;-1:-1:-1;67149:16:0;;;;-1:-1:-1;;;67149:16:0;;;;:21;67126:44;67122:88;;;67194:4;67187:11;;;;;;67122:88;67304:16;;;;;67286:14;;;;-1:-1:-1;;;67304:16:0;;;;;;;;67286:14;;;;;:34;;:70;;-1:-1:-1;67342:14:0;;;;;67324;;;;-1:-1:-1;;;67324:14:0;;67342;67324;;;-1:-1:-1;;;67342:14:0;;;;67324:32;67286:70;67282:115;;;67380:5;67373:12;;;;;;67282:115;67427:16;;;;;67411:12;;;;-1:-1:-1;;;67411:12:0;;67427:16;67411:12;;;-1:-1:-1;;;67427:16:0;;;;67411:32;;:66;;-1:-1:-1;67463:14:0;;;;;67447:12;;;;-1:-1:-1;;;67463:14:0;;;;;;;;67447:12;;;;;:30;67411:66;67407:111;;;67501:5;67494:12;;;;;;67407:111;67587:4;67580:11;;;;66107:1492;;;;;;;:::o;63288:450::-;63375:4;63414:29;;;:18;:29;;;;;;;63474:27;;;;;;;-1:-1:-1;;;;;63414:29:0;;;;63474:27;63657:24;;;;:72;;-1:-1:-1;63685:29:0;;;;:20;:29;;;;;;-1:-1:-1;;;;;63685:29:0;;;:44;;;;63649:81;;;;63288:450;;;;:::o;64701:134::-;64801:20;;;-1:-1:-1;;;64801:20:0;;;;:25;;;64701:134::o;62681:369::-;63016:20;;;-1:-1:-1;;;63016:20:0;;;;:25;;62681:369::o;67780:298::-;67887:4;67909:21;67933:7;67941:9;67933:18;;;;;;;;;;;;;;;;;;67909:42;;67962:19;67984:7;67992;67984:16;;;;;;;;;;;;;;;;;;67962:38;;68018:52;68037:6;68045:9;68056:4;68062:7;68018:18;:52::i;69062:927::-;69248:21;69272:7;69280:9;69272:18;;;;;;;;;;;;;;;;69378:19;69272:18;;;;;69378:19;;;:37;;;;;-1:-1:-1;;;69378:37:0;-1:-1:-1;;;;69378:37:0;;;;;;69687:31;;;:20;:31;;;;;;69680:38;;-1:-1:-1;;;;;;69680:38:0;;;;;;69736:29;;;;;;69729:36;;;;;;;69849:15;:17;;;;;;;;69931:29;;;:18;:29;;;;;;;69922:59;;-1:-1:-1;;;;;69931:29:0;;;;69922:59;;;;;;;;;;;;;;;;69272:18;;-1:-1:-1;69922:59:0;;;;;;;;;;69062:927;;;:::o;83928:4367::-;;;;;;;;;-1:-1:-1;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;83928:4367:0;;;-1:-1:-1;83928:4367:0;:::i;:::-;;;:::o;:::-;;;;;;;;;-1:-1:-1;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://a2519486d7e80a0b5f8dc4d89b1b059c0dc278b9f2a407309cb4f51303a42b38
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.