Overview
ETH Balance
0.961 ETH
Eth Value
$3,450.30 (@ $3,590.32/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 333 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Funds | 21523820 | 3 days ago | IN | 0 ETH | 0.00044112 | ||||
Accept Global Bi... | 21413443 | 18 days ago | IN | 0 ETH | 0.0010147 | ||||
Accept Global Bi... | 21413443 | 18 days ago | IN | 0 ETH | 0.0010147 | ||||
Withdraw Funds | 21302184 | 34 days ago | IN | 0 ETH | 0.00052815 | ||||
Global Bid On To... | 21288166 | 36 days ago | IN | 0.05 ETH | 0.00229005 | ||||
Accept Global Bi... | 21288134 | 36 days ago | IN | 0 ETH | 0.00200916 | ||||
Global Bid On To... | 21288093 | 36 days ago | IN | 0.15 ETH | 0.00261123 | ||||
Global Bid On To... | 21288085 | 36 days ago | IN | 0.15 ETH | 0.00258332 | ||||
Accept Global Bi... | 21288040 | 36 days ago | IN | 0 ETH | 0.00363824 | ||||
Global Bid On To... | 21287722 | 36 days ago | IN | 0.2 ETH | 0.00183977 | ||||
Global Bid On To... | 21287711 | 36 days ago | IN | 0.15 ETH | 0.00150379 | ||||
Accept Global Bi... | 21128410 | 58 days ago | IN | 0 ETH | 0.00189802 | ||||
Global Bid On To... | 21125374 | 59 days ago | IN | 0.06 ETH | 0.0023191 | ||||
Accept Global Bi... | 21121289 | 59 days ago | IN | 0 ETH | 0.00092012 | ||||
Global Bid On To... | 21113957 | 60 days ago | IN | 0.06 ETH | 0.00071149 | ||||
Accept Global Bi... | 21101850 | 62 days ago | IN | 0 ETH | 0.00130039 | ||||
Cancel Global Bi... | 21092195 | 63 days ago | IN | 0 ETH | 0.00029846 | ||||
Withdraw Funds | 21086643 | 64 days ago | IN | 0 ETH | 0.00037681 | ||||
Global Bid On To... | 21021868 | 73 days ago | IN | 0.03 ETH | 0.00171015 | ||||
Withdraw Funds | 20864465 | 95 days ago | IN | 0 ETH | 0.00070655 | ||||
Cancel Global Bi... | 20824242 | 101 days ago | IN | 0 ETH | 0.00083351 | ||||
Accept Global Bi... | 20811333 | 102 days ago | IN | 0 ETH | 0.00430418 | ||||
Global Bid On To... | 20810797 | 102 days ago | IN | 0.1 ETH | 0.00376465 | ||||
Global Bid On To... | 20810776 | 102 days ago | IN | 0.1 ETH | 0.00278629 | ||||
Accept Global Bi... | 20728146 | 114 days ago | IN | 0 ETH | 0.00132829 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21523820 | 3 days ago | 0.25 ETH | ||||
21302184 | 34 days ago | 0.402 ETH | ||||
21128410 | 58 days ago | 0.051 ETH | ||||
21121289 | 59 days ago | 0.051 ETH | ||||
21092195 | 63 days ago | 0.05 ETH | ||||
20864465 | 95 days ago | 0.2125 ETH | ||||
20824242 | 101 days ago | 0.1 ETH | ||||
20811333 | 102 days ago | 0.0875 ETH | ||||
20563290 | 137 days ago | 0.03 ETH | ||||
20514448 | 144 days ago | 0.033 ETH | ||||
20514439 | 144 days ago | 0.03 ETH | ||||
20514435 | 144 days ago | 0.015 ETH | ||||
20323760 | 170 days ago | 0.093902 ETH | ||||
20269340 | 178 days ago | 0.15 ETH | ||||
20205648 | 187 days ago | 0.059375 ETH | ||||
20155205 | 194 days ago | 0.1 ETH | ||||
20155201 | 194 days ago | 0.025 ETH | ||||
20143103 | 196 days ago | 0.02 ETH | ||||
20088392 | 203 days ago | 0.240625 ETH | ||||
19885467 | 232 days ago | 0.025 ETH | ||||
19885464 | 232 days ago | 0.035 ETH | ||||
19885448 | 232 days ago | 0.035 ETH | ||||
19878005 | 233 days ago | 0.05 ETH | ||||
19821607 | 241 days ago | 4 ETH | ||||
19733435 | 253 days ago | 0.0369 ETH |
Loading...
Loading
Contract Name:
GlobalDigitalMediaBidCore
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-19 */ // File: SafeBoxInterface.sol pragma solidity 0.8.16; abstract contract SafeBoxInterface { function VERSION() public pure virtual returns (uint8); function typeOfContract() public pure virtual returns (bytes32); function singleTransfer( address _tokenContract, uint256 _tokenId, address _to ) external virtual; } // File: VaultCoreInterface.sol pragma solidity 0.8.16; abstract contract VaultCoreInterface { function VERSION() public pure virtual returns (uint8); function typeOfContract() public pure virtual returns (bytes32); function approveToken(uint256 _tokenId, address _tokenContractAddress) external virtual; } // File: RoyaltyRegistryInterface.sol pragma solidity 0.8.16; /** * Interface to the RoyaltyRegistry responsible for looking payout addresses */ abstract contract RoyaltyRegistryInterface { function getAddress(address custodial) external view virtual returns (address); function getMediaCustomPercentage(uint256 mediaId, address tokenAddress) external view virtual returns (uint16); function getExternalTokenPercentage(uint256 tokenId, address tokenAddress) external view virtual returns (uint16, uint16); function typeOfContract() public pure virtual returns (string calldata); function VERSION() public pure virtual returns (uint8); } // File: PaymentsBufferInterface.sol pragma solidity 0.8.16; /** * Interface to move funds to PaymentsBuffer for owner to claim it later. */ abstract contract PaymentsBufferInterface { function typeOfContract() public pure virtual returns (bytes32); function add(address _to) external payable virtual; function withdraw() external payable virtual; } // File: DigitalMediaBurnInterfaceV3.sol pragma solidity 0.8.16; /** * Interface to the DigitalMediaCore responsible for burning tokens */ abstract contract DigitalMediaBurnInterfaceV3 { struct PayoutInfo { address user; uint256 amount; } function burn(uint256 _tokenId) external virtual; function burnDigitalMedia(uint256 _digitalMedia) external virtual; function getDigitalMediaForSale(uint256 _digitalMediaId) external view virtual returns ( address, bool, uint16 ); function getDigitalMediaRelease(uint256 _tokenId) external view virtual returns (uint32, uint256); function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual returns (PayoutInfo[] memory); function saleInfo(uint256 _tokenId, uint256 _salePrice) external view virtual returns (PayoutInfo[] memory); } // File: DigitalMediaBurnInterfaceV2.sol pragma solidity 0.8.16; /** * Interface to the DigitalMediaCore responsible for burning tokens */ abstract contract DigitalMediaBurnInterfaceV2 { function burn(uint256 _tokenId) external virtual; function burnToken(uint256 _tokenId) external virtual; function burnDigitalMedia(uint256 _digitalMedia) external virtual; function getDigitalMedia(uint256 _digitalMediaId) external view virtual returns ( uint256, uint32, uint32, uint256, address, string calldata ); function getDigitalMediaRelease(uint256 _tokenId) external view virtual returns ( uint256, uint32, uint256 ); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: WithdrawFundsControl.sol pragma solidity 0.8.16; contract WithdrawFundsControl is Ownable, Pausable { // List of approved on withdraw addresses mapping(address => uint256) public approvedWithdrawAddresses; bool public isInitialWithdrawAddressAdded = false; // Full week wait period before an approved withdraw address becomes active uint256 public constant withdrawApprovalWaitPeriod = 1 days; event WithdrawAddressAdded(address withdrawAddress); event WithdrawAddressRemoved(address widthdrawAddress); /** * Add a new approved on behalf of user address. */ function addApprovedWithdrawAddress(address _withdrawAddress) external onlyOwner { approvedWithdrawAddresses[_withdrawAddress] = block.timestamp; emit WithdrawAddressAdded(_withdrawAddress); } /* * Add new withdrawAddress for immediate use. This is an internal only Fn that is called * only when the contract is deployed. */ function addApprovedWithdrawAddressImmediately(address _withdrawAddress) internal onlyOwner { if (_withdrawAddress != address(0)) { // set the date to one in past so that address is active immediately. approvedWithdrawAddresses[_withdrawAddress] = block.timestamp - withdrawApprovalWaitPeriod - 1; emit WithdrawAddressAdded(_withdrawAddress); } } /** * Removes an approved on bhealf of user address. */ function removeApprovedWithdrawAddress(address _withdrawAddress) external onlyOwner { delete approvedWithdrawAddresses[_withdrawAddress]; emit WithdrawAddressRemoved(_withdrawAddress); } function addApprovedWithdrawAddressAfterDeploy(address _withdrawAddress) external onlyOwner { require( isInitialWithdrawAddressAdded == false, "Initial withdraw address already added" ); addApprovedWithdrawAddressImmediately(_withdrawAddress); isInitialWithdrawAddressAdded = true; } /** * Checks that a given withdraw address ia approved and is past it's required * wait time. */ function isApprovedWithdrawAddress(address _withdrawAddress) internal view returns (bool) { uint256 approvalTime = approvedWithdrawAddresses[_withdrawAddress]; require(approvalTime > 0, "withdraw address is not registered"); return block.timestamp - approvalTime > withdrawApprovalWaitPeriod; } } // File: OBOControl.sol pragma solidity 0.8.16; contract OBOControl is Ownable { address public oboAdmin; uint256 public constant newAddressWaitPeriod = 1 days; bool public canAddOBOImmediately = true; // List of approved on behalf of users. mapping(address => uint256) public approvedOBOs; event NewOBOAddressEvent(address OBOAddress, bool action); event NewOBOAdminAddressEvent(address oboAdminAddress); modifier onlyOBOAdmin() { require( owner() == _msgSender() || oboAdmin == _msgSender(), "not oboAdmin" ); _; } function setOBOAdmin(address _oboAdmin) external onlyOwner { oboAdmin = _oboAdmin; emit NewOBOAdminAddressEvent(_oboAdmin); } /** * Add a new approvedOBO address. The address can be used after wait period. */ function addApprovedOBO(address _oboAddress) external onlyOBOAdmin { require(_oboAddress != address(0), "cant set to 0x"); require(approvedOBOs[_oboAddress] == 0, "already added"); approvedOBOs[_oboAddress] = block.timestamp; emit NewOBOAddressEvent(_oboAddress, true); } /** * Removes an approvedOBO immediately. */ function removeApprovedOBO(address _oboAddress) external onlyOBOAdmin { delete approvedOBOs[_oboAddress]; emit NewOBOAddressEvent(_oboAddress, false); } /* * Add OBOAddress for immediate use. This is an internal only Fn that is called * only when the contract is deployed. */ function addApprovedOBOImmediately(address _oboAddress) internal { require(_oboAddress != address(0), "addr(0)"); // set the date to one in past so that address is active immediately. approvedOBOs[_oboAddress] = block.timestamp - newAddressWaitPeriod - 1; emit NewOBOAddressEvent(_oboAddress, true); } function addApprovedOBOAfterDeploy(address _oboAddress) external onlyOBOAdmin { require(canAddOBOImmediately == true, "disabled"); addApprovedOBOImmediately(_oboAddress); } function blockImmediateOBO() external onlyOBOAdmin { canAddOBOImmediately = false; } /* * Helper function to verify is a given address is a valid approvedOBO address. */ function isValidApprovedOBO(address _oboAddress) public view returns (bool) { uint256 createdAt = approvedOBOs[_oboAddress]; if (createdAt == 0) { return false; } return block.timestamp - createdAt > newAddressWaitPeriod; } /** * @dev Modifier to make the obo calls only callable by approved addressess */ modifier isApprovedOBO() { require(isValidApprovedOBO(msg.sender), "unauthorized OBO user"); _; } } // File: DigitalMediaSaleBase.sol pragma solidity 0.8.16; contract DigitalMediaSaleBase is OBOControl, Pausable { uint16 public royaltyPercentage = 1000; // reserving 0 with BadContract so that we can verify membership of a mapping. enum ContractType { BadContract, MakersPlaceV2, MakersPlaceV3 } // Mapping of token contract address to bool indicated approval. mapping(address => ContractType) public approvedTokenContracts; error InvalidTokenAddress(address tokenAddress); /** * Adds a new token contract address to be approved to be called. */ function addApprovedTokenContract( address _tokenContractAddress, ContractType _contractType ) external onlyOwner { approvedTokenContracts[_tokenContractAddress] = _contractType; } /** * Remove an approved token contract address from the list of approved addresses. */ function removeApprovedTokenContract(address _tokenContractAddress) external onlyOwner { delete approvedTokenContracts[_tokenContractAddress]; } /** * Checks that a particular token contract address is a valid MP token contract. */ function _isValidTokenContract(address _tokenContractAddress) internal view returns (bool) { return approvedTokenContracts[_tokenContractAddress] != ContractType.BadContract; } /** * Returns an ERC721 instance of a token contract address. Throws otherwise. * Only valid and approved token contracts are allowed to be interacted with. */ function _getTokenContract(address _tokenContractAddress) internal pure returns (IERC721) { // require(_isValidTokenContract(_tokenContractAddress), "Invalid tcontract"); return IERC721(_tokenContractAddress); } /** * Checks with the ERC-721 token contract the owner of the a token */ function _ownerOf(uint256 _tokenId, address _tokenContractAddress) internal view returns (address) { IERC721 tokenContract = _getTokenContract(_tokenContractAddress); return tokenContract.ownerOf(_tokenId); } /** * Checks to ensure that the token owner has approved the escrow contract, * or escrowAddress owns the token. */ function _approvedForEscrow( address _seller, uint256 _tokenId, address _tokenContractAddress, address _escrowAddress ) internal view returns (bool) { IERC721 tokenContract = _getTokenContract(_tokenContractAddress); // seller is the owner of the token, so checking that first return (_seller == _escrowAddress || tokenContract.isApprovedForAll(_seller, _escrowAddress) || tokenContract.getApproved(_tokenId) == _escrowAddress); } /** * Transfer an ERC-721 token from seller to the buyer. This is to be called after a purchase is * completed. */ function _transferFromTo( address _seller, address _receiver, uint256 _tokenId, address _tokenContractAddress ) internal { IERC721 tokenContract = _getTokenContract(_tokenContractAddress); tokenContract.safeTransferFrom(_seller, _receiver, _tokenId); } function getDigitalMedia(uint256 _digitalMediaId, address _tokenAddress) internal view returns ( address creator, bool collaborated, uint16 royalty ) { ContractType cType = approvedTokenContracts[_tokenAddress]; if (cType == ContractType.MakersPlaceV2) { DigitalMediaBurnInterfaceV2 tokenContract = DigitalMediaBurnInterfaceV2( _tokenAddress ); (, , , , creator, ) = tokenContract.getDigitalMedia( _digitalMediaId ); collaborated = false; royalty = royaltyPercentage; } else if (cType == ContractType.MakersPlaceV3) { DigitalMediaBurnInterfaceV3 tokenContract = DigitalMediaBurnInterfaceV3( _tokenAddress ); (creator, collaborated, royalty) = tokenContract .getDigitalMediaForSale(_digitalMediaId); } else { revert InvalidTokenAddress({tokenAddress: _tokenAddress}); } } function getReleaseMedia(uint256 _tokenId, address _tokenAddress) internal view returns (uint256 mediaId) { ContractType cType = approvedTokenContracts[_tokenAddress]; if (cType == ContractType.MakersPlaceV2) { DigitalMediaBurnInterfaceV2 tokenContract = DigitalMediaBurnInterfaceV2( _tokenAddress ); (, , mediaId) = tokenContract.getDigitalMediaRelease(_tokenId); } else if (cType == ContractType.MakersPlaceV3) { DigitalMediaBurnInterfaceV3 tokenContract = DigitalMediaBurnInterfaceV3( _tokenAddress ); (, mediaId) = tokenContract.getDigitalMediaRelease(_tokenId); } else { revert InvalidTokenAddress({tokenAddress: _tokenAddress}); } } } // File: CommissionControl.sol pragma solidity 0.8.16; contract CommissionControl is OBOControl, Pausable { enum CommissionType { InvalidType, saleType, reSaleType, externalType } event CommissionPercentageChanged( CommissionType commissionType, uint16 percentage, bool committed ); // 3 days wait period before new percentage is in effect uint256 public constant commissionAddressWaitPeriod = 3 days; struct CommissionStruct { uint16 percentage; uint16 intermediatePercentage; uint256 createdAt; } CommissionStruct public saleCommission = CommissionStruct(1500, 0, 0); CommissionStruct public reSaleCommission = CommissionStruct(250, 0, 0); CommissionStruct public externalSaleCommission = CommissionStruct(0, 0, 0); uint256 internal constant HUNDREDPERCENT = 10000; function _getCommisssionStruct(CommissionType _cType) internal view returns (CommissionStruct storage) { CommissionStruct storage x; if (_cType == CommissionType.saleType) { x = saleCommission; } else if (_cType == CommissionType.reSaleType) { x = reSaleCommission; } else { x = externalSaleCommission; } return x; } /* * Change commission percentage for contract. Usually in the range of 80-90%. * This change is stored in mapping untill committed. You can only commit * after the wait period. */ function changeCommissionPercentage( uint16 _percentage, CommissionType _cType ) external whenNotPaused onlyOwner { require( _percentage > 0 && _percentage <= HUNDREDPERCENT, "Invalid percentage" ); CommissionStruct storage commission = _getCommisssionStruct(_cType); require( commission.intermediatePercentage == 0, "commissionChange exists" ); commission.intermediatePercentage = _percentage; commission.createdAt = block.timestamp; emit CommissionPercentageChanged({ commissionType: _cType, percentage: _percentage, committed: false }); } function deleteCommissionChange(CommissionType _cType) external whenNotPaused onlyOwner { CommissionStruct storage commission = _getCommisssionStruct(_cType); commission.intermediatePercentage = 0; commission.createdAt = 0; } /* * Commit a commission percentage change that has already been submitted for change. */ function commitCommissionChange(CommissionType _cType) external whenNotPaused onlyOwner { CommissionStruct storage commission = _getCommisssionStruct(_cType); require( commission.intermediatePercentage > 0, "commissionChange exists" ); require( block.timestamp - commission.createdAt > commissionAddressWaitPeriod, "under wait period" ); commission.percentage = commission.intermediatePercentage; commission.intermediatePercentage = 0; commission.createdAt = 0; emit CommissionPercentageChanged({ commissionType: _cType, percentage: commission.percentage, committed: true }); } /* * Calculates payout for a given sale / bid price by doing the percentage math. */ function _computePayoutForPrice( uint256 salePrice, uint256 thisCommissionPercentage ) internal pure returns (uint256) { return (salePrice * ((HUNDREDPERCENT - thisCommissionPercentage))) / (HUNDREDPERCENT); } } // File: DigitalMediaFixedSale.sol pragma solidity 0.8.16; contract DigitalMediaFixedSale is DigitalMediaSaleBase, CommissionControl, WithdrawFundsControl { // constants (no storage used) uint256 internal constant changeContractWaitPeriod = 2 days; // storage bool public canRoyaltyRegistryChange = true; address internal newSafeBoxAddress; uint256 internal newSafeBoxCreatedAt; address internal newVaultAddress; uint256 internal newVaultCreatedAt; // Keep track of all the bids so that we dont withdraw current bids from this contract. // When a bid is accepted we can subtract the bid value from this totalBidAmount. // Initializaing variable to zero costs extra gas. by default its zero. uint256 public totalBidAmount; /** EVENTS **/ event SaleCreatedEvent( uint256 tokenId, address tokenContractAddress, bool acceptFiat, uint256 priceInWei ); event SaleSuccessfulEvent( uint256 tokenId, address tokenContractAddress, address buyer, address payoutAddress, uint256 payoutAmount, uint256 priceInWei ); event OBOSaleEvent( uint256 tokenId, address tokenContractAddress, address buyer, uint256 priceInWei ); event SaleCanceledEvent(uint256 tokenId, address tokenContractAddress); event NewSafeBoxRegistered(address newSafeBoxAddress); event NewVaultRegistered(address newVaultAddress); event NewVaultInEffect(address newVaultAddress); event NewSafeBoxInEffect(address newSafeBoxAddress); struct DigitalMediaSale { bool acceptFiat; address seller; uint256 priceInWei; // if commissionPercentage is set its a non-custodial sale. // createSaleOBO will set commissionPercentage to zero. uint256 commissionPercentage; } // Mapping of token contract address to ID to Digital Media Sale object. mapping(address => mapping(uint256 => DigitalMediaSale)) public tokenToSale; PaymentsBufferInterface public paymentInterface; RoyaltyRegistryInterface public royaltyStore; SafeBoxInterface public safebox; VaultCoreInterface public vaultInterface; constructor( address _royaltyRegistryAddress, address _safebox, address _vaultAddress ) { setRoyaltyRegistryStore(_royaltyRegistryAddress); safebox = _validateSafeBoxAddress(_safebox); vaultInterface = _validateVaultAddress(_vaultAddress); } function _validateVaultAddress(address _vaultAddress) internal pure returns (VaultCoreInterface) { require(_vaultAddress != address(0), "vault can't be 0x"); bytes32 vault_type = 0x6d707661756c7400000000000000000000000000000000000000000000000000; VaultCoreInterface vault = VaultCoreInterface(_vaultAddress); require(vault.typeOfContract() == vault_type, "not vault"); return vault; } function _validateSafeBoxAddress(address _safebox) internal pure returns (SafeBoxInterface) { // bytes32 safebox_type = bytes32(bytes("safebox")); bytes32 safebox_type = 0x73616665426f7800000000000000000000000000000000000000000000000000; SafeBoxInterface sb = SafeBoxInterface(_safebox); require(sb.typeOfContract() == safebox_type, "not safebox"); return sb; } /* * Need to register the new vault address first. Then call setVaultAddress after * wait period to set it for good. */ function registerNewVaultAddress(address _vaultAddress) external onlyOwner { _validateVaultAddress(_vaultAddress); newVaultAddress = _vaultAddress; newVaultCreatedAt = block.timestamp; emit NewVaultRegistered(_vaultAddress); } /* * Need to register the new safebox address first. Then call setSafeboxddress after * wait period to set it for good. */ function registerNewSafeBoxAddress(address _safebox) external whenNotPaused onlyOwner { newSafeBoxAddress = address(_validateSafeBoxAddress(_safebox)); newSafeBoxCreatedAt = block.timestamp; emit NewSafeBoxRegistered(_safebox); } /* set the vault for this sale contract. All custodial token owners grant approveAll * permission to the vault. The sale contract get approve permission for each token * from the vault and transfers it to the final destination in case of sale / bid accept. */ function setVaultAddress(address _vaultAddress) external onlyOwner { VaultCoreInterface vault = _validateVaultAddress(_vaultAddress); // If we are changing vault address make sure it passes the conditions if (address(vaultInterface) != address(0)) { // store vault address require(_vaultAddress == newVaultAddress, "_vault != newVault"); require( block.timestamp - newVaultCreatedAt > changeContractWaitPeriod, "wait" ); } vaultInterface = vault; emit NewVaultInEffect(_vaultAddress); } function setSafeboxAddress(address _safebox) external whenNotPaused onlyOwner { require(_safebox == newSafeBoxAddress, "_safebox != newSafebox"); require( block.timestamp - newSafeBoxCreatedAt > changeContractWaitPeriod, "wait" ); safebox = _validateSafeBoxAddress(_safebox); emit NewSafeBoxInEffect(_safebox); } function setRoyaltyPercentage(uint16 _newPercentage) external whenNotPaused onlyOwner { // Royalty can be 30% max require( _newPercentage >= 0 && _newPercentage <= 3000, "Invalid Royalty" ); royaltyPercentage = _newPercentage; } function setRoyaltyRegistryStore(address _royaltyStore) public whenNotPaused onlyOBOAdmin { require(canRoyaltyRegistryChange == true, "no"); RoyaltyRegistryInterface candidateRoyaltyStore = RoyaltyRegistryInterface( _royaltyStore ); require(candidateRoyaltyStore.VERSION() == 1, "roylty v!= 1"); bytes32 contractType = keccak256( abi.encodePacked(candidateRoyaltyStore.typeOfContract()) ); // keccak256(abi.encodePacked("royaltyRegistry")) = 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323 require( contractType == 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323, "not royalty" ); royaltyStore = candidateRoyaltyStore; } function setRoyaltyRegistryForever() external whenNotPaused onlyOwner { canRoyaltyRegistryChange = false; } /** * Removes the sale object and emits SaleCanceledEvent. */ function _cancelSale(uint256 _tokenId, address _tokenContractAddress) internal { _removeSale(_tokenId, _tokenContractAddress); emit SaleCanceledEvent(_tokenId, _tokenContractAddress); } /** * Removes a token from storage. */ function _removeSale(uint256 _tokenId, address _tokenContractAddress) internal { delete tokenToSale[_tokenContractAddress][_tokenId]; } /** * Returns true whether a particular DigitalMediaSale instance is on sale. */ function _isOnSale(DigitalMediaSale storage _sale) internal view returns (bool) { return (_sale.priceInWei > 0); } /** * Cancel sale if sale exists for a token. Safe to call even if sale does not exist. */ function _cancelSaleIfSaleExists( uint256 _tokenId, address _tokenContractAddress ) internal { DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][ _tokenId ]; if (_isOnSale(sale)) { _cancelSale(_tokenId, _tokenContractAddress); } } /** * Handles the purchase logic of a token. Checks that only tokens on sale are actually * purchaseable, ensures that right amount of ether is sent and also sends back any * excess payment to the buyer. * * This function only handles the purchase capability not the actual transfer * of the token itself or emitting event related to purchase. * * The proceeds remains on the smart contract until ready for withdrawl from the CFO account. */ function _purchase( uint256 _tokenId, address _tokenContractAddress, DigitalMediaSale storage sale, uint256 _paymentAmount ) internal returns (uint256) { // Check that the bid is greater than or equal to the current price uint256 price = sale.priceInWei; require(_paymentAmount >= price, "< price"); // Remove the token from being on sale before transferring funds to avoid replay _removeSale(_tokenId, _tokenContractAddress); uint256 excessPayment = _paymentAmount - price; if (excessPayment > 0) { payable(msg.sender).call{value: excessPayment, gas: 5000}; } return price; } /* Set PaymentsBuffer interface */ function registerPaymentsBufferAddress(address _bufferAddress) external onlyOwner { require(address(paymentInterface) == address(0), "already set"); PaymentsBufferInterface paymentsBuffer = PaymentsBufferInterface( _bufferAddress ); require( paymentsBuffer.typeOfContract() == 0x6d707061796d656e747362756666657200000000000000000000000000000000, "not buffer" ); paymentInterface = paymentsBuffer; } /* * Transfer money to an address. If the transfer fails move the funds to * PaymentsBuffer contract where the owner of the funds can come and claim it. */ function transferFunds(address _toAddress, uint256 amount) internal { (bool sent, ) = _toAddress.call{value: amount, gas: 5000}(""); if (!sent) { require( address(paymentInterface) != address(0), "paymentInterface should be set" ); paymentInterface.add{value: amount}(_toAddress); } } /** * Withdraws all the funds to a specified non-zero address. */ function withdrawFunds(address payable _withdrawAddress) external isApprovedOBO { require( isApprovedWithdrawAddress(_withdrawAddress), "unapproved withdrawAddress" ); uint256 contractBalance = address(this).balance; // We can withdraw all successful sale related funds but not pending bids uint256 deductibleBalance = contractBalance - totalBidAmount; _withdrawAddress.transfer(deductibleBalance); } /** * Validate tokenId, tokenAddress and escrow permission for msg.sender */ function validateTokenForEscrow( uint256 _tokenId, address _tokenContractAddress ) internal view returns (address) { address seller = _ownerOf(_tokenId, _tokenContractAddress); require(msg.sender == seller, "msg.sender != seller"); require( _approvedForEscrow( msg.sender, _tokenId, _tokenContractAddress, address(this) ), "approve/All missing" ); return seller; } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: GlobalDigitalMediaBidCore.sol pragma solidity 0.8.16; /** * This contract facilitates bidding to NFT holders. An NFT holder can choose to accept an offer. * Global meaning bidding accross one media. One media can have several editions * The seller can be custodial or non-custodial. If seller is custodial, then they're paid off-chain * A new bidder replaces the previous bid. * Custodial is On Behalf Of (OBO) the seller. * CONTRACTS * --------------------------------------------------------------------------------- * VaultCore - holds the custodial seller's NFT in escrow * RoyaltyRegistry- used to get commision to pay creator/collaborators. Handles non MP contracts * non-EIP standard.. https://royaltyregistry.xyz/lookup * TransferCore - not used * PaymentBuffer - Send/withdraw ether */ contract GlobalDigitalMediaBidCore is DigitalMediaFixedSale, ReentrancyGuard { using Counters for Counters.Counter; // constants uint8 public constant VERSION = 1; bytes32 private constant safeboxType = 0x73616665426f7800000000000000000000000000000000000000000000000000; // storage slots Counters.Counter private _bidCounter; mapping(address => mapping(uint256 => mapping(address => uint256))) public mediaIdToPartialBidId; // bidIdToTokenBid[2] = TokenBid(bidder, price) mapping(uint256 => TokenBid) public bidIdToTokenBid; struct TokenBid { address bidder; uint256 price; } struct OBOAcceptBidStruct { uint256 tokenId; uint256 bidId; address tokenAddress; bool useSafebox; } struct CancelBidStruct { uint256 tokenId; address tokenAddress; address bidder; } event MediaBidCreatedEvent( uint256 mediaId, address tokenAddress, uint256 bidId, uint256 bidPrice, uint256 partialPrice, address bidder ); event MediaBidRemovedEvent( uint256 mediaId, address tokenAddress, address bidderAddress, uint256 bidId, uint256 price ); event MediaBidAcceptedEvent( uint256 tokenId, address tokenAddress, uint256 bidId, uint256 bidPrice, address bidder, address payoutAddress, address seller, uint256 payoutAmount ); constructor( address _royaltyRegistryAddress, address _safebox, address _vault ) DigitalMediaFixedSale(_royaltyRegistryAddress, _safebox, _vault) {} /** * Compute commission percentage for a given token. Checks if token creator is seller * to determine if its a sale or a resale. */ function _getCommissionPercentageForToken( address _seller, uint256 _tokenId, address _tokenContractAddress ) internal view returns (uint256) { // if the tokenContractAddress is of external type return external sale commission if (_isValidTokenContract(_tokenContractAddress) == false) { (uint16 customCommission, uint16 customRoyalty) = royaltyStore .getExternalTokenPercentage(_tokenId, _tokenContractAddress); return customCommission + customRoyalty > 0 ? customCommission + customRoyalty : externalSaleCommission.percentage; } uint256 digitalMediaId = getReleaseMedia( _tokenId, _tokenContractAddress ); (address creator, bool collaborated, uint16 royalty) = getDigitalMedia( digitalMediaId, _tokenContractAddress ); uint256 commissionPercentage; if (creator == _seller) { // if this media is a collaborated piece dont do payout on chain if (collaborated == true) { commissionPercentage = 0; } else { uint16 customPercentage = royaltyStore.getMediaCustomPercentage( digitalMediaId, _tokenContractAddress ); commissionPercentage = customPercentage > 0 ? customPercentage : saleCommission.percentage; } } else { // for secondary sales charge commission + royalty commissionPercentage = reSaleCommission.percentage + royalty; } return commissionPercentage; } /********************** * GLOBAL BIDDING * **********************/ /** * Function to put a bid on an approved ERC721 contract media. This function * stores only the current bid and the bid value in the contract. Any one can * bid on any media. Make sure you are bidding over the current bid price. * Global meaning bidding accross one media. One media can have several editions */ function globalBidOnToken( uint256 _digitalMediaId, address _tokenContractAddress ) external payable whenNotPaused { uint256 bidPrice = msg.value; require(bidPrice > 0, "send msg.value"); (address creator, , ) = getDigitalMedia( _digitalMediaId, _tokenContractAddress ); require(creator != address(0), "no media"); // Check if a current bid id exists for this mediaId + msg.sender uint256 currentBidId = mediaIdToPartialBidId[_tokenContractAddress][ _digitalMediaId ][msg.sender]; TokenBid memory currentBid = bidIdToTokenBid[currentBidId]; if (currentBidId != 0) { currentBid.price = currentBid.price + bidPrice; } else { currentBid.bidder = msg.sender; currentBid.price = bidPrice; _bidCounter.increment(); currentBidId = _bidCounter.current(); mediaIdToPartialBidId[_tokenContractAddress][_digitalMediaId][ msg.sender ] = currentBidId; } bidIdToTokenBid[currentBidId] = currentBid; totalBidAmount = totalBidAmount + bidPrice; // msg.value is automatically transferred to the contract. // No need to explicity move the money // https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/ emit MediaBidCreatedEvent( _digitalMediaId, _tokenContractAddress, currentBidId, currentBid.price, bidPrice, msg.sender ); } function _getAndDeleteCurrentBid( uint256 _tokenId, address _tokenContractAddress, uint256 _bidId ) internal returns (address bidder, uint256 bidPrice) { // make sure that this tokenId's mediaId matches the one on bid object uint256 mediaId = getReleaseMedia(_tokenId, _tokenContractAddress); TokenBid storage currentBid = bidIdToTokenBid[_bidId]; bidder = currentBid.bidder; bidPrice = currentBid.price; require(bidder != address(0), "no bid"); uint256 userBidId = mediaIdToPartialBidId[_tokenContractAddress][ mediaId ][bidder]; require(userBidId != 0, "No bid"); require(userBidId == _bidId, "bidId not current"); // Delete the bid to avoid re-entrancy attack delete mediaIdToPartialBidId[_tokenContractAddress][mediaId][bidder]; delete bidIdToTokenBid[_bidId]; totalBidAmount = totalBidAmount - bidPrice; _cancelSaleIfSaleExists(_tokenId, _tokenContractAddress); return (bidder, bidPrice); } /** * Seller accepts the current bid on a digital media (only they can call this). * Token is sent to the buyer and seller gets onchain payout * Global meaning bidding accross one media. One media can have several editions */ function acceptGlobalBid( uint256 _tokenId, address _tokenContractAddress, uint256 _bidId ) external whenNotPaused nonReentrant { address seller = validateTokenForEscrow( _tokenId, _tokenContractAddress ); (address currentBidder, uint256 bidPrice) = _getAndDeleteCurrentBid( _tokenId, _tokenContractAddress, _bidId ); _transferFromTo(seller, currentBidder, _tokenId, _tokenContractAddress); uint256 commissionPercentage = _getCommissionPercentageForToken( seller, _tokenId, _tokenContractAddress ); // Perform payout since seller is not a custodial account and can accept payment // This endpoint is called only by the tokenOwner. We decided if the token owner // took the pain to call this endpoint we will charge a commission based // on if its sold by creator or other. uint256 payoutAmount = 0; if (commissionPercentage > 0) { payoutAmount = _computePayoutForPrice( bidPrice, commissionPercentage ); if (payoutAmount > 0) { transferFunds(seller, payoutAmount); } } emit MediaBidAcceptedEvent({ tokenId: _tokenId, tokenAddress: _tokenContractAddress, bidId: _bidId, bidPrice: bidPrice, bidder: currentBidder, payoutAddress: seller, seller: seller, payoutAmount: payoutAmount }); } /** * Accept eth bids in exchange for the custodial NFTs * - Seller's custodial NFT is escrowed in the vault. * - Buyer's eth bid is held onchain here. * Move the vault escrowed NFT to the buyer. Seller is paid off-chain * OBO is on behalf of, meaning we are the custodial middle men (OBO the seller). Seller doesn't have a wallet. * Global meaning bidding accross one media. One media can have several editions */ function acceptGlobalBidsOBO(OBOAcceptBidStruct[] memory _requests) external whenNotPaused isApprovedOBO { for (uint256 i = 0; i < _requests.length; i++) { address tokenAddress = _requests[i].tokenAddress; uint256 tokenId = _requests[i].tokenId; uint256 bidId = _requests[i].bidId; bool useSafebox = _requests[i].useSafebox; address seller = _ownerOf(tokenId, tokenAddress); (address currentBidder, uint256 bidPrice) = _getAndDeleteCurrentBid( tokenId, tokenAddress, bidId ); if (useSafebox) { safebox.singleTransfer(tokenAddress, tokenId, currentBidder); } else { vaultInterface.approveToken(tokenId, tokenAddress); _transferFromTo(seller, currentBidder, tokenId, tokenAddress); } emit MediaBidAcceptedEvent({ tokenId: tokenId, tokenAddress: tokenAddress, bidId: bidId, bidPrice: bidPrice, bidder: currentBidder, payoutAddress: address(0), seller: seller, payoutAmount: 0 }); } } function _cancelMediaBid( uint256 _mediaId, address _tokenContractAddress, TokenBid memory partialBid, uint256 partialBidId ) internal { uint256 price = partialBid.price; delete mediaIdToPartialBidId[_tokenContractAddress][_mediaId][ partialBid.bidder ]; delete bidIdToTokenBid[partialBidId]; totalBidAmount = totalBidAmount - price; transferFunds(partialBid.bidder, price); emit MediaBidRemovedEvent( _mediaId, _tokenContractAddress, partialBid.bidder, partialBidId, price ); } /** * Cancel the current global bid for a digital media. Only the current bidder * can call this function. Cancelling the bid will move the * funds back to the bidder. * Global meaning bidding accross one media. One media can have several editions */ function cancelGlobalBid( uint256 _mediaId, address _tokenContractAddress, uint256 _bidId ) external nonReentrant { uint256 currentBidId = mediaIdToPartialBidId[_tokenContractAddress][ _mediaId ][msg.sender]; require(currentBidId != 0, "No bid"); require(currentBidId == _bidId, "not ur bid"); TokenBid storage currentBid = bidIdToTokenBid[currentBidId]; require(currentBid.bidder == msg.sender, "msg.sender!=bidder"); _cancelMediaBid(_mediaId, _tokenContractAddress, currentBid, _bidId); } /** * Cancel many global bids for many medias. Only approved OBO address can call this. * Global meaning bidding accross one media. One media can have several editions */ function cancelGlobalBidsOBO(CancelBidStruct[] memory requests) external whenNotPaused isApprovedOBO { for (uint32 i = 0; i < requests.length; i++) { CancelBidStruct memory request = requests[i]; uint256 partialBidId = mediaIdToPartialBidId[request.tokenAddress][ request.tokenId ][request.bidder]; if (partialBidId != 0) { TokenBid storage partialBid = bidIdToTokenBid[partialBidId]; _cancelMediaBid( request.tokenId, request.tokenAddress, partialBid, partialBidId ); } } } /** * For a given approved ERC721 media, get the current bid * Global meaning bidding accross one media. One media can have several editions */ function getGlobalBidForMedia( uint256 _mediaId, address _tokenContractAddress, address _bidderAddress ) external view returns (uint256 bidId, uint256 price) { uint256 globalBidId = mediaIdToPartialBidId[_tokenContractAddress][ _mediaId ][_bidderAddress]; if (globalBidId == 0) { return (0, 0); } else { TokenBid storage currentBid = bidIdToTokenBid[globalBidId]; return (globalBidId, currentBid.price); } } // pause (idempotent) function pause() external onlyOwner { if (!paused()) { _pause(); } } // unpause (idempotent) function unpause() external onlyOwner { if (paused()) { _unpause(); } } function renounceOwnership() public view override onlyOwner { revert("no"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_royaltyRegistryAddress","type":"address"},{"internalType":"address","name":"_safebox","type":"address"},{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"InvalidTokenAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum CommissionControl.CommissionType","name":"commissionType","type":"uint8"},{"indexed":false,"internalType":"uint16","name":"percentage","type":"uint16"},{"indexed":false,"internalType":"bool","name":"committed","type":"bool"}],"name":"CommissionPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"address","name":"payoutAddress","type":"address"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"payoutAmount","type":"uint256"}],"name":"MediaBidAcceptedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mediaId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"partialPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"}],"name":"MediaBidCreatedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mediaId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"bidderAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"MediaBidRemovedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"OBOAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"action","type":"bool"}],"name":"NewOBOAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oboAdminAddress","type":"address"}],"name":"NewOBOAdminAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSafeBoxAddress","type":"address"}],"name":"NewSafeBoxInEffect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSafeBoxAddress","type":"address"}],"name":"NewSafeBoxRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVaultAddress","type":"address"}],"name":"NewVaultInEffect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVaultAddress","type":"address"}],"name":"NewVaultRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"OBOSaleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"}],"name":"SaleCanceledEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"acceptFiat","type":"bool"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"SaleCreatedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"payoutAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"SaleSuccessfulEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"}],"name":"WithdrawAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"widthdrawAddress","type":"address"}],"name":"WithdrawAddressRemoved","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"uint256","name":"_bidId","type":"uint256"}],"name":"acceptGlobalBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"bidId","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"useSafebox","type":"bool"}],"internalType":"struct GlobalDigitalMediaBidCore.OBOAcceptBidStruct[]","name":"_requests","type":"tuple[]"}],"name":"acceptGlobalBidsOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBOAfterDeploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"enum DigitalMediaSaleBase.ContractType","name":"_contractType","type":"uint8"}],"name":"addApprovedTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"addApprovedWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"addApprovedWithdrawAddressAfterDeploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedOBOs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTokenContracts","outputs":[{"internalType":"enum DigitalMediaSaleBase.ContractType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedWithdrawAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bidIdToTokenBid","outputs":[{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockImmediateOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canAddOBOImmediately","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canRoyaltyRegistryChange","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mediaId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"uint256","name":"_bidId","type":"uint256"}],"name":"cancelGlobalBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"bidder","type":"address"}],"internalType":"struct GlobalDigitalMediaBidCore.CancelBidStruct[]","name":"requests","type":"tuple[]"}],"name":"cancelGlobalBidsOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_percentage","type":"uint16"},{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"changeCommissionPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commissionAddressWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"commitCommissionChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"deleteCommissionChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"externalSaleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mediaId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"address","name":"_bidderAddress","type":"address"}],"name":"getGlobalBidForMedia","outputs":[{"internalType":"uint256","name":"bidId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_digitalMediaId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"globalBidOnToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"isInitialWithdrawAddressAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"isValidApprovedOBO","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"mediaIdToPartialBidId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newAddressWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oboAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentInterface","outputs":[{"internalType":"contract PaymentsBufferInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reSaleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_safebox","type":"address"}],"name":"registerNewSafeBoxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"registerNewVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bufferAddress","type":"address"}],"name":"registerPaymentsBufferAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"removeApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"removeApprovedTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"removeApprovedWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentage","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyStore","outputs":[{"internalType":"contract RoyaltyRegistryInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safebox","outputs":[{"internalType":"contract SafeBoxInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAdmin","type":"address"}],"name":"setOBOAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newPercentage","type":"uint16"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRoyaltyRegistryForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyStore","type":"address"}],"name":"setRoyaltyRegistryStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_safebox","type":"address"}],"name":"setSafeboxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"setVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToSale","outputs":[{"internalType":"bool","name":"acceptFiat","type":"bool"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"priceInWei","type":"uint256"},{"internalType":"uint256","name":"commissionPercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBidAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultInterface","outputs":[{"internalType":"contract VaultCoreInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawApprovalWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_withdrawAddress","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6001805460ff60a01b1916600160a01b179055600380546203e80062ffff00199091161790556105dc6080819052600060a081905260c08190526005805463ffffffff199081169093179055600681905560fa60e081905261010082815261012083905260078054851690921790915560088290556101a060405261014082905261016082905261018082905260098054909316909255600a55600c805461ffff19169091179055348015620000b457600080fd5b50604051620046d2380380620046d2833981016040819052620000d7916200065c565b828282620000e53362000162565b6003805460ff19169055620000fa83620001b2565b62000105826200042d565b601480546001600160a01b0319166001600160a01b03929092169190911790556200013081620004ef565b601580546001600160a01b0319166001600160a01b03929092169190911790555050600160165550620007f792505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620001bc620005f5565b6000546001600160a01b0316331480620001e057506001546001600160a01b031633145b620002215760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b137a0b236b4b760a11b60448201526064015b60405180910390fd5b600c5460ff610100909104161515600114620002655760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b604482015260640162000218565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cf9190620006a6565b60ff16600114620003125760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b604482015260640162000218565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000353573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200037d919081019062000707565b6040516020016200038f9190620007bf565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b14620004095760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b604482015260640162000218565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000485573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007dd565b14620004e85760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b604482015260640162000218565b9392505050565b60006001600160a01b0382166200053d5760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b604482015260640162000218565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000594573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ba9190620007dd565b14620004e85760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b604482015260640162000218565b60035460ff16156200063d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000218565b565b80516001600160a01b03811681146200065757600080fd5b919050565b6000806000606084860312156200067257600080fd5b6200067d846200063f565b92506200068d602085016200063f565b91506200069d604085016200063f565b90509250925092565b600060208284031215620006b957600080fd5b815160ff81168114620004e857600080fd5b634e487b7160e01b600052604160045260246000fd5b60005b83811015620006fe578181015183820152602001620006e4565b50506000910152565b6000602082840312156200071a57600080fd5b81516001600160401b03808211156200073257600080fd5b818401915084601f8301126200074757600080fd5b8151818111156200075c576200075c620006cb565b604051601f8201601f19908116603f01168101908382118183101715620007875762000787620006cb565b81604052828152876020848701011115620007a157600080fd5b620007b4836020830160208801620006e1565b979650505050505050565b60008251620007d3818460208701620006e1565b9190910192915050565b600060208284031215620007f057600080fd5b5051919050565b613ecb80620008076000396000f3fe6080604052600436106103815760003560e01c80638da5cb5b116101d1578063ca3c80db11610102578063dfc5b33f116100a0578063f2fde38b1161006f578063f2fde38b14610b52578063f5e00d7614610b72578063fb12a87614610b92578063ffa1ad7414610bb257600080fd5b8063dfc5b33f14610a80578063e6ccc9bd14610adf578063ee7a116314610aff578063f0346c4714610b1557600080fd5b8063d059e0a3116100dc578063d059e0a314610a28578063d077fa5c14610a3f578063d29b93a41461039b578063d5edf45b14610a5f57600080fd5b8063ca3c80db146109bb578063cd161d2e146109db578063ce2d29ac146109fb57600080fd5b8063ab05868a1161016f578063b4cad1a711610149578063b4cad1a714610913578063bcaf4f231461093d578063be8380e01461097b578063c95ab4621461099b57600080fd5b8063ab05868a14610855578063aba48a93146108d9578063ae26c1b2146108f957600080fd5b8063a47a2e77116101ab578063a47a2e77146107e0578063a4e6446814610800578063a790c0e214610820578063a968bf261461083557600080fd5b80638da5cb5b14610778578063955b4d3b1461079657806396ac3649146107b657600080fd5b80635c975abb116102b6578063715018a6116102545780638456cb59116102235780638456cb59146106f057806385535cc5146107055780638a71bb2d146107255780638ce876461461075857600080fd5b8063715018a61461067b578063757c3a5814610690578063788e0543146106b05780637ff9f614146106d057600080fd5b806364e3950c1161029057806364e3950c146105fb5780636684e9a01461061b57806368742da61461063b5780637045f6251461065b57600080fd5b80635c975abb146105a35780635e7785a6146105bb5780635ea82934146105db57600080fd5b80631fc09717116103235780633f8a7865116102fd5780633f8a7865146104e757806340bbee5214610507578063475a9a0c1461053f5780634f4385521461057457600080fd5b80631fc097171461047257806322a2b1ed146104875780633f4ba83a146104d257600080fd5b80631a32de491161035f5780631a32de49146103e55780631ad32562146104055780631b0e3fab146104325780631bc8637e1461045257600080fd5b80630579647d146103865780630c9999291461039b578063188a840f146103c5575b600080fd5b610399610394366004613557565b610bd9565b005b3480156103a757600080fd5b506103b26201518081565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b506103996103e0366004613587565b610de7565b3480156103f157600080fd5b50610399610400366004613587565b610e6a565b34801561041157600080fd5b506103b2610420366004613587565b60026020526000908152604090205481565b34801561043e57600080fd5b5061039961044d366004613587565b610ec5565b34801561045e57600080fd5b5061039961046d3660046135b4565b610f37565b34801561047e57600080fd5b50610399610fad565b34801561049357600080fd5b50600954600a546104b19161ffff8082169262010000909204169083565b6040805161ffff9485168152939092166020840152908201526060016103bc565b3480156104de57600080fd5b50610399610fca565b3480156104f357600080fd5b50610399610502366004613587565b610fe7565b34801561051357600080fd5b50601254610527906001600160a01b031681565b6040516001600160a01b0390911681526020016103bc565b34801561054b57600080fd5b5061055f61055a3660046135d1565b6110f2565b604080519283526020830191909152016103bc565b34801561058057600080fd5b50600c5461059390610100900460ff1681565b60405190151581526020016103bc565b3480156105af57600080fd5b5060035460ff16610593565b3480156105c757600080fd5b506103996105d6366004613587565b611158565b3480156105e757600080fd5b50601554610527906001600160a01b031681565b34801561060757600080fd5b506103996106163660046136d8565b61139d565b34801561062757600080fd5b50601454610527906001600160a01b031681565b34801561064757600080fd5b50610399610656366004613587565b6115ce565b34801561066757600080fd5b506103996106763660046137ba565b611699565b34801561068757600080fd5b5061039961179b565b34801561069c57600080fd5b506103996106ab36600461388a565b6117d0565b3480156106bc57600080fd5b50601354610527906001600160a01b031681565b3480156106dc57600080fd5b506103996106eb366004613587565b611915565b3480156106fc57600080fd5b506103996119a6565b34801561071157600080fd5b50610399610720366004613587565b6119c0565b34801561073157600080fd5b5060035461074590610100900461ffff1681565b60405161ffff90911681526020016103bc565b34801561076457600080fd5b50610399610773366004613587565b611adb565b34801561078457600080fd5b506000546001600160a01b0316610527565b3480156107a257600080fd5b506103996107b136600461388a565b611b31565b3480156107c257600080fd5b506005546006546104b19161ffff8082169262010000909204169083565b3480156107ec57600080fd5b506103996107fb366004613587565b611bf4565b34801561080c57600080fd5b5061039961081b3660046138d6565b611c87565b34801561082c57600080fd5b50610399611cb9565b34801561084157600080fd5b506103996108503660046138f1565b611d07565b34801561086157600080fd5b506108af610870366004613926565b601160209081526000928352604080842090915290825290208054600182015460029092015460ff8216926101009092046001600160a01b0316919084565b6040805194151585526001600160a01b0390931660208501529183015260608201526080016103bc565b3480156108e557600080fd5b506103996108f4366004613952565b611e31565b34801561090557600080fd5b50600c546105939060ff1681565b34801561091f57600080fd5b506007546008546104b19161ffff8082169262010000909204169083565b34801561094957600080fd5b506103b2610958366004613984565b601860209081526000938452604080852082529284528284209052825290205481565b34801561098757600080fd5b506103996109963660046138d6565b611e77565b3480156109a757600080fd5b50600154610527906001600160a01b031681565b3480156109c757600080fd5b506103996109d6366004613587565b611f90565b3480156109e757600080fd5b506103996109f6366004613587565b611ff4565b348015610a0757600080fd5b506103b2610a16366004613587565b600b6020526000908152604090205481565b348015610a3457600080fd5b506103b26203f48081565b348015610a4b57600080fd5b50610399610a5a366004613587565b612122565b348015610a6b57600080fd5b5060015461059390600160a01b900460ff1681565b348015610a8c57600080fd5b50610ac0610a9b3660046139bb565b601960205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b0390931683526020830191909152016103bc565b348015610aeb57600080fd5b50610399610afa366004613587565b61214b565b348015610b0b57600080fd5b506103b260105481565b348015610b2157600080fd5b50610b45610b30366004613587565b60046020526000908152604090205460ff1681565b6040516103bc91906139ea565b348015610b5e57600080fd5b50610399610b6d366004613587565b61219f565b348015610b7e57600080fd5b50610399610b8d366004613587565b612215565b348015610b9e57600080fd5b50610593610bad366004613587565b61233c565b348015610bbe57600080fd5b50610bc7600181565b60405160ff90911681526020016103bc565b610be161237b565b3480610c255760405162461bcd60e51b815260206004820152600e60248201526d73656e64206d73672e76616c756560901b60448201526064015b60405180910390fd5b6000610c3184846123c1565b50909150506001600160a01b038116610c775760405162461bcd60e51b81526020600482015260086024820152676e6f206d6564696160c01b6044820152606401610c1c565b6001600160a01b0380841660009081526018602090815260408083208884528252808320338452825280832054808452601983529281902081518083019092528054909416815260019093015490830152908115610ce957838160200151610cdf9190613a1a565b6020820152610d35565b33815260208101849052610d01601780546001019055565b6017546001600160a01b03861660009081526018602090815260408083208a84528252808320338452909152902081905591505b6000828152601960209081526040909120825181546001600160a01b0319166001600160a01b0390911617815590820151600190910155601054610d7a908590613a1a565b601055602081810151604080518981526001600160a01b0389169381019390935282018490526060820152608081018590523360a08201527fa0412ddfe40c42731bf585195c122e97dd4086a6fa4f4c1cfaaa63061e4aca069060c00160405180910390a1505050505050565b610def612548565b600c5460ff1615610e515760405162461bcd60e51b815260206004820152602660248201527f496e697469616c207769746864726177206164647265737320616c726561647960448201526508185919195960d21b6064820152608401610c1c565b610e5a816125a2565b50600c805460ff19166001179055565b610e72612548565b6001600160a01b0381166000818152600b602090815260409182902042905590519182527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da8991015b60405180910390a150565b610ecd61237b565b610ed5612548565b610ede8161261e565b600c805462010000600160b01b031916620100006001600160a01b039384160217905542600d5560405190821681527f492248daa73d7944dee204e5f0b712242e10c4e48e492e94f627767fb27bec9390602001610eba565b610f3f61237b565b610f47612548565b610bb88161ffff161115610f8f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420526f79616c747960881b6044820152606401610c1c565b6003805461ffff9092166101000262ffff0019909216919091179055565b610fb561237b565b610fbd612548565b600c805461ff0019169055565b610fd2612548565b60035460ff1615610fe557610fe56126db565b565b610fef61237b565b610ff7612548565b600c546001600160a01b038281166201000090920416146110535760405162461bcd60e51b81526020600482015260166024820152750bee6c2cccac4def040427a40dccaeea6c2cccac4def60531b6044820152606401610c1c565b6202a300600d54426110659190613a2d565b1161109b5760405162461bcd60e51b8152600401610c1c906020808252600490820152631dd85a5d60e21b604082015260600190565b6110a48161261e565b601480546001600160a01b0319166001600160a01b0392831617905560405190821681527f091f872b99a289ff2eb82d5c9d093e605a598fc74f7973277917f8d99842e97d90602001610eba565b6001600160a01b03808316600090815260186020908152604080832087845282528083209385168352929052908120548190808203611138576000809250925050611150565b60008181526019602052604090206001015490925090505b935093915050565b61116061237b565b6000546001600160a01b031633148061118357506001546001600160a01b031633145b61119f5760405162461bcd60e51b8152600401610c1c90613a40565b600c5460ff6101009091041615156001146111e15760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610c1c565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112489190613a66565b60ff166001146112895760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610c1c565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa1580156112c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112f19190810190613b19565b6040516020016113019190613b4e565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146113795760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610c1c565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b6113a561237b565b6113ae3361233c565b6113ca5760405162461bcd60e51b8152600401610c1c90613b6a565b60005b81518110156115ca5760008282815181106113ea576113ea613b99565b6020026020010151604001519050600083838151811061140c5761140c613b99565b6020026020010151600001519050600084848151811061142e5761142e613b99565b6020026020010151602001519050600085858151811061145057611450613b99565b6020026020010151606001519050600061146a848661272d565b905060008061147a8688876127a7565b9150915083156114f757601454604051630608be6d60e11b81526001600160a01b03898116600483015260248201899052848116604483015290911690630c117cda90606401600060405180830381600087803b1580156114da57600080fd5b505af11580156114ee573d6000803e3d6000fd5b50505050611569565b60155460405163d2180e6160e01b8152600481018890526001600160a01b0389811660248301529091169063d2180e6190604401600060405180830381600087803b15801561154557600080fd5b505af1158015611559573d6000803e3d6000fd5b505050506115698383888a612933565b7fb7bcbeb1e5ce087115265974227d16efdb3d3fa9817c458aebd733ae1beef4e8868887848660008960006040516115a8989796959493929190613baf565b60405180910390a15050505050505080806115c290613bf5565b9150506113cd565b5050565b6115d73361233c565b6115f35760405162461bcd60e51b8152600401610c1c90613b6a565b6115fc816129ab565b6116485760405162461bcd60e51b815260206004820152601a60248201527f756e617070726f766564207769746864726177416464726573730000000000006044820152606401610c1c565b601054479060009061165a9083613a2d565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611693573d6000803e3d6000fd5b50505050565b6116a161237b565b6116aa3361233c565b6116c65760405162461bcd60e51b8152600401610c1c90613b6a565b60005b81518163ffffffff1610156115ca576000828263ffffffff16815181106116f2576116f2613b99565b602090810291909101810151808201516001600160a01b0390811660009081526018845260408082208451835285528082208185015190931682529190935290912054909150801561178657600081815260196020908152604091829020845185830151845180860190955282546001600160a01b031685526001830154938501939093529092611784929085612a1c565b505b5050808061179390613c0e565b9150506116c9565b6117a3612548565b60405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610c1c565b6117d8612aef565b6001600160a01b038216600090815260186020908152604080832086845282528083203384529091528120549081900361183d5760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610c1c565b8181146118795760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081d5c88189a5960b21b6044820152606401610c1c565b600081815260196020526040902080546001600160a01b031633146118d55760405162461bcd60e51b815260206004820152601260248201527136b9b39739b2b73232b9109eb134b23232b960711b6044820152606401610c1c565b6040805180820190915281546001600160a01b0316815260018201546020820152611904908690869086612a1c565b50506119106001601655565b505050565b6000546001600160a01b031633148061193857506001546001600160a01b031633145b6119545760405162461bcd60e51b8152600401610c1c90613a40565b6001600160a01b03811660008181526002602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610eba565b6119ae612548565b60035460ff16610fe557610fe5612b48565b6119c8612548565b60006119d382612b85565b6015549091506001600160a01b031615611a8157600e546001600160a01b03838116911614611a395760405162461bcd60e51b815260206004820152601260248201527117dd985d5b1d08084f481b995dd5985d5b1d60721b6044820152606401610c1c565b6202a300600f5442611a4b9190613a2d565b11611a815760405162461bcd60e51b8152600401610c1c906020808252600490820152631dd85a5d60e21b604082015260600190565b601580546001600160a01b0319166001600160a01b038381169190911790915560405190831681527f55c500d9f010bcb210d8664f602eb160ce8aee716a68ea710302305830e45233906020015b60405180910390a15050565b611ae3612548565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001610eba565b611b3961237b565b611b41612aef565b6000611b4d8484612c84565b9050600080611b5d8686866127a7565b91509150611b6d83838888612933565b6000611b7a848888612d30565b905060008115611ba057611b8e8383612f0c565b90508015611ba057611ba08582612f2f565b7fb7bcbeb1e5ce087115265974227d16efdb3d3fa9817c458aebd733ae1beef4e888888886888a8b88604051611bdd989796959493929190613baf565b60405180910390a150505050506119106001601655565b6000546001600160a01b0316331480611c1757506001546001600160a01b031633145b611c335760405162461bcd60e51b8152600401610c1c90613a40565b60018054600160a01b900460ff16151514611c7b5760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610c1c565b611c848161304d565b50565b611c8f61237b565b611c97612548565b6000611ca2826130fc565b805463ffff00001916815560006001909101555050565b6000546001600160a01b0316331480611cdc57506001546001600160a01b031633145b611cf85760405162461bcd60e51b8152600401610c1c90613a40565b6001805460ff60a01b19169055565b611d0f61237b565b611d17612548565b60008261ffff16118015611d3157506127108261ffff1611155b611d725760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642070657263656e7461676560701b6044820152606401610c1c565b6000611d7d826130fc565b805490915062010000900461ffff1615611dd35760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610c1c565b805463ffff000019166201000061ffff8516021781554260018201556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe590611e249084908690600090613c31565b60405180910390a1505050565b611e39612548565b6001600160a01b0382166000908152600460205260409020805482919060ff19166001836002811115611e6e57611e6e6139d4565b02179055505050565b611e7f61237b565b611e87612548565b6000611e92826130fc565b805490915062010000900461ffff16611ee75760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610c1c565b6203f480816001015442611efb9190613a2d565b11611f3c5760405162461bcd60e51b81526020600482015260116024820152701d5b99195c881dd85a5d081c195c9a5bd9607a1b6044820152606401610c1c565b805462010000810461ffff1663ffffffff199091168117825560006001808401919091556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe592611acf928692613c31565b611f98612548565b611fa181612b85565b50600e80546001600160a01b0319166001600160a01b03831690811790915542600f556040519081527f66ea39118110b77bdc70c8b8c6c494af2a13414c01a51c05678c67e53c70418990602001610eba565b6000546001600160a01b031633148061201757506001546001600160a01b031633145b6120335760405162461bcd60e51b8152600401610c1c90613a40565b6001600160a01b03811661207a5760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610c1c565b6001600160a01b038116600090815260026020526040902054156120d05760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610c1c565b6001600160a01b03811660008181526002602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610eba565b61212a612548565b6001600160a01b03166000908152600460205260409020805460ff19169055565b612153612548565b6001600160a01b0381166000818152600b602090815260408083209290925590519182527fffdbac6a703f8c063588b1b434bac15231b40f4c20b16f797a989d47a56ae8b29101610eba565b6121a7612548565b6001600160a01b03811661220c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c1c565b611c848161314a565b61221d612548565b6012546001600160a01b0316156122645760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610c1c565b6000819050806001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cb9190613c5f565b6f36b83830bcb6b2b73a39b13ab33332b960811b146123195760405162461bcd60e51b815260206004820152600a6024820152693737ba10313ab33332b960b11b6044820152606401610c1c565b601280546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381166000908152600260205260408120548082036123655750600092915050565b620151806123738242613a2d565b119392505050565b60035460ff1615610fe55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c1c565b6001600160a01b0381166000908152600460205260408120548190819060ff1660018160028111156123f5576123f56139d4565b0361248a576040516355df427560e01b81526004810187905285906001600160a01b038216906355df427590602401600060405180830381865afa158015612441573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124699190810190613c8c565b5060035490995060009850610100900461ffff169650612540945050505050565b600281600281111561249e5761249e6139d4565b0361251c57604051631e330caf60e21b81526004810187905285906001600160a01b038216906378cc32bc90602401606060405180830381865afa1580156124ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250e9190613d10565b919650945092506125409050565b604051637330680360e01b81526001600160a01b0386166004820152602401610c1c565b509250925092565b6000546001600160a01b03163314610fe55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1c565b6125aa612548565b6001600160a01b03811615611c845760016125c86201518042613a2d565b6125d29190613a2d565b6001600160a01b0382166000818152600b602090815260409182902093909355519081527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da899101610eba565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126999190613c5f565b146126d45760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b6044820152606401610c1c565b9392505050565b6126e361319a565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080826040516331a9108f60e11b8152600481018690529091506001600160a01b03821690636352211e90602401602060405180830381865afa158015612779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279d9190613d52565b9150505b92915050565b60008060006127b686866131e3565b6000858152601960205260409020805460018201546001600160a01b0390911695509350909150836128135760405162461bcd60e51b81526020600482015260066024820152651b9bc8189a5960d21b6044820152606401610c1c565b6001600160a01b03808716600090815260186020908152604080832086845282528083209388168352929052908120549081900361287c5760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610c1c565b8581146128bf5760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610c1c565b6001600160a01b038088166000908152601860209081526040808320878452825280832093891683529281528282208290558882526019905290812080546001600160a01b03191681556001015560105461291b908590613a2d565b6010556129288888613346565b505050935093915050565b600081604051632142170760e11b81526001600160a01b038781166004830152868116602483015260448201869052919250908216906342842e0e90606401600060405180830381600087803b15801561298c57600080fd5b505af11580156129a0573d6000803e3d6000fd5b505050505050505050565b6001600160a01b0381166000908152600b6020526040812054806123655760405162461bcd60e51b815260206004820152602260248201527f77697468647261772061646472657373206973206e6f74207265676973746572604482015261195960f21b6064820152608401610c1c565b6020808301516001600160a01b0380861660009081526018845260408082208983528552808220875190931682529184528181208190558481526019909352822080546001600160a01b031916815560010191909155601054612a80908290613a2d565b6010558251612a8f9082612f2f565b8251604080518781526001600160a01b038781166020830152909216828201526060820184905260808201839052517f698342ddb195b4e13b4e15fa7ab6bee76e248d5d2c577359b6e0c07efef305c69181900360a00190a15050505050565b600260165403612b415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c1c565b6002601655565b612b5061237b565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127103390565b60006001600160a01b038216612bd15760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b6044820152606401610c1c565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4b9190613c5f565b146126d45760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b6044820152606401610c1c565b600080612c91848461272d565b9050336001600160a01b03821614612ce25760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610c1c565b612cee3385853061337d565b6126d45760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610c1c565b6000612d3b82613490565b1515600003612df9576013546040516305fa22e960e11b8152600481018590526001600160a01b0384811660248301526000928392911690630bf445d2906044016040805180830381865afa158015612d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dbc9190613d6f565b90925090506000612dcd8284613d9e565b61ffff1611612de25760095461ffff16612dec565b612dec8183613d9e565b61ffff16925050506126d4565b6000612e0584846131e3565b90506000806000612e1684876123c1565b9250925092506000886001600160a01b0316846001600160a01b031603612ee757821515600103612e4957506000612f00565b6013546040516310cae44560e31b8152600481018790526001600160a01b0389811660248301526000921690638657222890604401602060405180830381865afa158015612e9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebf9190613db9565b905060008161ffff1611612ed95760055461ffff16612edb565b805b61ffff16915050612f00565b600754612ef990839061ffff16613d9e565b61ffff1690505b98975050505050505050565b6000612710612f1b8382613a2d565b612f259085613dd6565b6126d49190613df5565b6000826001600160a01b03168261138890604051600060405180830381858888f193505050503d8060008114612f81576040519150601f19603f3d011682016040523d82523d6000602084013e612f86565b606091505b5050905080611910576012546001600160a01b0316612fe75760405162461bcd60e51b815260206004820152601e60248201527f7061796d656e74496e746572666163652073686f756c642062652073657400006044820152606401610c1c565b601254604051630a3b0a4f60e01b81526001600160a01b03858116600483015290911690630a3b0a4f9084906024016000604051808303818588803b15801561302f57600080fd5b505af1158015613043573d6000803e3d6000fd5b5050505050505050565b6001600160a01b03811661308d5760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610c1c565b600161309c6201518042613a2d565b6130a69190613a2d565b6001600160a01b0382166000818152600260209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610eba565b6000806001836003811115613113576131136139d4565b03613120575060056127a1565b6002836003811115613134576131346139d4565b03613141575060076127a1565b50600992915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60035460ff16610fe55760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c1c565b6001600160a01b03811660009081526004602052604081205460ff166001816002811115613213576132136139d4565b0361328e57604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf90602401606060405180830381865afa15801561325f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132839190613e17565b945061333f92505050565b60028160028111156132a2576132a26139d4565b0361331b57604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf906024016040805180830381865afa1580156132ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133119190613e4c565b935061333f915050565b604051637330680360e01b81526001600160a01b0384166004820152602401610c1c565b5092915050565b6001600160a01b038116600090815260116020908152604080832085845290915290206001810154156119105761191083836134c8565b6000826001600160a01b038681169084161480613407575060405163e985e9c560e01b81526001600160a01b038781166004830152848116602483015282169063e985e9c590604401602060405180830381865afa1580156133e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134079190613e78565b80613486575060405163020604bf60e21b8152600481018690526001600160a01b03808516919083169063081812fc90602401602060405180830381865afa158015613457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347b9190613d52565b6001600160a01b0316145b9695505050505050565b6000806001600160a01b03831660009081526004602052604090205460ff1660028111156134c0576134c06139d4565b141592915050565b6001600160a01b0381166000908152601160209081526040808320858452909152812080546001600160a81b03191681556001810182905560020155604080518381526001600160a01b03831660208201527fa50b2d6faf84e88de164f615bc8daa8477ab67f677d72aef3a3122d26c6eae289101611acf565b6001600160a01b0381168114611c8457600080fd5b6000806040838503121561356a57600080fd5b82359150602083013561357c81613542565b809150509250929050565b60006020828403121561359957600080fd5b81356126d481613542565b61ffff81168114611c8457600080fd5b6000602082840312156135c657600080fd5b81356126d4816135a4565b6000806000606084860312156135e657600080fd5b8335925060208401356135f881613542565b9150604084013561360881613542565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561364c5761364c613613565b60405290565b6040516060810167ffffffffffffffff8111828210171561364c5761364c613613565b604051601f8201601f1916810167ffffffffffffffff8111828210171561369e5761369e613613565b604052919050565b600067ffffffffffffffff8211156136c0576136c0613613565b5060051b60200190565b8015158114611c8457600080fd5b600060208083850312156136eb57600080fd5b823567ffffffffffffffff81111561370257600080fd5b8301601f8101851361371357600080fd5b8035613726613721826136a6565b613675565b81815260079190911b8201830190838101908783111561374557600080fd5b928401925b828410156137af57608084890312156137635760008081fd5b61376b613629565b84358152858501358682015260408086013561378681613542565b90820152606085810135613799816136ca565b908201528252608093909301929084019061374a565b979650505050505050565b600060208083850312156137cd57600080fd5b823567ffffffffffffffff8111156137e457600080fd5b8301601f810185136137f557600080fd5b8035613803613721826136a6565b8181526060918202830184019184820191908884111561382257600080fd5b938501935b8385101561387e5780858a03121561383f5760008081fd5b613847613652565b853581528686013561385881613542565b8188015260408681013561386b81613542565b9082015283529384019391850191613827565b50979650505050505050565b60008060006060848603121561389f57600080fd5b8335925060208401356138b181613542565b929592945050506040919091013590565b8035600481106138d157600080fd5b919050565b6000602082840312156138e857600080fd5b6126d4826138c2565b6000806040838503121561390457600080fd5b823561390f816135a4565b915061391d602084016138c2565b90509250929050565b6000806040838503121561393957600080fd5b823561394481613542565b946020939093013593505050565b6000806040838503121561396557600080fd5b823561397081613542565b915060208301356003811061357c57600080fd5b60008060006060848603121561399957600080fd5b83356139a481613542565b925060208401359150604084013561360881613542565b6000602082840312156139cd57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106139fe576139fe6139d4565b91905290565b634e487b7160e01b600052601160045260246000fd5b808201808211156127a1576127a1613a04565b818103818111156127a1576127a1613a04565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b600060208284031215613a7857600080fd5b815160ff811681146126d457600080fd5b60005b83811015613aa4578181015183820152602001613a8c565b50506000910152565b600082601f830112613abe57600080fd5b815167ffffffffffffffff811115613ad857613ad8613613565b613aeb601f8201601f1916602001613675565b818152846020838601011115613b0057600080fd5b613b11826020830160208701613a89565b949350505050565b600060208284031215613b2b57600080fd5b815167ffffffffffffffff811115613b4257600080fd5b61279d84828501613aad565b60008251613b60818460208701613a89565b9190910192915050565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b9788526001600160a01b039687166020890152604088019590955260608701939093529084166080860152831660a085015290911660c083015260e08201526101000190565b600060018201613c0757613c07613a04565b5060010190565b600063ffffffff808316818103613c2757613c27613a04565b6001019392505050565b6060810160048510613c4557613c456139d4565b93815261ffff929092166020830152151560409091015290565b600060208284031215613c7157600080fd5b5051919050565b805163ffffffff811681146138d157600080fd5b60008060008060008060c08789031215613ca557600080fd5b86519550613cb560208801613c78565b9450613cc360408801613c78565b9350606087015192506080870151613cda81613542565b60a088015190925067ffffffffffffffff811115613cf757600080fd5b613d0389828a01613aad565b9150509295509295509295565b600080600060608486031215613d2557600080fd5b8351613d3081613542565b6020850151909350613d41816136ca565b6040850151909250613608816135a4565b600060208284031215613d6457600080fd5b81516126d481613542565b60008060408385031215613d8257600080fd5b8251613d8d816135a4565b602084015190925061357c816135a4565b61ffff81811683821601908082111561333f5761333f613a04565b600060208284031215613dcb57600080fd5b81516126d4816135a4565b6000816000190483118215151615613df057613df0613a04565b500290565b600082613e1257634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215613e2c57600080fd5b83519250613e3c60208501613c78565b9150604084015190509250925092565b60008060408385031215613e5f57600080fd5b613e6883613c78565b9150602083015190509250929050565b600060208284031215613e8a57600080fd5b81516126d4816136ca56fea2646970667358221220c9b6acb65a6ec5c792d089a7dce7fe2147fd83d5e7c3fba3937f68ee126af8c164736f6c63430008100033000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64
Deployed Bytecode
0x6080604052600436106103815760003560e01c80638da5cb5b116101d1578063ca3c80db11610102578063dfc5b33f116100a0578063f2fde38b1161006f578063f2fde38b14610b52578063f5e00d7614610b72578063fb12a87614610b92578063ffa1ad7414610bb257600080fd5b8063dfc5b33f14610a80578063e6ccc9bd14610adf578063ee7a116314610aff578063f0346c4714610b1557600080fd5b8063d059e0a3116100dc578063d059e0a314610a28578063d077fa5c14610a3f578063d29b93a41461039b578063d5edf45b14610a5f57600080fd5b8063ca3c80db146109bb578063cd161d2e146109db578063ce2d29ac146109fb57600080fd5b8063ab05868a1161016f578063b4cad1a711610149578063b4cad1a714610913578063bcaf4f231461093d578063be8380e01461097b578063c95ab4621461099b57600080fd5b8063ab05868a14610855578063aba48a93146108d9578063ae26c1b2146108f957600080fd5b8063a47a2e77116101ab578063a47a2e77146107e0578063a4e6446814610800578063a790c0e214610820578063a968bf261461083557600080fd5b80638da5cb5b14610778578063955b4d3b1461079657806396ac3649146107b657600080fd5b80635c975abb116102b6578063715018a6116102545780638456cb59116102235780638456cb59146106f057806385535cc5146107055780638a71bb2d146107255780638ce876461461075857600080fd5b8063715018a61461067b578063757c3a5814610690578063788e0543146106b05780637ff9f614146106d057600080fd5b806364e3950c1161029057806364e3950c146105fb5780636684e9a01461061b57806368742da61461063b5780637045f6251461065b57600080fd5b80635c975abb146105a35780635e7785a6146105bb5780635ea82934146105db57600080fd5b80631fc09717116103235780633f8a7865116102fd5780633f8a7865146104e757806340bbee5214610507578063475a9a0c1461053f5780634f4385521461057457600080fd5b80631fc097171461047257806322a2b1ed146104875780633f4ba83a146104d257600080fd5b80631a32de491161035f5780631a32de49146103e55780631ad32562146104055780631b0e3fab146104325780631bc8637e1461045257600080fd5b80630579647d146103865780630c9999291461039b578063188a840f146103c5575b600080fd5b610399610394366004613557565b610bd9565b005b3480156103a757600080fd5b506103b26201518081565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b506103996103e0366004613587565b610de7565b3480156103f157600080fd5b50610399610400366004613587565b610e6a565b34801561041157600080fd5b506103b2610420366004613587565b60026020526000908152604090205481565b34801561043e57600080fd5b5061039961044d366004613587565b610ec5565b34801561045e57600080fd5b5061039961046d3660046135b4565b610f37565b34801561047e57600080fd5b50610399610fad565b34801561049357600080fd5b50600954600a546104b19161ffff8082169262010000909204169083565b6040805161ffff9485168152939092166020840152908201526060016103bc565b3480156104de57600080fd5b50610399610fca565b3480156104f357600080fd5b50610399610502366004613587565b610fe7565b34801561051357600080fd5b50601254610527906001600160a01b031681565b6040516001600160a01b0390911681526020016103bc565b34801561054b57600080fd5b5061055f61055a3660046135d1565b6110f2565b604080519283526020830191909152016103bc565b34801561058057600080fd5b50600c5461059390610100900460ff1681565b60405190151581526020016103bc565b3480156105af57600080fd5b5060035460ff16610593565b3480156105c757600080fd5b506103996105d6366004613587565b611158565b3480156105e757600080fd5b50601554610527906001600160a01b031681565b34801561060757600080fd5b506103996106163660046136d8565b61139d565b34801561062757600080fd5b50601454610527906001600160a01b031681565b34801561064757600080fd5b50610399610656366004613587565b6115ce565b34801561066757600080fd5b506103996106763660046137ba565b611699565b34801561068757600080fd5b5061039961179b565b34801561069c57600080fd5b506103996106ab36600461388a565b6117d0565b3480156106bc57600080fd5b50601354610527906001600160a01b031681565b3480156106dc57600080fd5b506103996106eb366004613587565b611915565b3480156106fc57600080fd5b506103996119a6565b34801561071157600080fd5b50610399610720366004613587565b6119c0565b34801561073157600080fd5b5060035461074590610100900461ffff1681565b60405161ffff90911681526020016103bc565b34801561076457600080fd5b50610399610773366004613587565b611adb565b34801561078457600080fd5b506000546001600160a01b0316610527565b3480156107a257600080fd5b506103996107b136600461388a565b611b31565b3480156107c257600080fd5b506005546006546104b19161ffff8082169262010000909204169083565b3480156107ec57600080fd5b506103996107fb366004613587565b611bf4565b34801561080c57600080fd5b5061039961081b3660046138d6565b611c87565b34801561082c57600080fd5b50610399611cb9565b34801561084157600080fd5b506103996108503660046138f1565b611d07565b34801561086157600080fd5b506108af610870366004613926565b601160209081526000928352604080842090915290825290208054600182015460029092015460ff8216926101009092046001600160a01b0316919084565b6040805194151585526001600160a01b0390931660208501529183015260608201526080016103bc565b3480156108e557600080fd5b506103996108f4366004613952565b611e31565b34801561090557600080fd5b50600c546105939060ff1681565b34801561091f57600080fd5b506007546008546104b19161ffff8082169262010000909204169083565b34801561094957600080fd5b506103b2610958366004613984565b601860209081526000938452604080852082529284528284209052825290205481565b34801561098757600080fd5b506103996109963660046138d6565b611e77565b3480156109a757600080fd5b50600154610527906001600160a01b031681565b3480156109c757600080fd5b506103996109d6366004613587565b611f90565b3480156109e757600080fd5b506103996109f6366004613587565b611ff4565b348015610a0757600080fd5b506103b2610a16366004613587565b600b6020526000908152604090205481565b348015610a3457600080fd5b506103b26203f48081565b348015610a4b57600080fd5b50610399610a5a366004613587565b612122565b348015610a6b57600080fd5b5060015461059390600160a01b900460ff1681565b348015610a8c57600080fd5b50610ac0610a9b3660046139bb565b601960205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b0390931683526020830191909152016103bc565b348015610aeb57600080fd5b50610399610afa366004613587565b61214b565b348015610b0b57600080fd5b506103b260105481565b348015610b2157600080fd5b50610b45610b30366004613587565b60046020526000908152604090205460ff1681565b6040516103bc91906139ea565b348015610b5e57600080fd5b50610399610b6d366004613587565b61219f565b348015610b7e57600080fd5b50610399610b8d366004613587565b612215565b348015610b9e57600080fd5b50610593610bad366004613587565b61233c565b348015610bbe57600080fd5b50610bc7600181565b60405160ff90911681526020016103bc565b610be161237b565b3480610c255760405162461bcd60e51b815260206004820152600e60248201526d73656e64206d73672e76616c756560901b60448201526064015b60405180910390fd5b6000610c3184846123c1565b50909150506001600160a01b038116610c775760405162461bcd60e51b81526020600482015260086024820152676e6f206d6564696160c01b6044820152606401610c1c565b6001600160a01b0380841660009081526018602090815260408083208884528252808320338452825280832054808452601983529281902081518083019092528054909416815260019093015490830152908115610ce957838160200151610cdf9190613a1a565b6020820152610d35565b33815260208101849052610d01601780546001019055565b6017546001600160a01b03861660009081526018602090815260408083208a84528252808320338452909152902081905591505b6000828152601960209081526040909120825181546001600160a01b0319166001600160a01b0390911617815590820151600190910155601054610d7a908590613a1a565b601055602081810151604080518981526001600160a01b0389169381019390935282018490526060820152608081018590523360a08201527fa0412ddfe40c42731bf585195c122e97dd4086a6fa4f4c1cfaaa63061e4aca069060c00160405180910390a1505050505050565b610def612548565b600c5460ff1615610e515760405162461bcd60e51b815260206004820152602660248201527f496e697469616c207769746864726177206164647265737320616c726561647960448201526508185919195960d21b6064820152608401610c1c565b610e5a816125a2565b50600c805460ff19166001179055565b610e72612548565b6001600160a01b0381166000818152600b602090815260409182902042905590519182527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da8991015b60405180910390a150565b610ecd61237b565b610ed5612548565b610ede8161261e565b600c805462010000600160b01b031916620100006001600160a01b039384160217905542600d5560405190821681527f492248daa73d7944dee204e5f0b712242e10c4e48e492e94f627767fb27bec9390602001610eba565b610f3f61237b565b610f47612548565b610bb88161ffff161115610f8f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420526f79616c747960881b6044820152606401610c1c565b6003805461ffff9092166101000262ffff0019909216919091179055565b610fb561237b565b610fbd612548565b600c805461ff0019169055565b610fd2612548565b60035460ff1615610fe557610fe56126db565b565b610fef61237b565b610ff7612548565b600c546001600160a01b038281166201000090920416146110535760405162461bcd60e51b81526020600482015260166024820152750bee6c2cccac4def040427a40dccaeea6c2cccac4def60531b6044820152606401610c1c565b6202a300600d54426110659190613a2d565b1161109b5760405162461bcd60e51b8152600401610c1c906020808252600490820152631dd85a5d60e21b604082015260600190565b6110a48161261e565b601480546001600160a01b0319166001600160a01b0392831617905560405190821681527f091f872b99a289ff2eb82d5c9d093e605a598fc74f7973277917f8d99842e97d90602001610eba565b6001600160a01b03808316600090815260186020908152604080832087845282528083209385168352929052908120548190808203611138576000809250925050611150565b60008181526019602052604090206001015490925090505b935093915050565b61116061237b565b6000546001600160a01b031633148061118357506001546001600160a01b031633145b61119f5760405162461bcd60e51b8152600401610c1c90613a40565b600c5460ff6101009091041615156001146111e15760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610c1c565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112489190613a66565b60ff166001146112895760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610c1c565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa1580156112c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112f19190810190613b19565b6040516020016113019190613b4e565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146113795760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610c1c565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b6113a561237b565b6113ae3361233c565b6113ca5760405162461bcd60e51b8152600401610c1c90613b6a565b60005b81518110156115ca5760008282815181106113ea576113ea613b99565b6020026020010151604001519050600083838151811061140c5761140c613b99565b6020026020010151600001519050600084848151811061142e5761142e613b99565b6020026020010151602001519050600085858151811061145057611450613b99565b6020026020010151606001519050600061146a848661272d565b905060008061147a8688876127a7565b9150915083156114f757601454604051630608be6d60e11b81526001600160a01b03898116600483015260248201899052848116604483015290911690630c117cda90606401600060405180830381600087803b1580156114da57600080fd5b505af11580156114ee573d6000803e3d6000fd5b50505050611569565b60155460405163d2180e6160e01b8152600481018890526001600160a01b0389811660248301529091169063d2180e6190604401600060405180830381600087803b15801561154557600080fd5b505af1158015611559573d6000803e3d6000fd5b505050506115698383888a612933565b7fb7bcbeb1e5ce087115265974227d16efdb3d3fa9817c458aebd733ae1beef4e8868887848660008960006040516115a8989796959493929190613baf565b60405180910390a15050505050505080806115c290613bf5565b9150506113cd565b5050565b6115d73361233c565b6115f35760405162461bcd60e51b8152600401610c1c90613b6a565b6115fc816129ab565b6116485760405162461bcd60e51b815260206004820152601a60248201527f756e617070726f766564207769746864726177416464726573730000000000006044820152606401610c1c565b601054479060009061165a9083613a2d565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611693573d6000803e3d6000fd5b50505050565b6116a161237b565b6116aa3361233c565b6116c65760405162461bcd60e51b8152600401610c1c90613b6a565b60005b81518163ffffffff1610156115ca576000828263ffffffff16815181106116f2576116f2613b99565b602090810291909101810151808201516001600160a01b0390811660009081526018845260408082208451835285528082208185015190931682529190935290912054909150801561178657600081815260196020908152604091829020845185830151845180860190955282546001600160a01b031685526001830154938501939093529092611784929085612a1c565b505b5050808061179390613c0e565b9150506116c9565b6117a3612548565b60405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610c1c565b6117d8612aef565b6001600160a01b038216600090815260186020908152604080832086845282528083203384529091528120549081900361183d5760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610c1c565b8181146118795760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081d5c88189a5960b21b6044820152606401610c1c565b600081815260196020526040902080546001600160a01b031633146118d55760405162461bcd60e51b815260206004820152601260248201527136b9b39739b2b73232b9109eb134b23232b960711b6044820152606401610c1c565b6040805180820190915281546001600160a01b0316815260018201546020820152611904908690869086612a1c565b50506119106001601655565b505050565b6000546001600160a01b031633148061193857506001546001600160a01b031633145b6119545760405162461bcd60e51b8152600401610c1c90613a40565b6001600160a01b03811660008181526002602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610eba565b6119ae612548565b60035460ff16610fe557610fe5612b48565b6119c8612548565b60006119d382612b85565b6015549091506001600160a01b031615611a8157600e546001600160a01b03838116911614611a395760405162461bcd60e51b815260206004820152601260248201527117dd985d5b1d08084f481b995dd5985d5b1d60721b6044820152606401610c1c565b6202a300600f5442611a4b9190613a2d565b11611a815760405162461bcd60e51b8152600401610c1c906020808252600490820152631dd85a5d60e21b604082015260600190565b601580546001600160a01b0319166001600160a01b038381169190911790915560405190831681527f55c500d9f010bcb210d8664f602eb160ce8aee716a68ea710302305830e45233906020015b60405180910390a15050565b611ae3612548565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001610eba565b611b3961237b565b611b41612aef565b6000611b4d8484612c84565b9050600080611b5d8686866127a7565b91509150611b6d83838888612933565b6000611b7a848888612d30565b905060008115611ba057611b8e8383612f0c565b90508015611ba057611ba08582612f2f565b7fb7bcbeb1e5ce087115265974227d16efdb3d3fa9817c458aebd733ae1beef4e888888886888a8b88604051611bdd989796959493929190613baf565b60405180910390a150505050506119106001601655565b6000546001600160a01b0316331480611c1757506001546001600160a01b031633145b611c335760405162461bcd60e51b8152600401610c1c90613a40565b60018054600160a01b900460ff16151514611c7b5760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610c1c565b611c848161304d565b50565b611c8f61237b565b611c97612548565b6000611ca2826130fc565b805463ffff00001916815560006001909101555050565b6000546001600160a01b0316331480611cdc57506001546001600160a01b031633145b611cf85760405162461bcd60e51b8152600401610c1c90613a40565b6001805460ff60a01b19169055565b611d0f61237b565b611d17612548565b60008261ffff16118015611d3157506127108261ffff1611155b611d725760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642070657263656e7461676560701b6044820152606401610c1c565b6000611d7d826130fc565b805490915062010000900461ffff1615611dd35760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610c1c565b805463ffff000019166201000061ffff8516021781554260018201556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe590611e249084908690600090613c31565b60405180910390a1505050565b611e39612548565b6001600160a01b0382166000908152600460205260409020805482919060ff19166001836002811115611e6e57611e6e6139d4565b02179055505050565b611e7f61237b565b611e87612548565b6000611e92826130fc565b805490915062010000900461ffff16611ee75760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610c1c565b6203f480816001015442611efb9190613a2d565b11611f3c5760405162461bcd60e51b81526020600482015260116024820152701d5b99195c881dd85a5d081c195c9a5bd9607a1b6044820152606401610c1c565b805462010000810461ffff1663ffffffff199091168117825560006001808401919091556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe592611acf928692613c31565b611f98612548565b611fa181612b85565b50600e80546001600160a01b0319166001600160a01b03831690811790915542600f556040519081527f66ea39118110b77bdc70c8b8c6c494af2a13414c01a51c05678c67e53c70418990602001610eba565b6000546001600160a01b031633148061201757506001546001600160a01b031633145b6120335760405162461bcd60e51b8152600401610c1c90613a40565b6001600160a01b03811661207a5760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610c1c565b6001600160a01b038116600090815260026020526040902054156120d05760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610c1c565b6001600160a01b03811660008181526002602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610eba565b61212a612548565b6001600160a01b03166000908152600460205260409020805460ff19169055565b612153612548565b6001600160a01b0381166000818152600b602090815260408083209290925590519182527fffdbac6a703f8c063588b1b434bac15231b40f4c20b16f797a989d47a56ae8b29101610eba565b6121a7612548565b6001600160a01b03811661220c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c1c565b611c848161314a565b61221d612548565b6012546001600160a01b0316156122645760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610c1c565b6000819050806001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cb9190613c5f565b6f36b83830bcb6b2b73a39b13ab33332b960811b146123195760405162461bcd60e51b815260206004820152600a6024820152693737ba10313ab33332b960b11b6044820152606401610c1c565b601280546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381166000908152600260205260408120548082036123655750600092915050565b620151806123738242613a2d565b119392505050565b60035460ff1615610fe55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c1c565b6001600160a01b0381166000908152600460205260408120548190819060ff1660018160028111156123f5576123f56139d4565b0361248a576040516355df427560e01b81526004810187905285906001600160a01b038216906355df427590602401600060405180830381865afa158015612441573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124699190810190613c8c565b5060035490995060009850610100900461ffff169650612540945050505050565b600281600281111561249e5761249e6139d4565b0361251c57604051631e330caf60e21b81526004810187905285906001600160a01b038216906378cc32bc90602401606060405180830381865afa1580156124ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250e9190613d10565b919650945092506125409050565b604051637330680360e01b81526001600160a01b0386166004820152602401610c1c565b509250925092565b6000546001600160a01b03163314610fe55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1c565b6125aa612548565b6001600160a01b03811615611c845760016125c86201518042613a2d565b6125d29190613a2d565b6001600160a01b0382166000818152600b602090815260409182902093909355519081527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da899101610eba565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126999190613c5f565b146126d45760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b6044820152606401610c1c565b9392505050565b6126e361319a565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080826040516331a9108f60e11b8152600481018690529091506001600160a01b03821690636352211e90602401602060405180830381865afa158015612779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279d9190613d52565b9150505b92915050565b60008060006127b686866131e3565b6000858152601960205260409020805460018201546001600160a01b0390911695509350909150836128135760405162461bcd60e51b81526020600482015260066024820152651b9bc8189a5960d21b6044820152606401610c1c565b6001600160a01b03808716600090815260186020908152604080832086845282528083209388168352929052908120549081900361287c5760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610c1c565b8581146128bf5760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610c1c565b6001600160a01b038088166000908152601860209081526040808320878452825280832093891683529281528282208290558882526019905290812080546001600160a01b03191681556001015560105461291b908590613a2d565b6010556129288888613346565b505050935093915050565b600081604051632142170760e11b81526001600160a01b038781166004830152868116602483015260448201869052919250908216906342842e0e90606401600060405180830381600087803b15801561298c57600080fd5b505af11580156129a0573d6000803e3d6000fd5b505050505050505050565b6001600160a01b0381166000908152600b6020526040812054806123655760405162461bcd60e51b815260206004820152602260248201527f77697468647261772061646472657373206973206e6f74207265676973746572604482015261195960f21b6064820152608401610c1c565b6020808301516001600160a01b0380861660009081526018845260408082208983528552808220875190931682529184528181208190558481526019909352822080546001600160a01b031916815560010191909155601054612a80908290613a2d565b6010558251612a8f9082612f2f565b8251604080518781526001600160a01b038781166020830152909216828201526060820184905260808201839052517f698342ddb195b4e13b4e15fa7ab6bee76e248d5d2c577359b6e0c07efef305c69181900360a00190a15050505050565b600260165403612b415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c1c565b6002601655565b612b5061237b565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127103390565b60006001600160a01b038216612bd15760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b6044820152606401610c1c565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4b9190613c5f565b146126d45760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b6044820152606401610c1c565b600080612c91848461272d565b9050336001600160a01b03821614612ce25760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610c1c565b612cee3385853061337d565b6126d45760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610c1c565b6000612d3b82613490565b1515600003612df9576013546040516305fa22e960e11b8152600481018590526001600160a01b0384811660248301526000928392911690630bf445d2906044016040805180830381865afa158015612d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dbc9190613d6f565b90925090506000612dcd8284613d9e565b61ffff1611612de25760095461ffff16612dec565b612dec8183613d9e565b61ffff16925050506126d4565b6000612e0584846131e3565b90506000806000612e1684876123c1565b9250925092506000886001600160a01b0316846001600160a01b031603612ee757821515600103612e4957506000612f00565b6013546040516310cae44560e31b8152600481018790526001600160a01b0389811660248301526000921690638657222890604401602060405180830381865afa158015612e9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebf9190613db9565b905060008161ffff1611612ed95760055461ffff16612edb565b805b61ffff16915050612f00565b600754612ef990839061ffff16613d9e565b61ffff1690505b98975050505050505050565b6000612710612f1b8382613a2d565b612f259085613dd6565b6126d49190613df5565b6000826001600160a01b03168261138890604051600060405180830381858888f193505050503d8060008114612f81576040519150601f19603f3d011682016040523d82523d6000602084013e612f86565b606091505b5050905080611910576012546001600160a01b0316612fe75760405162461bcd60e51b815260206004820152601e60248201527f7061796d656e74496e746572666163652073686f756c642062652073657400006044820152606401610c1c565b601254604051630a3b0a4f60e01b81526001600160a01b03858116600483015290911690630a3b0a4f9084906024016000604051808303818588803b15801561302f57600080fd5b505af1158015613043573d6000803e3d6000fd5b5050505050505050565b6001600160a01b03811661308d5760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610c1c565b600161309c6201518042613a2d565b6130a69190613a2d565b6001600160a01b0382166000818152600260209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610eba565b6000806001836003811115613113576131136139d4565b03613120575060056127a1565b6002836003811115613134576131346139d4565b03613141575060076127a1565b50600992915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60035460ff16610fe55760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c1c565b6001600160a01b03811660009081526004602052604081205460ff166001816002811115613213576132136139d4565b0361328e57604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf90602401606060405180830381865afa15801561325f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132839190613e17565b945061333f92505050565b60028160028111156132a2576132a26139d4565b0361331b57604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf906024016040805180830381865afa1580156132ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133119190613e4c565b935061333f915050565b604051637330680360e01b81526001600160a01b0384166004820152602401610c1c565b5092915050565b6001600160a01b038116600090815260116020908152604080832085845290915290206001810154156119105761191083836134c8565b6000826001600160a01b038681169084161480613407575060405163e985e9c560e01b81526001600160a01b038781166004830152848116602483015282169063e985e9c590604401602060405180830381865afa1580156133e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134079190613e78565b80613486575060405163020604bf60e21b8152600481018690526001600160a01b03808516919083169063081812fc90602401602060405180830381865afa158015613457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347b9190613d52565b6001600160a01b0316145b9695505050505050565b6000806001600160a01b03831660009081526004602052604090205460ff1660028111156134c0576134c06139d4565b141592915050565b6001600160a01b0381166000908152601160209081526040808320858452909152812080546001600160a81b03191681556001810182905560020155604080518381526001600160a01b03831660208201527fa50b2d6faf84e88de164f615bc8daa8477ab67f677d72aef3a3122d26c6eae289101611acf565b6001600160a01b0381168114611c8457600080fd5b6000806040838503121561356a57600080fd5b82359150602083013561357c81613542565b809150509250929050565b60006020828403121561359957600080fd5b81356126d481613542565b61ffff81168114611c8457600080fd5b6000602082840312156135c657600080fd5b81356126d4816135a4565b6000806000606084860312156135e657600080fd5b8335925060208401356135f881613542565b9150604084013561360881613542565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561364c5761364c613613565b60405290565b6040516060810167ffffffffffffffff8111828210171561364c5761364c613613565b604051601f8201601f1916810167ffffffffffffffff8111828210171561369e5761369e613613565b604052919050565b600067ffffffffffffffff8211156136c0576136c0613613565b5060051b60200190565b8015158114611c8457600080fd5b600060208083850312156136eb57600080fd5b823567ffffffffffffffff81111561370257600080fd5b8301601f8101851361371357600080fd5b8035613726613721826136a6565b613675565b81815260079190911b8201830190838101908783111561374557600080fd5b928401925b828410156137af57608084890312156137635760008081fd5b61376b613629565b84358152858501358682015260408086013561378681613542565b90820152606085810135613799816136ca565b908201528252608093909301929084019061374a565b979650505050505050565b600060208083850312156137cd57600080fd5b823567ffffffffffffffff8111156137e457600080fd5b8301601f810185136137f557600080fd5b8035613803613721826136a6565b8181526060918202830184019184820191908884111561382257600080fd5b938501935b8385101561387e5780858a03121561383f5760008081fd5b613847613652565b853581528686013561385881613542565b8188015260408681013561386b81613542565b9082015283529384019391850191613827565b50979650505050505050565b60008060006060848603121561389f57600080fd5b8335925060208401356138b181613542565b929592945050506040919091013590565b8035600481106138d157600080fd5b919050565b6000602082840312156138e857600080fd5b6126d4826138c2565b6000806040838503121561390457600080fd5b823561390f816135a4565b915061391d602084016138c2565b90509250929050565b6000806040838503121561393957600080fd5b823561394481613542565b946020939093013593505050565b6000806040838503121561396557600080fd5b823561397081613542565b915060208301356003811061357c57600080fd5b60008060006060848603121561399957600080fd5b83356139a481613542565b925060208401359150604084013561360881613542565b6000602082840312156139cd57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106139fe576139fe6139d4565b91905290565b634e487b7160e01b600052601160045260246000fd5b808201808211156127a1576127a1613a04565b818103818111156127a1576127a1613a04565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b600060208284031215613a7857600080fd5b815160ff811681146126d457600080fd5b60005b83811015613aa4578181015183820152602001613a8c565b50506000910152565b600082601f830112613abe57600080fd5b815167ffffffffffffffff811115613ad857613ad8613613565b613aeb601f8201601f1916602001613675565b818152846020838601011115613b0057600080fd5b613b11826020830160208701613a89565b949350505050565b600060208284031215613b2b57600080fd5b815167ffffffffffffffff811115613b4257600080fd5b61279d84828501613aad565b60008251613b60818460208701613a89565b9190910192915050565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b9788526001600160a01b039687166020890152604088019590955260608701939093529084166080860152831660a085015290911660c083015260e08201526101000190565b600060018201613c0757613c07613a04565b5060010190565b600063ffffffff808316818103613c2757613c27613a04565b6001019392505050565b6060810160048510613c4557613c456139d4565b93815261ffff929092166020830152151560409091015290565b600060208284031215613c7157600080fd5b5051919050565b805163ffffffff811681146138d157600080fd5b60008060008060008060c08789031215613ca557600080fd5b86519550613cb560208801613c78565b9450613cc360408801613c78565b9350606087015192506080870151613cda81613542565b60a088015190925067ffffffffffffffff811115613cf757600080fd5b613d0389828a01613aad565b9150509295509295509295565b600080600060608486031215613d2557600080fd5b8351613d3081613542565b6020850151909350613d41816136ca565b6040850151909250613608816135a4565b600060208284031215613d6457600080fd5b81516126d481613542565b60008060408385031215613d8257600080fd5b8251613d8d816135a4565b602084015190925061357c816135a4565b61ffff81811683821601908082111561333f5761333f613a04565b600060208284031215613dcb57600080fd5b81516126d4816135a4565b6000816000190483118215151615613df057613df0613a04565b500290565b600082613e1257634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215613e2c57600080fd5b83519250613e3c60208501613c78565b9150604084015190509250925092565b60008060408385031215613e5f57600080fd5b613e6883613c78565b9150602083015190509250929050565b600060208284031215613e8a57600080fd5b81516126d4816136ca56fea2646970667358221220c9b6acb65a6ec5c792d089a7dce7fe2147fd83d5e7c3fba3937f68ee126af8c164736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64
-----Decoded View---------------
Arg [0] : _royaltyRegistryAddress (address): 0x913adD08c2791fa3FFf4b95E94bF9054D3ee4052
Arg [1] : _safebox (address): 0x035da52E7Aa085F7E71764C0c8a1Ce6690e3Dfef
Arg [2] : _vault (address): 0xB7bC86cB0183Af5853274ae4E20D36DE387c4A64
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052
Arg [1] : 000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef
Arg [2] : 000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64
Deployed Bytecode Sourcemap
48531:14317:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52711:1667;;;;;;:::i;:::-;;:::i;:::-;;18979:53;;;;;;;;;;;;19026:6;18979:53;;;;;616:25:1;;;604:2;589:18;18979:53:0;;;;;;;;17985:373;;;;;;;;;;-1:-1:-1;17985:373:0;;;;;:::i;:::-;;:::i;16781:238::-;;;;;;;;;;-1:-1:-1;16781:238:0;;;;;:::i;:::-;;:::i;19132:47::-;;;;;;;;;;-1:-1:-1;19132:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;35377:293;;;;;;;;;;-1:-1:-1;35377:293:0;;;;;:::i;:::-;;:::i;37028:327::-;;;;;;;;;;-1:-1:-1;37028:327:0;;;;;:::i;:::-;;:::i;38233:121::-;;;;;;;;;;;;;:::i;28074:74::-;;;;;;;;;;-1:-1:-1;28074:74:0;;;;;;;;;;;;;;;;;;;;;;;1484:6:1;1517:15;;;1499:34;;1569:15;;;;1564:2;1549:18;;1542:43;1601:18;;;1594:34;1462:2;1447:18;28074:74:0;1276:358:1;62639:107:0;;;;;;;;;;;;;:::i;36600:420::-;;;;;;;;;;-1:-1:-1;36600:420:0;;;;;:::i;:::-;;:::i;33379:47::-;;;;;;;;;;-1:-1:-1;33379:47:0;;;;-1:-1:-1;;;;;33379:47:0;;;;;;-1:-1:-1;;;;;1833:32:1;;;1815:51;;1803:2;1788:18;33379:47:0;1639:233:1;61922:541:0;;;;;;;;;;-1:-1:-1;61922:541:0;;;;;:::i;:::-;;:::i;:::-;;;;2512:25:1;;;2568:2;2553:18;;2546:34;;;;2485:18;61922:541:0;2338:248:1;31552:43:0;;;;;;;;;;-1:-1:-1;31552:43:0;;;;;;;;;;;;;;2756:14:1;;2749:22;2731:41;;2719:2;2704:18;31552:43:0;2591:187:1;12455:86:0;;;;;;;;;;-1:-1:-1;12526:7:0;;;;12455:86;;37363:862;;;;;;;;;;-1:-1:-1;37363:862:0;;;;;:::i;:::-;;:::i;33522:40::-;;;;;;;;;;-1:-1:-1;33522:40:0;;;;-1:-1:-1;;;;;33522:40:0;;;57887:1333;;;;;;;;;;-1:-1:-1;57887:1333:0;;;;;:::i;:::-;;:::i;33484:31::-;;;;;;;;;;-1:-1:-1;33484:31:0;;;;-1:-1:-1;;;;;33484:31:0;;;42087:508;;;;;;;;;;-1:-1:-1;42087:508:0;;;;;:::i;:::-;;:::i;61001:746::-;;;;;;;;;;-1:-1:-1;61001:746:0;;;;;:::i;:::-;;:::i;62754:91::-;;;;;;;;;;;;;:::i;60196:603::-;;;;;;;;;;-1:-1:-1;60196:603:0;;;;;:::i;:::-;;:::i;33433:44::-;;;;;;;;;;-1:-1:-1;33433:44:0;;;;-1:-1:-1;;;;;33433:44:0;;;20131:175;;;;;;;;;;-1:-1:-1;20131:175:0;;;;;:::i;:::-;;:::i;62498:104::-;;;;;;;;;;;;;:::i;35961:631::-;;;;;;;;;;-1:-1:-1;35961:631:0;;;;;:::i;:::-;;:::i;21926:38::-;;;;;;;;;;-1:-1:-1;21926:38:0;;;;;;;;;;;;;;8621:6:1;8609:19;;;8591:38;;8579:2;8564:18;21926:38:0;8447:188:1;19493:148:0;;;;;;;;;;-1:-1:-1;19493:148:0;;;;;:::i;:::-;;:::i;14672:87::-;;;;;;;;;;-1:-1:-1;14718:7:0;14745:6;-1:-1:-1;;;;;14745:6:0;14672:87;;55742:1675;;;;;;;;;;-1:-1:-1;55742:1675:0;;;;;:::i;:::-;;:::i;27921:69::-;;;;;;;;;;-1:-1:-1;27921:69:0;;;;;;;;;;;;;;;;;;;20810:218;;;;;;;;;;-1:-1:-1;20810:218:0;;;;;:::i;:::-;;:::i;29625:289::-;;;;;;;;;;-1:-1:-1;29625:289:0;;;;;:::i;:::-;;:::i;21036:98::-;;;;;;;;;;;;;:::i;28876:741::-;;;;;;;;;;-1:-1:-1;28876:741:0;;;;;:::i;:::-;;:::i;33297:75::-;;;;;;;;;;-1:-1:-1;33297:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33297:75:0;;;;;;;;;10155:14:1;;10148:22;10130:41;;-1:-1:-1;;;;;10207:32:1;;;10202:2;10187:18;;10180:60;10256:18;;;10249:34;10314:2;10299:18;;10292:34;10117:3;10102:19;33297:75:0;9905:427:1;22440:217:0;;;;;;;;;;-1:-1:-1;22440:217:0;;;;;:::i;:::-;;:::i;16381:49::-;;;;;;;;;;-1:-1:-1;16381:49:0;;;;;;;;27997:70;;;;;;;;;;-1:-1:-1;27997:70:0;;;;;;;;;;;;;;;;;;;48905:105;;;;;;;;;;-1:-1:-1;48905:105:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30029:812;;;;;;;;;;-1:-1:-1;30029:812:0;;;;;:::i;:::-;;:::i;18949:23::-;;;;;;;;;;-1:-1:-1;18949:23:0;;;;-1:-1:-1;;;;;18949:23:0;;;34956:267;;;;;;;;;;-1:-1:-1;34956:267:0;;;;;:::i;:::-;;:::i;19749:312::-;;;;;;;;;;-1:-1:-1;19749:312:0;;;;;:::i;:::-;;:::i;16314:60::-;;;;;;;;;;-1:-1:-1;16314:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;27716;;;;;;;;;;;;27770:6;27716:60;;22770:181;;;;;;;;;;-1:-1:-1;22770:181:0;;;;;:::i;:::-;;:::i;19039:39::-;;;;;;;;;;-1:-1:-1;19039:39:0;;;;-1:-1:-1;;;19039:39:0;;;;;;49070:51;;;;;;;;;;-1:-1:-1;49070:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49070:51:0;;;;;;;;;;-1:-1:-1;;;;;11593:32:1;;;11575:51;;11657:2;11642:18;;11635:34;;;;11548:18;49070:51:0;11401:274:1;17745:232:0;;;;;;;;;;-1:-1:-1;17745:232:0;;;;;:::i;:::-;;:::i;32027:29::-;;;;;;;;;;;;;;;;22226:62;;;;;;;;;;-1:-1:-1;22226:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;15578:201::-;;;;;;;;;;-1:-1:-1;15578:201:0;;;;;:::i;:::-;;:::i;40885:535::-;;;;;;;;;;-1:-1:-1;40885:535:0;;;;;:::i;:::-;;:::i;21244:309::-;;;;;;;;;;-1:-1:-1;21244:309:0;;;;;:::i;:::-;;:::i;48677:33::-;;;;;;;;;;;;48709:1;48677:33;;;;;12236:4:1;12224:17;;;12206:36;;12194:2;12179:18;48677:33:0;12064:184:1;52711:1667:0;12060:19;:17;:19::i;:::-;52879:9:::1;52907:12:::0;52899:39:::1;;;::::0;-1:-1:-1;;;52899:39:0;;12455:2:1;52899:39:0::1;::::0;::::1;12437:21:1::0;12494:2;12474:18;;;12467:30;-1:-1:-1;;;12513:18:1;;;12506:44;12567:18;;52899:39:0::1;;;;;;;;;52950:15;52973:92;53003:15;53033:21;52973:15;:92::i;:::-;-1:-1:-1::0;52949:116:0;;-1:-1:-1;;;;;;;53084:21:0;::::1;53076:42;;;::::0;-1:-1:-1;;;53076:42:0;;12798:2:1;53076:42:0::1;::::0;::::1;12780:21:1::0;12837:1;12817:18;;;12810:29;-1:-1:-1;;;12855:18:1;;;12848:38;12903:18;;53076:42:0::1;12596:331:1::0;53076:42:0::1;-1:-1:-1::0;;;;;53227:44:0;;::::1;53204:20;53227:44:::0;;;:21:::1;:44;::::0;;;;;;;:85;;;;;;;;53313:10:::1;53227:97:::0;;;;;;;;53364:29;;;:15:::1;:29:::0;;;;;;53335:58;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;53227:97;53408:17;;53404:425:::1;;53480:8;53461:10;:16;;;:27;;;;:::i;:::-;53442:16;::::0;::::1;:46:::0;53404:425:::1;;;53541:10;53521:30:::0;;53566:16:::1;::::0;::::1;:27:::0;;;53608:23:::1;:11;47277:19:::0;;47295:1;47277:19;;;47188:127;53608:23:::1;53661:11;47158:14:::0;-1:-1:-1;;;;;53697:44:0;::::1;;::::0;;;:21:::1;:44;::::0;;;;;;;:61;;;;;;;;53777:10:::1;53697:105:::0;;;;;;;:120;;;53646:36;-1:-1:-1;53404:425:0::1;53839:29;::::0;;;:15:::1;:29;::::0;;;;;;;:42;;;;-1:-1:-1;;;;;;53839:42:0::1;-1:-1:-1::0;;;;;53839:42:0;;::::1;;::::0;;;;::::1;::::0;-1:-1:-1;53839:42:0;;::::1;::::0;53909:14:::1;::::0;:25:::1;::::0;53926:8;;53909:25:::1;:::i;:::-;53892:14;:42:::0;54295:16:::1;::::0;;::::1;::::0;54167:203:::1;::::0;;13481:25:1;;;-1:-1:-1;;;;;13580:15:1;;13560:18;;;13553:43;;;;13612:18;;13605:34;;;13670:2;13655:18;;13648:34;13713:3;13698:19;;13691:35;;;54349:10:0::1;13533:3:1::0;13742:19;;13735:44;54167:203:0::1;::::0;13468:3:1;13453:19;54167:203:0::1;;;;;;;52849:1529;;;;52711:1667:::0;;:::o;17985:373::-;14558:13;:11;:13::i;:::-;18133:29:::1;::::0;::::1;;:38;18111:126;;;::::0;-1:-1:-1;;;18111:126:0;;13992:2:1;18111:126:0::1;::::0;::::1;13974:21:1::0;14031:2;14011:18;;;14004:30;14070:34;14050:18;;;14043:62;-1:-1:-1;;;14121:18:1;;;14114:36;14167:19;;18111:126:0::1;13790:402:1::0;18111:126:0::1;18248:55;18286:16;18248:37;:55::i;:::-;-1:-1:-1::0;18314:29:0::1;:36:::0;;-1:-1:-1;;18314:36:0::1;18346:4;18314:36;::::0;;17985:373::o;16781:238::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;16896:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;;16942:15:::1;16896:61:::0;;16973:38;;1815:51:1;;;16973:38:0::1;::::0;1788:18:1;16973:38:0::1;;;;;;;;16781:238:::0;:::o;35377:293::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;35534:33:::2;35558:8;35534:23;:33::i;:::-;35506:17;:62:::0;;-1:-1:-1;;;;;;35506:62:0::2;::::0;-1:-1:-1;;;;;35506:62:0;;::::2;;;::::0;;35601:15:::2;35579:19;:37:::0;35632:30:::2;::::0;1833:32:1;;;1815:51;;35632:30:0::2;::::0;1803:2:1;1788:18;35632:30:0::2;1639:233:1::0;37028:327:0;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;37255:4:::2;37237:14;:22;;;;37192:110;;;::::0;-1:-1:-1;;;37192:110:0;;14399:2:1;37192:110:0::2;::::0;::::2;14381:21:1::0;14438:2;14418:18;;;14411:30;-1:-1:-1;;;14457:18:1;;;14450:45;14512:18;;37192:110:0::2;14197:339:1::0;37192:110:0::2;37313:17;:34:::0;;::::2;::::0;;::::2;;;-1:-1:-1::0;;37313:34:0;;::::2;::::0;;;::::2;::::0;;37028:327::o;38233:121::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;38314:24:::2;:32:::0;;-1:-1:-1;;38314:32:0::2;::::0;;38233:121::o;62639:107::-;14558:13;:11;:13::i;:::-;12526:7;;;;62688:51:::1;;;62717:10;:8;:10::i;:::-;62639:107::o:0;36600:420::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;36741:17:::2;::::0;-1:-1:-1;;;;;36729:29:0;;::::2;36741:17:::0;;;::::2;;36729:29;36721:64;;;::::0;-1:-1:-1;;;36721:64:0;;14743:2:1;36721:64:0::2;::::0;::::2;14725:21:1::0;14782:2;14762:18;;;14755:30;-1:-1:-1;;;14801:18:1;;;14794:52;14863:18;;36721:64:0::2;14541:346:1::0;36721:64:0::2;31521:6;36836:19;;36818:15;:37;;;;:::i;:::-;:64;36796:118;;;;-1:-1:-1::0;;;36796:118:0::2;;;;;;15227:2:1::0;15209:21;;;15266:1;15246:18;;;15239:29;-1:-1:-1;;;15299:2:1;15284:18;;15277:34;15343:2;15328:18;;15025:327;36796:118:0::2;36935:33;36959:8;36935:23;:33::i;:::-;36925:7;:43:::0;;-1:-1:-1;;;;;;36925:43:0::2;-1:-1:-1::0;;;;;36925:43:0;;::::2;;::::0;;36984:28:::2;::::0;1833:32:1;;;1815:51;;36984:28:0::2;::::0;1803:2:1;1788:18;36984:28:0::2;1639:233:1::0;61922:541:0;-1:-1:-1;;;;;62145:44:0;;;62082:13;62145:44;;;:21;:44;;;;;;;;:78;;;;;;;;:94;;;;;;;;;;;;62082:13;;62254:16;;;62250:206;;62295:1;62298;62287:13;;;;;;;62250:206;62333:27;62363:28;;;:15;:28;;;;;62427:16;;;62379:11;;-1:-1:-1;62427:16:0;-1:-1:-1;61922:541:0;;;;;;;:::o;37363:862::-;12060:19;:17;:19::i;:::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23:::1;::::0;:51:::1;;-1:-1:-1::0;19401:8:0::1;::::0;-1:-1:-1;;;;;19401:8:0::1;10648:10:::0;19401:24:::1;19374:51;19352:113;;;;-1:-1:-1::0;;;19352:113:0::1;;;;;;;:::i;:::-;37504:24:::2;::::0;::::2;;::::0;;::::2;;:32;;:24;:32;37496:47;;;::::0;-1:-1:-1;;;37496:47:0;;15900:2:1;37496:47:0::2;::::0;::::2;15882:21:1::0;15939:1;15919:18;;;15912:29;-1:-1:-1;;;15957:18:1;;;15950:32;15999:18;;37496:47:0::2;15698:325:1::0;37496:47:0::2;37554:46;37646:13;37554:120;;37693:21;-1:-1:-1::0;;;;;37693:29:0::2;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;37728:1;37693:36;37685:61;;;::::0;-1:-1:-1;;;37685:61:0;;16508:2:1;37685:61:0::2;::::0;::::2;16490:21:1::0;16547:2;16527:18;;;16520:30;-1:-1:-1;;;16566:18:1;;;16559:42;16618:18;;37685:61:0::2;16306:336:1::0;37685:61:0::2;37757:20;37821:21;-1:-1:-1::0;;;;;37821:36:0::2;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;37821:38:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;37804:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;37780:91;;;;;;37757:114;;38032:12;38065:66;38032:99;;;38010:160;;;::::0;-1:-1:-1;;;38010:160:0;;18255:2:1;38010:160:0::2;::::0;::::2;18237:21:1::0;18294:2;18274:18;;;18267:30;-1:-1:-1;;;18313:18:1;;;18306:41;18364:18;;38010:160:0::2;18053:335:1::0;38010:160:0::2;-1:-1:-1::0;38181:12:0::2;:36:::0;;-1:-1:-1;;;;;;38181:36:0::2;-1:-1:-1::0;;;;;38181:36:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;37363:862:0:o;57887:1333::-;12060:19;:17;:19::i;:::-;21704:30:::1;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1::0;;;21696:64:0::1;;;;;;;:::i;:::-;58040:9:::2;58035:1178;58059:9;:16;58055:1;:20;58035:1178;;;58097:20;58120:9;58130:1;58120:12;;;;;;;;:::i;:::-;;;;;;;:25;;;58097:48;;58160:15;58178:9;58188:1;58178:12;;;;;;;;:::i;:::-;;;;;;;:20;;;58160:38;;58213:13;58229:9;58239:1;58229:12;;;;;;;;:::i;:::-;;;;;;;:18;;;58213:34;;58262:15;58280:9;58290:1;58280:12;;;;;;;;:::i;:::-;;;;;;;:23;;;58262:41;;58318:14;58335:31;58344:7;58353:12;58335:8;:31::i;:::-;58318:48;;58384:21;58407:16:::0;58427:119:::2;58469:7;58495:12;58526:5;58427:23;:119::i;:::-;58383:163;;;;58565:10;58561:282;;;58596:7;::::0;:60:::2;::::0;-1:-1:-1;;;58596:60:0;;-1:-1:-1;;;;;19133:15:1;;;58596:60:0::2;::::0;::::2;19115:34:1::0;19165:18;;;19158:34;;;19228:15;;;19208:18;;;19201:43;58596:7:0;;::::2;::::0;:22:::2;::::0;19050:18:1;;58596:60:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;58561:282;;;58697:14;::::0;:50:::2;::::0;-1:-1:-1;;;58697:50:0;;::::2;::::0;::::2;19429:25:1::0;;;-1:-1:-1;;;;;19490:32:1;;;19470:18;;;19463:60;58697:14:0;;::::2;::::0;:27:::2;::::0;19402:18:1;;58697:50:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;58766:61;58782:6;58790:13;58805:7;58814:12;58766:15;:61::i;:::-;58864:337;58914:7;58954:12;58992:5;59026:8;59061:13;59116:1;59145:6;59184:1;58864:337;;;;;;;;;;;;;:::i;:::-;;;;;;;;58082:1131;;;;;;;58077:3;;;;;:::i;:::-;;;;58035:1178;;;;57887:1333:::0;:::o;42087:508::-;21704:30;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1;;;21696:64:0;;;;;;;:::i;:::-;42223:43:::1;42249:16;42223:25;:43::i;:::-;42201:119;;;::::0;-1:-1:-1;;;42201:119:0;;20642:2:1;42201:119:0::1;::::0;::::1;20624:21:1::0;20681:2;20661:18;;;20654:30;20720:28;20700:18;;;20693:56;20766:18;;42201:119:0::1;20440:350:1::0;42201:119:0::1;42518:14;::::0;42357:21:::1;::::0;42331:23:::1;::::0;42500:32:::1;::::0;42357:21;42500:32:::1;:::i;:::-;42543:44;::::0;42472:60;;-1:-1:-1;;;;;;42543:25:0;::::1;::::0;:44;::::1;;;::::0;42472:60;;42543:44:::1;::::0;;;42472:60;42543:25;:44;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42190:405;;42087:508:::0;:::o;61001:746::-;12060:19;:17;:19::i;:::-;21704:30:::1;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1::0;;;21696:64:0::1;;;;;;;:::i;:::-;61150:8:::2;61145:595;61168:8;:15;61164:1;:19;;;61145:595;;;61205:30;61238:8;61247:1;61238:11;;;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;61309:20;;::::2;::::0;-1:-1:-1;;;;;61287:43:0;;::::2;61264:20;61287:43:::0;;;:21:::2;:43:::0;;;;;;61349:15;;61287:92;;;;;;;61380:14;;::::2;::::0;61287:108;;::::2;::::0;;;;;;;;;;61238:11;;-1:-1:-1;61414:17:0;;61410:319:::2;;61452:27;61482:29:::0;;;:15:::2;:29;::::0;;;;;;;;61568:15;;61606:20;;::::2;::::0;61530:183;;;;::::2;::::0;;;;;-1:-1:-1;;;;;61530:183:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;;;61482:29;;61530:183:::2;::::0;61606:20;61498:12;61530:15:::2;:183::i;:::-;61433:296;61410:319;61190:550;;61185:3;;;;;:::i;:::-;;;;61145:595;;62754:91:::0;14558:13;:11;:13::i;:::-;62825:12:::1;::::0;-1:-1:-1;;;62825:12:0;;15900:2:1;62825:12:0::1;::::0;::::1;15882:21:1::0;15939:1;15919:18;;;15912:29;-1:-1:-1;;;15957:18:1;;;15950:32;15999:18;;62825:12:0::1;15698:325:1::0;60196:603:0;45593:21;:19;:21::i;:::-;-1:-1:-1;;;;;60376:44:0;::::1;60353:20;60376:44:::0;;;:21:::1;:44;::::0;;;;;;;:78;;;;;;;;60455:10:::1;60376:90:::0;;;;;;;;;60485:17;;;60477:36:::1;;;::::0;-1:-1:-1;;;60477:36:0;;21203:2:1;60477:36:0::1;::::0;::::1;21185:21:1::0;21242:1;21222:18;;;21215:29;-1:-1:-1;;;21260:18:1;;;21253:36;21306:18;;60477:36:0::1;21001:329:1::0;60477:36:0::1;60548:6;60532:12;:22;60524:45;;;::::0;-1:-1:-1;;;60524:45:0;;21537:2:1;60524:45:0::1;::::0;::::1;21519:21:1::0;21576:2;21556:18;;;21549:30;-1:-1:-1;;;21595:18:1;;;21588:40;21645:18;;60524:45:0::1;21335:334:1::0;60524:45:0::1;60580:27;60610:29:::0;;;:15:::1;:29;::::0;;;;60658:17;;-1:-1:-1;;;;;60658:17:0::1;60679:10;60658:31;60650:62;;;::::0;-1:-1:-1;;;60650:62:0;;21876:2:1;60650:62:0::1;::::0;::::1;21858:21:1::0;21915:2;21895:18;;;21888:30;-1:-1:-1;;;21934:18:1;;;21927:48;21992:18;;60650:62:0::1;21674:342:1::0;60650:62:0::1;60723:68;::::0;;;;::::1;::::0;;;;;-1:-1:-1;;;;;60723:68:0::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;60739:8;;60749:21;;60784:6;60723:15:::1;:68::i;:::-;60342:457;;45637:20:::0;45031:1;46157:7;:22;45974:213;45637:20;60196:603;;;:::o;20131:175::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20219:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;20212:32;;;20260:38;;22189:51:1;;;22256:18;;;22249:50;;;;20260:38:0::1;::::0;22162:18:1;20260:38:0::1;22021:284:1::0;62498:104:0;14558:13;:11;:13::i;:::-;12526:7;;;;62545:50:::1;;62575:8;:6;:8::i;35961:631::-:0;14558:13;:11;:13::i;:::-;36039:24:::1;36066:36;36088:13;36066:21;:36::i;:::-;36205:14;::::0;36039:63;;-1:-1:-1;;;;;;36205:14:0::1;36197:37:::0;36193:312:::1;;36312:15;::::0;-1:-1:-1;;;;;36295:32:0;;::::1;36312:15:::0;::::1;36295:32;36287:63;;;::::0;-1:-1:-1;;;36287:63:0;;22512:2:1;36287:63:0::1;::::0;::::1;22494:21:1::0;22551:2;22531:18;;;22524:30;-1:-1:-1;;;22570:18:1;;;22563:48;22628:18;;36287:63:0::1;22310:342:1::0;36287:63:0::1;31521:6;36409:17;;36391:15;:35;;;;:::i;:::-;:62;36365:128;;;;-1:-1:-1::0;;;36365:128:0::1;;;;;;15227:2:1::0;15209:21;;;15266:1;15246:18;;;15239:29;-1:-1:-1;;;15299:2:1;15284:18;;15277:34;15343:2;15328:18;;15025:327;36365:128:0::1;36515:14;:22:::0;;-1:-1:-1;;;;;;36515:22:0::1;-1:-1:-1::0;;;;;36515:22:0;;::::1;::::0;;;::::1;::::0;;;36553:31:::1;::::0;1833:32:1;;;1815:51;;36553:31:0::1;::::0;1803:2:1;1788:18;36553:31:0::1;;;;;;;;36028:564;35961:631:::0;:::o;19493:148::-;14558:13;:11;:13::i;:::-;19563:8:::1;:20:::0;;-1:-1:-1;;;;;;19563:20:0::1;-1:-1:-1::0;;;;;19563:20:0;::::1;::::0;;::::1;::::0;;;19599:34:::1;::::0;1815:51:1;;;19599:34:0::1;::::0;1803:2:1;1788:18;19599:34:0::1;1639:233:1::0;55742:1675:0;12060:19;:17;:19::i;:::-;45593:21:::1;:19;:21::i;:::-;55913:14:::2;55930:92;55967:8;55990:21;55930:22;:92::i;:::-;55913:109;;56034:21;56057:16:::0;56077:114:::2;56115:8;56138:21;56174:6;56077:23;:114::i;:::-;56033:158;;;;56202:71;56218:6;56226:13;56241:8;56251:21;56202:15;:71::i;:::-;56284:28;56315:123;56362:6;56383:8;56406:21;56315:32;:123::i;:::-;56284:154:::0;-1:-1:-1;56759:20:0::2;56798:24:::0;;56794:281:::2;;56854:103;56895:8;56922:20;56854:22;:103::i;:::-;56839:118:::0;-1:-1:-1;56976:16:0;;56972:92:::2;;57013:35;57027:6;57035:12;57013:13;:35::i;:::-;57090:319;57136:8;57173:21;57216:6;57247:8;57278:13;57321:6;57350;57385:12;57090:319;;;;;;;;;;;;;:::i;:::-;;;;;;;;55902:1515;;;;;45637:20:::1;45031:1:::0;46157:7;:22;45974:213;20810:218;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;20930:20:::1;::::0;;-1:-1:-1;;;20930:20:0;::::1;;;:28;;;20922:49;;;::::0;-1:-1:-1;;;20922:49:0;;23617:2:1;20922:49:0::1;::::0;::::1;23599:21:1::0;23656:1;23636:18;;;23629:29;-1:-1:-1;;;23674:18:1;;;23667:38;23722:18;;20922:49:0::1;23415:331:1::0;20922:49:0::1;20982:38;21008:11;20982:25;:38::i;:::-;20810:218:::0;:::o;29625:289::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;29756:35:::2;29794:29;29816:6;29794:21;:29::i;:::-;29834:37:::0;;-1:-1:-1;;29834:37:0::2;::::0;;29870:1:::2;-1:-1:-1::0;29882:20:0;;::::2;:24:::0;-1:-1:-1;;29625:289:0:o;21036:98::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;21098:20:::1;:28:::0;;-1:-1:-1;;;;21098:28:0::1;::::0;;21036:98::o;28876:741::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;29060:1:::2;29046:11;:15;;;:48;;;;;28198:5;29065:11;:29;;;;29046:48;29024:116;;;::::0;-1:-1:-1;;;29024:116:0;;23953:2:1;29024:116:0::2;::::0;::::2;23935:21:1::0;23992:2;23972:18;;;23965:30;-1:-1:-1;;;24011:18:1;;;24004:48;24069:18;;29024:116:0::2;23751:342:1::0;29024:116:0::2;29151:35;29189:29;29211:6;29189:21;:29::i;:::-;29251:33:::0;;;;-1:-1:-1;29251:33:0;;::::2;;;:38:::0;29229:111:::2;;;::::0;-1:-1:-1;;;29229:111:0;;24300:2:1;29229:111:0::2;::::0;::::2;24282:21:1::0;24339:2;24319:18;;;24312:30;-1:-1:-1;;;24358:18:1;;;24351:53;24421:18;;29229:111:0::2;24098:347:1::0;29229:111:0::2;29351:47:::0;;-1:-1:-1;;29351:47:0::2;::::0;::::2;::::0;::::2;;;::::0;;29432:15:::2;-1:-1:-1::0;29409:20:0;::::2;:38:::0;29463:146:::2;::::0;::::2;::::0;::::2;::::0;29522:6;;29351:47;;-1:-1:-1;;29463:146:0::2;:::i;:::-;;;;;;;;29013:604;28876:741:::0;;:::o;22440:217::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;22588:45:0;::::1;;::::0;;;:22:::1;:45;::::0;;;;:61;;22636:13;;22588:45;-1:-1:-1;;22588:61:0::1;::::0;22636:13;22588:61:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;22440:217:::0;;:::o;30029:812::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;30160:35:::2;30198:29;30220:6;30198:21;:29::i;:::-;30260:33:::0;;;;-1:-1:-1;30260:33:0;;::::2;;;30238:110;;;::::0;-1:-1:-1;;;30238:110:0;;24300:2:1;30238:110:0::2;::::0;::::2;24282:21:1::0;24339:2;24319:18;;;24312:30;-1:-1:-1;;;24358:18:1;;;24351:53;24421:18;;30238:110:0::2;24098:347:1::0;30238:110:0::2;27770:6;30399:10;:20;;;30381:15;:38;;;;:::i;:::-;:85;30359:152;;;::::0;-1:-1:-1;;;30359:152:0;;25070:2:1;30359:152:0::2;::::0;::::2;25052:21:1::0;25109:2;25089:18;;;25082:30;-1:-1:-1;;;25128:18:1;;;25121:47;25185:18;;30359:152:0::2;24868:341:1::0;30359:152:0::2;30546:33:::0;;;;::::2;;;-1:-1:-1::0;;30590:37:0;;;;;;;-1:-1:-1;;30638:20:0;;::::2;:24:::0;;;;30678:155:::2;::::0;::::2;::::0;::::2;::::0;30737:6;;30678:155:::2;:::i;34956:267::-:0;14558:13;:11;:13::i;:::-;35042:36:::1;35064:13;35042:21;:36::i;:::-;-1:-1:-1::0;35089:15:0::1;:31:::0;;-1:-1:-1;;;;;;35089:31:0::1;-1:-1:-1::0;;;;;35089:31:0;::::1;::::0;;::::1;::::0;;;35151:15:::1;35131:17;:35:::0;35182:33:::1;::::0;1815:51:1;;;35182:33:0::1;::::0;1803:2:1;1788:18;35182:33:0::1;1639:233:1::0;19749:312:0;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19835:25:0;::::1;19827:52;;;::::0;-1:-1:-1;;;19827:52:0;;25416:2:1;19827:52:0::1;::::0;::::1;25398:21:1::0;25455:2;25435:18;;;25428:30;-1:-1:-1;;;25474:18:1;;;25467:44;25528:18;;19827:52:0::1;25214:338:1::0;19827:52:0::1;-1:-1:-1::0;;;;;19898:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;:30;19890:56:::1;;;::::0;-1:-1:-1;;;19890:56:0;;25759:2:1;19890:56:0::1;::::0;::::1;25741:21:1::0;25798:2;25778:18;;;25771:30;-1:-1:-1;;;25817:18:1;;;25810:43;25870:18;;19890:56:0::1;25557:337:1::0;19890:56:0::1;-1:-1:-1::0;;;;;19957:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;;19985:15:::1;19957:43:::0;;20016:37;;22189:51:1;;;20048:4:0::1;22256:18:1::0;;;22249:50;20016:37:0::1;::::0;22162:18:1;20016:37:0::1;22021:284:1::0;22770:181:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;22898:45:0::1;;::::0;;;:22:::1;:45;::::0;;;;22891:52;;-1:-1:-1;;22891:52:0::1;::::0;;22770:181::o;17745:232::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;17870:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;17863:50;;;;17929:40;;1815:51:1;;;17929:40:0::1;::::0;1788:18:1;17929:40:0::1;1639:233:1::0;15578:201:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;15667:22:0;::::1;15659:73;;;::::0;-1:-1:-1;;;15659:73:0;;26101:2:1;15659:73:0::1;::::0;::::1;26083:21:1::0;26140:2;26120:18;;;26113:30;26179:34;26159:18;;;26152:62;-1:-1:-1;;;26230:18:1;;;26223:36;26276:19;;15659:73:0::1;25899:402:1::0;15659:73:0::1;15743:28;15762:8;15743:18;:28::i;40885:535::-:0;14558:13;:11;:13::i;:::-;41017:16:::1;::::0;-1:-1:-1;;;;;41017:16:0::1;41009:39:::0;41001:63:::1;;;::::0;-1:-1:-1;;;41001:63:0;;26508:2:1;41001:63:0::1;::::0;::::1;26490:21:1::0;26547:2;26527:18;;;26520:30;-1:-1:-1;;;26566:18:1;;;26559:41;26617:18;;41001:63:0::1;26306:335:1::0;41001:63:0::1;41075:38;41154:14;41075:104;;41212:14;-1:-1:-1::0;;;;;41212:29:0::1;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;41212:118:0::1;41190:178;;;::::0;-1:-1:-1;;;41190:178:0;;27037:2:1;41190:178:0::1;::::0;::::1;27019:21:1::0;27076:2;27056:18;;;27049:30;-1:-1:-1;;;27095:18:1;;;27088:40;27145:18;;41190:178:0::1;26835:334:1::0;41190:178:0::1;41379:16;:33:::0;;-1:-1:-1;;;;;;41379:33:0::1;-1:-1:-1::0;;;;;41379:33:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;40885:535:0:o;21244:309::-;-1:-1:-1;;;;;21383:25:0;;21341:4;21383:25;;;:12;:25;;;;;;21423:14;;;21419:59;;-1:-1:-1;21461:5:0;;21244:309;-1:-1:-1;;21244:309:0:o;21419:59::-;19026:6;21495:27;21513:9;21495:15;:27;:::i;:::-;:50;;21244:309;-1:-1:-1;;;21244:309:0:o;12614:108::-;12526:7;;;;12684:9;12676:38;;;;-1:-1:-1;;;12676:38:0;;27376:2:1;12676:38:0;;;27358:21:1;27415:2;27395:18;;;27388:30;-1:-1:-1;;;27434:18:1;;;27427:46;27490:18;;12676:38:0;27174:340:1;25277:1114:0;-1:-1:-1;;;;;25539:37:0;;25414:15;25539:37;;;:22;:37;;;;;;25414:15;;;;25539:37;;;25591:5;:35;;;;;;;;:::i;:::-;;25587:797;;25806:78;;-1:-1:-1;;;25806:78:0;;;;;616:25:1;;;25737:13:0;;-1:-1:-1;;;;;25806:29:0;;;;;589:18:1;;25806:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25806:78:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25944:17:0;;25784:100;;-1:-1:-1;25914:5:0;;-1:-1:-1;25944:17:0;;;;;;-1:-1:-1;25587:797:0;;-1:-1:-1;;;;;25587:797:0;;25992:26;25983:5;:35;;;;;;;;:::i;:::-;;25979:405;;26211:71;;-1:-1:-1;;;26211:71:0;;;;;616:25:1;;;26129:13:0;;-1:-1:-1;;;;;26211:54:0;;;;;589:18:1;;26211:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26176:106;;-1:-1:-1;26176:106:0;-1:-1:-1;26176:106:0;-1:-1:-1;25979:405:0;;-1:-1:-1;25979:405:0;;26322:50;;-1:-1:-1;;;26322:50:0;;-1:-1:-1;;;;;1833:32:1;;26322:50:0;;;1815:51:1;1788:18;;26322:50:0;1639:233:1;25979:405:0;25507:884;25277:1114;;;;;:::o;14837:132::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;14901:23;14893:68;;;;-1:-1:-1;;;14893:68:0;;29170:2:1;14893:68:0;;;29152:21:1;;;29189:18;;;29182:30;29248:34;29228:18;;;29221:62;29300:18;;14893:68:0;28968:356:1;17182:482:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;17312:30:0;::::1;::::0;17308:349:::1;;17586:1;17505:61;16573:6;17505:15;:61;:::i;:::-;:82;;;;:::i;:::-;-1:-1:-1::0;;;;;17442:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;;:145;;;;17607:38;1815:51:1;;;17607:38:0::1;::::0;1788:18:1;17607:38:0::1;1639:233:1::0;34360:445:0;34461:16;34557:20;-1:-1:-1;;;34557:89:0;;;;34659:19;34698:8;34659:48;;34749:12;34726:2;-1:-1:-1;;;;;34726:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;34718:59;;;;-1:-1:-1;;;34718:59:0;;29531:2:1;34718:59:0;;;29513:21:1;29570:2;29550:18;;;29543:30;-1:-1:-1;;;29589:18:1;;;29582:41;29640:18;;34718:59:0;29329:335:1;34718:59:0;34795:2;34360:445;-1:-1:-1;;;34360:445:0:o;13310:120::-;12319:16;:14;:16::i;:::-;13369:7:::1;:15:::0;;-1:-1:-1;;13369:15:0::1;::::0;;13400:22:::1;10648:10:::0;13409:12:::1;13400:22;::::0;-1:-1:-1;;;;;1833:32:1;;;1815:51;;1803:2;1788:18;13400:22:0::1;;;;;;;13310:120::o:0;23867:263::-;23984:7;;24051:21;24091:31;;-1:-1:-1;;;24091:31:0;;;;;616:25:1;;;24009:64:0;;-1:-1:-1;;;;;;24091:21:0;;;;;589:18:1;;24091:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24084:38;;;23867:263;;;;;:::o;54386:1093::-;54536:14;54552:16;54661:15;54679:48;54695:8;54705:21;54679:15;:48::i;:::-;54738:27;54768:23;;;:15;:23;;;;;54811:17;;;54850:16;;;-1:-1:-1;;;;;54811:17:0;;;;-1:-1:-1;54850:16:0;-1:-1:-1;54661:66:0;;-1:-1:-1;54811:17:0;54877:39;;;;-1:-1:-1;;;54877:39:0;;30127:2:1;54877:39:0;;;30109:21:1;30166:1;30146:18;;;30139:29;-1:-1:-1;;;30184:18:1;;;30177:36;30230:18;;54877:39:0;29925:329:1;54877:39:0;-1:-1:-1;;;;;54947:44:0;;;54927:17;54947:44;;;:21;:44;;;;;;;;:77;;;;;;;;:85;;;;;;;;;;;;;55051:14;;;55043:33;;;;-1:-1:-1;;;55043:33:0;;21203:2:1;55043:33:0;;;21185:21:1;21242:1;21222:18;;;21215:29;-1:-1:-1;;;21260:18:1;;;21253:36;21306:18;;55043:33:0;21001:329:1;55043:33:0;55108:6;55095:9;:19;55087:49;;;;-1:-1:-1;;;55087:49:0;;30461:2:1;55087:49:0;;;30443:21:1;30500:2;30480:18;;;30473:30;-1:-1:-1;;;30519:18:1;;;30512:47;30576:18;;55087:49:0;30259:341:1;55087:49:0;-1:-1:-1;;;;;55211:44:0;;;;;;;:21;:44;;;;;;;;:53;;;;;;;;:61;;;;;;;;;;;55204:68;;;55290:23;;;:15;:23;;;;;55283:30;;-1:-1:-1;;;;;;55283:30:0;;;;;;55341:14;;:25;;55358:8;;55341:25;:::i;:::-;55324:14;:42;55379:56;55403:8;55413:21;55379:23;:56::i;:::-;55446:25;;;54386:1093;;;;;;:::o;24953:316::-;25126:21;25168;25201:60;;-1:-1:-1;;;25201:60:0;;-1:-1:-1;;;;;30863:15:1;;;25201:60:0;;;30845:34:1;30915:15;;;30895:18;;;30888:43;30947:18;;;30940:34;;;25126:64:0;;-1:-1:-1;25201:30:0;;;;;;30780:18:1;;25201:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25115:154;24953:316;;;;:::o;18486:358::-;-1:-1:-1;;;;;18642:43:0;;18597:4;18642:43;;;:25;:43;;;;;;18704:16;18696:63;;;;-1:-1:-1;;;18696:63:0;;31187:2:1;18696:63:0;;;31169:21:1;31226:2;31206:18;;;31199:30;31265:34;31245:18;;;31238:62;-1:-1:-1;;;31316:18:1;;;31309:32;31358:19;;18696:63:0;30985:398:1;59228:674:0;59431:16;;;;;-1:-1:-1;;;;;59465:44:0;;;59415:13;59465:44;;;:21;:44;;;;;;:54;;;;;;;;59534:17;;59465:97;;;;;;;;;;;59458:104;;;59580:29;;;:15;:29;;;;;59573:36;;-1:-1:-1;;;;;;59573:36:0;;;;;;;;;59637:14;;:22;;59431:16;;59637:22;:::i;:::-;59620:14;:39;59684:17;;59670:39;;59703:5;59670:13;:39::i;:::-;59819:17;;59725:169;;;31647:25:1;;;-1:-1:-1;;;;;31746:15:1;;;31741:2;31726:18;;31719:43;31798:15;;;31778:18;;;31771:43;31845:2;31830:18;;31823:34;;;31888:3;31873:19;;31866:35;;;59725:169:0;;;;;;31634:3:1;59725:169:0;;;59404:498;59228:674;;;;:::o;45673:293::-;45075:1;45807:7;;:19;45799:63;;;;-1:-1:-1;;;45799:63:0;;32114:2:1;45799:63:0;;;32096:21:1;32153:2;32133:18;;;32126:30;32192:33;32172:18;;;32165:61;32243:18;;45799:63:0;31912:355:1;45799:63:0;45075:1;45940:7;:18;45673:293::o;13051:118::-;12060:19;:17;:19::i;:::-;13111:7:::1;:14:::0;;-1:-1:-1;;13111:14:0::1;13121:4;13111:14;::::0;;13141:20:::1;13148:12;10648:10:::0;;10568:98;33884:468;33988:18;-1:-1:-1;;;;;34032:27:0;;34024:57;;;;-1:-1:-1;;;34024:57:0;;32474:2:1;34024:57:0;;;32456:21:1;32513:2;32493:18;;;32486:30;-1:-1:-1;;;32532:18:1;;;32525:47;32589:18;;34024:57:0;32272:341:1;34024:57:0;34092:18;-1:-1:-1;;;34092:87:0;;;;34192:24;34238:13;34192:60;;34297:10;34271:5;-1:-1:-1;;;;;34271:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;34263:58;;;;-1:-1:-1;;;34263:58:0;;32820:2:1;34263:58:0;;;32802:21:1;32859:1;32839:18;;;32832:29;-1:-1:-1;;;32877:18:1;;;32870:39;32926:18;;34263:58:0;32618:332:1;42697:544:0;42826:7;42846:14;42863:41;42872:8;42882:21;42863:8;:41::i;:::-;42846:58;-1:-1:-1;42923:10:0;-1:-1:-1;;;;;42923:20:0;;;42915:53;;;;-1:-1:-1;;;42915:53:0;;33157:2:1;42915:53:0;;;33139:21:1;33196:2;33176:18;;;33169:30;-1:-1:-1;;;33215:18:1;;;33208:50;33275:18;;42915:53:0;32955:344:1;42915:53:0;43001:161;43038:10;43067:8;43094:21;43142:4;43001:18;:161::i;:::-;42979:230;;;;-1:-1:-1;;;42979:230:0;;33506:2:1;42979:230:0;;;33488:21:1;33545:2;33525:18;;;33518:30;-1:-1:-1;;;33564:18:1;;;33557:49;33623:18;;42979:230:0;33304:343:1;50475:1788:0;50640:7;50756:44;50778:21;50756;:44::i;:::-;:53;;50804:5;50756:53;50752:414;;50876:12;;:90;;-1:-1:-1;;;50876:90:0;;;;;19429:25:1;;;-1:-1:-1;;;;;19490:32:1;;;19470:18;;;19463:60;50827:23:0;;;;50876:12;;;:57;;19402:18:1;;50876:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50826:140;;-1:-1:-1;50826:140:0;-1:-1:-1;51040:1:0;51005:32;50826:140;;51005:32;:::i;:::-;:36;;;:149;;51121:22;:33;;;51005:149;;;51065:32;51084:13;51065:16;:32;:::i;:::-;50981:173;;;;;;;;50752:414;51176:22;51201:85;51231:8;51254:21;51201:15;:85::i;:::-;51176:110;;51298:15;51315:17;51334:14;51352:91;51382:14;51411:21;51352:15;:91::i;:::-;51297:146;;;;;;51454:28;51508:7;-1:-1:-1;;;;;51497:18:0;:7;-1:-1:-1;;;;;51497:18:0;;51493:725;;51614:20;;;51630:4;51614:20;51610:440;;-1:-1:-1;51678:1:0;51493:725;;51610:440;51746:12;;:137;;-1:-1:-1;;;51746:137:0;;;;;19429:25:1;;;-1:-1:-1;;;;;19490:32:1;;;19470:18;;;19463:60;51720:23:0;;51746:12;;:37;;19402:18:1;;51746:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51720:163;;51944:1;51925:16;:20;;;:109;;52009:14;:25;;;51925:109;;;51969:16;51925:109;51902:132;;;;51701:349;51493:725;;;52169:16;:27;:37;;52199:7;;52169:27;;:37;:::i;:::-;52146:60;;;;51493:725;52235:20;50475:1788;-1:-1:-1;;;;;;;;50475:1788:0:o;30951:272::-;31084:7;28198:5;31139:41;31156:24;28198:5;31139:41;:::i;:::-;31125:57;;:9;:57;:::i;:::-;31124:91;;;;:::i;41607:389::-;41687:9;41702:10;-1:-1:-1;;;;;41702:15:0;41725:6;41738:4;41702:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41686:61;;;41763:4;41758:231;;41818:16;;-1:-1:-1;;;;;41818:16:0;41784:131;;;;-1:-1:-1;;;41784:131:0;;35272:2:1;41784:131:0;;;35254:21:1;35311:2;35291:18;;;35284:30;35350:32;35330:18;;;35323:60;35400:18;;41784:131:0;35070:354:1;41784:131:0;41930:16;;:47;;-1:-1:-1;;;41930:47:0;;-1:-1:-1;;;;;1833:32:1;;;41930:47:0;;;1815:51:1;41930:16:0;;;;:20;;41958:6;;1788:18:1;;41930:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41675:321;41607:389;;:::o;20460:342::-;-1:-1:-1;;;;;20544:25:0;;20536:45;;;;-1:-1:-1;;;20536:45:0;;35631:2:1;20536:45:0;;;35613:21:1;35670:1;35650:18;;;35643:29;-1:-1:-1;;;35688:18:1;;;35681:37;35735:18;;20536:45:0;35429:330:1;20536:45:0;20740:1;20699:38;19026:6;20699:15;:38;:::i;:::-;:42;;;;:::i;:::-;-1:-1:-1;;;;;20671:25:0;;;;;;:12;:25;;;;;;;;;:70;;;;20757:37;;22189:51:1;;;20789:4:0;22256:18:1;;;22249:50;;;;20757:37:0;;22162:18:1;20757:37:0;22021:284:1;28212:446:0;28316:24;;28409:23;28399:6;:33;;;;;;;;:::i;:::-;;28395:237;;-1:-1:-1;28453:14:0;28395:237;;;28499:25;28489:6;:35;;;;;;;;:::i;:::-;;28485:147;;-1:-1:-1;28545:16:0;28485:147;;;-1:-1:-1;28598:22:0;28649:1;28212:446;-1:-1:-1;;28212:446:0:o;15939:191::-;16013:16;16032:6;;-1:-1:-1;;;;;16049:17:0;;;-1:-1:-1;;;;;;16049:17:0;;;;;;16082:40;;16032:6;;;;;;;16082:40;;16013:16;16082:40;16002:128;15939:191;:::o;12799:108::-;12526:7;;;;12858:41;;;;-1:-1:-1;;;12858:41:0;;35966:2:1;12858:41:0;;;35948:21:1;36005:2;35985:18;;;35978:30;-1:-1:-1;;;36024:18:1;;;36017:50;36084:18;;12858:41:0;35764:344:1;26399:861:0;-1:-1:-1;;;;;26569:37:0;;26515:15;26569:37;;;:22;:37;;;;;;;;;26621:5;:35;;;;;;;;:::i;:::-;;26617:636;;26830:46;;-1:-1:-1;;;26830:46:0;;;;;616:25:1;;;26767:13:0;;-1:-1:-1;;;;;26830:36:0;;;;;589:18:1;;26830:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26814:62;-1:-1:-1;26617:636:0;;-1:-1:-1;;;26617:636:0;;26907:26;26898:5;:35;;;;;;;;:::i;:::-;;26894:359;;27105:46;;-1:-1:-1;;;27105:46:0;;;;;616:25:1;;;27044:13:0;;-1:-1:-1;;;;;27105:36:0;;;;;589:18:1;;27105:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27091:60;-1:-1:-1;26894:359:0;;-1:-1:-1;;26894:359:0;;27191:50;;-1:-1:-1;;;27191:50:0;;-1:-1:-1;;;;;1833:32:1;;27191:50:0;;;1815:51:1;1788:18;;27191:50:0;1639:233:1;26894:359:0;26537:723;26399:861;;;;:::o;39272:337::-;-1:-1:-1;;;;;39431:34:0;;39399:29;39431:34;;;:11;:34;;;;;;;;:68;;;;;;;;39127:16;;;;:20;39510:92;;39546:44;39558:8;39568:21;39546:11;:44::i;24277:529::-;24461:4;24520:21;-1:-1:-1;;;;;24630:25:0;;;;;;;;:97;;-1:-1:-1;24672:55:0;;-1:-1:-1;;;24672:55:0;;-1:-1:-1;;;;;36948:15:1;;;24672:55:0;;;36930:34:1;37000:15;;;36980:18;;;36973:43;24672:30:0;;;;;36865:18:1;;24672:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24630:167;;;-1:-1:-1;24744:35:0;;-1:-1:-1;;;24744:35:0;;;;;616:25:1;;;-1:-1:-1;;;;;24744:53:0;;;;:25;;;;;;589:18:1;;24744:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24744:53:0;;24630:167;24622:176;24277:529;-1:-1:-1;;;;;;24277:529:0:o;23063:248::-;23175:4;;-1:-1:-1;;;;;23217:45:0;;;;;;:22;:45;;;;;;;;:86;;;;;;;;:::i;:::-;;;;23063:248;-1:-1:-1;;23063:248:0:o;38441:222::-;-1:-1:-1;;;;;38838:34:0;;;;;;:11;:34;;;;;;;;:44;;;;;;;;38831:51;;-1:-1:-1;;;;;;38831:51:0;;;-1:-1:-1;38831:51:0;;;;;;;;38605:50;;;19429:25:1;;;-1:-1:-1;;;;;19490:32:1;;19485:2;19470:18;;19463:60;38605:50:0;;19402:18:1;38605:50:0;19255:274:1;14:131;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;331:9;318:23;308:33;;391:2;380:9;376:18;363:32;404:31;429:5;404:31;:::i;:::-;454:5;444:15;;;150:315;;;;;:::o;652:247::-;711:6;764:2;752:9;743:7;739:23;735:32;732:52;;;780:1;777;770:12;732:52;819:9;806:23;838:31;863:5;838:31;:::i;904:117::-;989:6;982:5;978:18;971:5;968:29;958:57;;1011:1;1008;1001:12;1026:245;1084:6;1137:2;1125:9;1116:7;1112:23;1108:32;1105:52;;;1153:1;1150;1143:12;1105:52;1192:9;1179:23;1211:30;1235:5;1211:30;:::i;1877:456::-;1954:6;1962;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2075:9;2062:23;2052:33;;2135:2;2124:9;2120:18;2107:32;2148:31;2173:5;2148:31;:::i;:::-;2198:5;-1:-1:-1;2255:2:1;2240:18;;2227:32;2268:33;2227:32;2268:33;:::i;:::-;2320:7;2310:17;;;1877:456;;;;;:::o;3016:127::-;3077:10;3072:3;3068:20;3065:1;3058:31;3108:4;3105:1;3098:15;3132:4;3129:1;3122:15;3148:253;3220:2;3214:9;3262:4;3250:17;;3297:18;3282:34;;3318:22;;;3279:62;3276:88;;;3344:18;;:::i;:::-;3380:2;3373:22;3148:253;:::o;3406:::-;3478:2;3472:9;3520:4;3508:17;;3555:18;3540:34;;3576:22;;;3537:62;3534:88;;;3602:18;;:::i;3664:275::-;3735:2;3729:9;3800:2;3781:13;;-1:-1:-1;;3777:27:1;3765:40;;3835:18;3820:34;;3856:22;;;3817:62;3814:88;;;3882:18;;:::i;:::-;3918:2;3911:22;3664:275;;-1:-1:-1;3664:275:1:o;3944:201::-;4022:4;4055:18;4047:6;4044:30;4041:56;;;4077:18;;:::i;:::-;-1:-1:-1;4122:1:1;4118:14;4134:4;4114:25;;3944:201::o;4150:118::-;4236:5;4229:13;4222:21;4215:5;4212:32;4202:60;;4258:1;4255;4248:12;4273:1557;4393:6;4424:2;4467;4455:9;4446:7;4442:23;4438:32;4435:52;;;4483:1;4480;4473:12;4435:52;4523:9;4510:23;4556:18;4548:6;4545:30;4542:50;;;4588:1;4585;4578:12;4542:50;4611:22;;4664:4;4656:13;;4652:27;-1:-1:-1;4642:55:1;;4693:1;4690;4683:12;4642:55;4729:2;4716:16;4752:78;4768:61;4826:2;4768:61;:::i;:::-;4752:78;:::i;:::-;4864:15;;;4946:1;4942:10;;;;4934:19;;4930:28;;;4895:12;;;;4970:19;;;4967:39;;;5002:1;4999;4992:12;4967:39;5026:11;;;;5046:754;5062:6;5057:3;5054:15;5046:754;;;5144:4;5138:3;5129:7;5125:17;5121:28;5118:118;;;5190:1;5219:2;5215;5208:14;5118:118;5262:22;;:::i;:::-;5324:3;5311:17;5304:5;5297:32;5387:2;5382:3;5378:12;5365:26;5360:2;5353:5;5349:14;5342:50;5415:2;5467;5462:3;5458:12;5445:26;5484:33;5509:7;5484:33;:::i;:::-;5537:14;;;5530:31;5584:2;5627:12;;;5614:26;5653:30;5614:26;5653:30;:::i;:::-;5703:14;;;5696:31;5740:18;;5088:4;5079:14;;;;;5778:12;;;;5046:754;;;5819:5;4273:1557;-1:-1:-1;;;;;;;4273:1557:1:o;6326:1489::-;6443:6;6474:2;6517;6505:9;6496:7;6492:23;6488:32;6485:52;;;6533:1;6530;6523:12;6485:52;6573:9;6560:23;6606:18;6598:6;6595:30;6592:50;;;6638:1;6635;6628:12;6592:50;6661:22;;6714:4;6706:13;;6702:27;-1:-1:-1;6692:55:1;;6743:1;6740;6733:12;6692:55;6779:2;6766:16;6802:78;6818:61;6876:2;6818:61;:::i;6802:78::-;6914:15;;;6976:4;7015:11;;;7007:20;;7003:29;;;6945:12;;;;6902:3;7044:19;;;7041:39;;;7076:1;7073;7066:12;7041:39;7100:11;;;;7120:665;7136:6;7131:3;7128:15;7120:665;;;7216:2;7210:3;7201:7;7197:17;7193:26;7190:116;;;7260:1;7289:2;7285;7278:14;7190:116;7332:22;;:::i;:::-;7394:3;7381:17;7374:5;7367:32;7449:2;7444:3;7440:12;7427:26;7466:33;7491:7;7466:33;:::i;:::-;7519:14;;;7512:31;7566:2;7609:12;;;7596:26;7635:33;7596:26;7635:33;:::i;:::-;7688:14;;;7681:31;7725:18;;7153:12;;;;7763;;;;7120:665;;;-1:-1:-1;7804:5:1;6326:1489;-1:-1:-1;;;;;;;6326:1489:1:o;7820:383::-;7897:6;7905;7913;7966:2;7954:9;7945:7;7941:23;7937:32;7934:52;;;7982:1;7979;7972:12;7934:52;8018:9;8005:23;7995:33;;8078:2;8067:9;8063:18;8050:32;8091:31;8116:5;8091:31;:::i;:::-;7820:383;;8141:5;;-1:-1:-1;;;8193:2:1;8178:18;;;;8165:32;;7820:383::o;8848:155::-;8928:20;;8977:1;8967:12;;8957:40;;8993:1;8990;8983:12;8957:40;8848:155;;;:::o;9008:217::-;9086:6;9139:2;9127:9;9118:7;9114:23;9110:32;9107:52;;;9155:1;9152;9145:12;9107:52;9178:41;9209:9;9178:41;:::i;9230:350::-;9316:6;9324;9377:2;9365:9;9356:7;9352:23;9348:32;9345:52;;;9393:1;9390;9383:12;9345:52;9432:9;9419:23;9451:30;9475:5;9451:30;:::i;:::-;9500:5;-1:-1:-1;9524:50:1;9570:2;9555:18;;9524:50;:::i;:::-;9514:60;;9230:350;;;;;:::o;9585:315::-;9653:6;9661;9714:2;9702:9;9693:7;9689:23;9685:32;9682:52;;;9730:1;9727;9720:12;9682:52;9769:9;9756:23;9788:31;9813:5;9788:31;:::i;:::-;9838:5;9890:2;9875:18;;;;9862:32;;-1:-1:-1;;;9585:315:1:o;10337:413::-;10421:6;10429;10482:2;10470:9;10461:7;10457:23;10453:32;10450:52;;;10498:1;10495;10488:12;10450:52;10537:9;10524:23;10556:31;10581:5;10556:31;:::i;:::-;10606:5;-1:-1:-1;10663:2:1;10648:18;;10635:32;10698:1;10686:14;;10676:42;;10714:1;10711;10704:12;10755:456;10832:6;10840;10848;10901:2;10889:9;10880:7;10876:23;10872:32;10869:52;;;10917:1;10914;10907:12;10869:52;10956:9;10943:23;10975:31;11000:5;10975:31;:::i;:::-;11025:5;-1:-1:-1;11077:2:1;11062:18;;11049:32;;-1:-1:-1;11133:2:1;11118:18;;11105:32;11146:33;11105:32;11146:33;:::i;11216:180::-;11275:6;11328:2;11316:9;11307:7;11303:23;11299:32;11296:52;;;11344:1;11341;11334:12;11296:52;-1:-1:-1;11367:23:1;;11216:180;-1:-1:-1;11216:180:1:o;11680:127::-;11741:10;11736:3;11732:20;11729:1;11722:31;11772:4;11769:1;11762:15;11796:4;11793:1;11786:15;11812:247;11960:2;11945:18;;11993:1;11982:13;;11972:47;;11999:18;;:::i;:::-;12028:25;;;11812:247;:::o;12932:127::-;12993:10;12988:3;12984:20;12981:1;12974:31;13024:4;13021:1;13014:15;13048:4;13045:1;13038:15;13064:125;13129:9;;;13150:10;;;13147:36;;;13163:18;;:::i;14892:128::-;14959:9;;;14980:11;;;14977:37;;;14994:18;;:::i;15357:336::-;15559:2;15541:21;;;15598:2;15578:18;;;15571:30;-1:-1:-1;;;15632:2:1;15617:18;;15610:42;15684:2;15669:18;;15357:336::o;16028:273::-;16096:6;16149:2;16137:9;16128:7;16124:23;16120:32;16117:52;;;16165:1;16162;16155:12;16117:52;16197:9;16191:16;16247:4;16240:5;16236:16;16229:5;16226:27;16216:55;;16267:1;16264;16257:12;16647:250;16732:1;16742:113;16756:6;16753:1;16750:13;16742:113;;;16832:11;;;16826:18;16813:11;;;16806:39;16778:2;16771:10;16742:113;;;-1:-1:-1;;16889:1:1;16871:16;;16864:27;16647:250::o;16902:510::-;16956:5;17009:3;17002:4;16994:6;16990:17;16986:27;16976:55;;17027:1;17024;17017:12;16976:55;17056:6;17050:13;17082:18;17078:2;17075:26;17072:52;;;17104:18;;:::i;:::-;17148:55;17191:2;17172:13;;-1:-1:-1;;17168:27:1;17197:4;17164:38;17148:55;:::i;:::-;17228:2;17219:7;17212:19;17274:3;17267:4;17262:2;17254:6;17250:15;17246:26;17243:35;17240:55;;;17291:1;17288;17281:12;17240:55;17304:77;17378:2;17371:4;17362:7;17358:18;17351:4;17343:6;17339:17;17304:77;:::i;:::-;17399:7;16902:510;-1:-1:-1;;;;16902:510:1:o;17417:337::-;17497:6;17550:2;17538:9;17529:7;17525:23;17521:32;17518:52;;;17566:1;17563;17556:12;17518:52;17599:9;17593:16;17632:18;17624:6;17621:30;17618:50;;;17664:1;17661;17654:12;17618:50;17687:61;17740:7;17731:6;17720:9;17716:22;17687:61;:::i;17759:289::-;17890:3;17928:6;17922:13;17944:66;18003:6;17998:3;17991:4;17983:6;17979:17;17944:66;:::i;:::-;18026:16;;;;;17759:289;-1:-1:-1;;17759:289:1:o;18393:345::-;18595:2;18577:21;;;18634:2;18614:18;;;18607:30;-1:-1:-1;;;18668:2:1;18653:18;;18646:51;18729:2;18714:18;;18393:345::o;18743:127::-;18804:10;18799:3;18795:20;18792:1;18785:31;18835:4;18832:1;18825:15;18859:4;18856:1;18849:15;19534:761;19885:25;;;-1:-1:-1;;;;;19984:15:1;;;19979:2;19964:18;;19957:43;20031:2;20016:18;;20009:34;;;;20074:2;20059:18;;20052:34;;;;20123:15;;;20117:3;20102:19;;20095:44;20176:15;;19937:3;20155:19;;20148:44;20229:15;;;20223:3;20208:19;;20201:44;20276:3;20261:19;;20254:35;19872:3;19857:19;;19534:761::o;20300:135::-;20339:3;20360:17;;;20357:43;;20380:18;;:::i;:::-;-1:-1:-1;20427:1:1;20416:13;;20300:135::o;20795:201::-;20833:3;20861:10;20906:2;20899:5;20895:14;20933:2;20924:7;20921:15;20918:41;;20939:18;;:::i;:::-;20988:1;20975:15;;20795:201;-1:-1:-1;;;20795:201:1:o;24450:413::-;24649:2;24634:18;;24682:1;24671:13;;24661:47;;24688:18;;:::i;:::-;24717:25;;;24790:6;24778:19;;;;24773:2;24758:18;;24751:47;24841:14;24834:22;24829:2;24814:18;;;24807:50;24450:413;:::o;26646:184::-;26716:6;26769:2;26757:9;26748:7;26744:23;26740:32;26737:52;;;26785:1;26782;26775:12;26737:52;-1:-1:-1;26808:16:1;;26646:184;-1:-1:-1;26646:184:1:o;27519:167::-;27597:13;;27650:10;27639:22;;27629:33;;27619:61;;27676:1;27673;27666:12;27691:756;27814:6;27822;27830;27838;27846;27854;27907:3;27895:9;27886:7;27882:23;27878:33;27875:53;;;27924:1;27921;27914:12;27875:53;27953:9;27947:16;27937:26;;27982:48;28026:2;28015:9;28011:18;27982:48;:::i;:::-;27972:58;;28049:48;28093:2;28082:9;28078:18;28049:48;:::i;:::-;28039:58;;28137:2;28126:9;28122:18;28116:25;28106:35;;28184:3;28173:9;28169:19;28163:26;28198:31;28223:5;28198:31;:::i;:::-;28297:3;28282:19;;28276:26;28248:5;;-1:-1:-1;28325:18:1;28314:30;;28311:50;;;28357:1;28354;28347:12;28311:50;28380:61;28433:7;28424:6;28413:9;28409:22;28380:61;:::i;:::-;28370:71;;;27691:756;;;;;;;;:::o;28452:511::-;28536:6;28544;28552;28605:2;28593:9;28584:7;28580:23;28576:32;28573:52;;;28621:1;28618;28611:12;28573:52;28653:9;28647:16;28672:31;28697:5;28672:31;:::i;:::-;28772:2;28757:18;;28751:25;28722:5;;-1:-1:-1;28785:30:1;28751:25;28785:30;:::i;:::-;28886:2;28871:18;;28865:25;28834:7;;-1:-1:-1;28899:32:1;28865:25;28899:32;:::i;29669:251::-;29739:6;29792:2;29780:9;29771:7;29767:23;29763:32;29760:52;;;29808:1;29805;29798:12;29760:52;29840:9;29834:16;29859:31;29884:5;29859:31;:::i;33652:381::-;33729:6;33737;33790:2;33778:9;33769:7;33765:23;33761:32;33758:52;;;33806:1;33803;33796:12;33758:52;33838:9;33832:16;33857:30;33881:5;33857:30;:::i;:::-;33956:2;33941:18;;33935:25;33906:5;;-1:-1:-1;33969:32:1;33935:25;33969:32;:::i;34038:168::-;34105:6;34131:10;;;34143;;;34127:27;;34166:11;;;34163:37;;;34180:18;;:::i;34211:249::-;34280:6;34333:2;34321:9;34312:7;34308:23;34304:32;34301:52;;;34349:1;34346;34339:12;34301:52;34381:9;34375:16;34400:30;34424:5;34400:30;:::i;34465:168::-;34505:7;34571:1;34567;34563:6;34559:14;34556:1;34553:21;34548:1;34541:9;34534:17;34530:45;34527:71;;;34578:18;;:::i;:::-;-1:-1:-1;34618:9:1;;34465:168::o;34638:217::-;34678:1;34704;34694:132;;34748:10;34743:3;34739:20;34736:1;34729:31;34783:4;34780:1;34773:15;34811:4;34808:1;34801:15;34694:132;-1:-1:-1;34840:9:1;;34638:217::o;36113:328::-;36200:6;36208;36216;36269:2;36257:9;36248:7;36244:23;36240:32;36237:52;;;36285:1;36282;36275:12;36237:52;36314:9;36308:16;36298:26;;36343:48;36387:2;36376:9;36372:18;36343:48;:::i;:::-;36333:58;;36431:2;36420:9;36416:18;36410:25;36400:35;;36113:328;;;;;:::o;36446:267::-;36524:6;36532;36585:2;36573:9;36564:7;36560:23;36556:32;36553:52;;;36601:1;36598;36591:12;36553:52;36624:39;36653:9;36624:39;:::i;:::-;36614:49;;36703:2;36692:9;36688:18;36682:25;36672:35;;36446:267;;;;;:::o;37027:245::-;37094:6;37147:2;37135:9;37126:7;37122:23;37118:32;37115:52;;;37163:1;37160;37153:12;37115:52;37195:9;37189:16;37214:28;37236:5;37214:28;:::i
Swarm Source
ipfs://c9b6acb65a6ec5c792d089a7dce7fe2147fd83d5e7c3fba3937f68ee126af8c1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,592.62 | 0.961 | $3,452.5 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.