Write a Java program that mimics the framework for an online movie information system similar to IMDB written in Java. Create an abstract base class, two subclasses, and one interface to provide basic functionality for the system. Use the provided UML, the class descriptions, and the test output to determine the proper behavior for your classes. Create an interface Rateable that: Provides a method vote(int numVotes, int voteScore). Create an abstract class Movie that: Implements the Rateable and Comparable interfaces. Provides the data fields: title, releaseYear, genre, numVotes, and voteScore. Provides four constructors: o Default, no-arg constructor o Three convenience constructors that allow as parameters: the title the title and releaseYear the title, releaseYear, and genre. Provides an abstract getInfo() method. Provides a concrete toString() method that returns the only movie title. Provides a concrete getRating() method that returns: o -1 if numVotes is 0, o voteScore/numVotes otherwise. Implements the Rateable interface’s vote() method by increasing the existing values of numVotes and voteScore by the amount passed in the appropriate parameter. Implements the Comparable interface’s compareTo() method by comparing ratings. Movies should be sorted in descending order, meaning that a higher rating should be considered “less than” a lower rating. Create a concrete class Horror that: Automatically sets the genre to Horror in its constructors. Adds a data attribute for number of deaths, numOfDeaths, with the appropriate getter/setter methods. 2 Provides a getInfo() method that returns “title, genre, releaseYear (rating): numDeaths deaths” with the appropriate values. o Detects if it receives a -1 from getRating() and uses “No ratings” as the rating. o To pass LiveLab’s auto-grader, make sure ratings are limited to one decimal place (see documentation on using String.format() which works similar to System.out.printf()). Create a concrete class Comedy that: Automatically sets the genre to Comedy in its constructors. Adds a data attribute, hasProfanity, to indicate whether there is profanity in the film with the appropriate getter/setter methods. Provides a getInfo() method that returns “title, genre, releaseYear (rating): Profanity/No Profanity” with the appropriate values. o Detects if it receives a -1 from getRating() and use “No ratings” as the rating. o To pass LiveLab’s auto- grader, make sure ratings are limited to one decimal place (see documentation on using String.format() which works similar to System.out.printf()). NOTE: Movie, Horror, and Comedy should provide all of the appropriate accessor/mutator methods for their data fields. For brevity, these are not included in the UML. Main method Create the horror movies: o A Nightmare on Elm Street, 1984, 4 deaths o Final Destination 5, 2011, 94 deaths1 o Saw, 2004, 6 deaths Create the comedy movies: o Napoleon Dynamite, 2004, no profanity o Keeping Up with the Joneses, 2016, profanity o.