Index: trunk/src/cptms/data_layers/cmsToGeoJson.awk
===================================================================
--- trunk/src/cptms/data_layers/cmsToGeoJson.awk	(revision 318)
+++ trunk/src/cptms/data_layers/cmsToGeoJson.awk	(revision 318)
@@ -0,0 +1,18 @@
+# Convert a csv with cctv location data to a geojson file
+# This was used for a one-off task to convert the static csv file we manually produced into json
+# Sample invocation:  awk -F',' -f awkpgm1 filename
+
+# Manually remove the first line with column headers before running this.
+
+# Remove quotes around those streets names that have them
+//{gsub("\"","",$5);printf "  {\n  \"type\": \"Feature\",\n  \"id\": \"%s\",\n  \"geometry\":\n      {\n      \"type\": \"Point\",\n      \"coordinates\": [%s,%s]\n      },\n  \"properties\":\n      {\n      \"location\":\"%s %s %5.2f\",\n      \"street\":\"%s\"\n      }\n  },\n", $1,$7,$8,$10,$12,$15, $5}
+
+#
+# When finished prepend:
+#{
+#  "type": "FeatureCollection",
+#  "features": [
+# 
+# and Append:
+#  ] }
+
Index: trunk/src/cptms/data_layers/prep_postmiles.py
===================================================================
--- trunk/src/cptms/data_layers/prep_postmiles.py	(revision 318)
+++ trunk/src/cptms/data_layers/prep_postmiles.py	(revision 318)
@@ -0,0 +1,273 @@
+import collections,math,sys
+# Scan the postmile file to preprocess it to identify N/S pairs
+# that are so close they will overlap in the display. 
+# Compute the perpendicular vector that will be used to adjust their position.
+# Input filename is a Output to stdout.
+# This program adds one extra column to the output, a color, to allow the
+# results to be easily converted to json and displayed for visual verification. 
+# (See the convert csv to json bash/awk script)
+# Before being used in the simulation, remove the last column:
+#     cut -f1-6 -d"," output.txt
+
+# jdalbey Feb 2019
+postmileFile = "d12_vds_uniq_sorted.csv"
+
+# Helper function to find the perpendicular unit vector to the line
+# between two postmiles.
+def findPerpX(ax,ay,bx,by):
+    dx = float(bx) - float(ax);
+    dy = float(by) - float(ay);
+    
+    dist = math.sqrt(dx * dx + dy * dy);
+    try:
+        normX = dy / dist;  # calc a unit vector
+        normY = -dx / dist;
+        return round(normX, 6)
+    except ZeroDivisionError:
+        print "Oops, (",ay,",",ax,") appeared twice,"
+        print "causing findPerp() to divide by zero. Probable cause: duplicates in input"
+        print "Please correct the input file."
+        sys.exit(-1)
+# And same for Y ... I know it's redundant code.
+def findPerpY(ax,ay,bx,by):
+    dx = float(bx) - float(ax);
+    dy = float(by) - float(ay);
+    
+    dist = math.sqrt(dx * dx + dy * dy);
+    
+    normX = dy / dist;  # calc a unit vector
+    normY = -dx / dist;
+    return round(normY, 6)
+
+orientationLookup = {'N':0,'S':1,'E':0,'W':1}
+
+def loadHighways():
+
+    f = open(postmileFile,'r')
+    lines = [line.split(',') for line in f.readlines()]
+    
+    # Create a set containing just the route numbers 
+    routeNums = set()
+    for item in lines:
+        routeNums.add(int(item[0]))
+    # put the route numbers in order
+    sortedRoutes = sorted (routeNums)    
+    # Create the empty postmile collections
+    for route in sortedRoutes:
+        #print route,
+        highways[str(route)]=[collections.OrderedDict(),collections.OrderedDict()]
+    #print
+    # Process all the data, placing it in proper route and collection
+    for item in lines:
+        route = item[0]
+        orientation = orientationLookup[item[1]]
+        postmileItem = item[2]
+        highways[route][orientation][postmileItem]=item
+
+
+def dumpHighways():
+    # Dump the highways data we've organized
+    for item in highways:
+        for cnt in [0,1]:
+            list1 = highways[item][cnt]
+            print "highway",item,list1
+            # show fields for one entry
+            for pm_entry in list1:
+                print pm_entry,list1[pm_entry]
+
+def calcPerpendicularVectors(theList,thePerps,dirSign):
+    size = len(theList)
+    idx = 1
+    while (idx < size-1):
+        # see which is closer, previous or next
+        a = abs(float(theList[idx][2]) - float(theList[idx+1][2]))
+        b = abs(float(theList[idx][2]) - float(theList[idx-1][2]))
+        if ( a<b ):
+            #print "closest to ",theList[idx][1]+theList[idx][2]," is ", theList[idx+1][2],
+            ax=theList[idx][4] #long
+            ay=theList[idx][3] #lat
+            bx=theList[idx+1][4]
+            by=theList[idx+1][3]
+            px = findPerpX(ax,ay,bx,by) * dirSign
+            py = findPerpY(ax,ay,bx,by) * dirSign
+            # TODO: ADd check to see if this pm already assigned px,py
+            thePerps[theList[idx][2]] = [px,py]
+            thePerps[theList[idx+1][2]] = [px,py]
+            #print px,py
+        else:
+            #print ">closest to ",theList[idx][2]," is ", theList[idx-1][2],
+            ax=theList[idx][4]
+            ay=theList[idx][3]
+            bx=theList[idx-1][4]
+            by=theList[idx-1][3]
+            px = findPerpX(bx,by,ax,ay) * dirSign # reverse order so normal stays NB
+            py = findPerpY(bx,by,ax,ay) * dirSign
+            # TODO: ADd check to see if this pm already assigned px,py
+            thePerps[theList[idx][2]] = [px,py]
+            thePerps[theList[idx-1][2]] = [px,py]
+            #print px,py
+        idx += 1
+
+    # Did first and last spots get filled?
+    if theList[0][2] in thePerps:
+        #print "good, the first item ",theList[0][2]," is present"
+        pass
+    else:
+        #print "oops, first item ",theList[0][2]," missing"
+        # I'm too lazy to calc this value, so providing zero meaning no perp vector
+        # Which means if by chance this spot has a "mate" then it won't get adjusted
+        # as it should.  TODO: fix this by using the neighbor as adjacent
+        thePerps[theList[0][2]]=[0,0]
+    if theList[idx][2] in thePerps:
+        #print "good, the last item ",theList[idx][2]," is present"
+        pass
+    else:
+        #print "oops, last item ",theList[idx][2]," is missing"
+        thePerps[theList[idx][2]]=[0,0]
+
+# ------------------------------------------------------------------------------------------
+
+highways = collections.OrderedDict()    
+loadHighways()
+
+
+# Iterate over all the highway routes
+for route in highways:
+    #print "Starting route: ",route
+    # ---------------------------------------------------------------------------------
+    # ## First, compute the perpendicular vectors for each item 
+    # Compute nearest adjacent for each item (in SAME direction)
+    # We create separate north/south lists so it's easier to locate an adjacent spot
+    northlist = list (highways[route][0].values())
+    southlist = list (highways[route][1].values())
+    northPerps = {}  # a dictionary addressed by postmile that yields perp vectors
+    southPerps = {}
+    #print "northsize is ",northSize, "southsize is ",southSize
+    calcPerpendicularVectors(northlist,northPerps, +1)
+    calcPerpendicularVectors(southlist,southPerps, -1)
+    
+    # -------------------------------------------------------------------------------
+    #print "*****"
+    #print "Perps computed for these up pm's:",sorted(northPerps)
+    #print "Perps computed for these down pm's:",sorted (southPerps)
+    
+    # Try to find matching pairs
+    # Create a match list and add matching postmiles to it.
+    north = highways[route][0]
+    south = highways[route][1]
+    matches = []
+    for item in north:
+        # if south ALSO has item add i to matches list
+        if item in south:
+            #print "match for: " + item
+            matches.append(item)
+    
+    #print "found ",len(matches)," matches."
+    #outFile = open("pairedDots.json","w") # put results here
+    #[0xFF0000,0xFF4000,0xFF8000,0xFFBF00,0xFFFF00,0x00FF00,0x00FFFF,0x0080FF,0x0000FF,0x8000FF,0xFF00FF]
+    colorcode = ["red","salmon","deeppink","coral","orangered","yellow","khaki","purple",
+    "slateblue","lime","lightgreen","cyan","blue","slategray"]
+    colorindex=0
+    for match in matches:
+        # We want to output these as json with matching color
+        id = south[match][0] + " " + south[match][1] + " " + south[match][2]
+        print ("%s,%s,%s,%s,%s,%s,%s" % (id,south[match][3],south[match][4],south[match][5].rstrip(),southPerps[south[match][2]][0],southPerps[south[match][2]][1],colorcode[colorindex]))
+        # lookup perpvector for postmile = south[match][2]
+        #perpx = southPerps[south[match][2]][0]
+        #perpy = southPerps[south[match][2]][1]
+        #print perpx, perpy
+        
+        id = north[match][0] + " " + north[match][1] + " " + north[match][2]
+        print ("%s,%s,%s,%s,%s,%s,%s" % (id,north[match][3],north[match][4],north[match][5].rstrip(),northPerps[north[match][2]][0],northPerps[north[match][2]][1],colorcode[colorindex]))
+        colorindex = (colorindex+1) % 14 # advance to next color
+        # remove them from future consideration
+        south.pop(match)
+        north.pop(match)
+        
+
+    # -----------------------------------------------------------------------
+    leftover_count = len(north)+len(south)
+    #print "Leftover count:",leftover_count
+    # After we've handled all the "matching" pairs of N/S dots
+    # There will be "leftover" single dots 
+    if (leftover_count > 0):
+        #print "Leftovers ... single dots"
+        #print len(north),"North keys", north.keys()
+        #print len(south),"South keys", south.keys()
+        
+         
+        # Assert: there are no matching keys in the two dictionaries,
+        #         they should have been removed by the previous step.
+        # Merge the two sets of keys into one list,
+        # each entry is the postmile and direction
+        mergedKeys = []
+        upLetter = ''
+        downLetter = ''
+        if len(north) > 0:
+            upLetter = north.items()[0][1][1]
+            for item in north.keys():
+                mergedKeys.append(item + upLetter)
+            #print "north keys after merging and letter assigned:",mergedKeys
+        if len(south) > 0:
+            downLetter = south.items()[0][1][1]
+            for item in south.keys():
+                mergedKeys.append(item + downLetter)
+        
+        
+        #Sort the list of keys in ascending order by postmile
+        leftovers = sorted(mergedKeys)
+        # Create a dictionary of postmiles and assigned color, and init to white
+        pm_colors=collections.OrderedDict()
+        for pm in leftovers:
+            pm_colors[pm] = "white"
+        
+        # Look for adjacent items close together in opposite directions
+        # Give them same color dots and assign perpendicular vectors
+        close_count = 0
+        prev = leftovers.pop(0)
+        prev_dir = prev[-1:]
+        prev_pm = prev[:-1]
+        for curr in leftovers:
+            curr_dir = curr[-1:]
+            curr_pm  = curr[:-1]
+            # Only consider adjacent items in OPPOSITE directions
+            if curr_dir != prev_dir:
+                curr_color = "white"
+                # See if they are close enough to be considered a pair
+                if (abs(float(curr_pm) - float(prev_pm)) <= 0.111):
+                    #print "FOUND CLOSE: ",prev, curr
+                    close_count += 1
+                    # tag the previous item with a colored dot
+                    pm_colors[curr_pm+curr_dir]="lime"
+                    pm_colors[prev_pm+prev_dir]="lime"
+               
+            prev = curr
+            prev_dir = curr_dir
+            prev_pm = curr_pm
+                
+        #print "Counted ",close_count," close pairs"
+        # print all the tagged items as csv with their tagged color
+        for spot in pm_colors:
+            curr_dir = spot[-1:]
+            curr_pm  = spot[:-1]
+            if (curr_dir == upLetter):
+                curr_info = north[curr_pm]
+                curr_perpx = northPerps[north[curr_pm][2]][0]
+                curr_perpy = northPerps[north[curr_pm][2]][1]
+            else:
+                curr_info = south[curr_pm]
+                curr_perpx = southPerps[south[curr_pm][2]][0]
+                curr_perpy = southPerps[south[curr_pm][2]][1]
+            id = curr_info[0] + " " + curr_info[1] + " " + curr_info[2]
+            # white dots have no mate so don't need to be adjusted
+            if (pm_colors[spot]=="white"):
+                px=0
+                py=0
+            else:
+                px=curr_perpx
+                py=curr_perpy
+            # output this spot 
+            print ("%s,%s,%s,%s,%s,%s,%s" % (id,curr_info[3],curr_info[4],curr_info[5].rstrip(),px,py,pm_colors[curr_pm+curr_info[1]]))
+            
+
+    
Index: trunk/src/cptms/data_layers/cmsStatusD12.json
===================================================================
--- trunk/src/cptms/data_layers/cmsStatusD12.json	(revision 318)
+++ trunk/src/cptms/data_layers/cmsStatusD12.json	(revision 318)
@@ -0,0 +1,3397 @@
+{
+	"data":
+	[
+		{
+			"cms":
+			{
+				"index": "1200022",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "VISTA HERMOSA",
+					"nearbyPlace":    "San Clemente",
+					"longitude":      "-117.630113",
+					"latitude":       "33.444697",
+					"elevation":      "206",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "4.01",
+					"alignment":      "",
+					"milepost":       "76.25"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "405 FREEWAY   16",
+						"phase1Line3": "JW AIRPORT    23"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200023",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "AEROPUERTO",
+					"nearbyPlace":    "San Juan Capistrano",
+					"longitude":      "-117.669201",
+					"latitude":       "33.481886",
+					"elevation":      "88",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "8.01",
+					"alignment":      "",
+					"milepost":       "80.27"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "405 FREEWAY   12",
+						"phase1Line3": "55 FREEWAY    21"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200024",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "EL TORO",
+					"nearbyPlace":    "Laguna Hills",
+					"longitude":      "-117.706059",
+					"latitude":       "33.613779",
+					"elevation":      "380",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "18.59",
+					"alignment":      "",
+					"milepost":       "90.83"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200025",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "S\/O REDHILL",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.807584",
+					"latitude":       "33.728551",
+					"elevation":      "95",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "28.54",
+					"alignment":      "",
+					"milepost":       "100.78"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200026",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "17TH ST.",
+					"nearbyPlace":    "Santa Ana",
+					"longitude":      "-117.860465",
+					"latitude":       "33.759171",
+					"elevation":      "180",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "32.36",
+					"alignment":      "",
+					"milepost":       "104.63"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200027",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "STATE COLLEGE",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.889301",
+					"latitude":       "33.791531",
+					"elevation":      "150",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "35.16",
+					"alignment":      "",
+					"milepost":       "107.4"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200028",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "BROOKHURST ST.",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.948993",
+					"latitude":       "33.840168",
+					"elevation":      "127",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "40.03",
+					"alignment":      "",
+					"milepost":       "112.27"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200029",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "LOS ALISOS AVE.",
+					"nearbyPlace":    "Laguna Hills",
+					"longitude":      "-117.697775",
+					"latitude":       "33.608063",
+					"elevation":      "393",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "17.96",
+					"alignment":      "",
+					"milepost":       "90.21"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200030",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "JEFFREY",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.766893",
+					"latitude":       "33.687054",
+					"elevation":      "170",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "24.78",
+					"alignment":      "",
+					"milepost":       "97.04"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200031",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "17TH ST.",
+					"nearbyPlace":    "Santa Ana",
+					"longitude":      "-117.862165",
+					"latitude":       "33.759473",
+					"elevation":      "170",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "32.44",
+					"alignment":      "",
+					"milepost":       "104.75"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200032",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "ANAHEIM BLVD",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.904051",
+					"latitude":       "33.804356",
+					"elevation":      "154",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "36.46",
+					"alignment":      "",
+					"milepost":       "108.65"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "55 FREEWAY     8",
+						"phase1Line3": "133 FREEWAY   15"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200033",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "BROADWAY AVE.",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.929983",
+					"latitude":       "33.829882",
+					"elevation":      "127",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "38.7",
+					"alignment":      "",
+					"milepost":       "110.93"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "55 FREEWAY     9",
+						"phase1Line3": "133 FREEWAY   17"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200034",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "ARTESIA ST.",
+					"nearbyPlace":    "Buena Park",
+					"longitude":      "-118.006132",
+					"latitude":       "33.870302",
+					"elevation":      "78",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "43.96",
+					"alignment":      "",
+					"milepost":       "116.23"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200035",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "HARBOR ST.",
+					"nearbyPlace":    "Garden Grove",
+					"longitude":      "-117.913378",
+					"latitude":       "33.76994",
+					"elevation":      "108",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "8.27",
+					"alignment":      "",
+					"milepost":       "9.74"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200036",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "CAMBRIDGE ST.",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.843417",
+					"latitude":       "33.776622",
+					"elevation":      "206",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "12.42",
+					"alignment":      "",
+					"milepost":       "13.98"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200037",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "DYER ROAD",
+					"nearbyPlace":    "Santa Ana",
+					"longitude":      "-117.847695",
+					"latitude":       "33.712247",
+					"elevation":      "68",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "8.21",
+					"alignment":      "",
+					"milepost":       "8.22"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200038",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "MEATS AVE",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.831691",
+					"latitude":       "33.822628",
+					"elevation":      "275",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "16.12",
+					"alignment":      "",
+					"milepost":       "16.07"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200039",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "PAULARINO",
+					"nearbyPlace":    "Costa Mesa",
+					"longitude":      "-117.875754",
+					"latitude":       "33.683906",
+					"elevation":      "45",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "5.68",
+					"alignment":      "",
+					"milepost":       "5.68"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200040",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WARNER AVE",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.843494",
+					"latitude":       "33.717264",
+					"elevation":      "85",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "8.64",
+					"alignment":      "",
+					"milepost":       "8.64"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": " I-405 TO CLOSE ",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200041",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "SANTA CLARA AVE.",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.831216",
+					"latitude":       "33.767232",
+					"elevation":      "203",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "12.3",
+					"alignment":      "",
+					"milepost":       "12.27"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200042",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "KATELLA",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.832172",
+					"latitude":       "33.808725",
+					"elevation":      "269",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "15.16",
+					"alignment":      "",
+					"milepost":       "15.12"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200043",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "CHAPMAN AVE",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.879574",
+					"latitude":       "33.786456",
+					"elevation":      "154",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "11.18",
+					"alignment":      "",
+					"milepost":       "0.46"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "HONDA CENTER",
+						"phase1Line2": "EXIT",
+						"phase1Line3": "KATELLA AVE"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200044",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WAGNER AVE.",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.875932",
+					"latitude":       "33.825274",
+					"elevation":      "200",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "13.91",
+					"alignment":      "",
+					"milepost":       "3.18"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200045",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WAGNER AVE.",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.876328",
+					"latitude":       "33.825497",
+					"elevation":      "196",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "13.92",
+					"alignment":      "",
+					"milepost":       "3.19"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "HONDA CENTER",
+						"phase1Line2": "EXIT",
+						"phase1Line3": "BALL ROAD"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200046",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "YORBA LINDA BLVD",
+					"nearbyPlace":    "Fullerton",
+					"longitude":      "-117.880875",
+					"latitude":       "33.889973",
+					"elevation":      "285",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "18.41",
+					"alignment":      "",
+					"milepost":       "7.67"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200047",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "HOLDER",
+					"nearbyPlace":    "Buena Park",
+					"longitude":      "-118.018053",
+					"latitude":       "33.855681",
+					"elevation":      "78",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "1.46",
+					"alignment":      "",
+					"milepost":       "16.18"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "55 FREEWAY    14",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200048",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "ACACIA",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.900723",
+					"latitude":       "33.853692",
+					"elevation":      "180",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "4.6",
+					"alignment":      "",
+					"milepost":       "22.98"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200049",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "EUCLID",
+					"nearbyPlace":    "Fullerton",
+					"longitude":      "-117.944242",
+					"latitude":       "33.854316",
+					"elevation":      "141",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "2.09",
+					"alignment":      "",
+					"milepost":       "20.46"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200050",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "LAKEVIEW",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.813397",
+					"latitude":       "33.852168",
+					"elevation":      "282",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "10.19",
+					"alignment":      "",
+					"milepost":       "28.56"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "ORANGETHORPE  14",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200051",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WIER CANYON",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.689271",
+					"latitude":       "33.873408",
+					"elevation":      "465",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "17.82",
+					"alignment":      "L",
+					"milepost":       "36.19"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Not Reported",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "Not Reported",
+						"phase1Line2": "Not Reported",
+						"phase1Line3": "Not Reported"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "Not Reported",
+						"phase2Line2": "Not Reported",
+						"phase2Line3": "Not Reported"
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200052",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "HARVARD",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.831322",
+					"latitude":       "33.672632",
+					"elevation":      "62",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "6.15",
+					"alignment":      "",
+					"milepost":       "5.93"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200053",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "MAGNOLIA ST",
+					"nearbyPlace":    "Fountain Valley",
+					"longitude":      "-117.971297",
+					"latitude":       "33.719788",
+					"elevation":      "42",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "15.18",
+					"alignment":      "",
+					"milepost":       "14.93"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200055",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "JEFFREY",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.796762",
+					"latitude":       "33.663333",
+					"elevation":      "121",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "4.06",
+					"alignment":      "",
+					"milepost":       "3.81"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200056",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "NEW HAMPSHIRE",
+					"nearbyPlace":    "Costa Mesa",
+					"longitude":      "-117.928345",
+					"latitude":       "33.692524",
+					"elevation":      "39",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "12.04",
+					"alignment":      "",
+					"milepost":       "11.79"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200057",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "SEAL BEACH",
+					"nearbyPlace":    "Seal Beach",
+					"longitude":      "-118.060253",
+					"latitude":       "33.774024",
+					"elevation":      "29",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "21.8",
+					"alignment":      "",
+					"milepost":       "21.55"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200058",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WARDLOW",
+					"nearbyPlace":    "Long Beach",
+					"longitude":      "-118.081678",
+					"latitude":       "33.817992",
+					"elevation":      "42",
+					"direction":      "South",
+					"county":         "Los Angeles",
+					"route":          "I-605",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "0.81",
+					"alignment":      "",
+					"milepost":       "2.86"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": " I-405 TO CLOSE ",
+						"phase1Line2": "  AT FAIRVIEW   ",
+						"phase1Line3": " SAT  11PM-9AM  "
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1208488",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "YORBA LINDA",
+					"nearbyPlace":    "Fullerton",
+					"longitude":      "-117.880268",
+					"latitude":       "33.887518",
+					"elevation":      "278",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "18.24",
+					"alignment":      "",
+					"milepost":       "7.5"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1211184",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "IRVINE CENTER DRIVE",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.745482",
+					"latitude":       "33.647931",
+					"elevation":      "236",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "0.87",
+					"alignment":      "",
+					"milepost":       "0.62"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1211185",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "VON KARMAN",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.851222",
+					"latitude":       "33.679969",
+					"elevation":      "62",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "7.41",
+					"alignment":      "",
+					"milepost":       "7.19"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1211967",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "MAGNOLIA AT 22",
+					"nearbyPlace":    "Garden Grove",
+					"longitude":      "-117.969424",
+					"latitude":       "33.766029",
+					"elevation":      "68",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "5",
+					"alignment":      "",
+					"milepost":       "6.43"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1211978",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "17th ST",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.830808",
+					"latitude":       "33.758616",
+					"elevation":      "160",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "11.71",
+					"alignment":      "",
+					"milepost":       "11.69"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1212138",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Ortega Hwy",
+					"nearbyPlace":    "San Juan Capistrano",
+					"longitude":      "-117.661704",
+					"latitude":       "33.510279",
+					"elevation":      "216",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "10.17",
+					"alignment":      "",
+					"milepost":       "82.43"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1212822",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Kraemer",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.859224",
+					"latitude":       "33.846746",
+					"elevation":      "226",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "7.12",
+					"alignment":      "",
+					"milepost":       "25.5"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1212823",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "E of Imperial",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.767451",
+					"latitude":       "33.864767",
+					"elevation":      "314",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "13.05",
+					"alignment":      "",
+					"milepost":       "31.4"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214503",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Vista Hermosa",
+					"nearbyPlace":    "San Clemente",
+					"longitude":      "-117.639346",
+					"latitude":       "33.449613",
+					"elevation":      "190",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "4.64",
+					"alignment":      "",
+					"milepost":       "76.88"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214504",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Avery Pkwy",
+					"nearbyPlace":    "Mission Viejo",
+					"longitude":      "-117.672768",
+					"latitude":       "33.546096",
+					"elevation":      "252",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "12.86",
+					"alignment":      "",
+					"milepost":       "85.12"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214505",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Crown Valley Pkwy",
+					"nearbyPlace":    "Mission Viejo",
+					"longitude":      "-117.67218",
+					"latitude":       "33.570674",
+					"elevation":      "288",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "14.57",
+					"alignment":      "",
+					"milepost":       "86.82"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214506",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "405 fwy",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.733182",
+					"latitude":       "33.642772",
+					"elevation":      "252",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "21.14",
+					"alignment":      "",
+					"milepost":       "93.4"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214507",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Yale OC",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.775036",
+					"latitude":       "33.700544",
+					"elevation":      "150",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "25.82",
+					"alignment":      "",
+					"milepost":       "98.06"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214508",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Tustin Ranch OC",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.805112",
+					"latitude":       "33.725985",
+					"elevation":      "91",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "28.32",
+					"alignment":      "",
+					"milepost":       "100.57"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214509",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Santa Isabella",
+					"nearbyPlace":    "Costa Mesa",
+					"longitude":      "-117.903163",
+					"latitude":       "33.657101",
+					"elevation":      "72",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "3.25",
+					"alignment":      "",
+					"milepost":       "3.25"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214510",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Baker Street",
+					"nearbyPlace":    "Costa Mesa",
+					"longitude":      "-117.878706",
+					"latitude":       "33.680209",
+					"elevation":      "55",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "5.38",
+					"alignment":      "",
+					"milepost":       "5.38"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214511",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Orangewood Ave",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.877915",
+					"latitude":       "33.796586",
+					"elevation":      "154",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "11.86",
+					"alignment":      "",
+					"milepost":       "1.14"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214512",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Placentia OH",
+					"nearbyPlace":    "Placentia",
+					"longitude":      "-117.879528",
+					"latitude":       "33.86806",
+					"elevation":      "223",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "16.88",
+					"alignment":      "",
+					"milepost":       "6.16"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214513",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Lambert Rd",
+					"nearbyPlace":    "Brea",
+					"longitude":      "-117.878697",
+					"latitude":       "33.935067",
+					"elevation":      "570",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "21.52",
+					"alignment":      "",
+					"milepost":       "10.79"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214514",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Edwards",
+					"nearbyPlace":    "Westminster",
+					"longitude":      "-118.01674",
+					"latitude":       "33.754335",
+					"elevation":      "39",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "18.72",
+					"alignment":      "",
+					"milepost":       "18.48"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214956",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Cambridge Street",
+					"nearbyPlace":    "Santa Ana",
+					"longitude":      "-117.845635",
+					"latitude":       "33.775533",
+					"elevation":      "190",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "12.28",
+					"alignment":      "",
+					"milepost":       "13.85"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1217542",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Test CMS",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.76848",
+					"latitude":       "33.69002",
+					"elevation":      "150",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "25",
+					"alignment":      "",
+					"milepost":       ""
+				},
+				"inService": "false",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218442",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Antonio",
+					"nearbyPlace":    "San Juan Capistrano",
+					"longitude":      "-117.624421",
+					"latitude":       "33.519067",
+					"elevation":      "170",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-74",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "2.31",
+					"alignment":      "",
+					"milepost":       "2.31"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218482",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "County Line",
+					"nearbyPlace":    "San Clemente",
+					"longitude":      "-117.59611",
+					"latitude":       "33.401633",
+					"elevation":      "127",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "0.38",
+					"alignment":      "",
+					"milepost":       "72.64"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218483",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Springdale",
+					"nearbyPlace":    "Westminster",
+					"longitude":      "-118.023301",
+					"latitude":       "33.774078",
+					"elevation":      "49",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "1.77",
+					"alignment":      "",
+					"milepost":       "3.23"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218484",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Laguna_Hills",
+					"nearbyPlace":    "Aliso Viejo",
+					"longitude":      "-117.725774",
+					"latitude":       "33.584286",
+					"elevation":      "452",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-73",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "14.77",
+					"alignment":      "",
+					"milepost":       "4.77"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218485",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "North of Jamboree",
+					"nearbyPlace":    "Newport Beach",
+					"longitude":      "-117.866717",
+					"latitude":       "33.657071",
+					"elevation":      "59",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-73",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "24.91",
+					"alignment":      "",
+					"milepost":       "14.91"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218486",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "South of Wildlife",
+					"nearbyPlace":    "Newport Coast",
+					"longitude":      "-117.818984",
+					"latitude":       "33.61494",
+					"elevation":      "718",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-73",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "20.75",
+					"alignment":      "",
+					"milepost":       "10.75"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		}
+	]
+}
Index: trunk/src/cptms/data_layers/convertCSVtoJSON.bash
===================================================================
--- trunk/src/cptms/data_layers/convertCSVtoJSON.bash	(revision 318)
+++ trunk/src/cptms/data_layers/convertCSVtoJSON.bash	(revision 318)
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Convert csv to json using awk pgm
+# Get input filename from command line
+if [ "$#" -ne 1 ] 
+then
+  echo "argument required: provide input csv filename of prepped postmile file"
+  exit 1
+fi 
+
+echo "{"
+echo " \"type\": \"FeatureCollection\","
+echo " \"features\": ["
+awk -F',' -f csvToJson.awk $1
+echo " ]"
+echo "}"
+# NB: You need to manually remove the comma after the last feature.
Index: trunk/src/cptms/data_layers/csvToJson.awk
===================================================================
--- trunk/src/cptms/data_layers/csvToJson.awk	(revision 318)
+++ trunk/src/cptms/data_layers/csvToJson.awk	(revision 318)
@@ -0,0 +1,13 @@
+# Convert a csv with postmile and coordinates to a json file
+# Note it switches lat/long to long/lat
+# Sample invocation:  awk -F',' -f awkpgm1 filename
+//{printf "  {\n  \"type\": \"Feature\",\n  \"id\": \"%s\",\n    \"geometry\":\n      {\n      \"type\": \"Point\",\n      \"coordinates\": [%s,%s]\n      },\n      \"properties\": {\"street\":\"%s\", \"color\":\"%s\", \"perpx\":\"%s\", \"perpy\":\"%s\"}\n  },\n", $1, $3,$2,$4,$7,$5,$6 }
+#
+# When finished prepend:
+#{
+#  "type": "FeatureCollection",
+#  "features": [
+# 
+# and Append:
+#  ] }
+
Index: trunk/src/cptms/data_layers/prep_cctv.py
===================================================================
--- trunk/src/cptms/data_layers/prep_cctv.py	(revision 318)
+++ trunk/src/cptms/data_layers/prep_cctv.py	(revision 318)
@@ -0,0 +1,79 @@
+import collections,math,sys
+# Scan the cctv file to find the nearest vds
+# This is a one-time job to create the static file of cctv locations and nearest vds
+# The output of this program needs to be manually modified before input to cptms_map.html
+# 1. The vds column is appended to cctvFile (yes, adding a new column to the original input).
+# 2. Convert this csv file to json (using cctvToJson.awk)
+# 3. Remove tabs from json.  Trim any blanks from nearVDS field. 
+# jdalbey Mar 2019
+vdsFile = "vds_fromhighwaysmap.csv"
+cctvFile = "cctv_locations_D12.csv"
+orientationLookup = {'N':0,'S':1,'E':0,'W':1}
+
+def loadHighways():
+
+    f = open(vdsFile,'r')
+    lines = [line.split(',') for line in f.readlines()]
+    # 5,N,0.65,4 S. LUIS REY
+    # Create a set containing just the route numbers 
+    routeNums = set()
+    for item in lines:
+        routeNums.add(int(item[0]))
+    # put the route numbers in order
+    sortedRoutes = sorted (routeNums)    
+    # Create the empty postmile collections
+    for route in sortedRoutes:
+        #print route,
+        highways[str(route)]=[collections.OrderedDict(),collections.OrderedDict()]
+    #print
+    # Process all the data, placing it in proper route and collection
+    for item in lines:
+        route = item[0]
+        orientation = orientationLookup[item[1]]
+        postmileItem = item[2]
+        highways[route][orientation][postmileItem]=item
+
+
+def dumpHighways():
+    # Dump the highways data we've organized
+    for item in highways:
+        for cnt in [0,1]:
+            list1 = highways[item][cnt]
+            print "highway",item,list1
+            # show fields for one entry
+            for pm_entry in list1:
+                print pm_entry,list1[pm_entry]
+
+def findNearest():
+
+    f = open(cctvFile,'r')
+    #5,S,42.11,-117.978854,33.856288,SB 5 N/O MAGNOLIA AVE (S/O 91),12-005-CCTV-0001
+    lines = [line.split(',') for line in f.readlines()]
+
+    # Find he nearest VDS to each cctv
+    for item in lines:
+        route = item[0]
+        orientation = orientationLookup[item[1]]
+        postmileItem = item[2]
+        segment = highways[route][orientation] 
+
+        # Now we know which highway segment the cctv is on, look at all those VDS to find nearest
+        print route,item[1],postmileItem+",",
+        min = 9999
+        nearVDS = 0
+        for vds in segment:
+            diff = abs(float(vds) - float(postmileItem))
+            #print vds + "("+str(diff)+")",
+            if (diff < min):
+                min = diff
+                nearVDS = vds
+        print route,item[1],nearVDS
+
+# ------------------------------------------------------------------------------------------
+
+highways = collections.OrderedDict()    
+loadHighways()
+dumpHighways()
+print "CCTV\tnearestVDS"
+findNearest()
+
Index: trunk/src/cptms/data_layers/showDupPostmiles.py
===================================================================
--- trunk/src/cptms/data_layers/showDupPostmiles.py	(revision 318)
+++ trunk/src/cptms/data_layers/showDupPostmiles.py	(revision 318)
@@ -0,0 +1,67 @@
+import fileinput
+# Some postmiles files have duplicate entries,
+# same postmile but slightly different street names.
+# This program presents the duplicates to the user to 
+# select which one to keep and discards the others.
+# Only works when duplicates are in successive rows of the file, which is
+# how it should be if it's sorted by postmile.  But sometimes
+# there's weird data where two SLIGHTLY different postmiles have
+# the same latlong, and you'll have to deal with these by hand.
+
+# Read from file name provided on command line
+# Expected input format: route, direction, lat, long, name
+# Assumes commas are separators and don't appear in name.
+prevName = ""
+prevCoords = ""
+prevstreet = ""
+prevFields = ["","","","","",""]
+matching = False
+streets = []
+outputFile = "uniqFile"
+outFile = open(outputFile,"w") # put results here
+# Examine each input line
+for line in fileinput.input():
+    lineIn = line.rstrip()   #to trim whitespace and newline
+    fields = lineIn.split(",")
+    current = fields[3]+","+fields[4]  # match the latLong pair
+    # Does this item match the previous one?
+    if (current == prevCoords): 
+        if not matching:
+            # indicate we are in matching mode (for 1 or more items)
+            matching = True
+            print fields[0] + "\t" + prevstreet
+        print "\t\t" + fields[5]
+        streets.append(fields[5])
+    else:
+        if matching: # if we were matching, turn it off
+            matching = False
+            # Ask user to select one of the matching items
+            choice = raw_input("choose one of "+str(len(streets)) + ": ")
+            if (len(choice)==0):
+                choice = "1"
+            print "         OK, you selected: ",streets[int(choice)-1]
+            print 
+            print "-----------"
+#            outFile.write(prevName + "," +prevCoords + "," + streets[int(choice)-1])
+            outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + streets[int(choice)-1])
+            outFile.write("\n")
+        else:
+            # output the previous unmatched item (unless were at the first line)
+            if prevFields[0] != "":
+#            outFile.write(prevName + "," + prevCoords + "," + prevstreet + "\n")
+                outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + prevFields[5])
+                outFile.write("\n")
+        # reset the saved street names
+        streets = []
+        streets.append(fields[5])
+    # save current for next iteration
+    prevName = fields[0]
+    prevCoords = current
+    prevstreet = fields[5]
+    prevFields = fields
+# output last entry
+outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + prevFields[5])
+outFile.write("\n")
+outFile.close()
+
+print "All Done, output in ", outputFile
Index: trunk/src/cptms/cmsStatusD12.json
===================================================================
--- trunk/src/cptms/cmsStatusD12.json	(revision 297)
+++ 	(revision )
@@ -1,3397 +1,0 @@
-{
-	"data":
-	[
-		{
-			"cms":
-			{
-				"index": "1200022",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "VISTA HERMOSA",
-					"nearbyPlace":    "San Clemente",
-					"longitude":      "-117.630113",
-					"latitude":       "33.444697",
-					"elevation":      "206",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "4.01",
-					"alignment":      "",
-					"milepost":       "76.25"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "  MINUTES TO:   ",
-						"phase1Line2": "405 FREEWAY   16",
-						"phase1Line3": "JW AIRPORT    23"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200023",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "AEROPUERTO",
-					"nearbyPlace":    "San Juan Capistrano",
-					"longitude":      "-117.669201",
-					"latitude":       "33.481886",
-					"elevation":      "88",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "8.01",
-					"alignment":      "",
-					"milepost":       "80.27"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "  MINUTES TO:   ",
-						"phase1Line2": "405 FREEWAY   12",
-						"phase1Line3": "55 FREEWAY    21"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200024",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "EL TORO",
-					"nearbyPlace":    "Laguna Hills",
-					"longitude":      "-117.706059",
-					"latitude":       "33.613779",
-					"elevation":      "380",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "18.59",
-					"alignment":      "",
-					"milepost":       "90.83"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200025",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "S\/O REDHILL",
-					"nearbyPlace":    "Tustin",
-					"longitude":      "-117.807584",
-					"latitude":       "33.728551",
-					"elevation":      "95",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "28.54",
-					"alignment":      "",
-					"milepost":       "100.78"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200026",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "17TH ST.",
-					"nearbyPlace":    "Santa Ana",
-					"longitude":      "-117.860465",
-					"latitude":       "33.759171",
-					"elevation":      "180",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "32.36",
-					"alignment":      "",
-					"milepost":       "104.63"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200027",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "STATE COLLEGE",
-					"nearbyPlace":    "Orange",
-					"longitude":      "-117.889301",
-					"latitude":       "33.791531",
-					"elevation":      "150",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "35.16",
-					"alignment":      "",
-					"milepost":       "107.4"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200028",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "BROOKHURST ST.",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.948993",
-					"latitude":       "33.840168",
-					"elevation":      "127",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "40.03",
-					"alignment":      "",
-					"milepost":       "112.27"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200029",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "LOS ALISOS AVE.",
-					"nearbyPlace":    "Laguna Hills",
-					"longitude":      "-117.697775",
-					"latitude":       "33.608063",
-					"elevation":      "393",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "17.96",
-					"alignment":      "",
-					"milepost":       "90.21"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200030",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "JEFFREY",
-					"nearbyPlace":    "Irvine",
-					"longitude":      "-117.766893",
-					"latitude":       "33.687054",
-					"elevation":      "170",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "24.78",
-					"alignment":      "",
-					"milepost":       "97.04"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200031",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "17TH ST.",
-					"nearbyPlace":    "Santa Ana",
-					"longitude":      "-117.862165",
-					"latitude":       "33.759473",
-					"elevation":      "170",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "32.44",
-					"alignment":      "",
-					"milepost":       "104.75"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200032",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "ANAHEIM BLVD",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.904051",
-					"latitude":       "33.804356",
-					"elevation":      "154",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "36.46",
-					"alignment":      "",
-					"milepost":       "108.65"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "  MINUTES TO:   ",
-						"phase1Line2": "55 FREEWAY     8",
-						"phase1Line3": "133 FREEWAY   15"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200033",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "BROADWAY AVE.",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.929983",
-					"latitude":       "33.829882",
-					"elevation":      "127",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "38.7",
-					"alignment":      "",
-					"milepost":       "110.93"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "  MINUTES TO:   ",
-						"phase1Line2": "55 FREEWAY     9",
-						"phase1Line3": "133 FREEWAY   17"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200034",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "ARTESIA ST.",
-					"nearbyPlace":    "Buena Park",
-					"longitude":      "-118.006132",
-					"latitude":       "33.870302",
-					"elevation":      "78",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "43.96",
-					"alignment":      "",
-					"milepost":       "116.23"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200035",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "HARBOR ST.",
-					"nearbyPlace":    "Garden Grove",
-					"longitude":      "-117.913378",
-					"latitude":       "33.76994",
-					"elevation":      "108",
-					"direction":      "East",
-					"county":         "Orange",
-					"route":          "SR-22",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "8.27",
-					"alignment":      "",
-					"milepost":       "9.74"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200036",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "CAMBRIDGE ST.",
-					"nearbyPlace":    "Orange",
-					"longitude":      "-117.843417",
-					"latitude":       "33.776622",
-					"elevation":      "206",
-					"direction":      "West",
-					"county":         "Orange",
-					"route":          "SR-22",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "12.42",
-					"alignment":      "",
-					"milepost":       "13.98"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200037",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "DYER ROAD",
-					"nearbyPlace":    "Santa Ana",
-					"longitude":      "-117.847695",
-					"latitude":       "33.712247",
-					"elevation":      "68",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "8.21",
-					"alignment":      "",
-					"milepost":       "8.22"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200038",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "MEATS AVE",
-					"nearbyPlace":    "Orange",
-					"longitude":      "-117.831691",
-					"latitude":       "33.822628",
-					"elevation":      "275",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "16.12",
-					"alignment":      "",
-					"milepost":       "16.07"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200039",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "PAULARINO",
-					"nearbyPlace":    "Costa Mesa",
-					"longitude":      "-117.875754",
-					"latitude":       "33.683906",
-					"elevation":      "45",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "5.68",
-					"alignment":      "",
-					"milepost":       "5.68"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200040",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "WARNER AVE",
-					"nearbyPlace":    "Tustin",
-					"longitude":      "-117.843494",
-					"latitude":       "33.717264",
-					"elevation":      "85",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "8.64",
-					"alignment":      "",
-					"milepost":       "8.64"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": " I-405 TO CLOSE ",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200041",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "SANTA CLARA AVE.",
-					"nearbyPlace":    "Tustin",
-					"longitude":      "-117.831216",
-					"latitude":       "33.767232",
-					"elevation":      "203",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "12.3",
-					"alignment":      "",
-					"milepost":       "12.27"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200042",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "KATELLA",
-					"nearbyPlace":    "Orange",
-					"longitude":      "-117.832172",
-					"latitude":       "33.808725",
-					"elevation":      "269",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "15.16",
-					"alignment":      "",
-					"milepost":       "15.12"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200043",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "CHAPMAN AVE",
-					"nearbyPlace":    "Orange",
-					"longitude":      "-117.879574",
-					"latitude":       "33.786456",
-					"elevation":      "154",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-57",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "11.18",
-					"alignment":      "",
-					"milepost":       "0.46"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "HONDA CENTER",
-						"phase1Line2": "EXIT",
-						"phase1Line3": "KATELLA AVE"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200044",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "WAGNER AVE.",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.875932",
-					"latitude":       "33.825274",
-					"elevation":      "200",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-57",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "13.91",
-					"alignment":      "",
-					"milepost":       "3.18"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200045",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "WAGNER AVE.",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.876328",
-					"latitude":       "33.825497",
-					"elevation":      "196",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-57",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "13.92",
-					"alignment":      "",
-					"milepost":       "3.19"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "HONDA CENTER",
-						"phase1Line2": "EXIT",
-						"phase1Line3": "BALL ROAD"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200046",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "YORBA LINDA BLVD",
-					"nearbyPlace":    "Fullerton",
-					"longitude":      "-117.880875",
-					"latitude":       "33.889973",
-					"elevation":      "285",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-57",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "18.41",
-					"alignment":      "",
-					"milepost":       "7.67"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200047",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "HOLDER",
-					"nearbyPlace":    "Buena Park",
-					"longitude":      "-118.018053",
-					"latitude":       "33.855681",
-					"elevation":      "78",
-					"direction":      "East",
-					"county":         "Orange",
-					"route":          "SR-91",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "1.46",
-					"alignment":      "",
-					"milepost":       "16.18"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "  MINUTES TO:   ",
-						"phase1Line2": "55 FREEWAY    14",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200048",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "ACACIA",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.900723",
-					"latitude":       "33.853692",
-					"elevation":      "180",
-					"direction":      "East",
-					"county":         "Orange",
-					"route":          "SR-91",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "4.6",
-					"alignment":      "",
-					"milepost":       "22.98"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200049",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "EUCLID",
-					"nearbyPlace":    "Fullerton",
-					"longitude":      "-117.944242",
-					"latitude":       "33.854316",
-					"elevation":      "141",
-					"direction":      "West",
-					"county":         "Orange",
-					"route":          "SR-91",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "2.09",
-					"alignment":      "",
-					"milepost":       "20.46"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200050",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "LAKEVIEW",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.813397",
-					"latitude":       "33.852168",
-					"elevation":      "282",
-					"direction":      "West",
-					"county":         "Orange",
-					"route":          "SR-91",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "10.19",
-					"alignment":      "",
-					"milepost":       "28.56"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "  MINUTES TO:   ",
-						"phase1Line2": "ORANGETHORPE  14",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200051",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "WIER CANYON",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.689271",
-					"latitude":       "33.873408",
-					"elevation":      "465",
-					"direction":      "West",
-					"county":         "Orange",
-					"route":          "SR-91",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "17.82",
-					"alignment":      "L",
-					"milepost":       "36.19"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Not Reported",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "Not Reported",
-						"phase1Line2": "Not Reported",
-						"phase1Line3": "Not Reported"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "Not Reported",
-						"phase2Line2": "Not Reported",
-						"phase2Line3": "Not Reported"
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200052",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "HARVARD",
-					"nearbyPlace":    "Irvine",
-					"longitude":      "-117.831322",
-					"latitude":       "33.672632",
-					"elevation":      "62",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-405",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "6.15",
-					"alignment":      "",
-					"milepost":       "5.93"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200053",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "MAGNOLIA ST",
-					"nearbyPlace":    "Fountain Valley",
-					"longitude":      "-117.971297",
-					"latitude":       "33.719788",
-					"elevation":      "42",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-405",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "15.18",
-					"alignment":      "",
-					"milepost":       "14.93"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200055",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "JEFFREY",
-					"nearbyPlace":    "Irvine",
-					"longitude":      "-117.796762",
-					"latitude":       "33.663333",
-					"elevation":      "121",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-405",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "4.06",
-					"alignment":      "",
-					"milepost":       "3.81"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200056",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "NEW HAMPSHIRE",
-					"nearbyPlace":    "Costa Mesa",
-					"longitude":      "-117.928345",
-					"latitude":       "33.692524",
-					"elevation":      "39",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-405",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "12.04",
-					"alignment":      "",
-					"milepost":       "11.79"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200057",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "SEAL BEACH",
-					"nearbyPlace":    "Seal Beach",
-					"longitude":      "-118.060253",
-					"latitude":       "33.774024",
-					"elevation":      "29",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-405",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "21.8",
-					"alignment":      "",
-					"milepost":       "21.55"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1200058",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "WARDLOW",
-					"nearbyPlace":    "Long Beach",
-					"longitude":      "-118.081678",
-					"latitude":       "33.817992",
-					"elevation":      "42",
-					"direction":      "South",
-					"county":         "Los Angeles",
-					"route":          "I-605",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "0.81",
-					"alignment":      "",
-					"milepost":       "2.86"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": " I-405 TO CLOSE ",
-						"phase1Line2": "  AT FAIRVIEW   ",
-						"phase1Line3": " SAT  11PM-9AM  "
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1208488",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "YORBA LINDA",
-					"nearbyPlace":    "Fullerton",
-					"longitude":      "-117.880268",
-					"latitude":       "33.887518",
-					"elevation":      "278",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-57",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "18.24",
-					"alignment":      "",
-					"milepost":       "7.5"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1211184",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "IRVINE CENTER DRIVE",
-					"nearbyPlace":    "Irvine",
-					"longitude":      "-117.745482",
-					"latitude":       "33.647931",
-					"elevation":      "236",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-405",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "0.87",
-					"alignment":      "",
-					"milepost":       "0.62"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1211185",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "VON KARMAN",
-					"nearbyPlace":    "Irvine",
-					"longitude":      "-117.851222",
-					"latitude":       "33.679969",
-					"elevation":      "62",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-405",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "7.41",
-					"alignment":      "",
-					"milepost":       "7.19"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1211967",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "MAGNOLIA AT 22",
-					"nearbyPlace":    "Garden Grove",
-					"longitude":      "-117.969424",
-					"latitude":       "33.766029",
-					"elevation":      "68",
-					"direction":      "West",
-					"county":         "Orange",
-					"route":          "SR-22",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "5",
-					"alignment":      "",
-					"milepost":       "6.43"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1211978",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "17th ST",
-					"nearbyPlace":    "Tustin",
-					"longitude":      "-117.830808",
-					"latitude":       "33.758616",
-					"elevation":      "160",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "11.71",
-					"alignment":      "",
-					"milepost":       "11.69"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1212138",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Ortega Hwy",
-					"nearbyPlace":    "San Juan Capistrano",
-					"longitude":      "-117.661704",
-					"latitude":       "33.510279",
-					"elevation":      "216",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "10.17",
-					"alignment":      "",
-					"milepost":       "82.43"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1212822",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Kraemer",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.859224",
-					"latitude":       "33.846746",
-					"elevation":      "226",
-					"direction":      "East",
-					"county":         "Orange",
-					"route":          "SR-91",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "7.12",
-					"alignment":      "",
-					"milepost":       "25.5"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1212823",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "E of Imperial",
-					"nearbyPlace":    "Anaheim",
-					"longitude":      "-117.767451",
-					"latitude":       "33.864767",
-					"elevation":      "314",
-					"direction":      "East",
-					"county":         "Orange",
-					"route":          "SR-91",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "13.05",
-					"alignment":      "",
-					"milepost":       "31.4"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214503",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Vista Hermosa",
-					"nearbyPlace":    "San Clemente",
-					"longitude":      "-117.639346",
-					"latitude":       "33.449613",
-					"elevation":      "190",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "4.64",
-					"alignment":      "",
-					"milepost":       "76.88"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214504",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Avery Pkwy",
-					"nearbyPlace":    "Mission Viejo",
-					"longitude":      "-117.672768",
-					"latitude":       "33.546096",
-					"elevation":      "252",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "12.86",
-					"alignment":      "",
-					"milepost":       "85.12"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214505",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Crown Valley Pkwy",
-					"nearbyPlace":    "Mission Viejo",
-					"longitude":      "-117.67218",
-					"latitude":       "33.570674",
-					"elevation":      "288",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "14.57",
-					"alignment":      "",
-					"milepost":       "86.82"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214506",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "405 fwy",
-					"nearbyPlace":    "Irvine",
-					"longitude":      "-117.733182",
-					"latitude":       "33.642772",
-					"elevation":      "252",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "21.14",
-					"alignment":      "",
-					"milepost":       "93.4"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214507",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Yale OC",
-					"nearbyPlace":    "Irvine",
-					"longitude":      "-117.775036",
-					"latitude":       "33.700544",
-					"elevation":      "150",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "25.82",
-					"alignment":      "",
-					"milepost":       "98.06"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214508",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Tustin Ranch OC",
-					"nearbyPlace":    "Tustin",
-					"longitude":      "-117.805112",
-					"latitude":       "33.725985",
-					"elevation":      "91",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "28.32",
-					"alignment":      "",
-					"milepost":       "100.57"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214509",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Santa Isabella",
-					"nearbyPlace":    "Costa Mesa",
-					"longitude":      "-117.903163",
-					"latitude":       "33.657101",
-					"elevation":      "72",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "3.25",
-					"alignment":      "",
-					"milepost":       "3.25"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214510",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Baker Street",
-					"nearbyPlace":    "Costa Mesa",
-					"longitude":      "-117.878706",
-					"latitude":       "33.680209",
-					"elevation":      "55",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-55",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "5.38",
-					"alignment":      "",
-					"milepost":       "5.38"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214511",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Orangewood Ave",
-					"nearbyPlace":    "Orange",
-					"longitude":      "-117.877915",
-					"latitude":       "33.796586",
-					"elevation":      "154",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-57",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "11.86",
-					"alignment":      "",
-					"milepost":       "1.14"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214512",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Placentia OH",
-					"nearbyPlace":    "Placentia",
-					"longitude":      "-117.879528",
-					"latitude":       "33.86806",
-					"elevation":      "223",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-57",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "16.88",
-					"alignment":      "",
-					"milepost":       "6.16"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214513",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Lambert Rd",
-					"nearbyPlace":    "Brea",
-					"longitude":      "-117.878697",
-					"latitude":       "33.935067",
-					"elevation":      "570",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-57",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "21.52",
-					"alignment":      "",
-					"milepost":       "10.79"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214514",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Edwards",
-					"nearbyPlace":    "Westminster",
-					"longitude":      "-118.01674",
-					"latitude":       "33.754335",
-					"elevation":      "39",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-405",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "18.72",
-					"alignment":      "",
-					"milepost":       "18.48"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1214956",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Cambridge Street",
-					"nearbyPlace":    "Santa Ana",
-					"longitude":      "-117.845635",
-					"latitude":       "33.775533",
-					"elevation":      "190",
-					"direction":      "East",
-					"county":         "Orange",
-					"route":          "SR-22",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "12.28",
-					"alignment":      "",
-					"milepost":       "13.85"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1217542",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Test CMS",
-					"nearbyPlace":    "Orange",
-					"longitude":      "-117.76848",
-					"latitude":       "33.69002",
-					"elevation":      "150",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "25",
-					"alignment":      "",
-					"milepost":       ""
-				},
-				"inService": "false",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1218442",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Antonio",
-					"nearbyPlace":    "San Juan Capistrano",
-					"longitude":      "-117.624421",
-					"latitude":       "33.519067",
-					"elevation":      "170",
-					"direction":      "East",
-					"county":         "Orange",
-					"route":          "SR-74",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "2.31",
-					"alignment":      "",
-					"milepost":       "2.31"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1218482",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "County Line",
-					"nearbyPlace":    "San Clemente",
-					"longitude":      "-117.59611",
-					"latitude":       "33.401633",
-					"elevation":      "127",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "I-5",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "0.38",
-					"alignment":      "",
-					"milepost":       "72.64"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1218483",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Springdale",
-					"nearbyPlace":    "Westminster",
-					"longitude":      "-118.023301",
-					"latitude":       "33.774078",
-					"elevation":      "49",
-					"direction":      "East",
-					"county":         "Orange",
-					"route":          "SR-22",
-					"routeSuffix":    "",
-					"postmilePrefix": "R",
-					"postmile":       "1.77",
-					"alignment":      "",
-					"milepost":       "3.23"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1218484",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "Laguna_Hills",
-					"nearbyPlace":    "Aliso Viejo",
-					"longitude":      "-117.725774",
-					"latitude":       "33.584286",
-					"elevation":      "452",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-73",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "14.77",
-					"alignment":      "",
-					"milepost":       "4.77"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1218485",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "North of Jamboree",
-					"nearbyPlace":    "Newport Beach",
-					"longitude":      "-117.866717",
-					"latitude":       "33.657071",
-					"elevation":      "59",
-					"direction":      "North",
-					"county":         "Orange",
-					"route":          "SR-73",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "24.91",
-					"alignment":      "",
-					"milepost":       "14.91"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "1 Page (Normal)",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "I-405 TO CLOSE",
-						"phase1Line2": "AT FAIRVIEW",
-						"phase1Line3": "SAT  11PM-9AM"
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		},
-		{
-			"cms":
-			{
-				"index": "1218486",
-				"recordTimestamp":
-				{
-					"recordDate": "2019-03-06",
-					"recordTime": "18:19:07"
-				},
-				"location":
-				{
-					"district":       "12",
-					"locationName":   "South of Wildlife",
-					"nearbyPlace":    "Newport Coast",
-					"longitude":      "-117.818984",
-					"latitude":       "33.61494",
-					"elevation":      "718",
-					"direction":      "South",
-					"county":         "Orange",
-					"route":          "SR-73",
-					"routeSuffix":    "",
-					"postmilePrefix": "",
-					"postmile":       "20.75",
-					"alignment":      "",
-					"milepost":       "10.75"
-				},
-				"inService": "true",
-				"message":
-				{
-					"messageTimestamp":
-					{
-						"messageDate": "Not Reported",
-						"messageTime": "Not Reported"
-					},
-					"display":     "Blank",
-					"displayTime": "Not Reported",
-					"phase1":
-					{
-						"phase1Font":  "Not Reported",
-						"phase1Line1": "",
-						"phase1Line2": "",
-						"phase1Line3": ""
-					},
-					"phase2":
-					{
-						"phase2Font":  "Not Reported",
-						"phase2Line1": "",
-						"phase2Line2": "",
-						"phase2Line3": ""
-					}
-				}
-			}
-		}
-	]
-}
Index: trunk/src/cptms/convertCSVtoJSON.bash
===================================================================
--- trunk/src/cptms/convertCSVtoJSON.bash	(revision 284)
+++ 	(revision )
@@ -1,16 +1,0 @@
-#!/bin/bash
-# Convert csv to json using awk pgm
-# Get input filename from command line
-if [ "$#" -ne 1 ] 
-then
-  echo "argument required: provide input csv filename of prepped postmile file"
-  exit 1
-fi 
-
-echo "{"
-echo " \"type\": \"FeatureCollection\","
-echo " \"features\": ["
-awk -F',' -f csvToJson.awk $1
-echo " ]"
-echo "}"
-# NB: You need to manually remove the comma after the last feature.
Index: trunk/src/cptms/csvToJson.awk
===================================================================
--- trunk/src/cptms/csvToJson.awk	(revision 284)
+++ 	(revision )
@@ -1,13 +1,0 @@
-# Convert a csv with postmile and coordinates to a json file
-# Note it switches lat/long to long/lat
-# Sample invocation:  awk -F',' -f awkpgm1 filename
-//{printf "  {\n  \"type\": \"Feature\",\n  \"id\": \"%s\",\n    \"geometry\":\n      {\n      \"type\": \"Point\",\n      \"coordinates\": [%s,%s]\n      },\n      \"properties\": {\"street\":\"%s\", \"color\":\"%s\", \"perpx\":\"%s\", \"perpy\":\"%s\"}\n  },\n", $1, $3,$2,$4,$7,$5,$6 }
-#
-# When finished prepend:
-#{
-#  "type": "FeatureCollection",
-#  "features": [
-# 
-# and Append:
-#  ] }
-
Index: trunk/src/cptms/cmsToGeoJson.awk
===================================================================
--- trunk/src/cptms/cmsToGeoJson.awk	(revision 314)
+++ 	(revision )
@@ -1,18 +1,0 @@
-# Convert a csv with cctv location data to a geojson file
-# This was used for a one-off task to convert the static csv file we manually produced into json
-# Sample invocation:  awk -F',' -f awkpgm1 filename
-
-# Manually remove the first line with column headers before running this.
-
-# Remove quotes around those streets names that have them
-//{gsub("\"","",$5);printf "  {\n  \"type\": \"Feature\",\n  \"id\": \"%s\",\n  \"geometry\":\n      {\n      \"type\": \"Point\",\n      \"coordinates\": [%s,%s]\n      },\n  \"properties\":\n      {\n      \"location\":\"%s %s %5.2f\",\n      \"street\":\"%s\"\n      }\n  },\n", $1,$7,$8,$10,$12,$15, $5}
-
-#
-# When finished prepend:
-#{
-#  "type": "FeatureCollection",
-#  "features": [
-# 
-# and Append:
-#  ] }
-
Index: trunk/src/cptms/prep_cctv.py
===================================================================
--- trunk/src/cptms/prep_cctv.py	(revision 305)
+++ 	(revision )
@@ -1,79 +1,0 @@
-import collections,math,sys
-# Scan the cctv file to find the nearest vds
-# This is a one-time job to create the static file of cctv locations and nearest vds
-# The output of this program needs to be manually modified before input to cptms_map.html
-# 1. The vds column is appended to cctvFile (yes, adding a new column to the original input).
-# 2. Convert this csv file to json (using cctvToJson.awk)
-# 3. Remove tabs from json.  Trim any blanks from nearVDS field. 
-# jdalbey Mar 2019
-vdsFile = "vds_fromhighwaysmap.csv"
-cctvFile = "cctv_locations_D12.csv"
-orientationLookup = {'N':0,'S':1,'E':0,'W':1}
-
-def loadHighways():
-
-    f = open(vdsFile,'r')
-    lines = [line.split(',') for line in f.readlines()]
-    # 5,N,0.65,4 S. LUIS REY
-    # Create a set containing just the route numbers 
-    routeNums = set()
-    for item in lines:
-        routeNums.add(int(item[0]))
-    # put the route numbers in order
-    sortedRoutes = sorted (routeNums)    
-    # Create the empty postmile collections
-    for route in sortedRoutes:
-        #print route,
-        highways[str(route)]=[collections.OrderedDict(),collections.OrderedDict()]
-    #print
-    # Process all the data, placing it in proper route and collection
-    for item in lines:
-        route = item[0]
-        orientation = orientationLookup[item[1]]
-        postmileItem = item[2]
-        highways[route][orientation][postmileItem]=item
-
-
-def dumpHighways():
-    # Dump the highways data we've organized
-    for item in highways:
-        for cnt in [0,1]:
-            list1 = highways[item][cnt]
-            print "highway",item,list1
-            # show fields for one entry
-            for pm_entry in list1:
-                print pm_entry,list1[pm_entry]
-
-def findNearest():
-
-    f = open(cctvFile,'r')
-    #5,S,42.11,-117.978854,33.856288,SB 5 N/O MAGNOLIA AVE (S/O 91),12-005-CCTV-0001
-    lines = [line.split(',') for line in f.readlines()]
-
-    # Find he nearest VDS to each cctv
-    for item in lines:
-        route = item[0]
-        orientation = orientationLookup[item[1]]
-        postmileItem = item[2]
-        segment = highways[route][orientation] 
-
-        # Now we know which highway segment the cctv is on, look at all those VDS to find nearest
-        print route,item[1],postmileItem+",",
-        min = 9999
-        nearVDS = 0
-        for vds in segment:
-            diff = abs(float(vds) - float(postmileItem))
-            #print vds + "("+str(diff)+")",
-            if (diff < min):
-                min = diff
-                nearVDS = vds
-        print route,item[1],nearVDS
-
-# ------------------------------------------------------------------------------------------
-
-highways = collections.OrderedDict()    
-loadHighways()
-dumpHighways()
-print "CCTV\tnearestVDS"
-findNearest()
-
Index: trunk/src/cptms/prep_postmiles.py
===================================================================
--- trunk/src/cptms/prep_postmiles.py	(revision 304)
+++ 	(revision )
@@ -1,273 +1,0 @@
-import collections,math,sys
-# Scan the postmile file to preprocess it to identify N/S pairs
-# that are so close they will overlap in the display. 
-# Compute the perpendicular vector that will be used to adjust their position.
-# Input filename is a Output to stdout.
-# This program adds one extra column to the output, a color, to allow the
-# results to be easily converted to json and displayed for visual verification. 
-# (See the convert csv to json bash/awk script)
-# Before being used in the simulation, remove the last column:
-#     cut -f1-6 -d"," output.txt
-
-# jdalbey Feb 2019
-postmileFile = "d12_vds_uniq_sorted.csv"
-
-# Helper function to find the perpendicular unit vector to the line
-# between two postmiles.
-def findPerpX(ax,ay,bx,by):
-    dx = float(bx) - float(ax);
-    dy = float(by) - float(ay);
-    
-    dist = math.sqrt(dx * dx + dy * dy);
-    try:
-        normX = dy / dist;  # calc a unit vector
-        normY = -dx / dist;
-        return round(normX, 6)
-    except ZeroDivisionError:
-        print "Oops, (",ay,",",ax,") appeared twice,"
-        print "causing findPerp() to divide by zero. Probable cause: duplicates in input"
-        print "Please correct the input file."
-        sys.exit(-1)
-# And same for Y ... I know it's redundant code.
-def findPerpY(ax,ay,bx,by):
-    dx = float(bx) - float(ax);
-    dy = float(by) - float(ay);
-    
-    dist = math.sqrt(dx * dx + dy * dy);
-    
-    normX = dy / dist;  # calc a unit vector
-    normY = -dx / dist;
-    return round(normY, 6)
-
-orientationLookup = {'N':0,'S':1,'E':0,'W':1}
-
-def loadHighways():
-
-    f = open(postmileFile,'r')
-    lines = [line.split(',') for line in f.readlines()]
-    
-    # Create a set containing just the route numbers 
-    routeNums = set()
-    for item in lines:
-        routeNums.add(int(item[0]))
-    # put the route numbers in order
-    sortedRoutes = sorted (routeNums)    
-    # Create the empty postmile collections
-    for route in sortedRoutes:
-        #print route,
-        highways[str(route)]=[collections.OrderedDict(),collections.OrderedDict()]
-    #print
-    # Process all the data, placing it in proper route and collection
-    for item in lines:
-        route = item[0]
-        orientation = orientationLookup[item[1]]
-        postmileItem = item[2]
-        highways[route][orientation][postmileItem]=item
-
-
-def dumpHighways():
-    # Dump the highways data we've organized
-    for item in highways:
-        for cnt in [0,1]:
-            list1 = highways[item][cnt]
-            print "highway",item,list1
-            # show fields for one entry
-            for pm_entry in list1:
-                print pm_entry,list1[pm_entry]
-
-def calcPerpendicularVectors(theList,thePerps,dirSign):
-    size = len(theList)
-    idx = 1
-    while (idx < size-1):
-        # see which is closer, previous or next
-        a = abs(float(theList[idx][2]) - float(theList[idx+1][2]))
-        b = abs(float(theList[idx][2]) - float(theList[idx-1][2]))
-        if ( a<b ):
-            #print "closest to ",theList[idx][1]+theList[idx][2]," is ", theList[idx+1][2],
-            ax=theList[idx][4] #long
-            ay=theList[idx][3] #lat
-            bx=theList[idx+1][4]
-            by=theList[idx+1][3]
-            px = findPerpX(ax,ay,bx,by) * dirSign
-            py = findPerpY(ax,ay,bx,by) * dirSign
-            # TODO: ADd check to see if this pm already assigned px,py
-            thePerps[theList[idx][2]] = [px,py]
-            thePerps[theList[idx+1][2]] = [px,py]
-            #print px,py
-        else:
-            #print ">closest to ",theList[idx][2]," is ", theList[idx-1][2],
-            ax=theList[idx][4]
-            ay=theList[idx][3]
-            bx=theList[idx-1][4]
-            by=theList[idx-1][3]
-            px = findPerpX(bx,by,ax,ay) * dirSign # reverse order so normal stays NB
-            py = findPerpY(bx,by,ax,ay) * dirSign
-            # TODO: ADd check to see if this pm already assigned px,py
-            thePerps[theList[idx][2]] = [px,py]
-            thePerps[theList[idx-1][2]] = [px,py]
-            #print px,py
-        idx += 1
-
-    # Did first and last spots get filled?
-    if theList[0][2] in thePerps:
-        #print "good, the first item ",theList[0][2]," is present"
-        pass
-    else:
-        #print "oops, first item ",theList[0][2]," missing"
-        # I'm too lazy to calc this value, so providing zero meaning no perp vector
-        # Which means if by chance this spot has a "mate" then it won't get adjusted
-        # as it should.  TODO: fix this by using the neighbor as adjacent
-        thePerps[theList[0][2]]=[0,0]
-    if theList[idx][2] in thePerps:
-        #print "good, the last item ",theList[idx][2]," is present"
-        pass
-    else:
-        #print "oops, last item ",theList[idx][2]," is missing"
-        thePerps[theList[idx][2]]=[0,0]
-
-# ------------------------------------------------------------------------------------------
-
-highways = collections.OrderedDict()    
-loadHighways()
-
-
-# Iterate over all the highway routes
-for route in highways:
-    #print "Starting route: ",route
-    # ---------------------------------------------------------------------------------
-    # ## First, compute the perpendicular vectors for each item 
-    # Compute nearest adjacent for each item (in SAME direction)
-    # We create separate north/south lists so it's easier to locate an adjacent spot
-    northlist = list (highways[route][0].values())
-    southlist = list (highways[route][1].values())
-    northPerps = {}  # a dictionary addressed by postmile that yields perp vectors
-    southPerps = {}
-    #print "northsize is ",northSize, "southsize is ",southSize
-    calcPerpendicularVectors(northlist,northPerps, +1)
-    calcPerpendicularVectors(southlist,southPerps, -1)
-    
-    # -------------------------------------------------------------------------------
-    #print "*****"
-    #print "Perps computed for these up pm's:",sorted(northPerps)
-    #print "Perps computed for these down pm's:",sorted (southPerps)
-    
-    # Try to find matching pairs
-    # Create a match list and add matching postmiles to it.
-    north = highways[route][0]
-    south = highways[route][1]
-    matches = []
-    for item in north:
-        # if south ALSO has item add i to matches list
-        if item in south:
-            #print "match for: " + item
-            matches.append(item)
-    
-    #print "found ",len(matches)," matches."
-    #outFile = open("pairedDots.json","w") # put results here
-    #[0xFF0000,0xFF4000,0xFF8000,0xFFBF00,0xFFFF00,0x00FF00,0x00FFFF,0x0080FF,0x0000FF,0x8000FF,0xFF00FF]
-    colorcode = ["red","salmon","deeppink","coral","orangered","yellow","khaki","purple",
-    "slateblue","lime","lightgreen","cyan","blue","slategray"]
-    colorindex=0
-    for match in matches:
-        # We want to output these as json with matching color
-        id = south[match][0] + " " + south[match][1] + " " + south[match][2]
-        print ("%s,%s,%s,%s,%s,%s,%s" % (id,south[match][3],south[match][4],south[match][5].rstrip(),southPerps[south[match][2]][0],southPerps[south[match][2]][1],colorcode[colorindex]))
-        # lookup perpvector for postmile = south[match][2]
-        #perpx = southPerps[south[match][2]][0]
-        #perpy = southPerps[south[match][2]][1]
-        #print perpx, perpy
-        
-        id = north[match][0] + " " + north[match][1] + " " + north[match][2]
-        print ("%s,%s,%s,%s,%s,%s,%s" % (id,north[match][3],north[match][4],north[match][5].rstrip(),northPerps[north[match][2]][0],northPerps[north[match][2]][1],colorcode[colorindex]))
-        colorindex = (colorindex+1) % 14 # advance to next color
-        # remove them from future consideration
-        south.pop(match)
-        north.pop(match)
-        
-
-    # -----------------------------------------------------------------------
-    leftover_count = len(north)+len(south)
-    #print "Leftover count:",leftover_count
-    # After we've handled all the "matching" pairs of N/S dots
-    # There will be "leftover" single dots 
-    if (leftover_count > 0):
-        #print "Leftovers ... single dots"
-        #print len(north),"North keys", north.keys()
-        #print len(south),"South keys", south.keys()
-        
-         
-        # Assert: there are no matching keys in the two dictionaries,
-        #         they should have been removed by the previous step.
-        # Merge the two sets of keys into one list,
-        # each entry is the postmile and direction
-        mergedKeys = []
-        upLetter = ''
-        downLetter = ''
-        if len(north) > 0:
-            upLetter = north.items()[0][1][1]
-            for item in north.keys():
-                mergedKeys.append(item + upLetter)
-            #print "north keys after merging and letter assigned:",mergedKeys
-        if len(south) > 0:
-            downLetter = south.items()[0][1][1]
-            for item in south.keys():
-                mergedKeys.append(item + downLetter)
-        
-        
-        #Sort the list of keys in ascending order by postmile
-        leftovers = sorted(mergedKeys)
-        # Create a dictionary of postmiles and assigned color, and init to white
-        pm_colors=collections.OrderedDict()
-        for pm in leftovers:
-            pm_colors[pm] = "white"
-        
-        # Look for adjacent items close together in opposite directions
-        # Give them same color dots and assign perpendicular vectors
-        close_count = 0
-        prev = leftovers.pop(0)
-        prev_dir = prev[-1:]
-        prev_pm = prev[:-1]
-        for curr in leftovers:
-            curr_dir = curr[-1:]
-            curr_pm  = curr[:-1]
-            # Only consider adjacent items in OPPOSITE directions
-            if curr_dir != prev_dir:
-                curr_color = "white"
-                # See if they are close enough to be considered a pair
-                if (abs(float(curr_pm) - float(prev_pm)) <= 0.111):
-                    #print "FOUND CLOSE: ",prev, curr
-                    close_count += 1
-                    # tag the previous item with a colored dot
-                    pm_colors[curr_pm+curr_dir]="lime"
-                    pm_colors[prev_pm+prev_dir]="lime"
-               
-            prev = curr
-            prev_dir = curr_dir
-            prev_pm = curr_pm
-                
-        #print "Counted ",close_count," close pairs"
-        # print all the tagged items as csv with their tagged color
-        for spot in pm_colors:
-            curr_dir = spot[-1:]
-            curr_pm  = spot[:-1]
-            if (curr_dir == upLetter):
-                curr_info = north[curr_pm]
-                curr_perpx = northPerps[north[curr_pm][2]][0]
-                curr_perpy = northPerps[north[curr_pm][2]][1]
-            else:
-                curr_info = south[curr_pm]
-                curr_perpx = southPerps[south[curr_pm][2]][0]
-                curr_perpy = southPerps[south[curr_pm][2]][1]
-            id = curr_info[0] + " " + curr_info[1] + " " + curr_info[2]
-            # white dots have no mate so don't need to be adjusted
-            if (pm_colors[spot]=="white"):
-                px=0
-                py=0
-            else:
-                px=curr_perpx
-                py=curr_perpy
-            # output this spot 
-            print ("%s,%s,%s,%s,%s,%s,%s" % (id,curr_info[3],curr_info[4],curr_info[5].rstrip(),px,py,pm_colors[curr_pm+curr_info[1]]))
-            
-
-    
Index: trunk/src/cptms/showDupPostmiles.py
===================================================================
--- trunk/src/cptms/showDupPostmiles.py	(revision 284)
+++ 	(revision )
@@ -1,67 +1,0 @@
-import fileinput
-# Some postmiles files have duplicate entries,
-# same postmile but slightly different street names.
-# This program presents the duplicates to the user to 
-# select which one to keep and discards the others.
-# Only works when duplicates are in successive rows of the file, which is
-# how it should be if it's sorted by postmile.  But sometimes
-# there's weird data where two SLIGHTLY different postmiles have
-# the same latlong, and you'll have to deal with these by hand.
-
-# Read from file name provided on command line
-# Expected input format: route, direction, lat, long, name
-# Assumes commas are separators and don't appear in name.
-prevName = ""
-prevCoords = ""
-prevstreet = ""
-prevFields = ["","","","","",""]
-matching = False
-streets = []
-outputFile = "uniqFile"
-outFile = open(outputFile,"w") # put results here
-# Examine each input line
-for line in fileinput.input():
-    lineIn = line.rstrip()   #to trim whitespace and newline
-    fields = lineIn.split(",")
-    current = fields[3]+","+fields[4]  # match the latLong pair
-    # Does this item match the previous one?
-    if (current == prevCoords): 
-        if not matching:
-            # indicate we are in matching mode (for 1 or more items)
-            matching = True
-            print fields[0] + "\t" + prevstreet
-        print "\t\t" + fields[5]
-        streets.append(fields[5])
-    else:
-        if matching: # if we were matching, turn it off
-            matching = False
-            # Ask user to select one of the matching items
-            choice = raw_input("choose one of "+str(len(streets)) + ": ")
-            if (len(choice)==0):
-                choice = "1"
-            print "         OK, you selected: ",streets[int(choice)-1]
-            print 
-            print "-----------"
-#            outFile.write(prevName + "," +prevCoords + "," + streets[int(choice)-1])
-            outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + streets[int(choice)-1])
-            outFile.write("\n")
-        else:
-            # output the previous unmatched item (unless were at the first line)
-            if prevFields[0] != "":
-#            outFile.write(prevName + "," + prevCoords + "," + prevstreet + "\n")
-                outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + prevFields[5])
-                outFile.write("\n")
-        # reset the saved street names
-        streets = []
-        streets.append(fields[5])
-    # save current for next iteration
-    prevName = fields[0]
-    prevCoords = current
-    prevstreet = fields[5]
-    prevFields = fields
-# output last entry
-outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + prevFields[5])
-outFile.write("\n")
-outFile.close()
-
-print "All Done, output in ", outputFile
