ETH Price: $3,590.32 (+3.56%)
 

Overview

ETH Balance

0.961 ETH

Eth Value

$3,450.30 (@ $3,590.32/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Funds215238202024-12-31 17:03:593 days ago1735664639IN
0x785fE260...A0A0fA67d
0 ETH0.0004411211.56564501
Accept Global Bi...214134432024-12-16 6:59:3518 days ago1734332375IN
0x785fE260...A0A0fA67d
0 ETH0.00101477.05712631
Accept Global Bi...214134432024-12-16 6:59:3518 days ago1734332375IN
0x785fE260...A0A0fA67d
0 ETH0.00101477.05712631
Withdraw Funds213021842024-11-30 18:08:4734 days ago1732990127IN
0x785fE260...A0A0fA67d
0 ETH0.0005281513.84731226
Global Bid On To...212881662024-11-28 19:04:2336 days ago1732820663IN
0x785fE260...A0A0fA67d
0.05 ETH0.0022900516.13283639
Accept Global Bi...212881342024-11-28 18:57:5936 days ago1732820279IN
0x785fE260...A0A0fA67d
0 ETH0.0020091613.9735219
Global Bid On To...212880932024-11-28 18:49:3536 days ago1732819775IN
0x785fE260...A0A0fA67d
0.15 ETH0.0026112318.39544657
Global Bid On To...212880852024-11-28 18:47:5936 days ago1732819679IN
0x785fE260...A0A0fA67d
0.15 ETH0.0025833218.1988297
Accept Global Bi...212880402024-11-28 18:38:5936 days ago1732819139IN
0x785fE260...A0A0fA67d
0 ETH0.0036382421.00796072
Global Bid On To...212877222024-11-28 17:34:5936 days ago1732815299IN
0x785fE260...A0A0fA67d
0.2 ETH0.0018397712.96074786
Global Bid On To...212877112024-11-28 17:32:2336 days ago1732815143IN
0x785fE260...A0A0fA67d
0.15 ETH0.0015037910.59380716
Accept Global Bi...211284102024-11-06 11:48:1158 days ago1730893691IN
0x785fE260...A0A0fA67d
0 ETH0.0018980215.66043445
Global Bid On To...211253742024-11-06 1:37:4759 days ago1730857067IN
0x785fE260...A0A0fA67d
0.06 ETH0.002319119.53821442
Accept Global Bi...211212892024-11-05 11:56:2359 days ago1730807783IN
0x785fE260...A0A0fA67d
0 ETH0.000920127.591888
Global Bid On To...211139572024-11-04 11:22:2360 days ago1730719343IN
0x785fE260...A0A0fA67d
0.06 ETH0.000711495.99424431
Accept Global Bi...211018502024-11-02 18:49:2362 days ago1730573363IN
0x785fE260...A0A0fA67d
0 ETH0.001300397.50872777
Cancel Global Bi...210921952024-11-01 10:27:2363 days ago1730456843IN
0x785fE260...A0A0fA67d
0 ETH0.000298466.46779052
Withdraw Funds210866432024-10-31 15:53:3564 days ago1730390015IN
0x785fE260...A0A0fA67d
0 ETH0.0003768111.98495475
Global Bid On To...210218682024-10-22 14:58:3573 days ago1729609115IN
0x785fE260...A0A0fA67d
0.03 ETH0.0017101514.4078713
Withdraw Funds208644652024-09-30 15:48:1195 days ago1727711291IN
0x785fE260...A0A0fA67d
0 ETH0.0007065518.52476724
Cancel Global Bi...208242422024-09-25 1:08:23101 days ago1727226503IN
0x785fE260...A0A0fA67d
0 ETH0.0008335118.06226508
Accept Global Bi...208113332024-09-23 5:55:35102 days ago1727070935IN
0x785fE260...A0A0fA67d
0 ETH0.0043041819.29982092
Global Bid On To...208107972024-09-23 4:07:47102 days ago1727064467IN
0x785fE260...A0A0fA67d
0.1 ETH0.0037646526.52095982
Global Bid On To...208107762024-09-23 4:03:35102 days ago1727064215IN
0x785fE260...A0A0fA67d
0.1 ETH0.0027862923.4742224
Accept Global Bi...207281462024-09-11 15:04:35114 days ago1726067075IN
0x785fE260...A0A0fA67d
0 ETH0.001328297.6698625
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
215238202024-12-31 17:03:593 days ago1735664639
0x785fE260...A0A0fA67d
0.25 ETH
213021842024-11-30 18:08:4734 days ago1732990127
0x785fE260...A0A0fA67d
0.402 ETH
211284102024-11-06 11:48:1158 days ago1730893691
0x785fE260...A0A0fA67d
0.051 ETH
211212892024-11-05 11:56:2359 days ago1730807783
0x785fE260...A0A0fA67d
0.051 ETH
210921952024-11-01 10:27:2363 days ago1730456843
0x785fE260...A0A0fA67d
0.05 ETH
208644652024-09-30 15:48:1195 days ago1727711291
0x785fE260...A0A0fA67d
0.2125 ETH
208242422024-09-25 1:08:23101 days ago1727226503
0x785fE260...A0A0fA67d
0.1 ETH
208113332024-09-23 5:55:35102 days ago1727070935
0x785fE260...A0A0fA67d
0.0875 ETH
205632902024-08-19 14:32:23137 days ago1724077943
0x785fE260...A0A0fA67d
0.03 ETH
205144482024-08-12 18:53:35144 days ago1723488815
0x785fE260...A0A0fA67d
0.033 ETH
205144392024-08-12 18:51:47144 days ago1723488707
0x785fE260...A0A0fA67d
0.03 ETH
205144352024-08-12 18:50:59144 days ago1723488659
0x785fE260...A0A0fA67d
0.015 ETH
203237602024-07-17 4:08:47170 days ago1721189327
0x785fE260...A0A0fA67d
0.093902 ETH
202693402024-07-09 13:50:23178 days ago1720533023
0x785fE260...A0A0fA67d
0.15 ETH
202056482024-06-30 16:18:47187 days ago1719764327
0x785fE260...A0A0fA67d
0.059375 ETH
201552052024-06-23 15:12:35194 days ago1719155555
0x785fE260...A0A0fA67d
0.1 ETH
201552012024-06-23 15:11:47194 days ago1719155507
0x785fE260...A0A0fA67d
0.025 ETH
201431032024-06-21 22:34:11196 days ago1719009251
0x785fE260...A0A0fA67d
0.02 ETH
200883922024-06-14 6:55:59203 days ago1718348159
0x785fE260...A0A0fA67d
0.240625 ETH
198854672024-05-16 22:17:47232 days ago1715897867
0x785fE260...A0A0fA67d
0.025 ETH
198854642024-05-16 22:17:11232 days ago1715897831
0x785fE260...A0A0fA67d
0.035 ETH
198854482024-05-16 22:13:59232 days ago1715897639
0x785fE260...A0A0fA67d
0.035 ETH
198780052024-05-15 21:15:35233 days ago1715807735
0x785fE260...A0A0fA67d
0.05 ETH
198216072024-05-07 23:56:47241 days ago1715126207
0x785fE260...A0A0fA67d
4 ETH
197334352024-04-25 16:00:23253 days ago1714060823
0x785fE260...A0A0fA67d
0.0369 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GlobalDigitalMediaBidCore

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

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

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.