Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LANDRegistry
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-07-17 */ pragma solidity ^0.4.24; // File: contracts/upgradable/ProxyStorage.sol contract ProxyStorage { /** * Current contract to which we are proxing */ address public currentContract; address public proxyOwner; } // File: contracts/upgradable/OwnableStorage.sol contract OwnableStorage { address public owner; constructor() internal { owner = msg.sender; } } // File: erc821/contracts/AssetRegistryStorage.sol contract AssetRegistryStorage { string internal _name; string internal _symbol; string internal _description; /** * Stores the total count of assets managed by this registry */ uint256 internal _count; /** * Stores an array of assets owned by a given account */ mapping(address => uint256[]) internal _assetsOf; /** * Stores the current holder of an asset */ mapping(uint256 => address) internal _holderOf; /** * Stores the index of an asset in the `_assetsOf` array of its holder */ mapping(uint256 => uint256) internal _indexOfAsset; /** * Stores the data associated with an asset */ mapping(uint256 => string) internal _assetData; /** * For a given account, for a given operator, store whether that operator is * allowed to transfer and modify assets on behalf of them. */ mapping(address => mapping(address => bool)) internal _operators; /** * Approval array */ mapping(uint256 => address) internal _approval; } // File: contracts/estate/IEstateRegistry.sol contract IEstateRegistry { function mint(address to, string metadata) external returns (uint256); function ownerOf(uint256 _tokenId) public view returns (address _owner); // from ERC721 // Events event CreateEstate( address indexed _owner, uint256 indexed _estateId, string _data ); event AddLand( uint256 indexed _estateId, uint256 indexed _landId ); event RemoveLand( uint256 indexed _estateId, uint256 indexed _landId, address indexed _destinatary ); event Update( uint256 indexed _assetId, address indexed _holder, address indexed _operator, string _data ); event UpdateOperator( uint256 indexed _estateId, address indexed _operator ); event UpdateManager( address indexed _owner, address indexed _operator, address indexed _caller, bool _approved ); event SetLANDRegistry( address indexed _registry ); event SetEstateLandBalanceToken( address indexed _previousEstateLandBalance, address indexed _newEstateLandBalance ); } // File: contracts/minimeToken/IMinimeToken.sol interface IMiniMeToken { //////////////// // Generate and destroy tokens //////////////// /// @notice Generates `_amount` tokens that are assigned to `_owner` /// @param _owner The address that will be assigned the new tokens /// @param _amount The quantity of tokens generated /// @return True if the tokens are generated correctly function generateTokens(address _owner, uint _amount) external returns (bool); /// @notice Burns `_amount` tokens from `_owner` /// @param _owner The address that will lose the tokens /// @param _amount The quantity of tokens to burn /// @return True if the tokens are burned correctly function destroyTokens(address _owner, uint _amount) external returns (bool); /// @param _owner The address that's balance is being requested /// @return The balance of `_owner` at the current block function balanceOf(address _owner) external view returns (uint256 balance); event Transfer(address indexed _from, address indexed _to, uint256 _amount); } // File: contracts/land/LANDStorage.sol contract LANDStorage { mapping (address => uint) public latestPing; uint256 constant clearLow = 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000; uint256 constant clearHigh = 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff; uint256 constant factor = 0x100000000000000000000000000000000; mapping (address => bool) internal _deprecated_authorizedDeploy; mapping (uint256 => address) public updateOperator; IEstateRegistry public estateRegistry; mapping (address => bool) public authorizedDeploy; mapping(address => mapping(address => bool)) public updateManager; // Land balance minime token IMiniMeToken public landBalance; // Registered balance accounts mapping(address => bool) public registeredBalance; } // File: contracts/Storage.sol contract Storage is ProxyStorage, OwnableStorage, AssetRegistryStorage, LANDStorage { } // File: contracts/upgradable/Ownable.sol contract Ownable is Storage { event OwnerUpdate(address _prevOwner, address _newOwner); modifier onlyOwner { assert(msg.sender == owner); _; } function transferOwnership(address _newOwner) public onlyOwner { require(_newOwner != owner, "Cannot transfer to yourself"); owner = _newOwner; } } // File: contracts/upgradable/IApplication.sol contract IApplication { function initialize(bytes data) public; } // File: openzeppelin-solidity/contracts/math/SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } // File: erc821/contracts/IERC721Base.sol interface IERC721Base { function totalSupply() external view returns (uint256); // function exists(uint256 assetId) external view returns (bool); function ownerOf(uint256 assetId) external view returns (address); function balanceOf(address holder) external view returns (uint256); function safeTransferFrom(address from, address to, uint256 assetId) external; function safeTransferFrom(address from, address to, uint256 assetId, bytes userData) external; function transferFrom(address from, address to, uint256 assetId) external; function approve(address operator, uint256 assetId) external; function setApprovalForAll(address operator, bool authorized) external; function getApprovedAddress(uint256 assetId) external view returns (address); function isApprovedForAll(address assetHolder, address operator) external view returns (bool); function isAuthorized(address operator, uint256 assetId) external view returns (bool); /** * @dev Deprecated transfer event. Now we use the standard with three parameters * It is only used in the ABI to get old transfer events. Do not remove */ event Transfer( address indexed from, address indexed to, uint256 indexed assetId, address operator, bytes userData, bytes operatorData ); /** * @dev Deprecated transfer event. Now we use the standard with three parameters * It is only used in the ABI to get old transfer events. Do not remove */ event Transfer( address indexed from, address indexed to, uint256 indexed assetId, address operator, bytes userData ); event Transfer( address indexed from, address indexed to, uint256 indexed assetId ); event ApprovalForAll( address indexed holder, address indexed operator, bool authorized ); event Approval( address indexed owner, address indexed operator, uint256 indexed assetId ); } // File: erc821/contracts/IERC721Receiver.sol interface IERC721Receiver { function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _userData ) external returns (bytes4); } // File: erc821/contracts/ERC165.sol interface ERC165 { function supportsInterface(bytes4 interfaceID) external view returns (bool); } // File: erc821/contracts/ERC721Base.sol contract ERC721Base is AssetRegistryStorage, IERC721Base, ERC165 { using SafeMath for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` bytes4 private constant ERC721_RECEIVED = 0x150b7a02; bytes4 private constant InterfaceId_ERC165 = 0x01ffc9a7; /* * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ bytes4 private constant Old_InterfaceId_ERC721 = 0x7c0633c6; bytes4 private constant InterfaceId_ERC721 = 0x80ac58cd; /* * 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ // // Global Getters // /** * @dev Gets the total amount of assets stored by the contract * @return uint256 representing the total amount of assets */ function totalSupply() external view returns (uint256) { return _totalSupply(); } function _totalSupply() internal view returns (uint256) { return _count; } // // Asset-centric getter functions // /** * @dev Queries what address owns an asset. This method does not throw. * In order to check if the asset exists, use the `exists` function or check if the * return value of this call is `0`. * @return uint256 the assetId */ function ownerOf(uint256 assetId) external view returns (address) { return _ownerOf(assetId); } function _ownerOf(uint256 assetId) internal view returns (address) { return _holderOf[assetId]; } // // Holder-centric getter functions // /** * @dev Gets the balance of the specified address * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) external view returns (uint256) { return _balanceOf(owner); } function _balanceOf(address owner) internal view returns (uint256) { return _assetsOf[owner].length; } // // Authorization getters // /** * @dev Query whether an address has been authorized to move any assets on behalf of someone else * @param operator the address that might be authorized * @param assetHolder the address that provided the authorization * @return bool true if the operator has been authorized to move any assets */ function isApprovedForAll(address assetHolder, address operator) external view returns (bool) { return _isApprovedForAll(assetHolder, operator); } function _isApprovedForAll(address assetHolder, address operator) internal view returns (bool) { return _operators[assetHolder][operator]; } /** * @dev Query what address has been particularly authorized to move an asset * @param assetId the asset to be queried for * @return bool true if the asset has been approved by the holder */ function getApproved(uint256 assetId) external view returns (address) { return _getApprovedAddress(assetId); } function getApprovedAddress(uint256 assetId) external view returns (address) { return _getApprovedAddress(assetId); } function _getApprovedAddress(uint256 assetId) internal view returns (address) { return _approval[assetId]; } /** * @dev Query if an operator can move an asset. * @param operator the address that might be authorized * @param assetId the asset that has been `approved` for transfer * @return bool true if the asset has been approved by the holder */ function isAuthorized(address operator, uint256 assetId) external view returns (bool) { return _isAuthorized(operator, assetId); } function _isAuthorized(address operator, uint256 assetId) internal view returns (bool) { require(operator != 0); address owner = _ownerOf(assetId); if (operator == owner) { return true; } return _isApprovedForAll(owner, operator) || _getApprovedAddress(assetId) == operator; } // // Authorization // /** * @dev Authorize a third party operator to manage (send) msg.sender's asset * @param operator address to be approved * @param authorized bool set to true to authorize, false to withdraw authorization */ function setApprovalForAll(address operator, bool authorized) external { return _setApprovalForAll(operator, authorized); } function _setApprovalForAll(address operator, bool authorized) internal { if (authorized) { require(!_isApprovedForAll(msg.sender, operator)); _addAuthorization(operator, msg.sender); } else { require(_isApprovedForAll(msg.sender, operator)); _clearAuthorization(operator, msg.sender); } emit ApprovalForAll(msg.sender, operator, authorized); } /** * @dev Authorize a third party operator to manage one particular asset * @param operator address to be approved * @param assetId asset to approve */ function approve(address operator, uint256 assetId) external { address holder = _ownerOf(assetId); require(msg.sender == holder || _isApprovedForAll(msg.sender, holder)); require(operator != holder); if (_getApprovedAddress(assetId) != operator) { _approval[assetId] = operator; emit Approval(holder, operator, assetId); } } function _addAuthorization(address operator, address holder) private { _operators[holder][operator] = true; } function _clearAuthorization(address operator, address holder) private { _operators[holder][operator] = false; } // // Internal Operations // function _addAssetTo(address to, uint256 assetId) internal { _holderOf[assetId] = to; uint256 length = _balanceOf(to); _assetsOf[to].push(assetId); _indexOfAsset[assetId] = length; _count = _count.add(1); } function _removeAssetFrom(address from, uint256 assetId) internal { uint256 assetIndex = _indexOfAsset[assetId]; uint256 lastAssetIndex = _balanceOf(from).sub(1); uint256 lastAssetId = _assetsOf[from][lastAssetIndex]; _holderOf[assetId] = 0; // Insert the last asset into the position previously occupied by the asset to be removed _assetsOf[from][assetIndex] = lastAssetId; // Resize the array _assetsOf[from][lastAssetIndex] = 0; _assetsOf[from].length--; // Remove the array if no more assets are owned to prevent pollution if (_assetsOf[from].length == 0) { delete _assetsOf[from]; } // Update the index of positions for the asset _indexOfAsset[assetId] = 0; _indexOfAsset[lastAssetId] = assetIndex; _count = _count.sub(1); } function _clearApproval(address holder, uint256 assetId) internal { if (_ownerOf(assetId) == holder && _approval[assetId] != 0) { _approval[assetId] = 0; emit Approval(holder, 0, assetId); } } // // Supply-altering functions // function _generate(uint256 assetId, address beneficiary) internal { require(_holderOf[assetId] == 0); _addAssetTo(beneficiary, assetId); emit Transfer(0, beneficiary, assetId); } function _destroy(uint256 assetId) internal { address holder = _holderOf[assetId]; require(holder != 0); _removeAssetFrom(holder, assetId); emit Transfer(holder, 0, assetId); } // // Transaction related operations // modifier onlyHolder(uint256 assetId) { require(_ownerOf(assetId) == msg.sender); _; } modifier onlyAuthorized(uint256 assetId) { require(_isAuthorized(msg.sender, assetId)); _; } modifier isCurrentOwner(address from, uint256 assetId) { require(_ownerOf(assetId) == from); _; } modifier isDestinataryDefined(address destinatary) { require(destinatary != 0); _; } modifier destinataryIsNotHolder(uint256 assetId, address to) { require(_ownerOf(assetId) != to); _; } /** * @dev Alias of `safeTransferFrom(from, to, assetId, '')` * * @param from address that currently owns an asset * @param to address to receive the ownership of the asset * @param assetId uint256 ID of the asset to be transferred */ function safeTransferFrom(address from, address to, uint256 assetId) external { return _doTransferFrom(from, to, assetId, '', true); } /** * @dev Securely transfers the ownership of a given asset from one address to * another address, calling the method `onNFTReceived` on the target address if * there's code associated with it * * @param from address that currently owns an asset * @param to address to receive the ownership of the asset * @param assetId uint256 ID of the asset to be transferred * @param userData bytes arbitrary user information to attach to this transfer */ function safeTransferFrom(address from, address to, uint256 assetId, bytes userData) external { return _doTransferFrom(from, to, assetId, userData, true); } /** * @dev Transfers the ownership of a given asset from one address to another address * Warning! This function does not attempt to verify that the target address can send * tokens. * * @param from address sending the asset * @param to address to receive the ownership of the asset * @param assetId uint256 ID of the asset to be transferred */ function transferFrom(address from, address to, uint256 assetId) external { return _doTransferFrom(from, to, assetId, '', false); } function _doTransferFrom( address from, address to, uint256 assetId, bytes userData, bool doCheck ) onlyAuthorized(assetId) internal { _moveToken(from, to, assetId, userData, doCheck); } function _moveToken( address from, address to, uint256 assetId, bytes userData, bool doCheck ) isDestinataryDefined(to) destinataryIsNotHolder(assetId, to) isCurrentOwner(from, assetId) private { address holder = _holderOf[assetId]; _clearApproval(holder, assetId); _removeAssetFrom(holder, assetId); _addAssetTo(to, assetId); emit Transfer(holder, to, assetId); if (doCheck && _isContract(to)) { // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")) require( IERC721Receiver(to).onERC721Received( msg.sender, holder, assetId, userData ) == ERC721_RECEIVED ); } } /** * Internal function that moves an asset from one holder to another */ /** * @dev Returns `true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise * @param _interfaceID The interface identifier, as specified in ERC-165 */ function supportsInterface(bytes4 _interfaceID) external view returns (bool) { if (_interfaceID == 0xffffffff) { return false; } return _interfaceID == InterfaceId_ERC165 || _interfaceID == Old_InterfaceId_ERC721 || _interfaceID == InterfaceId_ERC721; } // // Utilities // function _isContract(address addr) internal view returns (bool) { uint size; assembly { size := extcodesize(addr) } return size > 0; } } // File: erc821/contracts/IERC721Enumerable.sol contract IERC721Enumerable { /** * @notice Enumerate active tokens * @dev Throws if `index` >= `totalSupply()`, otherwise SHALL NOT throw. * @param index A counter less than `totalSupply()` * @return The identifier for the `index`th asset, (sort order not * specified) */ // TODO (eordano): Not implemented // function tokenByIndex(uint256 index) public view returns (uint256 _assetId); /** * @notice Count of owners which own at least one asset * Must not throw. * @return A count of the number of owners which own asset */ // TODO (eordano): Not implemented // function countOfOwners() public view returns (uint256 _count); /** * @notice Enumerate owners * @dev Throws if `index` >= `countOfOwners()`, otherwise must not throw. * @param index A counter less than `countOfOwners()` * @return The address of the `index`th owner (sort order not specified) */ // TODO (eordano): Not implemented // function ownerByIndex(uint256 index) public view returns (address owner); /** * @notice Get all tokens of a given address * @dev This is not intended to be used on-chain * @param owner address of the owner to query * @return a list of all assetIds of a user */ function tokensOf(address owner) external view returns (uint256[]); /** * @notice Enumerate tokens assigned to an owner * @dev Throws if `index` >= `balanceOf(owner)` or if * `owner` is the zero address, representing invalid assets. * Otherwise this must not throw. * @param owner An address where we are interested in assets owned by them * @param index A counter less than `balanceOf(owner)` * @return The identifier for the `index`th asset assigned to `owner`, * (sort order not specified) */ function tokenOfOwnerByIndex( address owner, uint256 index ) external view returns (uint256 tokenId); } // File: erc821/contracts/ERC721Enumerable.sol contract ERC721Enumerable is AssetRegistryStorage, IERC721Enumerable { /** * @notice Get all tokens of a given address * @dev This is not intended to be used on-chain * @param owner address of the owner to query * @return a list of all assetIds of a user */ function tokensOf(address owner) external view returns (uint256[]) { return _assetsOf[owner]; } /** * @notice Enumerate tokens assigned to an owner * @dev Throws if `index` >= `balanceOf(owner)` or if * `owner` is the zero address, representing invalid assets. * Otherwise this must not throw. * @param owner An address where we are interested in assets owned by them * @param index A counter less than `balanceOf(owner)` * @return The identifier for the `index`th asset assigned to `owner`, * (sort order not specified) */ function tokenOfOwnerByIndex( address owner, uint256 index ) external view returns (uint256 assetId) { require(index < _assetsOf[owner].length); require(index < (1<<127)); return _assetsOf[owner][index]; } } // File: erc821/contracts/IERC721Metadata.sol contract IERC721Metadata { /** * @notice A descriptive name for a collection of NFTs in this contract */ function name() external view returns (string); /** * @notice An abbreviated name for NFTs in this contract */ function symbol() external view returns (string); /** * @notice A description of what this DAR is used for */ function description() external view returns (string); /** * Stores arbitrary info about a token */ function tokenMetadata(uint256 assetId) external view returns (string); } // File: erc821/contracts/ERC721Metadata.sol contract ERC721Metadata is AssetRegistryStorage, IERC721Metadata { function name() external view returns (string) { return _name; } function symbol() external view returns (string) { return _symbol; } function description() external view returns (string) { return _description; } function tokenMetadata(uint256 assetId) external view returns (string) { return _assetData[assetId]; } function _update(uint256 assetId, string data) internal { _assetData[assetId] = data; } } // File: erc821/contracts/FullAssetRegistry.sol contract FullAssetRegistry is ERC721Base, ERC721Enumerable, ERC721Metadata { constructor() public { } /** * @dev Method to check if an asset identified by the given id exists under this DAR. * @return uint256 the assetId */ function exists(uint256 assetId) external view returns (bool) { return _exists(assetId); } function _exists(uint256 assetId) internal view returns (bool) { return _holderOf[assetId] != 0; } function decimals() external pure returns (uint256) { return 0; } } // File: contracts/land/ILANDRegistry.sol interface ILANDRegistry { // LAND can be assigned by the owner function assignNewParcel(int x, int y, address beneficiary) external; function assignMultipleParcels(int[] x, int[] y, address beneficiary) external; // After one year, LAND can be claimed from an inactive public key function ping() external; // LAND-centric getters function encodeTokenId(int x, int y) external pure returns (uint256); function decodeTokenId(uint value) external pure returns (int, int); function exists(int x, int y) external view returns (bool); function ownerOfLand(int x, int y) external view returns (address); function ownerOfLandMany(int[] x, int[] y) external view returns (address[]); function landOf(address owner) external view returns (int[], int[]); function landData(int x, int y) external view returns (string); // Transfer LAND function transferLand(int x, int y, address to) external; function transferManyLand(int[] x, int[] y, address to) external; // Update LAND function updateLandData(int x, int y, string data) external; function updateManyLandData(int[] x, int[] y, string data) external; // Authorize an updateManager to manage parcel data function setUpdateManager(address _owner, address _operator, bool _approved) external; // Events event Update( uint256 indexed assetId, address indexed holder, address indexed operator, string data ); event UpdateOperator( uint256 indexed assetId, address indexed operator ); event UpdateManager( address indexed _owner, address indexed _operator, address indexed _caller, bool _approved ); event DeployAuthorized( address indexed _caller, address indexed _deployer ); event DeployForbidden( address indexed _caller, address indexed _deployer ); event SetLandBalanceToken( address indexed _previousLandBalance, address indexed _newLandBalance ); } // File: contracts/metadata/IMetadataHolder.sol contract IMetadataHolder is ERC165 { function getMetadata(uint256 /* assetId */) external view returns (string); } // File: contracts/land/LANDRegistry.sol /* solium-disable function-order */ contract LANDRegistry is Storage, Ownable, FullAssetRegistry, ILANDRegistry { bytes4 constant public GET_METADATA = bytes4(keccak256("getMetadata(uint256)")); function initialize(bytes) external { _name = "Decentraland LAND"; _symbol = "LAND"; _description = "Contract that stores the Decentraland LAND registry"; } modifier onlyProxyOwner() { require(msg.sender == proxyOwner, "This function can only be called by the proxy owner"); _; } modifier onlyDeployer() { require( msg.sender == proxyOwner || authorizedDeploy[msg.sender], "This function can only be called by an authorized deployer" ); _; } modifier onlyOwnerOf(uint256 assetId) { require( msg.sender == _ownerOf(assetId), "This function can only be called by the owner of the asset" ); _; } modifier onlyUpdateAuthorized(uint256 tokenId) { require( msg.sender == _ownerOf(tokenId) || _isAuthorized(msg.sender, tokenId) || _isUpdateAuthorized(msg.sender, tokenId), "msg.sender is not authorized to update" ); _; } modifier canSetUpdateOperator(uint256 tokenId) { address owner = _ownerOf(tokenId); require( _isAuthorized(msg.sender, tokenId) || updateManager[owner][msg.sender], "unauthorized user" ); _; } // // Authorization // function isUpdateAuthorized(address operator, uint256 assetId) external view returns (bool) { return _isUpdateAuthorized(operator, assetId); } function _isUpdateAuthorized(address operator, uint256 assetId) internal view returns (bool) { address owner = _ownerOf(assetId); return owner == operator || updateOperator[assetId] == operator || updateManager[owner][operator]; } function authorizeDeploy(address beneficiary) external onlyProxyOwner { require(beneficiary != address(0), "invalid address"); require(authorizedDeploy[beneficiary] == false, "address is already authorized"); authorizedDeploy[beneficiary] = true; emit DeployAuthorized(msg.sender, beneficiary); } function forbidDeploy(address beneficiary) external onlyProxyOwner { require(beneficiary != address(0), "invalid address"); require(authorizedDeploy[beneficiary], "address is already forbidden"); authorizedDeploy[beneficiary] = false; emit DeployForbidden(msg.sender, beneficiary); } // // LAND Create // function assignNewParcel(int x, int y, address beneficiary) external onlyDeployer { _generate(_encodeTokenId(x, y), beneficiary); _updateLandBalance(address(0), beneficiary); } function assignMultipleParcels(int[] x, int[] y, address beneficiary) external onlyDeployer { for (uint i = 0; i < x.length; i++) { _generate(_encodeTokenId(x[i], y[i]), beneficiary); _updateLandBalance(address(0), beneficiary); } } // // Inactive keys after 1 year lose ownership // function ping() external { // solium-disable-next-line security/no-block-members latestPing[msg.sender] = block.timestamp; } function setLatestToNow(address user) external { require(msg.sender == proxyOwner || _isApprovedForAll(msg.sender, user), "Unauthorized user"); // solium-disable-next-line security/no-block-members latestPing[user] = block.timestamp; } // // LAND Getters // function encodeTokenId(int x, int y) external pure returns (uint) { return _encodeTokenId(x, y); } function _encodeTokenId(int x, int y) internal pure returns (uint result) { require( -1000000 < x && x < 1000000 && -1000000 < y && y < 1000000, "The coordinates should be inside bounds" ); return _unsafeEncodeTokenId(x, y); } function _unsafeEncodeTokenId(int x, int y) internal pure returns (uint) { return ((uint(x) * factor) & clearLow) | (uint(y) & clearHigh); } function decodeTokenId(uint value) external pure returns (int, int) { return _decodeTokenId(value); } function _unsafeDecodeTokenId(uint value) internal pure returns (int x, int y) { x = expandNegative128BitCast((value & clearLow) >> 128); y = expandNegative128BitCast(value & clearHigh); } function _decodeTokenId(uint value) internal pure returns (int x, int y) { (x, y) = _unsafeDecodeTokenId(value); require( -1000000 < x && x < 1000000 && -1000000 < y && y < 1000000, "The coordinates should be inside bounds" ); } function expandNegative128BitCast(uint value) internal pure returns (int) { if (value & (1<<127) != 0) { return int(value | clearLow); } return int(value); } function exists(int x, int y) external view returns (bool) { return _exists(x, y); } function _exists(int x, int y) internal view returns (bool) { return _exists(_encodeTokenId(x, y)); } function ownerOfLand(int x, int y) external view returns (address) { return _ownerOfLand(x, y); } function _ownerOfLand(int x, int y) internal view returns (address) { return _ownerOf(_encodeTokenId(x, y)); } function ownerOfLandMany(int[] x, int[] y) external view returns (address[]) { require(x.length > 0, "You should supply at least one coordinate"); require(x.length == y.length, "The coordinates should have the same length"); address[] memory addrs = new address[](x.length); for (uint i = 0; i < x.length; i++) { addrs[i] = _ownerOfLand(x[i], y[i]); } return addrs; } function landOf(address owner) external view returns (int[], int[]) { uint256 len = _assetsOf[owner].length; int[] memory x = new int[](len); int[] memory y = new int[](len); int assetX; int assetY; for (uint i = 0; i < len; i++) { (assetX, assetY) = _decodeTokenId(_assetsOf[owner][i]); x[i] = assetX; y[i] = assetY; } return (x, y); } function tokenMetadata(uint256 assetId) external view returns (string) { return _tokenMetadata(assetId); } function _tokenMetadata(uint256 assetId) internal view returns (string) { address _owner = _ownerOf(assetId); if (_isContract(_owner) && _owner != address(estateRegistry)) { if ((ERC165(_owner)).supportsInterface(GET_METADATA)) { return IMetadataHolder(_owner).getMetadata(assetId); } } return _assetData[assetId]; } function landData(int x, int y) external view returns (string) { return _tokenMetadata(_encodeTokenId(x, y)); } // // LAND Transfer // function transferFrom(address from, address to, uint256 assetId) external { require(to != address(estateRegistry), "EstateRegistry unsafe transfers are not allowed"); return _doTransferFrom( from, to, assetId, "", false ); } function transferLand(int x, int y, address to) external { uint256 tokenId = _encodeTokenId(x, y); _doTransferFrom( _ownerOf(tokenId), to, tokenId, "", true ); } function transferManyLand(int[] x, int[] y, address to) external { require(x.length > 0, "You should supply at least one coordinate"); require(x.length == y.length, "The coordinates should have the same length"); for (uint i = 0; i < x.length; i++) { uint256 tokenId = _encodeTokenId(x[i], y[i]); _doTransferFrom( _ownerOf(tokenId), to, tokenId, "", true ); } } function transferLandToEstate(int x, int y, uint256 estateId) external { require( estateRegistry.ownerOf(estateId) == msg.sender, "You must own the Estate you want to transfer to" ); uint256 tokenId = _encodeTokenId(x, y); _doTransferFrom( _ownerOf(tokenId), address(estateRegistry), tokenId, toBytes(estateId), true ); } function transferManyLandToEstate(int[] x, int[] y, uint256 estateId) external { require(x.length > 0, "You should supply at least one coordinate"); require(x.length == y.length, "The coordinates should have the same length"); require( estateRegistry.ownerOf(estateId) == msg.sender, "You must own the Estate you want to transfer to" ); for (uint i = 0; i < x.length; i++) { uint256 tokenId = _encodeTokenId(x[i], y[i]); _doTransferFrom( _ownerOf(tokenId), address(estateRegistry), tokenId, toBytes(estateId), true ); } } /** * @notice Set LAND updateOperator * @param assetId - LAND id * @param operator - address of the account to be set as the updateOperator */ function setUpdateOperator( uint256 assetId, address operator ) public canSetUpdateOperator(assetId) { updateOperator[assetId] = operator; emit UpdateOperator(assetId, operator); } /** * @notice Set many LAND updateOperator * @param _assetIds - LAND ids * @param _operator - address of the account to be set as the updateOperator */ function setManyUpdateOperator( uint256[] _assetIds, address _operator ) public { for (uint i = 0; i < _assetIds.length; i++) { setUpdateOperator(_assetIds[i], _operator); } } /** * @dev Set an updateManager for an account * @param _owner - address of the account to set the updateManager * @param _operator - address of the account to be set as the updateManager * @param _approved - bool whether the address will be approved or not */ function setUpdateManager(address _owner, address _operator, bool _approved) external { require(_operator != msg.sender, "The operator should be different from owner"); require( _owner == msg.sender || _isApprovedForAll(_owner, msg.sender), "Unauthorized user" ); updateManager[_owner][_operator] = _approved; emit UpdateManager( _owner, _operator, msg.sender, _approved ); } // // Estate generation // event EstateRegistrySet(address indexed registry); function setEstateRegistry(address registry) external onlyProxyOwner { estateRegistry = IEstateRegistry(registry); emit EstateRegistrySet(registry); } function createEstate(int[] x, int[] y, address beneficiary) external returns (uint256) { // solium-disable-next-line arg-overflow return _createEstate(x, y, beneficiary, ""); } function createEstateWithMetadata( int[] x, int[] y, address beneficiary, string metadata ) external returns (uint256) { // solium-disable-next-line arg-overflow return _createEstate(x, y, beneficiary, metadata); } function _createEstate( int[] x, int[] y, address beneficiary, string metadata ) internal returns (uint256) { require(x.length > 0, "You should supply at least one coordinate"); require(x.length == y.length, "The coordinates should have the same length"); require(address(estateRegistry) != 0, "The Estate registry should be set"); uint256 estateTokenId = estateRegistry.mint(beneficiary, metadata); bytes memory estateTokenIdBytes = toBytes(estateTokenId); for (uint i = 0; i < x.length; i++) { uint256 tokenId = _encodeTokenId(x[i], y[i]); _doTransferFrom( _ownerOf(tokenId), address(estateRegistry), tokenId, estateTokenIdBytes, true ); } return estateTokenId; } function toBytes(uint256 x) internal pure returns (bytes b) { b = new bytes(32); // solium-disable-next-line security/no-inline-assembly assembly { mstore(add(b, 32), x) } } // // LAND Update // function updateLandData( int x, int y, string data ) external { return _updateLandData(x, y, data); } function _updateLandData( int x, int y, string data ) internal onlyUpdateAuthorized(_encodeTokenId(x, y)) { uint256 assetId = _encodeTokenId(x, y); address owner = _holderOf[assetId]; _update(assetId, data); emit Update( assetId, owner, msg.sender, data ); } function updateManyLandData(int[] x, int[] y, string data) external { require(x.length > 0, "You should supply at least one coordinate"); require(x.length == y.length, "The coordinates should have the same length"); for (uint i = 0; i < x.length; i++) { _updateLandData(x[i], y[i], data); } } /** * @dev Set a new land balance minime token * @notice Set new land balance token: `_newLandBalance` * @param _newLandBalance address of the new land balance token */ function setLandBalanceToken(address _newLandBalance) onlyProxyOwner external { require(_newLandBalance != address(0), "New landBalance should not be zero address"); emit SetLandBalanceToken(landBalance, _newLandBalance); landBalance = IMiniMeToken(_newLandBalance); } /** * @dev Register an account balance * @notice Register land Balance */ function registerBalance() external { require(!registeredBalance[msg.sender], "Register Balance::The user is already registered"); // Get balance of the sender uint256 currentBalance = landBalance.balanceOf(msg.sender); if (currentBalance > 0) { require( landBalance.destroyTokens(msg.sender, currentBalance), "Register Balance::Could not destroy tokens" ); } // Set balance as registered registeredBalance[msg.sender] = true; // Get LAND balance uint256 newBalance = _balanceOf(msg.sender); // Generate Tokens require( landBalance.generateTokens(msg.sender, newBalance), "Register Balance::Could not generate tokens" ); } /** * @dev Unregister an account balance * @notice Unregister land Balance */ function unregisterBalance() external { require(registeredBalance[msg.sender], "Unregister Balance::The user not registered"); // Set balance as unregistered registeredBalance[msg.sender] = false; // Get balance uint256 currentBalance = landBalance.balanceOf(msg.sender); // Destroy Tokens require( landBalance.destroyTokens(msg.sender, currentBalance), "Unregister Balance::Could not destroy tokens" ); } function _doTransferFrom( address from, address to, uint256 assetId, bytes userData, bool doCheck ) internal { updateOperator[assetId] = address(0); _updateLandBalance(from, to); super._doTransferFrom( from, to, assetId, userData, doCheck ); } function _isContract(address addr) internal view returns (bool) { uint size; // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(addr) } return size > 0; } /** * @dev Update account balances * @param _from account * @param _to account */ function _updateLandBalance(address _from, address _to) internal { if (registeredBalance[_from]) { landBalance.destroyTokens(_from, 1); } if (registeredBalance[_to]) { landBalance.generateTokens(_to, 1); } } }
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":true,"inputs":[],"name":"proxyOwner","outputs":[{"name":"","type":"address"}],"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":"","type":"address"},{"name":"","type":"address"}],"name":"updateManager","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"ownerOfLand","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"setLatestToNow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unregisterBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"beneficiary","type":"address"}],"name":"assignNewParcel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"}],"name":"ownerOfLandMany","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"latestPing","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"data","type":"string"}],"name":"updateManyLandData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"isAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"authorizedDeploy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"assetId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"authorizeDeploy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"to","type":"address"}],"name":"transferLand","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"","type":"bytes"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"landData","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"to","type":"address"}],"name":"transferManyLand","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"tokensOf","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ping","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registeredBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newLandBalance","type":"address"}],"name":"setLandBalanceToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GET_METADATA","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"isUpdateAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"tokenMetadata","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"encodeTokenId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_assetIds","type":"uint256[]"},{"name":"_operator","type":"address"}],"name":"setManyUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"description","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"value","type":"uint256"}],"name":"decodeTokenId","outputs":[{"name":"","type":"int256"},{"name":"","type":"int256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"landBalance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"}],"name":"assignMultipleParcels","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"},{"name":"metadata","type":"string"}],"name":"createEstateWithMetadata","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"landOf","outputs":[{"name":"","type":"int256[]"},{"name":"","type":"int256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"registry","type":"address"}],"name":"setEstateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"updateOperator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"authorized","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"assetId","type":"uint256"},{"name":"operator","type":"address"}],"name":"setUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"},{"name":"userData","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"registerBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"}],"name":"createEstate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"data","type":"string"}],"name":"updateLandData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"estateRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetHolder","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"getApprovedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setUpdateManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"estateId","type":"uint256"}],"name":"transferManyLandToEstate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"estateId","type":"uint256"}],"name":"transferLandToEstate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"forbidDeploy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"registry","type":"address"}],"name":"EstateRegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":true,"name":"holder","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"data","type":"string"}],"name":"Update","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":true,"name":"operator","type":"address"}],"name":"UpdateOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":true,"name":"_caller","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"UpdateManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_caller","type":"address"},{"indexed":true,"name":"_deployer","type":"address"}],"name":"DeployAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_caller","type":"address"},{"indexed":true,"name":"_deployer","type":"address"}],"name":"DeployForbidden","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_previousLandBalance","type":"address"},{"indexed":true,"name":"_newLandBalance","type":"address"}],"name":"SetLandBalanceToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":false,"name":"operator","type":"address"},{"indexed":false,"name":"userData","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":false,"name":"operator","type":"address"},{"indexed":false,"name":"userData","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"authorized","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prevOwner","type":"address"},{"indexed":false,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]
Contract Creation Code
608060405260028054600160a060020a031916331790556143bd806100256000396000f3006080604052600436106102d15763ffffffff60e060020a60003504166301ffc9a781146102d6578063025313a21461030c57806306fdde031461033d57806307ecec3e146103c7578063081812fc146103ee578063095ea7b3146104065780631080f2511461042c578063133cbe3a1461044757806318160ddd146104685780631c07cac51461048f5780631cc69ac1146104a45780631d4b11e4146104cb5780631e375901146105475780631e4c77361461056857806323b872dd146105a05780632972b0f0146105ca57806329ffab3b146105ee5780632f745c591461060f578063313ce56714610633578063341f13f21461064857806335e64aaa1461066957806342842e0e14610690578063439fab91146106ba5780634c4bf936146106da5780634dad9003146106f55780634f558e791461072d5780635a3f2672146107455780635c36b186146107665780636087de1b1461077b57806361a822f91461079c5780636352211e146107bd57806365181ad3146107d557806365937ab9146108075780636914db601461082b5780636fb7e5881461084357806370a082311461085e578063721d7d8e1461087f57806372554ff5146108945780637284e416146108f45780637efd91121461090957806384b800041461093a5780638668a4161461094f578063881eeaa514610987578063885363eb146109cc5780638da5cb5b14610a865780638de74aa114610a9b57806395d89b4114610abc5780639d40b85014610ad1578063a22cb46514610ae9578063a8d8812714610b0f578063b0b02c6014610b2a578063b88d4fde14610b4e578063c2cf1cdc14610b87578063ca8a2c0814610b9c578063d4dd159414610bd4578063e387d31a14610bfc578063e985e9c514610c11578063eca4742a146103ee578063ef1db76214610c38578063f2fde38b14610c64578063f5f83a6114610c85578063f9cbec4314610cb4578063fd7a1b0014610cd2575b600080fd5b3480156102e257600080fd5b506102f8600160e060020a031960043516610cf3565b604080519115158252519081900360200190f35b34801561031857600080fd5b50610321610dac565b60408051600160a060020a039092168252519081900360200190f35b34801561034957600080fd5b50610352610dbb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038c578181015183820152602001610374565b50505050905090810190601f1680156103b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d357600080fd5b506102f8600160a060020a0360043581169060243516610e52565b3480156103fa57600080fd5b50610321600435610e72565b34801561041257600080fd5b5061042a600160a060020a0360043516602435610e7d565b005b34801561043857600080fd5b50610321600435602435610f48565b34801561045357600080fd5b5061042a600160a060020a0360043516610f5b565b34801561047457600080fd5b5061047d610feb565b60408051918252519081900360200190f35b34801561049b57600080fd5b5061042a610ffa565b3480156104b057600080fd5b5061042a600435602435600160a060020a036044351661124c565b3480156104d757600080fd5b506104f760246004803582810192908201359181359182019101356112fc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561053357818101518382015260200161051b565b505050509050019250505060405180910390f35b34801561055357600080fd5b5061047d600160a060020a0360043516611453565b34801561057457600080fd5b5061042a6024600480358281019290820135918135808301929082013591604435918201910135611465565b3480156105ac57600080fd5b5061042a600160a060020a0360043581169060243516604435611597565b3480156105d657600080fd5b506102f8600160a060020a0360043516602435611641565b3480156105fa57600080fd5b506102f8600160a060020a036004351661164d565b34801561061b57600080fd5b5061047d600160a060020a0360043516602435611662565b34801561063f57600080fd5b5061047d6116d9565b34801561065457600080fd5b5061042a600160a060020a03600435166116de565b34801561067557600080fd5b5061042a600435602435600160a060020a0360443516611860565b34801561069c57600080fd5b5061042a600160a060020a036004358116906024351660443561189a565b3480156106c657600080fd5b5061042a60048035602481019101356118b8565b3480156106e657600080fd5b506103526004356024356119ac565b34801561070157600080fd5b5061042a6024600480358281019290820135918135918201910135600160a060020a03604435166119c0565b34801561073957600080fd5b506102f8600435611ae5565b34801561075157600080fd5b506104f7600160a060020a0360043516611af0565b34801561077257600080fd5b5061042a611b5c565b34801561078757600080fd5b506102f8600160a060020a0360043516611b70565b3480156107a857600080fd5b5061042a600160a060020a0360043516611b85565b3480156107c957600080fd5b50610321600435611ccb565b3480156107e157600080fd5b506107ea611cd6565b60408051600160e060020a03199092168252519081900360200190f35b34801561081357600080fd5b506102f8600160a060020a0360043516602435611d0b565b34801561083757600080fd5b50610352600435611d17565b34801561084f57600080fd5b5061047d600435602435611d22565b34801561086a57600080fd5b5061047d600160a060020a0360043516611d2e565b34801561088b57600080fd5b50610321611d39565b3480156108a057600080fd5b506040805160206004803580820135838102808601850190965280855261042a9536959394602494938501929182918501908490808284375094975050509235600160a060020a03169350611d4892505050565b34801561090057600080fd5b50610352611d7d565b34801561091557600080fd5b50610921600435611dde565b6040805192835260208301919091528051918290030190f35b34801561094657600080fd5b50610321611df4565b34801561095b57600080fd5b5061042a6024600480358281019290820135918135918201910135600160a060020a0360443516611e03565b34801561099357600080fd5b5061047d6024600480358281019290820135918135808301929082013591600160a060020a036044351691606435908101910135611ed7565b3480156109d857600080fd5b506109ed600160a060020a0360043516611f76565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a31578181015183820152602001610a19565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a70578181015183820152602001610a58565b5050505090500194505050505060405180910390f35b348015610a9257600080fd5b5061032161208c565b348015610aa757600080fd5b5061042a600160a060020a036004351661209b565b348015610ac857600080fd5b50610352612149565b348015610add57600080fd5b506103216004356121aa565b348015610af557600080fd5b5061042a600160a060020a036004351660243515156121c5565b348015610b1b57600080fd5b506102f86004356024356121d3565b348015610b3657600080fd5b5061042a600435600160a060020a03602435166121df565b348015610b5a57600080fd5b5061042a600160a060020a03600480358216916024803590911691604435916064359081019101356122d6565b348015610b9357600080fd5b5061042a61231c565b348015610ba857600080fd5b5061047d6024600480358281019290820135918135918201910135600160a060020a0360443516612699565b348015610be057600080fd5b5061042a60048035906024803591604435918201910135612718565b348015610c0857600080fd5b50610321612753565b348015610c1d57600080fd5b506102f8600160a060020a0360043581169060243516612762565b348015610c4457600080fd5b5061042a600160a060020a0360043581169060243516604435151561276e565b348015610c7057600080fd5b5061042a600160a060020a03600435166128d8565b348015610c9157600080fd5b5061042a6024600480358281019290820135918135918201910135604435612974565b348015610cc057600080fd5b5061042a600435602435604435612b91565b348015610cde57600080fd5b5061042a600160a060020a0360043516612cda565b6000600160e060020a03198083161415610d0f57506000610da7565b600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610d705750600160e060020a031982167f7c0633c600000000000000000000000000000000000000000000000000000000145b80610da45750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b90505b919050565b600154600160a060020a031681565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b820191906000526020600020905b815481529060010190602001808311610e2a57829003601f168201915b505050505090505b90565b601260209081526000928352604080842090915290825290205460ff1681565b6000610da482612e5a565b6000610e8882612e75565b905033600160a060020a0382161480610ea65750610ea63382612e90565b1515610eb157600080fd5b600160a060020a038381169082161415610eca57600080fd5b82600160a060020a0316610edd83612e5a565b600160a060020a031614610f43576000828152600c60205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45b505050565b6000610f548383612ebe565b9392505050565b600154600160a060020a0316331480610f795750610f793382612e90565b1515610fcf576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03166000908152600d60205260409020429055565b6000610ff5612ed2565b905090565b3360009081526014602052604081205460ff161515611089576040805160e560020a62461bcd02815260206004820152602b60248201527f556e72656769737465722042616c616e63653a3a5468652075736572206e6f7460448201527f2072656769737465726564000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601460209081526040808320805460ff1916905560135481517f70a0823100000000000000000000000000000000000000000000000000000000815260048101959095529051600160a060020a03909116936370a082319360248083019493928390030190829087803b15801561110557600080fd5b505af1158015611119573d6000803e3d6000fd5b505050506040513d602081101561112f57600080fd5b5051601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163d3ce77fe916044808201926020929091908290030181600087803b1580156111a157600080fd5b505af11580156111b5573d6000803e3d6000fd5b505050506040513d60208110156111cb57600080fd5b50511515611249576040805160e560020a62461bcd02815260206004820152602c60248201527f556e72656769737465722042616c616e63653a3a436f756c64206e6f7420646560448201527f7374726f7920746f6b656e730000000000000000000000000000000000000000606482015290519081900360840190fd5b50565b600154600160a060020a031633148061127457503360009081526011602052604090205460ff165b15156112de576040805160e560020a62461bcd02815260206004820152603a602482015260008051602061433283398151915260448201527f20627920616e20617574686f72697a6564206465706c6f796572000000000000606482015290519081900360840190fd5b6112f16112eb8484612ed8565b82612f92565b610f43600082612ffb565b606080600080861161135a576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b8584146113b3576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b6040805187815260208089028201019091528680156113dc578160200160208202803883390190505b509150600090505b858110156114495761141c8787838181106113fb57fe5b90506020020135868684818110151561141057fe5b90506020020135612ebe565b828281518110151561142a57fe5b600160a060020a039092166020928302909101909101526001016113e4565b5095945050505050565b600d6020526000908152604090205481565b60008086116114c0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414611519576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b5060005b8581101561158e5761158687878381811061153457fe5b90506020020135868684818110151561154957fe5b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613172945050505050565b60010161151d565b50505050505050565b601054600160a060020a0383811691161415611623576040805160e560020a62461bcd02815260206004820152602f60248201527f457374617465526567697374727920756e73616665207472616e73666572732060448201527f617265206e6f7420616c6c6f7765640000000000000000000000000000000000606482015290519081900360840190fd5b610f438383836020604051908101604052806000815250600061331f565b6000610f548383613352565b60116020526000908152604090205460ff1681565b600160a060020a038216600090815260076020526040812054821061168657600080fd5b6f8000000000000000000000000000000082106116a257600080fd5b600160a060020a03831660009081526007602052604090208054839081106116c657fe5b9060005260206000200154905092915050565b600090565b600154600160a060020a03163314611742576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a03811615156117a2576040805160e560020a62461bcd02815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526011602052604090205460ff1615611813576040805160e560020a62461bcd02815260206004820152601d60248201527f6164647265737320697320616c726561647920617574686f72697a6564000000604482015290519081900360640190fd5b600160a060020a038116600081815260116020526040808220805460ff191660011790555133917f9e237638dcd1b2be1fc623ab6a47409b34dc8a62196448dd2d6b9045b2c3315791a350565b600061186c8484612ed8565b905061189461187a82612e75565b83836020604051908101604052806000815250600161331f565b50505050565b610f438383836020604051908101604052806000815250600161331f565b6040805180820190915260118082527f446563656e7472616c616e64204c414e4400000000000000000000000000000060209092019182526118fc916003916141ff565b506040805180820190915260048082527f4c414e4400000000000000000000000000000000000000000000000000000000602090920191825261193f91816141ff565b506040805160608101825260338082527f436f6e747261637420746861742073746f7265732074686520446563656e7472602083019081527f616c616e64204c414e44207265676973747279000000000000000000000000009290930191909152610f43916005916141ff565b6060610f546119bb8484612ed8565b6133d0565b600080808611611a1c576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414611a75576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b600091505b8582101561158e57611ab2878784818110611a9157fe5b905060200201358686858181101515611aa657fe5b90506020020135612ed8565b9050611ada611ac082612e75565b84836020604051908101604052806000815250600161331f565b600190910190611a7a565b6000610da48261364a565b600160a060020a038116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015611b5057602002820191906000526020600020905b815481526020019060010190808311611b3c575b50505050509050919050565b336000908152600d60205260409020429055565b60146020526000908152604090205460ff1681565b600154600160a060020a03163314611be9576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a0381161515611c6f576040805160e560020a62461bcd02815260206004820152602a60248201527f4e6577206c616e6442616c616e63652073686f756c64206e6f74206265207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015290519081900360840190fd5b601354604051600160a060020a038084169216907f72d675e4d2f5ce2deafcb203f4dacdeee8be536626817bc87833e716ef73942d90600090a360138054600160a060020a031916600160a060020a0392909216919091179055565b6000610da482612e75565b604080517f6765744d657461646174612875696e74323536290000000000000000000000008152905190819003601401902081565b6000610f548383613667565b6060610da4826133d0565b6000610f548383612ed8565b6000610da4826136e6565b600054600160a060020a031681565b60005b8251811015610f4357611d758382815181101515611d6557fe5b90602001906020020151836121df565b600101611d4b565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b600080611dea83613701565b915091505b915091565b601354600160a060020a031681565b600154600090600160a060020a0316331480611e2e57503360009081526011602052604090205460ff165b1515611e98576040805160e560020a62461bcd02815260206004820152603a602482015260008051602061433283398151915260448201527f20627920616e20617574686f72697a6564206465706c6f796572000000000000606482015290519081900360840190fd5b5060005b84811015611ecf57611ebc611eb6878784818110611a9157fe5b83612f92565b611ec7600083612ffb565b600101611e9c565b505050505050565b6000611f6a8888808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808e0282810182019093528d82529095508d94508c93508392508501908490808284375050604080516020601f8c018190048102820181019092528a81528c955093508a925089915081908401838280828437506137c0945050505050565b98975050505050505050565b600160a060020a0381166000908152600760209081526040808320548151818152818402810190930190915260609283928391829181908190868015611fc6578160200160208202803883390190505b50945085604051908082528060200260200182016040528015611ff3578160200160208202803883390190505b509350600090505b8581101561207d57600160a060020a0389166000908152600760205260409020805461203c91908390811061202c57fe5b9060005260206000200154613701565b86519194509250839086908390811061205157fe5b602090810290910101528351829085908390811061206b57fe5b60209081029091010152600101611ffb565b50929791965090945050505050565b600254600160a060020a031681565b600154600160a060020a031633146120ff576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b60108054600160a060020a031916600160a060020a0383169081179091556040517f5b3ad80e09ce4c88735037542891c02fdc63b85e96a579d9260a403153c2775590600090a250565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b600f60205260009081526040902054600160a060020a031681565b6121cf8282613a93565b5050565b6000610f548383613b21565b8160006121eb82612e75565b90506121f73383613352565b806122255750600160a060020a038116600090815260126020908152604080832033845290915290205460ff165b151561227b576040805160e560020a62461bcd02815260206004820152601160248201527f756e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b6000848152600f60205260408082208054600160a060020a031916600160a060020a0387169081179091559051909186917f9d9dd80a56a16f715df6eb40b771e24ff8cbea6eed9de28473ce0f28fe5602a99190a350505050565b61231585858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506001945061331f9350505050565b5050505050565b33600090815260146020526040812054819060ff16156123ac576040805160e560020a62461bcd02815260206004820152603060248201527f52656769737465722042616c616e63653a3a546865207573657220697320616c60448201527f7265616479207265676973746572656400000000000000000000000000000000606482015290519081900360840190fd5b601354604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561241257600080fd5b505af1158015612426573d6000803e3d6000fd5b505050506040513d602081101561243c57600080fd5b50519150600082111561255e57601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018590529051600160a060020a039092169163d3ce77fe916044808201926020929091908290030181600087803b1580156124b657600080fd5b505af11580156124ca573d6000803e3d6000fd5b505050506040513d60208110156124e057600080fd5b5051151561255e576040805160e560020a62461bcd02815260206004820152602a60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f74206465737460448201527f726f7920746f6b656e7300000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601460205260409020805460ff19166001179055612581906136e6565b601354604080517f827f32c0000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163827f32c0916044808201926020929091908290030181600087803b1580156125f157600080fd5b505af1158015612605573d6000803e3d6000fd5b505050506040513d602081101561261b57600080fd5b505115156121cf576040805160e560020a62461bcd02815260206004820152602b60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f742067656e6560448201527f7261746520746f6b656e73000000000000000000000000000000000000000000606482015290519081900360840190fd5b600061270e8686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a9350839250850190849080828437505060408051602081019091526000815289945092506137c0915050565b9695505050505050565b611894848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750613172945050505050565b601054600160a060020a031681565b6000610f548383612e90565b600160a060020a0382163314156127f5576040805160e560020a62461bcd02815260206004820152602b60248201527f546865206f70657261746f722073686f756c6420626520646966666572656e7460448201527f2066726f6d206f776e6572000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831633148061281157506128118333612e90565b1515612867576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03838116600081815260126020908152604080832094871680845294825291829020805460ff191686151590811790915582519081529151339493927fd79fbfe1644c022b9150727d871532bfcc3e27ffee86fc596a062770ac97b04292908290030190a4505050565b600254600160a060020a031633146128ec57fe5b600254600160a060020a0382811691161415612952576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f74207472616e7366657220746f20796f757273656c660000000000604482015290519081900360640190fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b6000808086116129d0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414612a29576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b601054604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905290513392600160a060020a031691636352211e9160248083019260209291908290030181600087803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b505050506040513d6020811015612ab957600080fd5b5051600160a060020a031614612b3f576040805160e560020a62461bcd02815260206004820152602f60248201527f596f75206d757374206f776e207468652045737461746520796f752077616e7460448201527f20746f207472616e7366657220746f0000000000000000000000000000000000606482015290519081900360840190fd5b600091505b8582101561158e57612b5b878784818110611a9157fe5b9050612b86612b6982612e75565b601054600160a060020a031683612b7f87613b35565b600161331f565b600190910190612b44565b601054604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905290516000923392600160a060020a0390911691636352211e9160248082019260209290919082900301818887803b158015612bfc57600080fd5b505af1158015612c10573d6000803e3d6000fd5b505050506040513d6020811015612c2657600080fd5b5051600160a060020a031614612cac576040805160e560020a62461bcd02815260206004820152602f60248201527f596f75206d757374206f776e207468652045737461746520796f752077616e7460448201527f20746f207472616e7366657220746f0000000000000000000000000000000000606482015290519081900360840190fd5b612cb68484612ed8565b9050611894612cc482612e75565b601054600160a060020a031683612b7f86613b35565b600154600160a060020a03163314612d3e576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a0381161515612d9e576040805160e560020a62461bcd02815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526011602052604090205460ff161515612e10576040805160e560020a62461bcd02815260206004820152601c60248201527f6164647265737320697320616c726561647920666f7262696464656e00000000604482015290519081900360640190fd5b600160a060020a038116600081815260116020526040808220805460ff191690555133917f7883da318e7694f396f400092b07b701a4eccb02aee0d28266adc659cca044da91a350565b6000908152600c6020526040902054600160a060020a031690565b600090815260086020526040902054600160a060020a031690565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6000610f54612ecd8484612ed8565b612e75565b60065490565b600082620f423f19128015612eef5750620f424083125b8015612efe575081620f423f19125b8015612f0c5750620f424082125b1515612f88576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610f548383613b60565b600082815260086020526040902054600160a060020a031615612fb457600080fd5b612fbe8183613ba1565b8181600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600160a060020a03821660009081526014602052604090205460ff16156130b857601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152600160248301529151919092169163d3ce77fe9160448083019260209291908290030181600087803b15801561308b57600080fd5b505af115801561309f573d6000803e3d6000fd5b505050506040513d60208110156130b557600080fd5b50505b600160a060020a03811660009081526014602052604090205460ff16156121cf57601354604080517f827f32c0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152600160248301529151919092169163827f32c09160448083019260209291908290030181600087803b15801561314857600080fd5b505af115801561315c573d6000803e3d6000fd5b505050506040513d602081101561189457600080fd5b60008061317f8585612ed8565b61318881612e75565b600160a060020a031633600160a060020a031614806131ac57506131ac3382613352565b806131bc57506131bc3382613667565b1515613238576040805160e560020a62461bcd02815260206004820152602660248201527f6d73672e73656e646572206973206e6f7420617574686f72697a656420746f2060448201527f7570646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6132428686612ed8565b600081815260086020526040902054909350600160a060020a031691506132698385613c2b565b33600160a060020a031682600160a060020a0316847f47c705b9219229ad762fca605f08fb024a3415d0ae78af5d319820c72e510414876040518080602001828103825283818151815260200191508051906020019080838360005b838110156132dd5781810151838201526020016132c5565b50505050905090810190601f16801561330a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a4505050505050565b6000838152600f602052604090208054600160a060020a03191690556133458585612ffb565b6123158585858585613c4a565b600080600160a060020a038416151561336a57600080fd5b61337383612e75565b905080600160a060020a031684600160a060020a0316141561339857600191506133c9565b6133a28185612e90565b806133c6575083600160a060020a03166133bb84612e5a565b600160a060020a0316145b91505b5092915050565b606060006133dd83612e75565b90506133e881613c6d565b80156134025750601054600160a060020a03828116911614155b156135a957604080517f6765744d657461646174612875696e7432353629000000000000000000000000815281519081900360140181207f01ffc9a7000000000000000000000000000000000000000000000000000000008252600160e060020a03191660048201529051600160a060020a038316916301ffc9a79160248083019260209291908290030181600087803b15801561349f57600080fd5b505af11580156134b3573d6000803e3d6000fd5b505050506040513d60208110156134c957600080fd5b5051156135a95780600160a060020a031663a574cea4846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561351957600080fd5b505af115801561352d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561355657600080fd5b81019080805164010000000081111561356e57600080fd5b8201602081018481111561358157600080fd5b815164010000000081118282018710171561359b57600080fd5b509095506136449350505050565b6000838152600a602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452909183018282801561363c5780601f106136115761010080835404028352916020019161363c565b820191906000526020600020905b81548152906001019060200180831161361f57829003601f168201915b505050505091505b50919050565b600090815260086020526040902054600160a060020a0316151590565b60008061367383612e75565b905083600160a060020a031681600160a060020a031614806136ae57506000838152600f6020526040902054600160a060020a038581169116145b806133c65750600160a060020a0380821660009081526012602090815260408083209388168352929052205460ff1691505092915050565b600160a060020a031660009081526007602052604090205490565b60008061370d83613c75565b9092509050620f423f19821380156137275750620f424082125b8015613736575080620f423f19125b80156137445750620f424081125b1515611def576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600080606060008060008951111515613825576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b8751895114613880576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b601054600160a060020a03161515613908576040805160e560020a62461bcd02815260206004820152602160248201527f546865204573746174652072656769737472792073686f756c6420626520736560448201527f7400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517fd0def521000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301908152602483019384528a5160448401528a51919094169363d0def521938c938c93606490910190602085019080838360005b8381101561398c578181015183820152602001613974565b50505050905090810190601f1680156139b95780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b1580156139d957600080fd5b505af11580156139ed573d6000803e3d6000fd5b505050506040513d6020811015613a0357600080fd5b50519350613a1084613b35565b9250600091505b8851821015613a8657613a588983815181101515613a3157fe5b906020019060200201518984815181101515613a4957fe5b90602001906020020151612ed8565b9050613a7b613a6682612e75565b601054600160a060020a03168386600161331f565b600190910190613a17565b5091979650505050505050565b8015613abc57613aa33383612e90565b15613aad57600080fd5b613ab78233613ccb565b613adb565b613ac63383612e90565b1515613ad157600080fd5b613adb8233613d00565b6040805182151581529051600160a060020a0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6000610f54613b308484612ed8565b61364a565b6040805160208082528183019092526060918082016104008038833950505060208101929092525090565b70010000000000000000000000000000000082026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff82161792915050565b60008181526008602052604081208054600160a060020a031916600160a060020a038516179055613bd1836136e6565b600160a060020a0384166000908152600760209081526040808320805460018181018355918552838520018790558684526009909252909120829055600654919250613c23919063ffffffff613d3216565b600655505050565b6000828152600a602090815260409091208251610f43928401906141ff565b82613c553382613352565b1515613c6057600080fd5b611ecf8686868686613d45565b6000903b1190565b600080613ca77001000000000000000000000000000000006fffffffffffffffffffffffffffffffff19851604613f9b565b9150613cc46fffffffffffffffffffffffffffffffff8416613f9b565b9050915091565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19166001179055565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19169055565b81810182811015613d3f57fe5b92915050565b600084600160a060020a0381161515613d5d57600080fd5b848680600160a060020a0316613d7283612e75565b600160a060020a03161415613d8657600080fd5b888781600160a060020a0316613d9b82612e75565b600160a060020a031614613dae57600080fd5b600089815260086020526040902054600160a060020a03169550613dd2868a613fd3565b613ddc868a61406c565b613de68a8a613ba1565b888a600160a060020a031687600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4868015613e385750613e388a613c6d565b15613f8e5763150b7a0260e060020a027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168a600160a060020a031663150b7a0233898d8d6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613eff578181015183820152602001613ee7565b50505050905090810190601f168015613f2c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613f4e57600080fd5b505af1158015613f62573d6000803e3d6000fd5b505050506040513d6020811015613f7857600080fd5b5051600160e060020a03191614613f8e57600080fd5b5050505050505050505050565b60006f80000000000000000000000000000000821615613fcf57506fffffffffffffffffffffffffffffffff198117610da7565b5090565b81600160a060020a0316613fe682612e75565b600160a060020a031614801561401257506000818152600c6020526040902054600160a060020a031615155b156121cf576000818152600c60205260408082208054600160a060020a031916905551829190600160a060020a038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b6000818152600960205260408120549080614097600161408b876136e6565b9063ffffffff6141ed16565b600160a060020a0386166000908152600760205260409020805491935090839081106140bf57fe5b60009182526020808320909101548683526008825260408084208054600160a060020a0319169055600160a060020a038916845260079092529120805491925082918590811061410b57fe5b6000918252602080832090910192909255600160a060020a038716815260079091526040812080548490811061413d57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490614174906000198301614279565b50600160a060020a03851660009081526007602052604090205415156141b557600160a060020a03851660009081526007602052604081206141b59161429d565b60008481526009602052604080822082905582825290208390556006546141e390600163ffffffff6141ed16565b6006555050505050565b6000828211156141f957fe5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061424057805160ff191683800117855561426d565b8280016001018555821561426d579182015b8281111561426d578251825591602001919060010190614252565b50613fcf9291506142b7565b815481835581811115610f4357600083815260209020610f439181019083016142b7565b508054600082559060005260206000209081019061124991905b610e4f91905b80821115613fcf57600081556001016142bd5600206279207468652070726f7879206f776e65720000000000000000000000000054686520636f6f7264696e617465732073686f756c642068617665207468652073616d65206c656e677468000000000000000000000000000000000000000000546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564596f752073686f756c6420737570706c79206174206c65617374206f6e6520636f6f7264696e6174650000000000000000000000000000000000000000000000a165627a7a7230582060dd553b8b9313990355b3a660fdf52c893d125560ffa4ca954f3f3ecd4818ef0029
Deployed Bytecode
0x6080604052600436106102d15763ffffffff60e060020a60003504166301ffc9a781146102d6578063025313a21461030c57806306fdde031461033d57806307ecec3e146103c7578063081812fc146103ee578063095ea7b3146104065780631080f2511461042c578063133cbe3a1461044757806318160ddd146104685780631c07cac51461048f5780631cc69ac1146104a45780631d4b11e4146104cb5780631e375901146105475780631e4c77361461056857806323b872dd146105a05780632972b0f0146105ca57806329ffab3b146105ee5780632f745c591461060f578063313ce56714610633578063341f13f21461064857806335e64aaa1461066957806342842e0e14610690578063439fab91146106ba5780634c4bf936146106da5780634dad9003146106f55780634f558e791461072d5780635a3f2672146107455780635c36b186146107665780636087de1b1461077b57806361a822f91461079c5780636352211e146107bd57806365181ad3146107d557806365937ab9146108075780636914db601461082b5780636fb7e5881461084357806370a082311461085e578063721d7d8e1461087f57806372554ff5146108945780637284e416146108f45780637efd91121461090957806384b800041461093a5780638668a4161461094f578063881eeaa514610987578063885363eb146109cc5780638da5cb5b14610a865780638de74aa114610a9b57806395d89b4114610abc5780639d40b85014610ad1578063a22cb46514610ae9578063a8d8812714610b0f578063b0b02c6014610b2a578063b88d4fde14610b4e578063c2cf1cdc14610b87578063ca8a2c0814610b9c578063d4dd159414610bd4578063e387d31a14610bfc578063e985e9c514610c11578063eca4742a146103ee578063ef1db76214610c38578063f2fde38b14610c64578063f5f83a6114610c85578063f9cbec4314610cb4578063fd7a1b0014610cd2575b600080fd5b3480156102e257600080fd5b506102f8600160e060020a031960043516610cf3565b604080519115158252519081900360200190f35b34801561031857600080fd5b50610321610dac565b60408051600160a060020a039092168252519081900360200190f35b34801561034957600080fd5b50610352610dbb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038c578181015183820152602001610374565b50505050905090810190601f1680156103b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d357600080fd5b506102f8600160a060020a0360043581169060243516610e52565b3480156103fa57600080fd5b50610321600435610e72565b34801561041257600080fd5b5061042a600160a060020a0360043516602435610e7d565b005b34801561043857600080fd5b50610321600435602435610f48565b34801561045357600080fd5b5061042a600160a060020a0360043516610f5b565b34801561047457600080fd5b5061047d610feb565b60408051918252519081900360200190f35b34801561049b57600080fd5b5061042a610ffa565b3480156104b057600080fd5b5061042a600435602435600160a060020a036044351661124c565b3480156104d757600080fd5b506104f760246004803582810192908201359181359182019101356112fc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561053357818101518382015260200161051b565b505050509050019250505060405180910390f35b34801561055357600080fd5b5061047d600160a060020a0360043516611453565b34801561057457600080fd5b5061042a6024600480358281019290820135918135808301929082013591604435918201910135611465565b3480156105ac57600080fd5b5061042a600160a060020a0360043581169060243516604435611597565b3480156105d657600080fd5b506102f8600160a060020a0360043516602435611641565b3480156105fa57600080fd5b506102f8600160a060020a036004351661164d565b34801561061b57600080fd5b5061047d600160a060020a0360043516602435611662565b34801561063f57600080fd5b5061047d6116d9565b34801561065457600080fd5b5061042a600160a060020a03600435166116de565b34801561067557600080fd5b5061042a600435602435600160a060020a0360443516611860565b34801561069c57600080fd5b5061042a600160a060020a036004358116906024351660443561189a565b3480156106c657600080fd5b5061042a60048035602481019101356118b8565b3480156106e657600080fd5b506103526004356024356119ac565b34801561070157600080fd5b5061042a6024600480358281019290820135918135918201910135600160a060020a03604435166119c0565b34801561073957600080fd5b506102f8600435611ae5565b34801561075157600080fd5b506104f7600160a060020a0360043516611af0565b34801561077257600080fd5b5061042a611b5c565b34801561078757600080fd5b506102f8600160a060020a0360043516611b70565b3480156107a857600080fd5b5061042a600160a060020a0360043516611b85565b3480156107c957600080fd5b50610321600435611ccb565b3480156107e157600080fd5b506107ea611cd6565b60408051600160e060020a03199092168252519081900360200190f35b34801561081357600080fd5b506102f8600160a060020a0360043516602435611d0b565b34801561083757600080fd5b50610352600435611d17565b34801561084f57600080fd5b5061047d600435602435611d22565b34801561086a57600080fd5b5061047d600160a060020a0360043516611d2e565b34801561088b57600080fd5b50610321611d39565b3480156108a057600080fd5b506040805160206004803580820135838102808601850190965280855261042a9536959394602494938501929182918501908490808284375094975050509235600160a060020a03169350611d4892505050565b34801561090057600080fd5b50610352611d7d565b34801561091557600080fd5b50610921600435611dde565b6040805192835260208301919091528051918290030190f35b34801561094657600080fd5b50610321611df4565b34801561095b57600080fd5b5061042a6024600480358281019290820135918135918201910135600160a060020a0360443516611e03565b34801561099357600080fd5b5061047d6024600480358281019290820135918135808301929082013591600160a060020a036044351691606435908101910135611ed7565b3480156109d857600080fd5b506109ed600160a060020a0360043516611f76565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a31578181015183820152602001610a19565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a70578181015183820152602001610a58565b5050505090500194505050505060405180910390f35b348015610a9257600080fd5b5061032161208c565b348015610aa757600080fd5b5061042a600160a060020a036004351661209b565b348015610ac857600080fd5b50610352612149565b348015610add57600080fd5b506103216004356121aa565b348015610af557600080fd5b5061042a600160a060020a036004351660243515156121c5565b348015610b1b57600080fd5b506102f86004356024356121d3565b348015610b3657600080fd5b5061042a600435600160a060020a03602435166121df565b348015610b5a57600080fd5b5061042a600160a060020a03600480358216916024803590911691604435916064359081019101356122d6565b348015610b9357600080fd5b5061042a61231c565b348015610ba857600080fd5b5061047d6024600480358281019290820135918135918201910135600160a060020a0360443516612699565b348015610be057600080fd5b5061042a60048035906024803591604435918201910135612718565b348015610c0857600080fd5b50610321612753565b348015610c1d57600080fd5b506102f8600160a060020a0360043581169060243516612762565b348015610c4457600080fd5b5061042a600160a060020a0360043581169060243516604435151561276e565b348015610c7057600080fd5b5061042a600160a060020a03600435166128d8565b348015610c9157600080fd5b5061042a6024600480358281019290820135918135918201910135604435612974565b348015610cc057600080fd5b5061042a600435602435604435612b91565b348015610cde57600080fd5b5061042a600160a060020a0360043516612cda565b6000600160e060020a03198083161415610d0f57506000610da7565b600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610d705750600160e060020a031982167f7c0633c600000000000000000000000000000000000000000000000000000000145b80610da45750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b90505b919050565b600154600160a060020a031681565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b820191906000526020600020905b815481529060010190602001808311610e2a57829003601f168201915b505050505090505b90565b601260209081526000928352604080842090915290825290205460ff1681565b6000610da482612e5a565b6000610e8882612e75565b905033600160a060020a0382161480610ea65750610ea63382612e90565b1515610eb157600080fd5b600160a060020a038381169082161415610eca57600080fd5b82600160a060020a0316610edd83612e5a565b600160a060020a031614610f43576000828152600c60205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45b505050565b6000610f548383612ebe565b9392505050565b600154600160a060020a0316331480610f795750610f793382612e90565b1515610fcf576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03166000908152600d60205260409020429055565b6000610ff5612ed2565b905090565b3360009081526014602052604081205460ff161515611089576040805160e560020a62461bcd02815260206004820152602b60248201527f556e72656769737465722042616c616e63653a3a5468652075736572206e6f7460448201527f2072656769737465726564000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601460209081526040808320805460ff1916905560135481517f70a0823100000000000000000000000000000000000000000000000000000000815260048101959095529051600160a060020a03909116936370a082319360248083019493928390030190829087803b15801561110557600080fd5b505af1158015611119573d6000803e3d6000fd5b505050506040513d602081101561112f57600080fd5b5051601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163d3ce77fe916044808201926020929091908290030181600087803b1580156111a157600080fd5b505af11580156111b5573d6000803e3d6000fd5b505050506040513d60208110156111cb57600080fd5b50511515611249576040805160e560020a62461bcd02815260206004820152602c60248201527f556e72656769737465722042616c616e63653a3a436f756c64206e6f7420646560448201527f7374726f7920746f6b656e730000000000000000000000000000000000000000606482015290519081900360840190fd5b50565b600154600160a060020a031633148061127457503360009081526011602052604090205460ff165b15156112de576040805160e560020a62461bcd02815260206004820152603a602482015260008051602061433283398151915260448201527f20627920616e20617574686f72697a6564206465706c6f796572000000000000606482015290519081900360840190fd5b6112f16112eb8484612ed8565b82612f92565b610f43600082612ffb565b606080600080861161135a576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b8584146113b3576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b6040805187815260208089028201019091528680156113dc578160200160208202803883390190505b509150600090505b858110156114495761141c8787838181106113fb57fe5b90506020020135868684818110151561141057fe5b90506020020135612ebe565b828281518110151561142a57fe5b600160a060020a039092166020928302909101909101526001016113e4565b5095945050505050565b600d6020526000908152604090205481565b60008086116114c0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414611519576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b5060005b8581101561158e5761158687878381811061153457fe5b90506020020135868684818110151561154957fe5b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613172945050505050565b60010161151d565b50505050505050565b601054600160a060020a0383811691161415611623576040805160e560020a62461bcd02815260206004820152602f60248201527f457374617465526567697374727920756e73616665207472616e73666572732060448201527f617265206e6f7420616c6c6f7765640000000000000000000000000000000000606482015290519081900360840190fd5b610f438383836020604051908101604052806000815250600061331f565b6000610f548383613352565b60116020526000908152604090205460ff1681565b600160a060020a038216600090815260076020526040812054821061168657600080fd5b6f8000000000000000000000000000000082106116a257600080fd5b600160a060020a03831660009081526007602052604090208054839081106116c657fe5b9060005260206000200154905092915050565b600090565b600154600160a060020a03163314611742576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a03811615156117a2576040805160e560020a62461bcd02815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526011602052604090205460ff1615611813576040805160e560020a62461bcd02815260206004820152601d60248201527f6164647265737320697320616c726561647920617574686f72697a6564000000604482015290519081900360640190fd5b600160a060020a038116600081815260116020526040808220805460ff191660011790555133917f9e237638dcd1b2be1fc623ab6a47409b34dc8a62196448dd2d6b9045b2c3315791a350565b600061186c8484612ed8565b905061189461187a82612e75565b83836020604051908101604052806000815250600161331f565b50505050565b610f438383836020604051908101604052806000815250600161331f565b6040805180820190915260118082527f446563656e7472616c616e64204c414e4400000000000000000000000000000060209092019182526118fc916003916141ff565b506040805180820190915260048082527f4c414e4400000000000000000000000000000000000000000000000000000000602090920191825261193f91816141ff565b506040805160608101825260338082527f436f6e747261637420746861742073746f7265732074686520446563656e7472602083019081527f616c616e64204c414e44207265676973747279000000000000000000000000009290930191909152610f43916005916141ff565b6060610f546119bb8484612ed8565b6133d0565b600080808611611a1c576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414611a75576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b600091505b8582101561158e57611ab2878784818110611a9157fe5b905060200201358686858181101515611aa657fe5b90506020020135612ed8565b9050611ada611ac082612e75565b84836020604051908101604052806000815250600161331f565b600190910190611a7a565b6000610da48261364a565b600160a060020a038116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015611b5057602002820191906000526020600020905b815481526020019060010190808311611b3c575b50505050509050919050565b336000908152600d60205260409020429055565b60146020526000908152604090205460ff1681565b600154600160a060020a03163314611be9576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a0381161515611c6f576040805160e560020a62461bcd02815260206004820152602a60248201527f4e6577206c616e6442616c616e63652073686f756c64206e6f74206265207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015290519081900360840190fd5b601354604051600160a060020a038084169216907f72d675e4d2f5ce2deafcb203f4dacdeee8be536626817bc87833e716ef73942d90600090a360138054600160a060020a031916600160a060020a0392909216919091179055565b6000610da482612e75565b604080517f6765744d657461646174612875696e74323536290000000000000000000000008152905190819003601401902081565b6000610f548383613667565b6060610da4826133d0565b6000610f548383612ed8565b6000610da4826136e6565b600054600160a060020a031681565b60005b8251811015610f4357611d758382815181101515611d6557fe5b90602001906020020151836121df565b600101611d4b565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b600080611dea83613701565b915091505b915091565b601354600160a060020a031681565b600154600090600160a060020a0316331480611e2e57503360009081526011602052604090205460ff165b1515611e98576040805160e560020a62461bcd02815260206004820152603a602482015260008051602061433283398151915260448201527f20627920616e20617574686f72697a6564206465706c6f796572000000000000606482015290519081900360840190fd5b5060005b84811015611ecf57611ebc611eb6878784818110611a9157fe5b83612f92565b611ec7600083612ffb565b600101611e9c565b505050505050565b6000611f6a8888808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808e0282810182019093528d82529095508d94508c93508392508501908490808284375050604080516020601f8c018190048102820181019092528a81528c955093508a925089915081908401838280828437506137c0945050505050565b98975050505050505050565b600160a060020a0381166000908152600760209081526040808320548151818152818402810190930190915260609283928391829181908190868015611fc6578160200160208202803883390190505b50945085604051908082528060200260200182016040528015611ff3578160200160208202803883390190505b509350600090505b8581101561207d57600160a060020a0389166000908152600760205260409020805461203c91908390811061202c57fe5b9060005260206000200154613701565b86519194509250839086908390811061205157fe5b602090810290910101528351829085908390811061206b57fe5b60209081029091010152600101611ffb565b50929791965090945050505050565b600254600160a060020a031681565b600154600160a060020a031633146120ff576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b60108054600160a060020a031916600160a060020a0383169081179091556040517f5b3ad80e09ce4c88735037542891c02fdc63b85e96a579d9260a403153c2775590600090a250565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b600f60205260009081526040902054600160a060020a031681565b6121cf8282613a93565b5050565b6000610f548383613b21565b8160006121eb82612e75565b90506121f73383613352565b806122255750600160a060020a038116600090815260126020908152604080832033845290915290205460ff165b151561227b576040805160e560020a62461bcd02815260206004820152601160248201527f756e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b6000848152600f60205260408082208054600160a060020a031916600160a060020a0387169081179091559051909186917f9d9dd80a56a16f715df6eb40b771e24ff8cbea6eed9de28473ce0f28fe5602a99190a350505050565b61231585858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506001945061331f9350505050565b5050505050565b33600090815260146020526040812054819060ff16156123ac576040805160e560020a62461bcd02815260206004820152603060248201527f52656769737465722042616c616e63653a3a546865207573657220697320616c60448201527f7265616479207265676973746572656400000000000000000000000000000000606482015290519081900360840190fd5b601354604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561241257600080fd5b505af1158015612426573d6000803e3d6000fd5b505050506040513d602081101561243c57600080fd5b50519150600082111561255e57601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018590529051600160a060020a039092169163d3ce77fe916044808201926020929091908290030181600087803b1580156124b657600080fd5b505af11580156124ca573d6000803e3d6000fd5b505050506040513d60208110156124e057600080fd5b5051151561255e576040805160e560020a62461bcd02815260206004820152602a60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f74206465737460448201527f726f7920746f6b656e7300000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601460205260409020805460ff19166001179055612581906136e6565b601354604080517f827f32c0000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163827f32c0916044808201926020929091908290030181600087803b1580156125f157600080fd5b505af1158015612605573d6000803e3d6000fd5b505050506040513d602081101561261b57600080fd5b505115156121cf576040805160e560020a62461bcd02815260206004820152602b60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f742067656e6560448201527f7261746520746f6b656e73000000000000000000000000000000000000000000606482015290519081900360840190fd5b600061270e8686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a9350839250850190849080828437505060408051602081019091526000815289945092506137c0915050565b9695505050505050565b611894848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750613172945050505050565b601054600160a060020a031681565b6000610f548383612e90565b600160a060020a0382163314156127f5576040805160e560020a62461bcd02815260206004820152602b60248201527f546865206f70657261746f722073686f756c6420626520646966666572656e7460448201527f2066726f6d206f776e6572000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831633148061281157506128118333612e90565b1515612867576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03838116600081815260126020908152604080832094871680845294825291829020805460ff191686151590811790915582519081529151339493927fd79fbfe1644c022b9150727d871532bfcc3e27ffee86fc596a062770ac97b04292908290030190a4505050565b600254600160a060020a031633146128ec57fe5b600254600160a060020a0382811691161415612952576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f74207472616e7366657220746f20796f757273656c660000000000604482015290519081900360640190fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b6000808086116129d0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414612a29576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b601054604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905290513392600160a060020a031691636352211e9160248083019260209291908290030181600087803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b505050506040513d6020811015612ab957600080fd5b5051600160a060020a031614612b3f576040805160e560020a62461bcd02815260206004820152602f60248201527f596f75206d757374206f776e207468652045737461746520796f752077616e7460448201527f20746f207472616e7366657220746f0000000000000000000000000000000000606482015290519081900360840190fd5b600091505b8582101561158e57612b5b878784818110611a9157fe5b9050612b86612b6982612e75565b601054600160a060020a031683612b7f87613b35565b600161331f565b600190910190612b44565b601054604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905290516000923392600160a060020a0390911691636352211e9160248082019260209290919082900301818887803b158015612bfc57600080fd5b505af1158015612c10573d6000803e3d6000fd5b505050506040513d6020811015612c2657600080fd5b5051600160a060020a031614612cac576040805160e560020a62461bcd02815260206004820152602f60248201527f596f75206d757374206f776e207468652045737461746520796f752077616e7460448201527f20746f207472616e7366657220746f0000000000000000000000000000000000606482015290519081900360840190fd5b612cb68484612ed8565b9050611894612cc482612e75565b601054600160a060020a031683612b7f86613b35565b600154600160a060020a03163314612d3e576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a0381161515612d9e576040805160e560020a62461bcd02815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526011602052604090205460ff161515612e10576040805160e560020a62461bcd02815260206004820152601c60248201527f6164647265737320697320616c726561647920666f7262696464656e00000000604482015290519081900360640190fd5b600160a060020a038116600081815260116020526040808220805460ff191690555133917f7883da318e7694f396f400092b07b701a4eccb02aee0d28266adc659cca044da91a350565b6000908152600c6020526040902054600160a060020a031690565b600090815260086020526040902054600160a060020a031690565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6000610f54612ecd8484612ed8565b612e75565b60065490565b600082620f423f19128015612eef5750620f424083125b8015612efe575081620f423f19125b8015612f0c5750620f424082125b1515612f88576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610f548383613b60565b600082815260086020526040902054600160a060020a031615612fb457600080fd5b612fbe8183613ba1565b8181600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600160a060020a03821660009081526014602052604090205460ff16156130b857601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152600160248301529151919092169163d3ce77fe9160448083019260209291908290030181600087803b15801561308b57600080fd5b505af115801561309f573d6000803e3d6000fd5b505050506040513d60208110156130b557600080fd5b50505b600160a060020a03811660009081526014602052604090205460ff16156121cf57601354604080517f827f32c0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152600160248301529151919092169163827f32c09160448083019260209291908290030181600087803b15801561314857600080fd5b505af115801561315c573d6000803e3d6000fd5b505050506040513d602081101561189457600080fd5b60008061317f8585612ed8565b61318881612e75565b600160a060020a031633600160a060020a031614806131ac57506131ac3382613352565b806131bc57506131bc3382613667565b1515613238576040805160e560020a62461bcd02815260206004820152602660248201527f6d73672e73656e646572206973206e6f7420617574686f72697a656420746f2060448201527f7570646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6132428686612ed8565b600081815260086020526040902054909350600160a060020a031691506132698385613c2b565b33600160a060020a031682600160a060020a0316847f47c705b9219229ad762fca605f08fb024a3415d0ae78af5d319820c72e510414876040518080602001828103825283818151815260200191508051906020019080838360005b838110156132dd5781810151838201526020016132c5565b50505050905090810190601f16801561330a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a4505050505050565b6000838152600f602052604090208054600160a060020a03191690556133458585612ffb565b6123158585858585613c4a565b600080600160a060020a038416151561336a57600080fd5b61337383612e75565b905080600160a060020a031684600160a060020a0316141561339857600191506133c9565b6133a28185612e90565b806133c6575083600160a060020a03166133bb84612e5a565b600160a060020a0316145b91505b5092915050565b606060006133dd83612e75565b90506133e881613c6d565b80156134025750601054600160a060020a03828116911614155b156135a957604080517f6765744d657461646174612875696e7432353629000000000000000000000000815281519081900360140181207f01ffc9a7000000000000000000000000000000000000000000000000000000008252600160e060020a03191660048201529051600160a060020a038316916301ffc9a79160248083019260209291908290030181600087803b15801561349f57600080fd5b505af11580156134b3573d6000803e3d6000fd5b505050506040513d60208110156134c957600080fd5b5051156135a95780600160a060020a031663a574cea4846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561351957600080fd5b505af115801561352d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561355657600080fd5b81019080805164010000000081111561356e57600080fd5b8201602081018481111561358157600080fd5b815164010000000081118282018710171561359b57600080fd5b509095506136449350505050565b6000838152600a602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452909183018282801561363c5780601f106136115761010080835404028352916020019161363c565b820191906000526020600020905b81548152906001019060200180831161361f57829003601f168201915b505050505091505b50919050565b600090815260086020526040902054600160a060020a0316151590565b60008061367383612e75565b905083600160a060020a031681600160a060020a031614806136ae57506000838152600f6020526040902054600160a060020a038581169116145b806133c65750600160a060020a0380821660009081526012602090815260408083209388168352929052205460ff1691505092915050565b600160a060020a031660009081526007602052604090205490565b60008061370d83613c75565b9092509050620f423f19821380156137275750620f424082125b8015613736575080620f423f19125b80156137445750620f424081125b1515611def576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600080606060008060008951111515613825576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b8751895114613880576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b601054600160a060020a03161515613908576040805160e560020a62461bcd02815260206004820152602160248201527f546865204573746174652072656769737472792073686f756c6420626520736560448201527f7400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517fd0def521000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301908152602483019384528a5160448401528a51919094169363d0def521938c938c93606490910190602085019080838360005b8381101561398c578181015183820152602001613974565b50505050905090810190601f1680156139b95780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b1580156139d957600080fd5b505af11580156139ed573d6000803e3d6000fd5b505050506040513d6020811015613a0357600080fd5b50519350613a1084613b35565b9250600091505b8851821015613a8657613a588983815181101515613a3157fe5b906020019060200201518984815181101515613a4957fe5b90602001906020020151612ed8565b9050613a7b613a6682612e75565b601054600160a060020a03168386600161331f565b600190910190613a17565b5091979650505050505050565b8015613abc57613aa33383612e90565b15613aad57600080fd5b613ab78233613ccb565b613adb565b613ac63383612e90565b1515613ad157600080fd5b613adb8233613d00565b6040805182151581529051600160a060020a0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6000610f54613b308484612ed8565b61364a565b6040805160208082528183019092526060918082016104008038833950505060208101929092525090565b70010000000000000000000000000000000082026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff82161792915050565b60008181526008602052604081208054600160a060020a031916600160a060020a038516179055613bd1836136e6565b600160a060020a0384166000908152600760209081526040808320805460018181018355918552838520018790558684526009909252909120829055600654919250613c23919063ffffffff613d3216565b600655505050565b6000828152600a602090815260409091208251610f43928401906141ff565b82613c553382613352565b1515613c6057600080fd5b611ecf8686868686613d45565b6000903b1190565b600080613ca77001000000000000000000000000000000006fffffffffffffffffffffffffffffffff19851604613f9b565b9150613cc46fffffffffffffffffffffffffffffffff8416613f9b565b9050915091565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19166001179055565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19169055565b81810182811015613d3f57fe5b92915050565b600084600160a060020a0381161515613d5d57600080fd5b848680600160a060020a0316613d7283612e75565b600160a060020a03161415613d8657600080fd5b888781600160a060020a0316613d9b82612e75565b600160a060020a031614613dae57600080fd5b600089815260086020526040902054600160a060020a03169550613dd2868a613fd3565b613ddc868a61406c565b613de68a8a613ba1565b888a600160a060020a031687600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4868015613e385750613e388a613c6d565b15613f8e5763150b7a0260e060020a027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168a600160a060020a031663150b7a0233898d8d6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613eff578181015183820152602001613ee7565b50505050905090810190601f168015613f2c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613f4e57600080fd5b505af1158015613f62573d6000803e3d6000fd5b505050506040513d6020811015613f7857600080fd5b5051600160e060020a03191614613f8e57600080fd5b5050505050505050505050565b60006f80000000000000000000000000000000821615613fcf57506fffffffffffffffffffffffffffffffff198117610da7565b5090565b81600160a060020a0316613fe682612e75565b600160a060020a031614801561401257506000818152600c6020526040902054600160a060020a031615155b156121cf576000818152600c60205260408082208054600160a060020a031916905551829190600160a060020a038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b6000818152600960205260408120549080614097600161408b876136e6565b9063ffffffff6141ed16565b600160a060020a0386166000908152600760205260409020805491935090839081106140bf57fe5b60009182526020808320909101548683526008825260408084208054600160a060020a0319169055600160a060020a038916845260079092529120805491925082918590811061410b57fe5b6000918252602080832090910192909255600160a060020a038716815260079091526040812080548490811061413d57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490614174906000198301614279565b50600160a060020a03851660009081526007602052604090205415156141b557600160a060020a03851660009081526007602052604081206141b59161429d565b60008481526009602052604080822082905582825290208390556006546141e390600163ffffffff6141ed16565b6006555050505050565b6000828211156141f957fe5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061424057805160ff191683800117855561426d565b8280016001018555821561426d579182015b8281111561426d578251825591602001919060010190614252565b50613fcf9291506142b7565b815481835581811115610f4357600083815260209020610f439181019083016142b7565b508054600082559060005260206000209081019061124991905b610e4f91905b80821115613fcf57600081556001016142bd5600206279207468652070726f7879206f776e65720000000000000000000000000054686520636f6f7264696e617465732073686f756c642068617665207468652073616d65206c656e677468000000000000000000000000000000000000000000546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564596f752073686f756c6420737570706c79206174206c65617374206f6e6520636f6f7264696e6174650000000000000000000000000000000000000000000000a165627a7a7230582060dd553b8b9313990355b3a660fdf52c893d125560ffa4ca954f3f3ecd4818ef0029
Deployed Bytecode Sourcemap
28232:15629:0:-;;;;;;;;;-1:-1:-1;;;28232:15629:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20495:280;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20495:280:0;-1:-1:-1;;;;;;20495:280:0;;;;;;;;;;;;;;;;;;;;;;;203:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;203:25:0;;;;;;;;-1:-1:-1;;;;;203:25:0;;;;;;;;;;;;;;24870:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24870:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;24870:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4394:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4394:65:0;-1:-1:-1;;;;;4394:65:0;;;;;;;;;;12522:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12522:118:0;;;;;14587:368;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14587:368:0;-1:-1:-1;;;;;14587:368:0;;;;;;;;;33220:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33220:105:0;;;;;;;31409:253;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31409:253:0;-1:-1:-1;;;;;31409:253:0;;;;;10453:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10453:89:0;;;;;;;;;;;;;;;;;;;;42475:468;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42475:468:0;;;;30744:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30744:189:0;;;;;-1:-1:-1;;;;;30744:189:0;;;;;33455:411;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33455:411:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;33455:411:0;;;;;;;;;;;;;;;;;3850:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3850:43:0;-1:-1:-1;;;;;3850:43:0;;;;;40739:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40739:322:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34929:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34929:277:0;-1:-1:-1;;;;;34929:277:0;;;;;;;;;;;;13157:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13157:138:0;-1:-1:-1;;;;;13157:138:0;;;;;;;4338:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4338:49:0;-1:-1:-1;;;;;4338:49:0;;;;;23877:249;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23877:249:0;-1:-1:-1;;;;;23877:249:0;;;;;;;25847:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25847:73:0;;;;30071:321;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30071:321:0;-1:-1:-1;;;;;30071:321:0;;;;;35212:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35212:214:0;;;;;-1:-1:-1;;;;;35212:214:0;;;;;17888:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17888:142:0;-1:-1:-1;;;;;17888:142:0;;;;;;;;;;;;28399:174;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28399:174:0;;;;;;;;;;;;34770:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34770:119:0;;;;;;;35432:452;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35432:452:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35432:452:0;;;;;25633:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25633:98:0;;;;;23297:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23297:103:0;-1:-1:-1;;;;;23297:103:0;;;;;31266:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31266:137:0;;;;4570:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4570:49:0;-1:-1:-1;;;;;4570:49:0;;;;;41255:286;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41255:286:0;-1:-1:-1;;;;;41255:286:0;;;;;10935:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10935:103:0;;;;;28313:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28313:79:0;;;;;;;;-1:-1:-1;;;;;;28313:79:0;;;;;;;;;;;;;;29649:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29649:150:0;-1:-1:-1;;;;;29649:150:0;;;;;;;34282:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34282:114:0;;;;;31701:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31701:106:0;;;;;;;11395:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11395:103:0;-1:-1:-1;;;;;11395:103:0;;;;;168:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;168:30:0;;;;37496:216;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37496:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37496:216:0;;-1:-1:-1;;;37496:216:0;;-1:-1:-1;;;;;37496:216:0;;-1:-1:-1;37496:216:0;;-1:-1:-1;;;37496:216:0;25026:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25026:86:0;;;;32231:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32231:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4498:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4498:31:0;;;;30939:259;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30939:259:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30939:259:0;;;;;38923:263;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38923:263:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38923:263:0;;;;;;;;;;;;;;33872:404;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33872:404:0;-1:-1:-1;;;;;33872:404:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;33872:404:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;33872:404:0;;;;;;;;;;;;;;;;;;;319:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;319:20:0;;;;38558:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38558:163:0;-1:-1:-1;;;;;38558:163:0;;;;;24946:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24946:76:0;;;;4237:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4237:50:0;;;;;13879:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13879:131:0;-1:-1:-1;;;;;13879:131:0;;;;;;;;;33007:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33007:92:0;;;;;;;37100:219;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37100:219:0;;;-1:-1:-1;;;;;37100:219:0;;;;;18520:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18520:164:0;-1:-1:-1;;;;;18520:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;41637:739;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41637:739:0;;;;38727:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38727:190:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38727:190:0;;;;;40243:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40243:135:0;;;;;;;;;;;;;;;;;;;4294:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4294:37:0;;;;11982:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11982:162:0;-1:-1:-1;;;;;11982:162:0;;;;;;;;;;37997:461;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37997:461:0;-1:-1:-1;;;;;37997:461:0;;;;;;;;;;;;;;4969:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4969:158:0;-1:-1:-1;;;;;4969:158:0;;;;;36296:636;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36296:636:0;;;;;;;;;;;;;;;;;;;;;;;;;;35890:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35890:400:0;;;;;;;;;30398:308;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30398:308:0;-1:-1:-1;;;;;30398:308:0;;;;;20495:280;20566:4;-1:-1:-1;;;;;;20585:26:0;;;;20581:61;;;-1:-1:-1;20629:5:0;20622:12;;20581:61;-1:-1:-1;;;;;;20655:34:0;;20671:18;20655:34;;:76;;-1:-1:-1;;;;;;;20693:38:0;;20709:22;20693:38;20655:76;:114;;;-1:-1:-1;;;;;;;20735:34:0;;20751:18;20735:34;20655:114;20648:121;;20495:280;;;;:::o;203:25::-;;;-1:-1:-1;;;;;203:25:0;;:::o;24870:72::-;24931:5;24924:12;;;;;;;;-1:-1:-1;;24924:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24909:6;;24924:12;;24931:5;;24924:12;;24931:5;24924:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24870:72;;:::o;4394:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12522:118::-;12583:7;12606:28;12626:7;12606:19;:28::i;14587:368::-;14655:14;14672:17;14681:7;14672:8;:17::i;:::-;14655:34;-1:-1:-1;14704:10:0;-1:-1:-1;;;;;14704:20:0;;;;:61;;;14728:37;14746:10;14758:6;14728:17;:37::i;:::-;14696:70;;;;;;;;-1:-1:-1;;;;;14781:18:0;;;;;;;;14773:27;;;;;;14845:8;-1:-1:-1;;;;;14813:40:0;:28;14833:7;14813:19;:28::i;:::-;-1:-1:-1;;;;;14813:40:0;;14809:141;;14864:18;;;;:9;:18;;;;;;:29;;-1:-1:-1;;;;;;14864:29:0;-1:-1:-1;;;;;14864:29:0;;;;;;;;;14907:35;;14864:18;;14907:35;;;;;;;14809:141;14587:368;;;:::o;33220:105::-;33278:7;33301:18;33314:1;33317;33301:12;:18::i;:::-;33294:25;33220:105;-1:-1:-1;;;33220:105:0:o;31409:253::-;31485:10;;-1:-1:-1;;;;;31485:10:0;31471;:24;;:63;;;31499:35;31517:10;31529:4;31499:17;:35::i;:::-;31463:93;;;;;;;-1:-1:-1;;;;;31463:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31622:16:0;;;;;:10;:16;;;;;31641:15;31622:34;;31409:253::o;10453:89::-;10499:7;10522:14;:12;:14::i;:::-;10515:21;;10453:89;:::o;42475:468::-;42546:10;42716:22;42528:29;;;:17;:29;;;;;;;;42520:85;;;;;;;-1:-1:-1;;;;;42520:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42668:10;42682:5;42650:29;;;:17;:29;;;;;;;;:37;;-1:-1:-1;;42650:37:0;;;42741:11;;:33;;;;;;;;;;;;;;-1:-1:-1;;;;;42741:11:0;;;;:21;;:33;;;;;42650:29;42741:33;;;;;;;;:11;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;42741:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42741:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42741:33:0;42822:11;;:53;;;;;;42848:10;42822:53;;;;;;;;;;;;42741:33;;-1:-1:-1;;;;;;42822:11:0;;;;:25;;:53;;;;;42741:33;;42822:53;;;;;;;;:11;;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;42822:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42822:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42822:53:0;42806:131;;;;;;;-1:-1:-1;;;;;42806:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42475:468;:::o;30744:189::-;28781:10;;-1:-1:-1;;;;;28781:10:0;28767;:24;;:56;;-1:-1:-1;28812:10:0;28795:28;;;;:16;:28;;;;;;;;28767:56;28751:148;;;;;;;-1:-1:-1;;;;;28751:148:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28751:148:0;;;;;;;;;;;;;;;;;;;;30833:44;30843:20;30858:1;30861;30843:14;:20::i;:::-;30865:11;30833:9;:44::i;:::-;30884:43;30911:1;30915:11;30884:18;:43::i;33455:411::-;33521:9;;33757:6;33547:12;;;33539:66;;;;;-1:-1:-1;;;;;33539:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33539:66:0;;;;-1:-1:-1;;;;;;;;;;;33539:66:0;;;;;;;;;;;;;;;33620:20;;;33612:76;;;;;-1:-1:-1;;;;;33612:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33612:76:0;;;;-1:-1:-1;;;;;;;;;;;33612:76:0;;;;;;;;;;;;;;;33722:23;;;;;;;;;;;;;;;;33736:1;33722:23;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;33722:23:0;;33697:48;;33766:1;33757:10;;33752:88;33769:12;;;33752:88;;;33808:24;33821:1;;33823;33821:4;;;;;;;;;;;;;33827:1;;33829;33827:4;;;;;;;;;;;;;;;33808:12;:24::i;:::-;33797:5;33803:1;33797:8;;;;;;;;;;-1:-1:-1;;;;;33797:35:0;;;:8;;;;;;;;;;:35;33783:3;;33752:88;;;-1:-1:-1;33855:5:0;33455:411;-1:-1:-1;;;;;33455:411:0:o;3850:43::-;;;;;;;;;;;;;:::o;40739:322::-;40975:6;40822:12;;;40814:66;;;;;-1:-1:-1;;;;;40814:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40814:66:0;;;;-1:-1:-1;;;;;;;;;;;40814:66:0;;;;;;;;;;;;;;;40895:20;;;40887:76;;;;;-1:-1:-1;;;;;40887:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40887:76:0;;;;-1:-1:-1;;;;;;;;;;;40887:76:0;;;;;;;;;;;;;;;-1:-1:-1;40984:1:0;40970:86;40987:12;;;40970:86;;;41015:33;41031:1;;41033;41031:4;;;;;;;;;;;;;41037:1;;41039;41037:4;;;;;;;;;;;;;;;41043;;41015:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41015:15:0;;-1:-1:-1;;;;;41015:33:0:i;:::-;41001:3;;40970:86;;;40739:322;;;;;;;:::o;34929:277::-;35032:14;;-1:-1:-1;;;;;35018:29:0;;;35032:14;;35018:29;;35010:89;;;;;-1:-1:-1;;;;;35010:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35113:87;35137:4;35150:2;35161:7;35113:87;;;;;;;;;;;;;35188:5;35113:15;:87::i;13157:138::-;13237:4;13257:32;13271:8;13281:7;13257:13;:32::i;4338:49::-;;;;;;;;;;;;;;;:::o;23877:249::-;-1:-1:-1;;;;;24027:16:0;;23984:15;24027:16;;;:9;:16;;;;;:23;24019:31;;24011:40;;;;;;24075:6;24066:16;;24058:25;;;;;;-1:-1:-1;;;;;24097:16:0;;;;;;:9;:16;;;;;:23;;24114:5;;24097:23;;;;;;;;;;;;;;24090:30;;23877:249;;;;:::o;25847:73::-;25890:7;25847:73;:::o;30071:321::-;28634:10;;-1:-1:-1;;;;;28634:10:0;28620;:24;28612:88;;;;;-1:-1:-1;;;;;28612:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30156:25:0;;;;30148:53;;;;;-1:-1:-1;;;;;30148:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30216:29:0;;;;;;:16;:29;;;;;;;;:38;30208:80;;;;;-1:-1:-1;;;;;30208:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30297:29:0;;;;;;:16;:29;;;;;;:36;;-1:-1:-1;;30297:36:0;30329:4;30297:36;;;30345:41;30362:10;;30345:41;;;30071:321;:::o;35212:214::-;35276:15;35294:20;35309:1;35312;35294:14;:20::i;:::-;35276:38;;35321:99;35345:17;35354:7;35345:8;:17::i;:::-;35371:2;35382:7;35321:99;;;;;;;;;;;;;35409:4;35321:15;:99::i;:::-;35212:214;;;;:::o;17888:142::-;17980:44;17996:4;18002:2;18006:7;17980:44;;;;;;;;;;;;;18019:4;17980:15;:44::i;28399:174::-;28442:27;;;;;;;;;;;;;;;;;;;;;;;:5;;:27;:::i;:::-;-1:-1:-1;28476:16:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28499:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;;:68;:::i;34770:119::-;34825:6;34847:36;34862:20;34877:1;34880;34862:14;:20::i;:::-;34847:14;:36::i;35432:452::-;35667:6;;35512:12;;;35504:66;;;;;-1:-1:-1;;;;;35504:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35504:66:0;;;;-1:-1:-1;;;;;;;;;;;35504:66:0;;;;;;;;;;;;;;;35585:20;;;35577:76;;;;;-1:-1:-1;;;;;35577:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35577:76:0;;;;-1:-1:-1;;;;;;;;;;;35577:76:0;;;;;;;;;;;;;;;35676:1;35667:10;;35662:217;35679:12;;;35662:217;;;35725:26;35740:1;;35742;35740:4;;;;;;;;;;;;;35746:1;;35748;35746:4;;;;;;;;;;;;;;;35725:14;:26::i;:::-;35707:44;;35760:111;35786:17;35795:7;35786:8;:17::i;:::-;35814:2;35827:7;35760:111;;;;;;;;;;;;;35858:4;35760:15;:111::i;:::-;35693:3;;;;;35662:217;;25633:98;25689:4;25709:16;25717:7;25709;:16::i;23297:103::-;-1:-1:-1;;;;;23378:16:0;;;;;;:9;:16;;;;;;;;;23371:23;;;;;;;;;;;;;;;;;23353:9;;23371:23;;;23378:16;23371:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23297:103;;;:::o;31266:137::-;31368:10;31357:22;;;;:10;:22;;;;;31382:15;31357:40;;31266:137::o;4570:49::-;;;;;;;;;;;;;;;:::o;41255:286::-;28634:10;;-1:-1:-1;;;;;28634:10:0;28620;:24;28612:88;;;;;-1:-1:-1;;;;;28612:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41348:29:0;;;;41340:84;;;;;-1:-1:-1;;;;;41340:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41456:11;;41436:49;;-1:-1:-1;;;;;41436:49:0;;;;41456:11;;41436:49;;41456:11;;41436:49;41492:11;:43;;-1:-1:-1;;;;;;41492:43:0;-1:-1:-1;;;;;41492:43:0;;;;;;;;;;41255:286::o;10935:103::-;10992:7;11015:17;11024:7;11015:8;:17::i;28313:79::-;28358:33;;;;;;;;;;;;;;;;28313:79;:::o;29649:150::-;29735:4;29755:38;29775:8;29785:7;29755:19;:38::i;34282:114::-;34345:6;34367:23;34382:7;34367:14;:23::i;31701:106::-;31761:4;31781:20;31796:1;31799;31781:14;:20::i;11395:103::-;11452:7;11475:17;11486:5;11475:10;:17::i;168:30::-;;;-1:-1:-1;;;;;168:30:0;;:::o;37496:216::-;37609:6;37604:103;37625:9;:16;37621:1;:20;37604:103;;;37657:42;37675:9;37685:1;37675:12;;;;;;;;;;;;;;;;;;37689:9;37657:17;:42::i;:::-;37643:3;;37604:103;;25026:86;25094:12;25087:19;;;;;;;;-1:-1:-1;;25087:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25072:6;;25087:19;;25094:12;;25087:19;;25094:12;25087:19;;;;;;;;;;;;;;;;;;;;;;;;32231:109;32289:3;32294;32313:21;32328:5;32313:14;:21::i;:::-;32306:28;;;;32231:109;;;;:::o;4498:31::-;;;-1:-1:-1;;;;;4498:31:0;;:::o;30939:259::-;28781:10;;31043:6;;-1:-1:-1;;;;;28781:10:0;28767;:24;;:56;;-1:-1:-1;28812:10:0;28795:28;;;;:16;:28;;;;;;;;28767:56;28751:148;;;;;;;-1:-1:-1;;;;;28751:148:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28751:148:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31052:1:0;31038:155;31055:12;;;31038:155;;;31083:50;31093:26;31108:1;;31110;31108:4;;;;;;31093:26;31121:11;31083:9;:50::i;:::-;31142:43;31169:1;31173:11;31142:18;:43::i;:::-;31069:3;;31038:155;;;30939:259;;;;;;:::o;38923:263::-;39066:7;39138:42;39152:1;;39138:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39138:42:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39155:1:0;;-1:-1:-1;39155:1:0;;-1:-1:-1;39155:1:0;;-1:-1:-1;39138:42:0;;;39155:1;;39138:42;39155:1;39138:42;;-1:-1:-1;;39138:42:0;;;;;;;;;;;;;;;;;;;;;;39158:11;;-1:-1:-1;39138:42:0;-1:-1:-1;39171:8:0;;-1:-1:-1;39171:8:0;;-1:-1:-1;39171:8:0;;39138:42;;39171:8;;;;39138:42;;-1:-1:-1;39138:13:0;;-1:-1:-1;;;;;39138:42:0:i;:::-;39131:49;38923:263;-1:-1:-1;;;;;;;;38923:263:0:o;33872:404::-;-1:-1:-1;;;;;33961:16:0;;33947:11;33961:16;;;:9;:16;;;;;;;;:23;34008:14;;;;;;;;;;;;;;;;33926:5;;;;;;;;33947:11;;;;33961:23;34008:14;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;34008:14:0;;33991:31;;34056:3;34046:14;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;34046:14:0;;34029:31;;34117:1;34108:10;;34103:146;34124:3;34120:1;:7;34103:146;;;-1:-1:-1;;;;;34177:16:0;;;;;;:9;:16;;;;;:19;;34162:35;;34177:16;34194:1;;34177:19;;;;;;;;;;;;;;34162:14;:35::i;:::-;34206:4;;34143:54;;-1:-1:-1;34143:54:0;-1:-1:-1;34143:54:0;;34206:1;;34208;;34206:4;;;;;;;;;;;;;;:13;34228:4;;34235:6;;34228:1;;34230;;34228:4;;;;;;;;;;;;;;:13;34129:3;;34103:146;;;-1:-1:-1;34265:1:0;;34268;;-1:-1:-1;33872:404:0;;-1:-1:-1;;;;;33872:404:0:o;319:20::-;;;-1:-1:-1;;;;;319:20:0;;:::o;38558:163::-;28634:10;;-1:-1:-1;;;;;28634:10:0;28620;:24;28612:88;;;;;-1:-1:-1;;;;;28612:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;;;;;;;;;;;;38634:14;:42;;-1:-1:-1;;;;;;38634:42:0;-1:-1:-1;;;;;38634:42:0;;;;;;;;38688:27;;;;-1:-1:-1;;38688:27:0;38558:163;:::o;24946:76::-;25009:7;25002:14;;;;;;;;-1:-1:-1;;25002:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24987:6;;25002:14;;25009:7;;25002:14;;25009:7;25002:14;;;;;;;;;;;;;;;;;;;;;;;;4237:50;;;;;;;;;;;;-1:-1:-1;;;;;4237:50:0;;:::o;13879:131::-;13964:40;13983:8;13993:10;13964:18;:40::i;:::-;13879:131;;:::o;33007:92::-;33060:4;33080:13;33088:1;33091;33080:7;:13::i;37100:219::-;37215:7;29434:13;29450:17;29459:7;29450:8;:17::i;:::-;29434:33;;29490:34;29504:10;29516:7;29490:13;:34::i;:::-;:70;;;-1:-1:-1;;;;;;29528:20:0;;;;;;:13;:20;;;;;;;;29549:10;29528:32;;;;;;;;;;29490:70;29474:121;;;;;;;-1:-1:-1;;;;;29474:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37234:23;;;;:14;:23;;;;;;:34;;-1:-1:-1;;;;;;37234:34:0;-1:-1:-1;;;;;37234:34:0;;;;;;;;37280:33;;37234:34;;:23;;37280:33;;37234:23;37280:33;37100:219;;;;:::o;18520:164::-;18628:50;18644:4;18650:2;18654:7;18663:8;;18628:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18673:4:0;;-1:-1:-1;18628:15:0;;-1:-1:-1;;;;18628:50:0:i;:::-;18520:164;;;;;:::o;41637:739::-;41707:10;41814:22;41689:29;;;:17;:29;;;;;;41814:22;;41689:29;;41688:30;41680:91;;;;;-1:-1:-1;;;;;41680:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41839:11;;:33;;;;;;41861:10;41839:33;;;;;;-1:-1:-1;;;;;41839:11:0;;;;:21;;:33;;;;;;;;;;;;;;;:11;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;41839:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41839:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41839:33:0;;-1:-1:-1;41900:1:0;41883:18;;41879:176;;;41930:11;;:53;;;;;;41956:10;41930:53;;;;;;;;;;;;-1:-1:-1;;;;;41930:11:0;;;;:25;;:53;;;;;;;;;;;;;;;:11;;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;41930:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41930:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41930:53:0;41912:135;;;;;;;-1:-1:-1;;;;;41912:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42115:10;42097:29;;;;:17;:29;;;;;:36;;-1:-1:-1;;42097:36:0;42129:4;42097:36;;;42188:22;;:10;:22::i;:::-;42259:11;;:50;;;;;;42286:10;42259:50;;;;;;;;;;;;42167:43;;-1:-1:-1;;;;;;42259:11:0;;;;:26;;:50;;;;;;;;;;;;;;;:11;;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;42259:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42259:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42259:50:0;42243:127;;;;;;;-1:-1:-1;;;;;42243:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38727:190;38806:7;38875:36;38889:1;;38875:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38875:36:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38892:1:0;;-1:-1:-1;38892:1:0;;-1:-1:-1;38892:1:0;;-1:-1:-1;38875:36:0;;;38892:1;;38875:36;38892:1;38875:36;;-1:-1:-1;;38875:36:0;;;;;;;;;-1:-1:-1;38875:36:0;;38895:11;;-1:-1:-1;38875:36:0;-1:-1:-1;38875:13:0;;-1:-1:-1;;38875:36:0:i;:::-;38868:43;38727:190;-1:-1:-1;;;;;;38727:190:0:o;40243:135::-;40345:27;40361:1;40364;40367:4;;40345:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40345:15:0;;-1:-1:-1;;;;;40345:27:0:i;4294:37::-;;;-1:-1:-1;;;;;4294:37:0;;:::o;11982:162::-;12075:4;12098:40;12116:11;12129:8;12098:17;:40::i;37997:461::-;-1:-1:-1;;;;;38098:23:0;;38111:10;38098:23;;38090:79;;;;;-1:-1:-1;;;;;38090:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38192:20:0;;38202:10;38192:20;;:68;;;38223:37;38241:6;38249:10;38223:17;:37::i;:::-;38176:119;;;;;;;-1:-1:-1;;;;;38176:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38304:21:0;;;;;;;:13;:21;;;;;;;;:32;;;;;;;;;;;;;:44;;-1:-1:-1;;38304:44:0;;;;;;;;;;38362:90;;;;;;;38417:10;;38304:32;:21;38362:90;;;;;;;;;37997:461;;;:::o;4969:158::-;4943:5;;-1:-1:-1;;;;;4943:5:0;4929:10;:19;4922:27;;;;5060:5;;-1:-1:-1;;;;;5047:18:0;;;5060:5;;5047:18;;5039:58;;;;;-1:-1:-1;;;;;5039:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5104:5;:17;;-1:-1:-1;;;;;;5104:17:0;-1:-1:-1;;;;;5104:17:0;;;;;;;;;;4969:158::o;36296:636::-;36679:6;;36390:12;;;36382:66;;;;;-1:-1:-1;;;;;36382:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36382:66:0;;;;-1:-1:-1;;;;;;;;;;;36382:66:0;;;;;;;;;;;;;;;36463:20;;;36455:76;;;;;-1:-1:-1;;;;;36455:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36455:76:0;;;;-1:-1:-1;;;;;;;;;;;36455:76:0;;;;;;;;;;;;;;;36554:14;;:32;;;;;;;;;;;;;;36590:10;;-1:-1:-1;;;;;36554:14:0;;:22;;:32;;;;;;;;;;;;;;:14;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;36554:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36554:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36554:32:0;-1:-1:-1;;;;;36554:46:0;;36538:127;;;;;-1:-1:-1;;;;;36538:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36688:1;36679:10;;36674:253;36691:12;;;36674:253;;;36737:26;36752:1;;36754;36752:4;;;;;;36737:26;36719:44;;36772:147;36798:17;36807:7;36798:8;:17::i;:::-;36834:14;;-1:-1:-1;;;;;36834:14:0;36860:7;36878:17;36886:8;36878:7;:17::i;:::-;36906:4;36772:15;:147::i;:::-;36705:3;;;;;36674:253;;35890:400;35984:14;;:32;;;;;;;;;;;;;;-1:-1:-1;;36020:10:0;;-1:-1:-1;;;;;35984:14:0;;;;:22;;:32;;;;;;;;;;;;;;;-1:-1:-1;35984:14:0;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;35984:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35984:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35984:32:0;-1:-1:-1;;;;;35984:46:0;;35968:127;;;;;-1:-1:-1;;;;;35968:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36122:20;36137:1;36140;36122:14;:20::i;:::-;36104:38;;36149:135;36173:17;36182:7;36173:8;:17::i;:::-;36207:14;;-1:-1:-1;;;;;36207:14:0;36231:7;36247:17;36255:8;36247:7;:17::i;30398:308::-;28634:10;;-1:-1:-1;;;;;28634:10:0;28620;:24;28612:88;;;;;-1:-1:-1;;;;;28612:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30480:25:0;;;;30472:53;;;;;-1:-1:-1;;;;;30472:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30540:29:0;;;;;;:16;:29;;;;;;;;30532:70;;;;;;;-1:-1:-1;;;;;30532:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30611:29:0;;30643:5;30611:29;;;:16;:29;;;;;;:37;;-1:-1:-1;;30611:37:0;;;30660:40;30676:10;;30660:40;;;30398:308;:::o;12773:116::-;12842:7;12865:18;;;:9;:18;;;;;;-1:-1:-1;;;;;12865:18:0;;12773:116::o;11042:105::-;11100:7;11123:18;;;:9;:18;;;;;;-1:-1:-1;;;;;11123:18:0;;11042:105::o;12148:156::-;-1:-1:-1;;;;;12265:23:0;;;12242:4;12265:23;;;:10;:23;;;;;;;;:33;;;;;;;;;;;;;;;12148:156::o;33331:118::-;33390:7;33413:30;33422:20;33437:1;33440;33422:14;:20::i;:::-;33413:8;:30::i;10546:82::-;10616:6;;10546:82;:::o;31813:258::-;31874:11;31921:1;-1:-1:-1;;31910:12:0;:27;;;;;31930:7;31926:1;:11;31910:27;:43;;;;;31952:1;-1:-1:-1;;31941:12:0;31910:43;:58;;;;;31961:7;31957:1;:11;31910:58;31894:131;;;;;;;-1:-1:-1;;;;;31894:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32039:26;32060:1;32063;32039:20;:26::i;16606:200::-;16687:18;;;;:9;:18;;;;;;-1:-1:-1;;;;;16687:18:0;:23;16679:32;;;;;;16720:33;16732:11;16745:7;16720:11;:33::i;:::-;16792:7;16779:11;-1:-1:-1;;;;;16767:33:0;16776:1;16767:33;;;;;;;;;;16606:200;;:::o;43612:246::-;-1:-1:-1;;;;;43688:24:0;;;;;;:17;:24;;;;;;;;43684:82;;;43723:11;;:35;;;;;;-1:-1:-1;;;;;43723:35:0;;;;;;;:11;:35;;;;;;:11;;;;;:25;;:35;;;;;;;;;;;;;;:11;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;43723:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43723:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;43684:82:0;-1:-1:-1;;;;;43778:22:0;;;;;;:17;:22;;;;;;;;43774:79;;;43811:11;;:34;;;;;;-1:-1:-1;;;;;43811:34:0;;;;;;;:11;:34;;;;;;:11;;;;;:26;;:34;;;;;;;;;;;;;;:11;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;43811:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43811:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;40384:349:0;40528:15;40573:13;40496:20;40511:1;40514;40496:14;:20::i;:::-;29191:17;29200:7;29191:8;:17::i;:::-;-1:-1:-1;;;;;29177:31:0;:10;-1:-1:-1;;;;;29177:31:0;;:76;;;;29219:34;29233:10;29245:7;29219:13;:34::i;:::-;29177:127;;;;29264:40;29284:10;29296:7;29264:19;:40::i;:::-;29161:199;;;;;;;-1:-1:-1;;;;;29161:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40546:20;40561:1;40564;40546:14;:20::i;:::-;40589:18;;;;:9;:18;;;;;;40528:38;;-1:-1:-1;;;;;;40589:18:0;;-1:-1:-1;40616:22:0;40528:38;40633:4;40616:7;:22::i;:::-;40697:10;-1:-1:-1;;;;;40652:75:0;40683:5;-1:-1:-1;;;;;40652:75:0;40667:7;40652:75;40716:4;40652:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;40652:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40384:349;;;;;;:::o;42949:337::-;43135:1;43101:23;;;:14;:23;;;;;:36;;-1:-1:-1;;;;;;43101:36:0;;;43144:28;43163:4;43169:2;43144:18;:28::i;:::-;43179:101;43209:4;43222:2;43233:7;43249:8;43266:7;43179:21;:101::i;13299:314::-;13380:4;;-1:-1:-1;;;;;13404:13:0;;;;13396:22;;;;;;13441:17;13450:7;13441:8;:17::i;:::-;13425:33;;13481:5;-1:-1:-1;;;;;13469:17:0;:8;-1:-1:-1;;;;;13469:17:0;;13465:51;;;13504:4;13497:11;;;;13465:51;13529:34;13547:5;13554:8;13529:17;:34::i;:::-;:78;;;;13599:8;-1:-1:-1;;;;;13567:40:0;:28;13587:7;13567:19;:28::i;:::-;-1:-1:-1;;;;;13567:40:0;;13529:78;13522:85;;13299:314;;;;;;:::o;34402:362::-;34466:6;34481:14;34498:17;34507:7;34498:8;:17::i;:::-;34481:34;;34526:19;34538:6;34526:11;:19::i;:::-;:56;;;;-1:-1:-1;34567:14:0;;-1:-1:-1;;;;;34549:33:0;;;34567:14;;34549:33;;34526:56;34522:204;;;28358:33;;;;;;;;;;;;;;;;34597:48;;;-1:-1:-1;;;;;;34597:48:0;;;;;;;-1:-1:-1;;;;;34597:34:0;;;;;:48;;;;;;;;;;;;;;-1:-1:-1;34597:34:0;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;34597:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34597:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34597:48:0;34593:126;;;34681:6;-1:-1:-1;;;;;34665:35:0;;34701:7;34665:44;;;;;-1:-1:-1;;;34665:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34665:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34665:44:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;34665:44:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;34665:44:0;;;;;;20:11:-1;15:3;12:20;9:2;;;45:1;42;35:12;9:2;64:21;;126:4;117:14;;142:31;;;139:2;;;186:1;183;176:12;139:2;218:10;;268:11;251:29;;293:43;;;290:58;-1:-1;239:118;236:2;;;370:1;367;360:12;236:2;-1:-1;34665:44:0;;-1:-1:-1;34658:51:0;;-1:-1:-1;;;;34658:51:0;34593:126;34739:19;;;;:10;:19;;;;;;;;;34732:26;;;;;;-1:-1:-1;;34732:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34739:19;;34732:26;;34739:19;34732:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34402:362;;;;;:::o;25735:106::-;25792:4;25812:18;;;:9;:18;;;;;;-1:-1:-1;;;;;25812:18:0;:23;;;25735:106::o;29805:260::-;29892:4;29905:13;29921:17;29930:7;29921:8;:17::i;:::-;29905:33;;29963:8;-1:-1:-1;;;;;29954:17:0;:5;-1:-1:-1;;;;;29954:17:0;;:64;;;-1:-1:-1;29983:23:0;;;;:14;:23;;;;;;-1:-1:-1;;;;;29983:35:0;;;:23;;:35;29954:64;:105;;;-1:-1:-1;;;;;;30029:20:0;;;;;;;:13;:20;;;;;;;;:30;;;;;;;;;;;;29947:112;;29805:260;;;;;:::o;11502:110::-;-1:-1:-1;;;;;11583:16:0;11560:7;11583:16;;;:9;:16;;;;;:23;;11502:110::o;32553:260::-;32612:5;32619;32642:27;32663:5;32642:20;:27::i;:::-;32633:36;;-1:-1:-1;32633:36:0;-1:-1:-1;;;32692:12:0;-1:-1:-1;32692:27:0;;;;;32712:7;32708:1;:11;32692:27;:43;;;;;32734:1;-1:-1:-1;;32723:12:0;32692:43;:58;;;;;32743:7;32739:1;:11;32692:58;32676:131;;;;;;;-1:-1:-1;;;;;32676:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39192:816;39324:7;39582:21;39655:31;39725:6;39765:15;39362:1;39351;:8;:12;39343:66;;;;;;;-1:-1:-1;;;;;39343:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39343:66:0;;;;-1:-1:-1;;;;;;;;;;;39343:66:0;;;;;;;;;;;;;;;39436:8;;39424;;:20;39416:76;;;;;-1:-1:-1;;;;;39416:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39416:76:0;;;;-1:-1:-1;;;;;;;;;;;39416:76:0;;;;;;;;;;;;;;;39515:14;;-1:-1:-1;;;;;39515:14:0;39507:28;;39499:74;;;;;-1:-1:-1;;;;;39499:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39606:14;;:42;;;;;;-1:-1:-1;;;;;39606:42:0;;;;;;;;;;;;;;;;;;;;;;;:14;;;;;:19;;39626:11;;39639:8;;39606:42;;;;;;;;;;;;:14;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;39606:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39606:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39606:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39606:42:0;;-1:-1:-1;39689:22:0;39606:42;39689:7;:22::i;:::-;39655:56;;39734:1;39725:10;;39720:254;39741:1;:8;39737:1;:12;39720:254;;;39783:26;39798:1;39800;39798:4;;;;;;;;;;;;;;;;;;39804:1;39806;39804:4;;;;;;;;;;;;;;;;;;39783:14;:26::i;:::-;39765:44;;39818:148;39844:17;39853:7;39844:8;:17::i;:::-;39880:14;;-1:-1:-1;;;;;39880:14:0;39906:7;39924:18;39880:14;39818:15;:148::i;:::-;39751:3;;;;;39720:254;;;-1:-1:-1;39989:13:0;;39192:816;-1:-1:-1;;;;;;;39192:816:0:o;14014:395::-;14097:10;14093:251;;;14127:39;14145:10;14157:8;14127:17;:39::i;:::-;14126:40;14118:49;;;;;;14176:39;14194:8;14204:10;14176:17;:39::i;:::-;14093:251;;;14246:39;14264:10;14276:8;14246:17;:39::i;:::-;14238:48;;;;;;;;14295:41;14315:8;14325:10;14295:19;:41::i;:::-;14355:48;;;;;;;;;;-1:-1:-1;;;;;14355:48:0;;;14370:10;;14355:48;;;;;;;;;14014:395;;:::o;33105:109::-;33159:4;33179:29;33187:20;33202:1;33205;33187:14;:20::i;:::-;33179:7;:29::i;40014:191::-;40085:13;;;40095:2;40085:13;;;;;;;;;40065:7;;40085:13;;;17:15:-1;;105:10;40085:13:0;88:34:-1;-1:-1;;;40191:2:0;40184:10;;40177:21;;;;-1:-1:-1;40184:10:0;40175:25::o;32077:148::-;4125:35;32166:16;;-1:-1:-1;;32165:29:0;4028:66;32199:19;;32164:55;32077:148;;;;:::o;15250:242::-;15348:14;15316:18;;;:9;:18;;;;;:23;;-1:-1:-1;;;;;;15316:23:0;-1:-1:-1;;;;;15316:23:0;;;;;15365:14;15316:23;15365:10;:14::i;:::-;-1:-1:-1;;;;;15388:13:0;;;;;;:9;:13;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;15388:27:0;;;;;;;;;;15424:22;;;:13;:22;;;;;;:31;;;15473:6;;15348:31;;-1:-1:-1;15473:13:0;;:6;:13;:10;:13;:::i;:::-;15464:6;:22;-1:-1:-1;;;15250:242:0:o;25230:95::-;25293:19;;;;:10;:19;;;;;;;;:26;;;;;;;;:::i;19215:235::-;19363:7;17232:34;17246:10;17258:7;17232:13;:34::i;:::-;17224:43;;;;;;;;19396:48;19407:4;19413:2;19417:7;19426:8;19436:7;19396:10;:48::i;43292:213::-;43350:4;43459:17;;43491:8;;43292:213::o;32346:201::-;32411:5;;32436:51;32461:25;-1:-1:-1;;32462:16:0;;32461:25;32436:24;:51::i;:::-;32432:55;;32498:43;4028:66;32523:5;:17;32498:24;:43::i;:::-;32494:47;;32346:201;;;:::o;14961:117::-;-1:-1:-1;;;;;15037:18:0;;;;;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;:35;;-1:-1:-1;;15037:35:0;15068:4;15037:35;;;14961:117::o;15084:120::-;-1:-1:-1;;;;;15162:18:0;;;15193:5;15162:18;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;:36;;-1:-1:-1;;15162:36:0;;;15084:120::o;6573:132::-;6655:7;;;6676;;;;6669:15;;;;6573:132;;;;:::o;19456:733::-;19708:14;19605:2;-1:-1:-1;;;;;17469:16:0;;;;17461:25;;;;;;19637:7;19646:2;17603;-1:-1:-1;;;;;17582:23:0;:17;17591:7;17582:8;:17::i;:::-;-1:-1:-1;;;;;17582:23:0;;;17574:32;;;;;;19670:4;19676:7;17378:4;-1:-1:-1;;;;;17357:25:0;:17;17366:7;17357:8;:17::i;:::-;-1:-1:-1;;;;;17357:25:0;;17349:34;;;;;;19725:18;;;;:9;:18;;;;;;-1:-1:-1;;;;;19725:18:0;;-1:-1:-1;19750:31:0;19725:18;19735:7;19750:14;:31::i;:::-;19788:33;19805:6;19813:7;19788:16;:33::i;:::-;19828:24;19840:2;19844:7;19828:11;:24::i;:::-;19885:7;19881:2;-1:-1:-1;;;;;19864:29:0;19873:6;-1:-1:-1;;;;;19864:29:0;;;;;;;;;;;19906:7;:26;;;;;19917:15;19929:2;19917:11;:15::i;:::-;19902:282;;;9394:10;-1:-1:-1;;;20152:15:0;20051:116;;;20067:2;-1:-1:-1;;;;;20051:36:0;;20100:10;20112:6;20120:7;20129:8;20051:97;;;;;-1:-1:-1;;;20051:97:0;;;;;;;-1:-1:-1;;;;;20051:97:0;-1:-1:-1;;;;;20051:97:0;;;;;;-1:-1:-1;;;;;20051:97:0;-1:-1:-1;;;;;20051:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;20051:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20051:97:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20051:97:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20051:97:0;-1:-1:-1;;;;;;20051:116:0;;20033:143;;;;;;17613:1;;17493;;19456:733;;;;;;;:::o;32819:182::-;32888:3;32913:6;32904:16;;:21;32900:72;;-1:-1:-1;;;32947:16:0;;32936:28;;32900:72;-1:-1:-1;32989:5:0;32819:182::o;16335:219::-;16433:6;-1:-1:-1;;;;;16412:27:0;:17;16421:7;16412:8;:17::i;:::-;-1:-1:-1;;;;;16412:27:0;;:54;;;;-1:-1:-1;16443:18:0;;;;:9;:18;;;;;;-1:-1:-1;;;;;16443:18:0;:23;;16412:54;16408:141;;;16498:1;16477:18;;;:9;:18;;;;;;:22;;-1:-1:-1;;;;;;16477:22:0;;;16513:28;16487:7;;16498:1;-1:-1:-1;;;;;16513:28:0;;;;;16498:1;;16513:28;16335:219;;:::o;15498:831::-;15571:18;15592:22;;;:13;:22;;;;;;;15571:18;15646:23;15667:1;15646:16;15657:4;15646:10;:16::i;:::-;:20;:23;:20;:23;:::i;:::-;-1:-1:-1;;;;;15698:15:0;;;;;;:9;:15;;;;;:31;;15621:48;;-1:-1:-1;15698:15:0;15621:48;;15698:31;;;;;;;;;;;;;;;;;;15738:18;;;:9;:18;;;;;;:22;;-1:-1:-1;;;;;;15738:22:0;;;-1:-1:-1;;;;;15864:15:0;;;;:9;:15;;;;;:27;;15698:31;;-1:-1:-1;15698:31:0;;15880:10;;15864:27;;;;;;;;;;;;;;;;;:41;;;;-1:-1:-1;;;;;15939:15:0;;;;:9;:15;;;;;;:31;;15955:14;;15939:31;;;;;;;;;;;;;;;;;:35;;;;-1:-1:-1;;;;;15981:15:0;;;;:9;:15;;;;;;:24;;;;;-1:-1:-1;;15981:24:0;;;:::i;:::-;-1:-1:-1;;;;;;16092:15:0;;;;;;:9;:15;;;;;:22;:27;16088:72;;;-1:-1:-1;;;;;16137:15:0;;;;;;:9;:15;;;;;16130:22;;;:::i;:::-;16245:1;16220:22;;;:13;:22;;;;;;:26;;;16253;;;;;:39;;;16310:6;;:13;;16321:1;16310:13;:10;:13;:::i;:::-;16301:6;:22;-1:-1:-1;;;;;15498:831:0:o;6387:119::-;6447:7;6470:8;;;;6463:16;;;;-1:-1:-1;6493:7:0;;;6387:119::o;28232:15629::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28232:15629:0;;;-1:-1:-1;28232:15629:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://60dd553b8b9313990355b3a660fdf52c893d125560ffa4ca954f3f3ecd4818ef
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.