interface IERC1820Registry {
   
    /**
     * @dev Sets the `implementer` contract as `account`'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(address account, bytes32 interfaceHash, address implementer) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 interfaceHash) external view returns (address);

   
}
//*******************************************************************//
//------------------------ ERC777 Interfaces -------------------------//
//*******************************************************************//
function setInterfaceImplementer(address account, bytes32 interfaceHash, address implementer) external;

/**
 * @dev Sets the `implementer` contract as `account`'s implementer for
 * `interfaceHash`.
 *
 * `account` being the zero address is an alias for the caller's address.
 * The zero address can also be used in `implementer` to remove an old one.
 *
 * See {interfaceHash} to learn how these are created.
 *
 * Emits an {InterfaceImplementerSet} event.
 *
 * Requirements:
 *
 * - the caller must be the current manager for `account`.
 * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
 * end in 28 zeroes).
 * - `implementer` must implement {IERC1820Implementer} and return true when
 * queried for support, unless `implementer` is the caller. See
 * {IERC1820Implementer-canImplementInterfaceForAddress}.
 */