contract ERC721ARNFTBase is ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    
    // Token counter
    Counters.Counter private _tokenIds;
    
    // Contract URI
    string private _contractURI;

    /**
     * @dev Initializes the contract by setting a `name`, a `symbol` a `contractURI` to the token collection.
     */
    constructor(string memory name, string memory symbol, string memory URI) ERC721(name, symbol) {
        _contractURI = URI;
    }

     /**
     * @dev Safely mints a new token with `tokenURI` and transfers it to `receiver` and returns the new token id.
     *
     * Requirements:
     *
     * - `sender` must not owner.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function mintARNFT(address receiver, string memory tokenURI) public onlyOwner returns (uint256) {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _safeMint(receiver, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
    
    /**
     * @dev Returns the `contractURI`.
     *
     */
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }
}
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the AR/3D view capability.
 */
function mintARNFT(address receiver, string memory tokenURI) public onlyOwner returns (uint256) {
    _tokenIds.increment();

    uint256 newItemId = _tokenIds.current();
    _safeMint(receiver, newItemId);
    _setTokenURI(newItemId, tokenURI);

    return newItemId;
}

/**
 * @dev Safely mints a new token with `tokenURI` and transfers it to `receiver` and returns the new token id.
 *
 * Requirements:
 *
 * - `sender` must not owner.
 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
 *
 * Emits a {Transfer} event.
 */