Please offer help on indexing a textbook

I really need help on an assignment. It is supposed to create an index for a textbook and it has to be implemnted using trees.
Generate an index for a book.
The Input:
The input file is specified as a command-line argument (use args). Be certain to check the validity of the file.
The input file consists of a set of index entries. Each line consists of the string IX:, followed by an index entry name enclosed in braces, followed by a page number that is enclosed in braces. Each ! in an index entry name represets a sub-level. A |( represents the start of a range and a |) represents the end of the range. Occasionally, this will be the same page, and in that case, only output a single page number. Otherwise, do not collapse or expand ranges on your own. As an example, here's a sample input:
IX: Series {2}
IX: {Series!geometric|(} {4}
IX: {Euler's constant} {4}
IX: {Series!geometric|)} {4}
IX: {Series!arithmetic|(} {4}
IX: {Series!arithmetic|)} {5}
IX: {Series!harmonic|(} {5}
IX: {Euler's constant} {5}
IX: {Series!harmonic|)} {5}
IX: Series {5}
The corresponding output is:
Euler's constant: 4, 5
Series: 2-5
arithmetic: 4-5
geometric: 4
harmonic: 5
(1)You must construct a general tree with a root node(the value stored in the root node will just be the word INDEX which should be the first item printed out - this is in addition to the output specification in the text) and its children consisting of top-level index terms, the next level of children consisting of sub -level index terms and so on;
(2)Each node(except the root) must store the index term and page ranges;
(3)In the general tree implementation the siblings need to be stored in a certain way so that a certain tree traversal algorithm will print out the index in the correct way.
   import java.io.*;          
// BinaryTree class; stores a binary tree.
// CONSTRUCTION: with (a) no parameters or (b) an object to
//    be placed in the root of a one-element tree.
// *******************PUBLIC OPERATIONS**********************
// Various tree traversals, size, height, isEmpty, makeEmpty.
// Also, the following tricky method:
// void merge( Object root, BinaryTree t1, BinaryTree t2 )
//                        --> Construct a new tree
// *******************ERRORS*********************************
// Error message printed for illegal merges.
* BinaryTree class that illustrates the calling of
* BinaryNode recursive routines and merge.
    public class BinaryTree //extends BinaryNode
      BinaryNode name = new BinaryNode();
       public static void main(String []args)
         String denem = "flag";
         BinaryTree index = new BinaryTree(denem);
         BinaryTree.insert(denem);
         System.out.println(index.infix(denem));
         System.exit(0);
       public BinaryTree( )
         name = null;
       public BinaryTree( String rootItem )
         BinaryNode name = new BinaryNode( rootItem, null, null );
       public void printInOrder( )
         //if( root != null )
         name.printInOrder( );
       public BinaryNode insert(String str, BinaryNode t)
         if(t == null)
            t = new BinaryNode(str, null, null);
         else if(str.compareTo(t.root) < 0)
            t.left = insert(str, t.left);
         else if(str.compareTo(t.root) > 0)
            t.right = insert(str, t.right);     
         return t;
       public BinaryNode insert(String str)
         BinaryNode n = root;
         return insert(str, n);
      // allows the pages to be printed out
       public String toString()
         String concat = name.getRoot();  
         return concat;
       public static void infix(BinaryNode t)     
         if (t != null)
            System.out.print("(");
            infix(t.getLeft());
            System.out.print(t);
            infix(t.getRight());
            System.out.print(")");
   // Class binary node
    final class BinaryNode
      protected String root;    //the name
      protected BinaryNode left;
      protected BinaryNode right;
      //protected String pages;
       public BinaryNode( )
         this( null, null, null); //, null);
       public BinaryNode( String root, BinaryNode left, BinaryNode right) //, String pages )
         root    = this.root;
         left    = this.left;
         right   = this.right;
       //  pages   = this.pages;
      * Return the size of the binary tree rooted at t.
       public static int size( BinaryNode t )
         if( t == null )
            return 0;
         else
            return 1 + size( t.left ) + size( t.right );
      * Return the height of the binary tree rooted at t.
       public static int height( BinaryNode t )
         if( t == null )
            return -1;
         else
            return 1 + Math.max( height( t.left ), height( t.right ) );
      // Print tree rooted at current node using inorder traversal.
       public void printInOrder( )
         if( left != null )
            left.printInOrder( );            // Left
         System.out.println( root );       // Node
         if( right != null )
            right.printInOrder( );          // Right         
       public String getRoot( )
         return root;
       public BinaryNode getLeft( )
         return left;
       public BinaryNode getRight( )
         return right;
       /*public void setElement( Object x )
         element = x;
       public void setLeft( BinaryNode t )
         left = t;
       public void setRight( BinaryNode t )
         right = t;
   } // end of class node
This is the solution done using linked lists and treemap.
   import java.io.*;                         // to read the file
  A red-black tree is a binary search tree where every node has two children or is a leaf.
  It ensures O(log N) search times, at a cost of a more complicated insertion (and deletion)
  process. In a red-black tree, every node is colored either red or black, with a black root
  node, though a black root node isn't a requirement. In addition, if a node is red, its
  children must be black and every path from root to leaf (or null child node) must
  contain the same number of black nodes. These rules allow balancing
   import java.util.TreeMap;
   import java.util.Comparator;
   import java.util.StringTokenizer;
   public interface Iterator An iterator over a collection. Iterator takes the place of
   Enumeration in the Java collections framework. Iterators differ from enumerations in two ways:
   Iterators allow the caller to remove elements from the underlying collection during the iteration
   with well-defined semantics.
   import java.util.Iterator;
   import java.util.LinkedList;
   import java.util.ArrayList;
    public class IndexGenerator3
      private static final String START    = "|(";
      private static final String END      = "|)";
      private static final String SUBTOPIC = "!";
      private static final char SUBTOP= SUBTOPIC.charAt(0);
        private static final String INPUT = "hw3.in";     
      //private static final String INPUT = "input.txt";
       private static class Section
         public String name;
         public int start = -1;
         public int end = -1;
         //public int page;
    private LinkedList pages = new LinkedList();
         //constructor
          public Section(String name, int start, int end, int page)
            this.name = name;
            this.start = start;
            this.end = end;
            if(page >= 0) //this is for error checking
               addPage(page);
          public void addPage(int page)
            pages.add(new Integer(page));
          public boolean isValid()
            return (start >= 0 && end >= 0 && pages.size() == 0) || pages.size() > 0;
      // allows the pages to be printed out
          public String toString()
            String concat = "";
            String szName = name;
            while(name.indexOf(SUBTOPIC) >= 0)      // returns tbe index of the first occurrence of the character. it takes a string or character as input parameter
               concat += " ";
               name = name.substring(name.indexOf(SUBTOPIC) +1);
            } //end of while
            concat += name + ": ";
            if (start >= 0)
               concat += String.valueOf(start);
               if (end >= 0 && end != start)
                  concat += "-" +end;
            else if (end >= 0)
               concat += String.valueOf(end);
            else
               Iterator iterator = pages.iterator();
               while (iterator.hasNext())
                  concat += iterator.next() + ", ";
               if (end < concat.length())
                  concat= concat.substring(0, concat.length()-2);
            return concat;
       public static void main(String[] args)
         try
            FileReader fr = new FileReader(INPUT);
            BufferedReader inFile = new BufferedReader(fr);
            TreeMap map = new TreeMap(
                   new Comparator()
                      public int compare(Object o1, Object o2)
                        String s1= (String) o1;
                        String s2= (String) o2;
                        s1.replace(SUBTOP, ' ');
                        s2.replace(SUBTOP, ' ');
                        s1.toLowerCase();
                        s2.toLowerCase();
                        return s1.compareTo(s2);
                        //return s1.compareToIgnoreCase(s2);     //Compares two strings lexicographically, ignoring case considerations.
                      public boolean equals(Object obj)
                        return false;
            String line = null;
            for (int i = 0; (line = inFile.readLine()) != null; i++)
               StringTokenizer st = new StringTokenizer(line, "{}");
               //if (st.countTokens() != 4)
                  //System.err.println("Error, Please correct: '" +line +"'");
                  //continue;
               st.nextToken();
               String name= st.nextToken();
               st.nextToken();
               String szPage= st.nextToken();
               int start= -1;
               int end= -1;
               int page= -1;
               if (name.endsWith(START))
                  name= name.substring(0, name.length() -START.length());
                  start= Integer.parseInt(szPage);
               else if (name.endsWith(END))  //string built in function endsWith()
                  name= name.substring(0, name.length() - END.length());
                  end= Integer.parseInt(szPage);
               else
                  page = Integer.parseInt(szPage); //convet the string into integers
               Section section = (Section) map.get(name); //???????????
               if (section == null)    //if object section is null, create new section object and initialize
                  section = new Section(name, start, end, page); //start cannot be omitted
                  map.put(name, section);
               else if (start >= 0)   //if more pages under
                  section.start= start;
               else if (end >= 0)   //if more pages under same heading are found
                  section.end = end;  // overwrite ???
               else if (page >= 0)     //if there are more pages under the same heading add a page. euler s constant
                  section.addPage(page);
            fr.close();                //close the input stream
            System.out.println("\nIndex:");
            ArrayList invalid= new ArrayList(); // prevents marginal occurences of repetitive header lines
            Iterator sections= map.values().iterator();
            while (sections.hasNext())
               Section section= (Section) sections.next();
               if (section.isValid())
                  System.out.println(" " + section);
               else
                  invalid.add(section);
             catch(FileNotFoundException exception)
            { System.err.println("File not found"); }
             catch (IOException exception)
            { System.out.println(exception); }
      }// end of main
   //     public void
   }  // end of class index generator
   I'm even offering the buy the program to make it more proffessional...the payment is as much duke dollars as i can give...We can also negotiate on e bay using real dollars, but the assignemtn is due tonite and i don t have much time... If someone will most kindly take a look, i will be greatly indebted and humbled...isn t there anyone on this site who actually loves solving this kinda stuff?

actually, your solution was how I found about this forum. go to google,
type in "index a textbook" + java, the forum pops up. Your solution has helped me a lot, I based my assignment on yours, just look at my main file. The difference was, I had to use a tree. That was more confusing than a linked list.

Similar Messages

  • Help! I dropped my external HD and now my Macbook Pro will not recognize the drive. I have tried to repair the disk and that does not work. Please offer help, suggestions, something!

    I dropped my external HD on my hard tile floor and now the drive is not working properly. I have tried a repair in Disc Ultilies with First Aid with no such luck. It started to work then I got a message "Filesystem verify or repair failed" about 3-4 minutes into the first aid repair disk. When I plug in I get the disk you inserted was not readable by this computer message. Please I need help on restoring this drive!
    Its a simple tech pro drive 1TB.

    Unfortunately, a drive that has been mechanically damaged by a drop and can't be repaired using Disk Utility probably can't be fixed any other way either. The best you can hope for is to salvage as much data from the drive as possible using one of the data recovery utilities linked below, and then replace the drive.
    http://www.prosofteng.com/products/data_rescue.php
    http://subrosasoft.com/OSXSoftware/index.php?main_page=product_info&products_id= 1
    http://download.cnet.com/VirtualLab-Data-Recovery/3000-2094_4-10298807.html
    If you can't recover your most important data using one of these utilities, the only remaining hope is a data recovery service, which is very likely to cost $1000 or more for a 1TB drive.

  • 10.8.4 installation made computer unusable, please offer help.

    Hello guys,
    could you please help me on what to do as Im lost here ;(
    I was installing 10.8.4 and went to use the toilet. When I got back to the installation I noticed that I had my computer off. So I wasnt sure if the installation was completed or not.
    Now the computer keeps restarting.
    Ive resetted SMC and PRAM but it didnt help and the computer still keeps restarting.
    Is my only option to reinstall the system from recovery disk? I have my time machine back up in another country so that is not an option.
    If i do reinstall the system, will it keep the settings?
    I do have another disc here with time machine backup but its about 3 months old. Is there a way just to take the system out of it whilst keeping everything untouched and my stuff will remain there? (applications etc)
    Or any other suggestions, please? Thank you

    Boot into the Recovery disk and run disk utility to repair  the disk and permissions.  See if that will get you over the boot hump.
    OT

  • "Cannot unmount harddrive" Can you please offer help/advice?

    Hi!
    I run Tiger 10.4.11 on a first generation MacBook (Core 2 Duo) with a 160 GB HD split into 2 partitions. Using SuperDuper I made a bootable clone of my main partition on an external LaCie HD.
    While booted from the clone on the external LaCie HD I tried to repartition the laptop's harddrive so that it will contain only one partition. The process failed several times due to this error: "unable to unmount partition 1".
    I used DiskWarrior 4 to verify, repair and replace directories on both partitions of the laptop and everything seems to be fine according to DiskWarrior. Nevertheless, while booted from the external HD, one of the 2 partitions on the laptop still cannot be unmounted.
    Can anyone offer any advice/suggestion?
    Thanks a lot.
    D.M.

    Hi!
    As promised, here is the update:
    1. tried to switch off Spotlight...no effect.
    2. tried to umount using terminal.... "could't unmount disk0...- error 49153
    3. tried to unmount using original OS X disk1-->Disk Ulitily--> erased the partition--result: OK
    Now, with the MacBook Hard Drive erased and partitioned to only one partition, I booted from the Clone on the external HD and copied this clone back to the MacBook harddrive.
    So far so good... everything on the laptop works, etc.
    Now, when I assign the Clone on the external HD ( let's call it: MacBook Clone) as startup disk and boot from it, the MacBook HD is again "unmountable" (which is expected since is a clone of the previous system).
    The question therefore is: what is it that keeps MacBook HD "in use". How do I find out what are the active programs (perhaps hidden?) that contribute to this situation? I strongly believe this is the underlying problem since I have been cloning back and forth for years and never encountered anything similar.
    Do you or anybody reading this post know where should I look or point me in the right direction?
    Thanks a lot, beforehand.
    D.M.
    I have
    Message was edited by: D.M.

  • HT5622 hi,my name is kutan.since i updated ios7 on my ipad;internet got very slow,i can not open facetime no more,i can not download or update anything from apple store! so this is just redicilous! please any help?

    hi,my name is kutan.since i updated ios7 on my ipad;internet got very slow,i can not open facetime no more,i can not download or update anything from apple store! so this is just redicilous! please any help?

    It is hardly Apple's fault that Epson can't/won't update their driver, but at least Epson suggest that you use the Gutenprint driver, which in any case is far better that what Epson offer.
    You can get it here:
    http://gimp-print.sourceforge.net/
    You can download the latest version from here:
    http://sourceforge.net/projects/gimp-print/
    Have you downloaded the recent Apple update to Epson drivers?
    http://support.apple.com/kb/DL1398

  • Please, need help with a query

    Hi !
    Please need help with this query:
    Needs to show (in cases of more than 1 loan offer) the latest create_date one time.
    Meaning, In cases the USER_ID, LOAN_ID, CREATE_DATE are the same need to show only the latest, Thanks!!!
    select distinct a.id,
    create_date,
    a.loanid,
    a.rate,
    a.pays,
    a.gracetime,
    a.emailtosend,
    d.first_name,
    d.last_name,
    a.user_id
    from CLAL_LOANCALC_DET a,
    loan_Calculator b,
    bv_user_profile c,
    bv_mr_user_profile d
    where b.loanid = a.loanid
    and c.NET_USER_NO = a.resp_id
    and d.user_id = c.user_id
    and a.is_partner is null
    and a.create_date between
    TO_DATE('6/3/2008 01:00:00', 'DD/MM/YY HH24:MI:SS') and
    TO_DATE('27/3/2008 23:59:00', 'DD/MM/YY HH24:MI:SS')
    order by a.create_date

    Take a look on the syntax :
    max(...) keep (dense_rank last order by ...)
    http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions056.htm#i1000901
    Nicolas.

  • Please need help with this query

    Hi !
    Please need help with this query:
    Needs to show (in cases of more than 1 loan offer) the latest create_date one time.
    Meaning, In cases the USER_ID, LOAN_ID, CREATE_DATE are the same need to show only the latest, Thanks!!!
    select distinct a.id,
    create_date,
    a.loanid,
    a.rate,
    a.pays,
    a.gracetime,
    a.emailtosend,
    d.first_name,
    d.last_name,
    a.user_id
    from CLAL_LOANCALC_DET a,
    loan_Calculator b,
    bv_user_profile c,
    bv_mr_user_profile d
    where b.loanid = a.loanid
    and c.NET_USER_NO = a.resp_id
    and d.user_id = c.user_id
    and a.is_partner is null
    and a.create_date between
    TO_DATE('6/3/2008 01:00:00', 'DD/MM/YY HH24:MI:SS') and
    TO_DATE('27/3/2008 23:59:00', 'DD/MM/YY HH24:MI:SS')
    order by a.create_date

    Perhaps something like this...
    select id, create_date, loanid, rate, pays, gracetime, emailtosend, first_name, last_name, user_id
    from (
          select distinct a.id,
                          create_date,
                          a.loanid,
                          a.rate,
                          a.pays,
                          a.gracetime,
                          a.emailtosend,
                          d.first_name,
                          d.last_name,
                          a.user_id,
                          max(create_date) over (partition by a.user_id, a.loadid) as max_create_date
          from CLAL_LOANCALC_DET a,
               loan_Calculator b,
               bv_user_profile c,
               bv_mr_user_profile d
          where b.loanid = a.loanid
          and   c.NET_USER_NO = a.resp_id
          and   d.user_id = c.user_id
          and   a.is_partner is null
          and   a.create_date between
                TO_DATE('6/3/2008 01:00:00', 'DD/MM/YY HH24:MI:SS') and
                TO_DATE('27/3/2008 23:59:00', 'DD/MM/YY HH24:MI:SS')
    where create_date = max_create_date
    order by create_date

  • HT5887 Hi,Latest games whichever available in itunes or public domain are not supprting to my IPOD tocuch. Please kindly help me on this

    Hi Everyone,
    I am trying to add games, songs, apps in my IPOD touch but it always saying that it not support. I have downloaded the latest ITUNES then downloaded lot of games,songs. When i try to synchronize all this to my ipod, it is saying that version will support. Please kindly help me on this.
    Thanks,
    Rama Mohan Raju R.

    I suspect you have a 2G iPod. Those can only go to iOS 4.2.1.
    Identifying iPod models
    iPod touch (3rd generation)
    iPod touch (3rd generation) features a 3.5-inch (diagonal) widescreen multi-touch display and 32 GB or 64 GB flash drive. You can browse the web with Safari and watch YouTube videos with Wi-Fi. You can also search, preview, and buy songs from the iTunes Wi-Fi Music Store on iPod touch.
    The iPod touch (3rd generation) can be distinguished from iPod touch (2nd generation) by looking at the back of the device. In the text below the engraving, look for the model number. iPod touch (2nd generation) is model A1288, and iPod touch (3rd generation) is model A1318.
    Many apps not requires a higher iOS version
    To more easily find compatible apps:
    iOSSearch - search the iTunes store for compatible apps.
    Apple Club - filter apps by iOS version.
    Starting when iOS 7 was releases, Apple now allows downloading the last compatible version of some apps (iOS 4.2.1 and later only)
    App Store: Downloading Older Versions of Apps on iOS - Apple Club
    App Store: Install the latest compatible version of an app
    You first have to download the non-compatible version on your computer. Then when you try to purchase the version on your iPod you will be offered a compatible version if one exists.

  • I deleted my keynote and downloaded it again but the installer says: You already have an eligible Keynote in the folder: /Applications/iwork 09, I didn't find any keynote. Please someone help me Im stuck in this mess.

    I deleted my keynote and downloaded it again but the installer says: You already have an eligible Keynote in the folder: /Applications/iwork 09, I didn't find any keynote. Please someone help me Im stuck in this mess.

    SkyDaughter29 wrote:
    My current situation: I have soooo many texts on my iphone and I haven't deleted many because I need the information contained in them for future reference and for legal purposes.  I would really like to find a means and way to save them other than on the phone itself. I've done searches for various apps yet I'm not finding what I think I would need.  It appears Apple does not sync the texts between the iphone and my MacBook Pro.
    Try the computer apps PhoneView (Mac) or TouchCopy (Mac & PC):
    http://www.ecamm.com/mac/phoneview/
    http://www.wideanglesoftware.com/touchcopy/index.php
    Best of luck.

  • My itunes library is empty but i want to upgrade my ipod without losing my music. how can i do this? please someone HELP!!!

    i recently got a new laptop so my itunes library is empty but i want to upgrade my ipod without losing my music. how can i do this? please someone HELP!!!

    but i got music from my old laptop and my little brothers laptop so basically its no way i can take whats already on my ipod and put it on my computer and drag and drop it to my new itunes library

  • Hey iphone an iphone 3g and i only have about 13 apps and the yellow bar on itunes for my phone is way to big i deleted all my photos all my music every thing i ryed restoring ans all it still takes up space for sum reason ?? please someone help me

    hey iphone an iphone 3g and i only have about 13 apps and the yellow bar on itunes for my phone is way to big i deleted all my photos all my music every thing i ryed restoring ans all it still takes up space for sum reason ?? please someone help me

    If Other (the yellow bar) is too big something is corrupted.  The only solution (that I know of) is to restore from your most recent backup using iTunes (see http://support.apple.com/kb/ht1766).

  • Setup problem please anyone help ~~ me !!!

    i was trying to setup adobe photoshop and i clicked setup.exe (file picture display like as a white paper) and it told me to choose application. so i dont know how to change or choose which program .. please anyone help me out on this..

    Photoshop is an application that must be purchased (not available via a download) and isn't cheap.
    You must purchase the OS X (Tiger compatible) version of Photoshop.
    Check Apple's online store under software or do a Google search.

  • My phone 5s did the new update and will not come back on. I already tried hard reboot still won't work. Been over a hour now. Please someone help I need my phone.

    My phone 5s 16gb gold did the new update and will not come back on. I already tried hard reboot still won't work. Been over a hour now. Please someone help I need my phone.   This phone is not even 6 months old been in case no scratches. This is driving me crazy.

    Connect your phone to a computer and restore your software using iTunes.

  • Ever since the new update, my Ipod won't sync. Starts to sync but then goes back to connected eject before disconnecting. Still won't transfer songs even after being restored. Restored fine. But now I've got nothing on it. Please god help!

    For awhile, since the newest update, I'd noticed when charging the ipod (classic) that it stopped going to the charging screen and would stay on the  Connected: Eject before disconnecting' screen. But, y'know, didn't matter to me, it still charged... until today when I tried to add music. Tried it many times, reset it... STILL wouldn't transfer songs... It would 'say' it was syncing, but then suddenly stop and stay on the same Connect: please eject before disconnecting' page. I did a couple of times get a message about scanning it but, after restoring that never popped up again...
    So, I do a system restore on it and ofcourse THAT works, but it STILL won't sync! So, now I've got an ipod with no music that won't sync and because it's all gone on there, I'm not sure how to back up my stuff (should I need to re-install iTunes... Though I doubt it'd work...)... So, yeah, I tried a different cable too, still no luck...
    There has GOT to be some way to fix this!
    Please somebody help me out! I so freaking appreciate it you have NO idea!

    I think the problem is that the iPod got set to Manually manage music and videos.  It needs to be set up for automatic syncing again.  Just unchecking that Manually manage music and videos setting does not do it.
    In iTunes 12, select the iPod in iTunes (using the device button), so that you see the iPod's "management" screen.  In the sidebar (along left side of screen), there are two headings (Settings and On My Device).  Under Settings, click on Music.  To the right, you see the iPod's Music screen, where you tell iTunes how to sync songs to the iPod.
    Check the box at the top for Sync Music.  That turns ON automatic syncing for music.  Below that, choose the option to sync Entire music library (assuming your music library fits completely on your iPod).  Otherwise, you can choose the option to sync Selected playlists, artists, albums, and genres and make your selections below.  Then click Apply.

  • HT6154 Can someone please just help me figure out how to update this stupid phone without losing anything? I somehow have more than one Apple ID on this,but I just want my music and my pictures to stay and I'm terrified of losing these things.

    Can someone please just help me figure out how to update this stupid phone(iPhone 4)without losing anything? I somehow have more than one Apple ID on this,but I just want my music and my pictures to stay and I'm terrified of losing these things. I have a lot of music from old CDs on here,and for some reason I can't even transfer them manually onto my computer. I'm not tech savvy whatsoever. Someone please help,having my music is the the whole reason I still have this phone.

    First read about back http://support.apple.com/kb/ht1766
    Then  read on how to transfer photos to your computer http://support.apple.com/kb/ts3195
    Then
    UPDATING iOS
    Over the air updating of iOS needs iOS 5 or later so unless you have iOS 5 or later you will not see updating in setting
    The following link explains how to update http://support.apple.com/kb/HT4972
    This link explains how to update using wireless http://support.apple.com/kb/HT4623
    This explains how to transfer purchases to your computer http://support.apple.com/kb/ht1848

Maybe you are looking for