import java.util.*;
public class Solution 
{
    public static void main (String[] args)
    {
        List<List<Object>> intervals = new ArrayList<>();
            
        List<Object> entries = new ArrayList<>();
            
        //TEST CASE 1 - No issues     PASS
        //entries.add("[1, 3]");
            
        //TEST CASE 2 - No issues     PASS
        //entries.add("[1, 3]");
        //entries.add("[4, 7]");
            
        //TEST CASE 3 - No issues     PASS
        //entries.add("[1, 3]");
        //entries.add("[2, 7]");
            
        //TEST CASE 4 - No issues     PASS
        //entries.add("[1, 3]");
        //entries.add("[4, 7]");
        //entries.add("[8, 9]");
            
        //TEST CASE 5 - No issues     PASS
        //entries.add("[1, 3]");
        //entries.add("[2, 7]");
        //entries.add("[8, 9]");
            
        // I CAN SEE, AS THE OBJECTS HIT 4, SIMILAR TO MY OTHER CODE, THE RESULTS WERE SKEWED....
            
        //TEST CASE 6 - No issues     PASS
        //entries.add("[1, 3]");
        //entries.add("[4, 7]");
        //entries.add("[8, 10]");
        //entries.add("[11, 25]");
            
        /*
        //TEST CASE 7 - No issues     PASS
        entries.add("[1, 3]");
        entries.add("[4, 7]");
        entries.add("[8, 10]");
        entries.add("[11, 25]");
        entries.add("[27, 33]");
        entries.add("[35, 38]");
        entries.add("[42, 47]");
        */
            
        //TEST CASE 8 -                 PASS
        //entries.add("[1, 3]");
        //entries.add("[2, 7]");
        //entries.add("[6, 10]");
            
        /*
        //TEST CASE 9 -                 PASS
        entries.add("[1, 3]");
        entries.add("[2, 7]");
        entries.add("[6, 10]");
        entries.add("[9, 25]");
        entries.add("[24, 33]");
        entries.add("[30, 38]");
        entries.add("[34, 44]");
        */
            
        /*
        //TEST CASE 10                  PASS 
        entries.add("[1, 3]");
        entries.add("[4, 7]");
        entries.add("[6, 9]");
        entries.add("[8, 25]");
        */
            
        /*
        //TEST CASE 11                PASS
        entries.add("[1, 3]");
        entries.add("[2, 7]");
        entries.add("[8, 9]");
        entries.add("[19, 45]");
        entries.add("[40, 52]");
        entries.add("[58, 61]");
        */
            
        /*
        //TEST CASE 12 - Invalid data   (same interval first two objects) - - seems satisfactory output
        entries.add("[1, 3]");
        entries.add("[3, 9]");
        entries.add("[8, 9]");
        */
            
        //TEST CASE 13 - Invalid data   (same interval first two objects) - seems satisfactory output
        //entries.add("[1, 3]");
        //entries.add("[3, 9]");
        //entries.add("[8, 12]");
        //entries.add("[12, 15]");
            
        /*
        //TEST CASE 14 - Invalid data   (same interval first two objects) - seems semantically correct
        entries.add("[1, 3]");
        entries.add("[4, 9]");
        entries.add("[8, 4]");
        entries.add("[9, 2]");
        */
            
        //TEST CASE 15 - undocumented  (same ranges) - seems satisfactory output
        entries.add("[1, 3]");
        entries.add("[1, 3]");
            
        intervals.add(entries);
            
        System.out.println("Final outer list: " + mergeIntervals(intervals));
    }
    
    public static List<List<Object>> mergeIntervals(List<List<Object>> intervals) 
    {
        List<List<Object>> outerList = new ArrayList<>();

        List<Object> innerList = new ArrayList<>();

        int counter=0;
        
        String newInterval="";
        
        int numberObjects=0;
        String range;
                
        String startIntervalFirstRange="";
        String endIntervalFirstRange="";
        
        String startIntervalSecondRange="";
        String endIntervalSecondRange="";
        
        Iterator<List<Object>> it = intervals.iterator();

        for (List <Object> tt: intervals)
        {  
              for (Object s:tt)
            {
                numberObjects++;
            }
            
            for (Object s:tt)
            {
                counter++;
                System.out.println("\nTHIS IS OBJECT: " + s +  " Counter: " + counter);
                    
                range = String.valueOf(s);
                
                if (numberObjects==1)
                {
                    startIntervalFirstRange = range.substring(1, range.indexOf(","));
                    
                    endIntervalFirstRange = range.substring(range.indexOf(" ")+1,range.indexOf("]"));
                    
                    newInterval = "["+startIntervalFirstRange+","+ " " + endIntervalFirstRange+"]";
                    innerList.add(newInterval);
                    System.out.println("1Added into innerlist: " + innerList);
                }
                
                if (counter>2)
                {   
                    String endNewInterval = newInterval.substring(newInterval.indexOf(" ")+1, newInterval.indexOf("]"));
                    
                    startIntervalFirstRange = range.substring(1, range.indexOf(","));
                    
                    endIntervalFirstRange = range.substring(range.indexOf(" ")+1,range.indexOf("]"));
                    
                    if (Integer.valueOf(startIntervalFirstRange)>Integer.valueOf(endNewInterval))
                    {
                        newInterval = "["+startIntervalFirstRange+","+ " " + endIntervalFirstRange+"]";
                        innerList.add(newInterval);
                        System.out.println("2Added into Inner List: " + newInterval);
                    }
                    
                    else
                    {
                        Object lastItemInnerList = innerList.get(innerList.size()-1);
                        System.out.println("Last item inner list: " + lastItemInnerList);
                        
                        String startInterval = String.valueOf(lastItemInnerList).substring(1,String.valueOf(lastItemInnerList).indexOf(","));
                        
                        System.out.println("Removed last item from innerList: " + innerList.get(innerList.size()-1));
                        
                        innerList.remove(innerList.size()-1);
                        
                        newInterval = "["+startInterval+","+ " " + endIntervalFirstRange+"]";
                        innerList.add(newInterval);
                        System.out.println("3Added into Inner List: " + newInterval);
                        System.out.println("This is innerlist: " + innerList);
                    }
                }
                
                if (counter<=2)
                {
                    if (counter==1)
                    {
                        startIntervalFirstRange = range.substring(1, range.indexOf(","));
                        
                        endIntervalFirstRange = range.substring(range.indexOf(" ")+1,range.indexOf("]"));
                        
                    }
                
                    if (counter==2)
                    {
                        startIntervalSecondRange = range.substring(1, range.indexOf(","));
                        
                        endIntervalSecondRange = range.substring(range.indexOf(" ")+1,range.indexOf("]"));
                        
                        if (Integer.valueOf(endIntervalFirstRange)>=Integer.valueOf(startIntervalSecondRange))
                        {
                            newInterval = "["+startIntervalFirstRange+","+ " " + endIntervalSecondRange+"]";
                            innerList.add(newInterval);
                            System.out.println("4Added into Inner List: " + newInterval);
                            System.out.println("4*****THE INNERLIST: " + innerList);
                    
                            startIntervalFirstRange="";
                            endIntervalFirstRange="";
                            startIntervalSecondRange="";
                            endIntervalSecondRange="";
                        }
                        else
                        {
                            innerList.add("["+startIntervalFirstRange+","+ " " + endIntervalFirstRange+"]");
                            System.out.println("5Added into Inner List: " + "["+startIntervalFirstRange+","+ " " + endIntervalFirstRange+"]");
                    
                            innerList.add("["+startIntervalSecondRange+","+ " " + endIntervalSecondRange+"]");
                            System.out.println("6Added into Inner List: " + "["+startIntervalSecondRange+","+ " " + endIntervalSecondRange+"]");
                    
                            System.out.println("*****THE INNERLIST: " + innerList);
                            newInterval = "["+startIntervalSecondRange+","+ " " + endIntervalSecondRange+"]";
                        }
                    }
                }
            }
        }
        
        outerList.add(innerList);
        
        return outerList;
    }
}