Browse Source

7.6.8 release

Former-commit-id: ce63d7ceb692aee76ccbc6a7587d17bbfa88332f
David Benson 7 years ago
parent
commit
47d907fcae

+ 4 - 0
ChangeLog

@@ -1,3 +1,7 @@
+13-NOV-2017: 7.6.8
+
+- Updates to latest AWS stencils
+
 30-OCT-2017: 7.6.7
 
 - Ignores invalid sources in embed mode

+ 1 - 1
VERSION

@@ -1 +1 @@
-7.6.7
+7.6.8

+ 1 - 1
war/cache.manifest

@@ -1,7 +1,7 @@
 CACHE MANIFEST
 
 # THIS FILE WAS GENERATED. DO NOT MODIFY!
-# 10/30/2017 12:32 PM
+# 11/13/2017 03:27 PM
 
 app.html
 index.html?offline=1

BIN
war/images/sidebar-aws3.png


File diff suppressed because it is too large
+ 178 - 238
war/js/app.min.js


File diff suppressed because it is too large
+ 3 - 3
war/js/atlas-viewer.min.js


File diff suppressed because it is too large
+ 178 - 238
war/js/atlas.min.js


+ 35 - 34
war/js/diagramly/EditorUi.js

@@ -999,7 +999,8 @@
 		var file = this.getCurrentFile();
 		var basename = (file != null && file.getTitle() != null) ? file.getTitle() : this.defaultFilename;
 		
-		if (/(\.xml)$/i.test(basename) || /(\.html)$/i.test(basename) || /(\.svg)$/i.test(basename))
+		if (/(\.xml)$/i.test(basename) || /(\.html)$/i.test(basename) ||
+			/(\.svg)$/i.test(basename) || /(\.png)$/i.test(basename))
 		{
 			basename = basename.substring(0, basename.lastIndexOf('.'));
 		}
@@ -8586,57 +8587,57 @@
 						else
 						{
 							// Creates a preview with no alt text for unsupported browsers
-				        	mxSvgCanvas2D.prototype.foAltText = null;
-				        	
-				        	var bg = this.editor.graph.background;
-				        	
-				        	if (bg == mxConstants.NONE)
-				        	{
-				        		bg = null;
-				        	}
-				        	
+					        	mxSvgCanvas2D.prototype.foAltText = null;
+					        	
+					        	var bg = this.editor.graph.background;
+					        	
+					        	if (bg == mxConstants.NONE)
+					        	{
+					        		bg = null;
+					        	}
+					        	
 							msg.xml = this.getFileData(true);
 							msg.format = 'svg';
-				        	
-				        	if (data.embedImages || data.embedImages == null)
-				        	{
+					        	
+					        	if (data.embedImages || data.embedImages == null)
+					        	{
 								if ((data.spin == null && data.spinKey == null) || this.spinner.spin(document.body,
 									(data.spinKey != null) ? mxResources.get(data.spinKey) : data.spin))
 								{
 									this.editor.graph.setEnabled(false);
 									
-					        		if (data.format == 'xmlsvg')
-					        		{
-						        		this.getEmbeddedSvg(msg.xml, this.editor.graph, null, true, mxUtils.bind(this, function(svg)
-					        			{
+						        		if (data.format == 'xmlsvg')
+						        		{
+							        		this.getEmbeddedSvg(msg.xml, this.editor.graph, null, true, mxUtils.bind(this, function(svg)
+						        			{
 											this.editor.graph.setEnabled(true);
 											this.spinner.stop();
 											
 											msg.data = this.createSvgDataUri(svg);
 											parent.postMessage(JSON.stringify(msg), '*');
-					        			}));
-					        		}
-					        		else
-					        		{
-					        			this.convertImages(this.editor.graph.getSvg(bg), mxUtils.bind(this, function(svgRoot)
-					        			{
+						        			}));
+						        		}
+						        		else
+						        		{
+						        			this.convertImages(this.editor.graph.getSvg(bg), mxUtils.bind(this, function(svgRoot)
+						        			{
 											this.editor.graph.setEnabled(true);
 											this.spinner.stop();
 											
 											msg.data = this.createSvgDataUri(mxUtils.getXml(svgRoot));
 											parent.postMessage(JSON.stringify(msg), '*');
-					        			}));
-					        		}
-							}
-				        		
-				        		return;
-				        	}
-				        	else
-				        	{
-				        		var svg = (data.format == 'xmlsvg') ? this.getEmbeddedSvg(this.getFileData(true),
-				        			this.editor.graph, null, true) : mxUtils.getXml(this.editor.graph.getSvg(bg));
+						        			}));
+						        		}
+								}
+					        		
+					        		return;
+					        	}
+					        	else
+					        	{
+					        		var svg = (data.format == 'xmlsvg') ? this.getEmbeddedSvg(this.getFileData(true),
+					        			this.editor.graph, null, true) : mxUtils.getXml(this.editor.graph.getSvg(bg));
 								msg.data = this.createSvgDataUri(svg);
-				        	}
+					        	}
 						}
 
 						parent.postMessage(JSON.stringify(msg), '*');

+ 646 - 31
war/js/diagramly/graphml/mxGraphMlCodec.js

@@ -23,7 +23,7 @@ mxGraphMlCodec.prototype.decode = function (xml, callback)
 		var graph = this.createMxGraph();
         graph.getModel().beginUpdate();
         
-        this.importPage(pageElement, graph);
+        this.importGraph(pageElement, graph, graph.getDefaultParent());
         
         mxFile += this.processPage(graph, i+1);
 	}
@@ -141,6 +141,7 @@ mxGraphMlCodec.prototype.dataElem2Obj = function (elem)
 {
 	var ref = this.getDirectFirstChildNamedElements(elem, mxGraphMlConstants.GRAPHML_REFERENCE);
 	var refKey = null;
+	var origElem = elem;
 	var obj = {};
 	
 	if (ref) 
@@ -151,6 +152,8 @@ mxGraphMlCodec.prototype.dataElem2Obj = function (elem)
 		//already cached
 		if (cachedObj)
 		{
+			//parse all attributes to update the reference
+			this.parseAttributes(elem, cachedObj);
 			return cachedObj;
 		}
 		
@@ -204,7 +207,19 @@ mxGraphMlCodec.prototype.dataElem2Obj = function (elem)
 					attName = attName.substr(dotPos + 1);
 				}
 				
-				obj[attName] = this.dataElem2Obj(child);
+				if (obj[attName] != null)
+				{
+					if (!(obj[attName] instanceof Array))
+					{
+						obj[attName] = [obj[attName]];
+					}
+					
+					obj[attName].push(this.dataElem2Obj(child));
+				}
+				else
+				{
+					obj[attName] = this.dataElem2Obj(child);
+				}
 			}
 		}
 	}
@@ -213,6 +228,8 @@ mxGraphMlCodec.prototype.dataElem2Obj = function (elem)
 	if (refKey)
 	{
 		var tmpObj = {};
+		//parse all attributes before following the reference
+		this.parseAttributes(origElem, tmpObj);
 		tmpObj[this.sharedData[refKey].nodeName] = obj; 
 		this.cachedRefObj[refKey] = tmpObj;
 		return tmpObj;
@@ -225,6 +242,15 @@ mxGraphMlCodec.prototype.dataElem2Obj = function (elem)
 //TODO yjs looks like they need special handling
 mxGraphMlCodec.prototype.mapObject = function (obj, mapping, map)
 {
+	//defaults can be overridden by actual values later
+	if (mapping.defaults)
+	{
+		for (var key in mapping.defaults)
+		{
+			map[key] = mapping.defaults[key];
+		}
+	}
+	
 	for (var key in mapping)
 	{
 		var parts = key.split('.');
@@ -249,21 +275,43 @@ mxGraphMlCodec.prototype.mapObject = function (obj, mapping, map)
 				}
 				else if (typeof mappingObj === "object")
 				{
-					var modVal;
+					var modVal = val.toLowerCase();
 					switch(mappingObj.mod)
 					{
 						case "color": //mxGraph doesn't support alfa in colors
-							if (val.indexOf("#") == 0)
+							if (val.indexOf("#") == 0 && val.length == 9)
+							{
 								modVal = "#" + val.substr(3);
+							}
+							else if (val == "TRANSPARENT")
+							{
+								modVal = "none";
+							}
 						break;
 						case "shape":
-							console.log(val);
+//							console.log(val);
 							modVal = mxGraphMlShapesMap[val];
 						break;
-						default:
-							modVal = val.toLowerCase();
+						case "bpmnOutline":
+//							console.log(val);
+							modVal = mxGraphMlShapesMap.bpmnOutline[val];
+						break;
+						case "bool":
+							modVal = val == "true"? "1" : "0";
+						break;
+						case "scale":
+							try {
+								modVal = parseFloat(val) * mappingObj.scale;
+							} catch(e) {
+								//nothing!
+							}
+						break;
+						case "arrow":
+							modVal = mxGraphMlArrowsMap[val];
+						break;
 					}
-					map[mappingObj.key] = modVal;
+					if (modVal != null)
+						map[mappingObj.key] = modVal;
 				}
 				else
 				{
@@ -289,22 +337,22 @@ mxGraphMlCodec.prototype.createMxGraph = function ()
     return graph;
 }
 
-mxGraphMlCodec.prototype.importPage = function (pageElement, graph)
+mxGraphMlCodec.prototype.importGraph = function (pageElement, graph, parent, nodesMap)
 {
 	var nodes = this.getDirectChildNamedElements(pageElement, mxGraphMlConstants.NODE);
 	
-	var nodesMap = {};
+	nodesMap = nodesMap || {};
 	
 	for (var i = 0; i < nodes.length; i++)
 	{
-		this.importNode(nodes[i], graph, nodesMap);
+		this.importNode(nodes[i], graph, nodesMap, parent);
 	}
 	
 	var edges = this.getDirectChildNamedElements(pageElement, mxGraphMlConstants.EDGE);
 	
 	for (var i = 0; i < edges.length; i++)
 	{
-		this.importEdge(edges[i], graph, nodesMap);
+		this.importEdge(edges[i], graph, nodesMap, parent);
 	}
 };
 
@@ -337,7 +385,7 @@ mxGraphMlCodec.prototype.styleMap2Str = function (styleMap)
 	return str;
 };
 
-mxGraphMlCodec.prototype.importNode = function (nodeElement, graph, nodesMap)
+mxGraphMlCodec.prototype.importNode = function (nodeElement, graph, nodesMap, parent)
 {
 	var data = this.getDirectChildNamedElements(nodeElement, mxGraphMlConstants.DATA);
 	var v;
@@ -345,7 +393,11 @@ mxGraphMlCodec.prototype.importNode = function (nodeElement, graph, nodesMap)
 	
 	var node = new mxCell();
 	node.vertex = true;
-	var style = {};
+
+	graph.addCell(node, parent);
+
+	var style = {graphMlID: id};
+	var mlStyleObj = null;
 	
 	for (var i = 0; i < data.length; i++)
 	{
@@ -354,11 +406,12 @@ mxGraphMlCodec.prototype.importNode = function (nodeElement, graph, nodesMap)
 		
 		if (dataObj.key == this.nodesKeys[mxGraphMlConstants.NODE_GEOMETRY].key) 
 		{
-			this.addNodeGeo(node, dataObj);
+			this.addNodeGeo(node, dataObj, parent.geometry);
 		} 
 		else if (dataObj.key == this.nodesKeys[mxGraphMlConstants.NODE_STYLE].key) 
 		{
-			console.log(dataObj);
+//			console.log(JSON.stringify(dataObj));
+			mlStyleObj = dataObj;
 			var dashStyleFn = function(val, map)
 			{
 				map["dashed"] = 1;
@@ -391,6 +444,7 @@ mxGraphMlCodec.prototype.importNode = function (nodeElement, graph, nodesMap)
 				"activityType": {key: "shape", mod: "shape"},
 				"fill": {key: "fillColor", mod: "color"},
 				"fill.yjs:SolidColorFill.color": {key: "fillColor", mod: "color"},
+				"fill.yjs:SolidColorFill.color.yjs:Color.value": {key: "fillColor", mod: "color"},
 				"stroke": {key: "strokeColor", mod: "color"},
 				"stroke.yjs:Stroke":
 				{
@@ -404,12 +458,131 @@ mxGraphMlCodec.prototype.importNode = function (nodeElement, graph, nodesMap)
 				}
 			};
 
+			var assetNodesStyle = mxUtils.clone(styleCommonMap);
+			assetNodesStyle["defaults"] = {
+				"fillColor": "#CCCCCC",
+				"strokeColor": "#6881B3"
+			};
+			
+			var bpmnActivityStyle = mxUtils.clone(styleCommonMap);
+			bpmnActivityStyle["defaults"] = {
+				"shape": "ext;rounded=1",
+				"fillColor": "#FFFFFF",
+				"strokeColor": "#000090"
+			};
+			
+			var bpmnGatewayStyle = mxUtils.clone(styleCommonMap);
+			bpmnGatewayStyle["defaults"] = {
+				"shape": "rhombus;fillColor=#FFFFFF;strokeColor=#FFCD28"
+			};
+			
+			var bpmnConversationStyle = mxUtils.clone(styleCommonMap);
+			bpmnConversationStyle["defaults"] = {
+				"shape": "hexagon",
+				"strokeColor": "#007000"
+			};
+			
+			var bpmnEventStyle = mxUtils.clone(styleCommonMap);
+			bpmnEventStyle["defaults"] = {
+				"shape": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=general",
+				"outline": "standard"
+			};
+			bpmnEventStyle["characteristic"] = {key: "outline", mod: "bpmnOutline"};
+			
+			var bpmnDataObjectStyle = mxUtils.clone(styleCommonMap);
+			bpmnDataObjectStyle["defaults"] = {
+				"shape": "js:bpmnDataObject"
+			};
+			
+			var bpmnDataStoreStyle = mxUtils.clone(styleCommonMap);
+			bpmnDataStoreStyle["defaults"] = {
+				"shape": "datastore"
+			};
+			
+			var bpmnGroupNodeStyle = mxUtils.clone(styleCommonMap);
+			bpmnGroupNodeStyle["defaults"] = {
+				"shape": "swimlane;swimlaneLine=0;startSize=20;dashed=1;dashPattern=3 1 1 1;collapsible=0;rounded=1"
+			};
+			
+			var bpmnChoreographyNodeStyle = mxUtils.clone(styleCommonMap);
+			bpmnChoreographyNodeStyle["defaults"] = {
+				"shape": "swimlane;childLayout=stackLayout;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;startSize=20;rounded=1;collapsible=0"
+			};
+			
+			//approximation to GraphML shapes TODO improve them
+			var bevelNodeStyle = mxUtils.clone(styleCommonMap);
+			bevelNodeStyle["defaults"] = {
+				"rounded": "1",
+				"glass": "1",
+				"strokeColor": "#FFFFFF"
+			};
+			bevelNodeStyle["inset"] = "strokeWidth";
+			bevelNodeStyle["radius"] = "arcSize";
+			bevelNodeStyle["drawShadow"] = {key:"shadow", mod:"bool"};
+			bevelNodeStyle["color"] = {key:"fillColor", mod:"color", addGradient: "north"};
+			bevelNodeStyle["color.yjs:Color.value"] = bevelNodeStyle["color"];
+			
+			var shinyPlateNodeStyle = mxUtils.clone(styleCommonMap);
+			shinyPlateNodeStyle["defaults"] = {
+				"rounded": "1",
+				"arcSize": 10,
+				"glass": "1",
+				"shadow": "1",
+				"strokeColor": "none",
+				"rotation": -90 //TODO requires rotation!
+			};
+			shinyPlateNodeStyle["drawShadow"] = {key:"shadow", mod:"bool"};
+			
+			var demoGroupStyle = mxUtils.clone(styleCommonMap);
+			demoGroupStyle["defaults"] = {
+				"shape": "swimlane",
+				"startSize": 20,
+				"strokeWidth": 4,
+				"spacingLeft": 10 //TODO can we change collapse icon to be in right side?
+			};
+			demoGroupStyle["isCollapsible"] = {key:"collapsible", mod:"bool"};
+			demoGroupStyle["borderColor"] = {key:"strokeColor", mod:"color"};
+			demoGroupStyle["folderFrontColor"] = {key:"fillColor", mod:"color"}; //TODO fillColor always match strokeColor!
+//			demoGroupStyle["folderBackColor"] = {key:"fillColor", mod:"color"}; //??
+			
+			var collapsibleNodeStyle = mxUtils.clone(styleCommonMap);
+			collapsibleNodeStyle["defaults"] = {
+				"shape": "swimlane",
+				"startSize": 20,
+				"spacingLeft": 10 //TODO can we change collapse icon to be in right side?
+			};
+			collapsibleNodeStyle["yjs:PanelNodeStyle"] = {
+				"color": {key:"swimlaneFillColor", mod:"color"},
+				"color.yjs:Color.value": {key:"swimlaneFillColor", mod:"color"},
+				"labelInsetsColor": {key:"fillColor", mod:"color"},
+				"labelInsetsColor.yjs:Color.value": {key:"fillColor", mod:"color"}
+			};
+			
+			var tableStyle = mxUtils.clone(styleCommonMap);
+			tableStyle["defaults"] = {
+				"shape": "js:table"
+			};
+			
 			this.mapObject(dataObj, {
 				"yjs:ShapeNodeStyle": styleCommonMap,
 				"demostyle:FlowchartNodeStyle": styleCommonMap,
-				"demostyle:AssetNodeStyle": styleCommonMap,
+				"demostyle:AssetNodeStyle": assetNodesStyle,
 				"demostyle:DemoGroupStyle": styleCommonMap,
-				"bpmn:ActivityNodeStyle": styleCommonMap
+				"bpmn:ActivityNodeStyle": bpmnActivityStyle,
+				"bpmn:GatewayNodeStyle": bpmnGatewayStyle,
+				"bpmn:ConversationNodeStyle": bpmnConversationStyle,
+				"bpmn:EventNodeStyle": bpmnEventStyle,
+				"bpmn:DataObjectNodeStyle": bpmnDataObjectStyle,
+				"bpmn:DataStoreNodeStyle": bpmnDataStoreStyle,
+				"bpmn:GroupNodeStyle": bpmnGroupNodeStyle,
+				"bpmn:ChoreographyNodeStyle": bpmnChoreographyNodeStyle,
+				"yjs:BevelNodeStyle": bevelNodeStyle,
+				"yjs:ShinyPlateNodeStyle": shinyPlateNodeStyle,
+				"demostyle:DemoGroupStyle": demoGroupStyle,
+				"yjs:CollapsibleNodeStyleDecorator": collapsibleNodeStyle,
+				"bpmn:PoolNodeStyle": tableStyle,
+				"yjs:TableNodeStyle": tableStyle,
+				"demotablestyle:DemoTableStyle": tableStyle
 			}, style);
 		}
 		else if (dataObj.key == this.nodesKeys[mxGraphMlConstants.NODE_LABELS].key) 
@@ -426,29 +599,278 @@ mxGraphMlCodec.prototype.importNode = function (nodeElement, graph, nodesMap)
 		this.importPort(ports[i], portsMap);
 	}
 	
+	this.handleFixedRatio(node, style);
+
+	//handle special compound shapes
+	this.handleCompoundShape(node, style, mlStyleObj);
+	
 	node.style = this.styleMap2Str(style);
 	
-	graph.addCell(node);
+	var subGraphs = this.getDirectChildNamedElements(nodeElement, mxGraphMlConstants.GRAPH);
+	
+	for (var i = 0; i < subGraphs.length; i++)
+	{
+		this.importGraph(subGraphs[i], graph, node, portsMap);
+	}	
+	
 	nodesMap[id] = {node: node, ports: portsMap};
 };
 
-mxGraphMlCodec.prototype.addNodeGeo = function (node, geoObj) 
+mxGraphMlCodec.prototype.handleCompoundShape = function (node, styleMap, mlStyleObj)
+{
+	var shape = styleMap["shape"];
+	
+	if (shape && shape.indexOf("js:") == 0)
+	{
+		switch(shape)
+		{
+			case "js:bpmnDataObject":
+				styleMap["shape"] = "note;size=16";
+				mlStyleObj = mlStyleObj["bpmn:DataObjectNodeStyle"];
+				
+				if (mlStyleObj["collection"] == "true")
+				{
+					var cell2 = new mxCell('', new mxGeometry(0.5, 1, 10, 10), 'html=1;whiteSpace=wrap;shape=parallelMarker;');
+					cell2.vertex = true;
+					cell2.geometry.relative = true;
+					cell2.geometry.offset = new mxPoint(-5, -10);
+					node.insert(cell2);
+				}
+				if (mlStyleObj["type"] == "INPUT")
+				{
+					var cell1 = new mxCell('', new mxGeometry(0, 0, 10, 10), 'html=1;shape=singleArrow;arrowWidth=0.4;arrowSize=0.4;');
+					cell1.vertex = true;
+					cell1.geometry.relative = true;
+					cell1.geometry.offset = new mxPoint(2, 2);
+					node.insert(cell1);
+				}
+				else if (mlStyleObj["type"] == "OUTPUT")
+				{
+					var cell1 = new mxCell('', new mxGeometry(0, 0, 10, 10), 'html=1;shape=singleArrow;arrowWidth=0.4;arrowSize=0.4;fillColor=#000000;');
+					cell1.vertex = true;
+					cell1.geometry.relative = true;
+					cell1.geometry.offset = new mxPoint(2, 2);
+					node.insert(cell1);
+				}
+			break;
+			case "js:table":
+				styleMap["shape"] = "swimlane;collapsible=0;swimlaneLine=0";
+				var tableObj = mlStyleObj["yjs:TableNodeStyle"] || mlStyleObj["demotablestyle:DemoTableStyle"];
+				
+				if (!tableObj && mlStyleObj["bpmn:PoolNodeStyle"])
+				{
+					tableObj = mlStyleObj["bpmn:PoolNodeStyle"]["yjs:TableNodeStyle"];
+				}
+				
+				console.log(tableObj);
+				
+				this.mapObject(tableObj, {
+					"backgroundStyle.demotablestyle:TableBackgroundStyle.insetFill.yjs:SolidColorFill.color.yjs:Color.value": {key: "fillColor", mod: "color"},
+					"backgroundStyle.yjs:ShapeNodeStyle.fill": {key: "fillColor", mod: "color"},
+					"backgroundStyle.yjs:ShapeNodeStyle.fill.yjs:SolidColorFill.color": {key: "fillColor", mod: "color"},
+				}, styleMap);
+				
+				//Lane fill color is the same as the fill color
+				styleMap["swimlaneFillColor"] = styleMap["fillColor"];
+				
+				tableObj = tableObj["table"]["y:Table"];
+				
+				var x = 0, y = 0, xShift = 0, yShift = 0;
+				var insets = tableObj["Insets"];
+				
+				if (insets)
+				{
+					insets = insets.split(',');
+					
+					if (insets[0] != "0")
+					{
+						styleMap["startSize"] = insets[0];
+						xShift = parseFloat(insets[0]);
+						x += xShift;						
+						styleMap["horizontal"] = "0";
+					} 
+					else if (insets[1] != "0")
+					{
+						styleMap["startSize"] = insets[1];
+						yShift = parseFloat(insets[1]); 
+						y += yShift;
+					}
+				}
+				else
+				{
+					styleMap["startSize"] = "0";
+				}
+				
+				var defRowStyle = {};
+				
+				var rowMapping = {
+					"Insets": function(val, map)
+					{
+						map["startSize"] = val.split(',')[0];
+					},
+					"Style.bpmn:AlternatingLeafStripeStyle": {
+						"evenLeafDescriptor.bpmn:StripeDescriptor": {
+							"insetFill": {key: "evenFill", mod: "color"},
+							"backgroundFill": {key: "evenLaneFill", mod: "color"}
+						},
+						"oddLeafDescriptor.bpmn:StripeDescriptor": {
+							"insetFill": {key: "oddFill", mod: "color"},
+							"backgroundFill": {key: "oddLaneFill", mod: "color"}
+						}
+						//parentDescriptor ??
+						//TODO Handle labels 
+						//TODO collect common types in a special mapping hash
+					},
+					"Size": "height"
+				};
+				this.mapObject(tableObj["RowDefaults"], {
+					"defaults": {
+						"shape": "swimlane;collapsible=0;horizontal=0",
+						"startSize": "0"
+					},
+					"y:StripeDefaults": rowMapping
+				}, defRowStyle);
+
+				var defColStyle = {};
+				
+				var colMapping = {
+					"Insets": function(val, map)
+					{
+						map["startSize"] = val.split(',')[1];
+					},
+					"Style.yjs:NodeStyleStripeStyleAdapter.yjs:ShapeNodeStyle": {
+						"fill": {key: "swimlaneFillColor", mod: "color"}
+					},
+					"Size": "width"
+				};
+				
+				this.mapObject(tableObj["ColumnDefaults"], {
+					"defaults": {
+						"shape": "swimlane;collapsible=0",
+						"startSize": "0",
+						"fillColor": "none"
+					},
+					"y:StripeDefaults": colMapping
+				}, defColStyle);
+
+				var pGeo = node.geometry;
+				
+				var rows = tableObj["Rows"]["y:Row"];
+				y += parseFloat(defColStyle["startSize"]);
+				
+				if (rows)
+				{
+					if (!(rows instanceof Array))
+						rows = [rows];
+					
+					for (var i = 0; i < rows.length; i++)
+					{
+						var cell = new mxCell();
+						cell.vertex = true;
+						var rowStyle = mxUtils.clone(defRowStyle);
+						this.mapObject(rows[i], rowMapping, rowStyle);
+						
+						if (i & 1) //odd
+						{
+							if (rowStyle["oddFill"]) 
+							{
+								rowStyle["fillColor"] = rowStyle["oddFill"];
+								rowStyle["swimlaneFillColor"] = rowStyle["oddLaneFill"];
+							}
+						}
+						else
+						{
+							if (rowStyle["evenFill"]) 
+							{
+								rowStyle["fillColor"] = rowStyle["evenFill"];
+								rowStyle["swimlaneFillColor"] = rowStyle["evenLaneFill"];
+							}
+						}
+						var height = parseFloat(rowStyle["height"]);
+						cell.geometry = new mxGeometry(xShift, y, pGeo.width - xShift, height);
+						y += height;
+						
+						cell.style = this.styleMap2Str(rowStyle);
+						node.insert(cell);
+					}
+				}
+
+				var columns = tableObj["Columns"]["y:Column"];
+				x += parseFloat(defRowStyle["startSize"]);
+				
+				if (columns)
+				{
+					if (!(columns instanceof Array))
+						columns = [columns];
+					
+					for (var i = 0; i < columns.length; i++)
+					{
+						var cell = new mxCell();
+						cell.vertex = true;
+						var colStyle = mxUtils.clone(defColStyle);
+						this.mapObject(columns[i], colMapping, colStyle);
+						
+						var width = parseFloat(colStyle["width"]);
+						cell.geometry = new mxGeometry(x, yShift, width, pGeo.height - yShift);
+						x += width;
+						
+						cell.style = this.styleMap2Str(colStyle);
+						node.insert(cell);
+					}
+				}
+			break;
+		}
+	}
+};
+
+mxGraphMlCodec.prototype.handleFixedRatio = function (node, styleMap)
+{
+	var shape = styleMap["shape"];
+	
+	if (shape && shape.indexOf(";aspect=fixed") > 0)
+	{
+		var geo = node.geometry;
+		
+		if (geo) 
+		{
+			var min = Math.min(geo.height, geo.width);
+			
+			if (min == geo.height) //fix coordinates
+			{
+				geo.x += (geo.width - min) / 2;
+			}
+			
+			geo.height = min;
+			geo.width = min;
+		}
+	}
+};
+
+mxGraphMlCodec.prototype.addNodeGeo = function (node, geoObj, parentGeo) 
 {
 	var geoRect = geoObj[mxGraphMlConstants.RECT];
 	
 	if (geoRect)
 	{
+		var dx = 0, dy = 0;
+		
+		if (parentGeo) 
+		{
+			dx = parentGeo.x;
+			dy = parentGeo.y;
+		}
+		
 		var geo = new mxGeometry( 
-				geoRect[mxGraphMlConstants.X],
-				geoRect[mxGraphMlConstants.Y],
-				geoRect[mxGraphMlConstants.WIDTH],
-				geoRect[mxGraphMlConstants.HEIGHT]
+				parseFloat(geoRect[mxGraphMlConstants.X]) - dx,
+				parseFloat(geoRect[mxGraphMlConstants.Y]) - dy,
+				parseFloat(geoRect[mxGraphMlConstants.WIDTH]),
+				parseFloat(geoRect[mxGraphMlConstants.HEIGHT])
 		);
 		node.geometry = geo;
 	}
 };
 
-mxGraphMlCodec.prototype.importEdge = function (edgeElement, graph, nodesMap)
+mxGraphMlCodec.prototype.importEdge = function (edgeElement, graph, nodesMap, parent)
 {
 	var data = this.getDirectChildNamedElements(edgeElement, mxGraphMlConstants.DATA);
 	var e;
@@ -458,8 +880,8 @@ mxGraphMlCodec.prototype.importEdge = function (edgeElement, graph, nodesMap)
 	var srcPort = edgeElement.getAttribute(mxGraphMlConstants.EDGE_SOURCE_PORT);
 	var trgPort = edgeElement.getAttribute(mxGraphMlConstants.EDGE_TARGET_PORT);
 	
-	var edge = graph.insertEdge(graph.getDefaultParent(), null, "", nodesMap[srcId].node, nodesMap[trgId].node, "graphMLId=" + id);
-	var style = {};
+	var edge = graph.insertEdge(parent, null, "", nodesMap[srcId].node, nodesMap[trgId].node, "graphMLId=" + id);
+	var style = {graphMlID: id};
 	
 	for (var i = 0; i < data.length; i++)
 	{
@@ -472,7 +894,8 @@ mxGraphMlCodec.prototype.importEdge = function (edgeElement, graph, nodesMap)
 		} 
 		else if (dataObj.key == this.edgesKeys[mxGraphMlConstants.EDGE_STYLE].key) 
 		{
-			this.addEdgeStyle(edge, dataObj);
+//			console.log(dataObj);
+			this.addEdgeStyle(edge, dataObj, style);
 		}
 		else if (dataObj.key == this.edgesKeys[mxGraphMlConstants.EDGE_LABELS].key) 
 		{
@@ -480,6 +903,8 @@ mxGraphMlCodec.prototype.importEdge = function (edgeElement, graph, nodesMap)
 		}
 	}
 	
+	edge.style = this.styleMap2Str(style);
+	
 	return edge;
 };
 
@@ -504,9 +929,84 @@ mxGraphMlCodec.prototype.addEdgeGeo = function (edge, geoObj)
 	}
 };
 
-mxGraphMlCodec.prototype.addEdgeStyle = function (edge, styleObj) 
+//TODO improve similarity handling
+mxGraphMlCodec.prototype.addEdgeStyle = function (edge, styleObj, styleMap) 
 {
+	var dashStyleFn = function(val, map)
+	{
+		map["dashed"] = 1;
+		//map["fixDash"] = 1;
+		var pattern = null;
+		switch(val)
+		{
+			case "DashDot":
+				pattern = "3 1 1 1";
+			break;
+			case "Dot":
+				pattern = "1 1";
+			break;
+			case "DashDotDot":
+				pattern = "3 1 1 1 1 1";
+			break;
+			default:
+				pattern = val.replace(/0/g, '1');
+		}
+		
+		if (pattern)
+			map["dashPattern"] = pattern;
+	};
 	
+	// can be mapping to WHITE => empty, BLACK => filled
+	var endArrowFill = function(val, map)
+	{
+		map["endFill"] = val == 'WHITE'? "0" : "1"; 
+	};
+	// can be mapping to WHITE => empty, BLACK => filled
+	var startArrowFill = function(val, map)
+	{
+		map["startFill"] = val == 'WHITE'? "0" : "1"; 
+	};
+
+	this.mapObject(styleObj, {
+		"yjs:PolylineEdgeStyle": {
+			"defaults" : 
+			{
+				"endArrow": "none"
+			},
+//			"smoothingLength": "",//?
+			"stroke": {key: "strokeColor", mod: "color"},
+			"stroke.yjs:Stroke":
+			{
+				"dashStyle": dashStyleFn,
+				"dashStyle.yjs:DashStyle.dashes": dashStyleFn,
+				"fill": {key: "strokeColor", mod: "color"},
+				"fill.yjs:SolidColorFill.color": {key: "strokeColor", mod: "color"},
+				//"lineCap": "", //??
+				"thickness.sys:Double": "strokeWidth",
+				"thickness": "strokeWidth",
+			},
+			"targetArrow.yjs:Arrow": {
+				"defaults" : 
+				{
+					"endArrow": "classic",
+					"endFill": "1",
+					"endSize": "6"
+				},
+//				cropLength: "", //??
+				"fill": endArrowFill,
+				"scale": {key: "endSize", mod: "scale", scale: 5},
+//				stroke: "", //?
+				"type": {key: "endArrow", mod: "arrow"}
+			},
+			"sourceArrow.yjs:Arrow": {
+//				cropLength: "", //??
+				"fill": startArrowFill,
+				"scale": {key: "startSize", mod: "scale", scale: 5},
+//				stroke: "", //?
+				"type": {key: "startArrow", mod: "arrow"}
+			}
+		}
+	}, styleMap);
 };
 
 mxGraphMlCodec.prototype.addLabels = function (node, LblObj, nodeStyle) 
@@ -521,7 +1021,7 @@ mxGraphMlCodec.prototype.addLabels = function (node, LblObj, nodeStyle)
 		for (var i = 0; i < lblList.length; i++)
 		{
 			var lbl = lblList[i];
-			console.log(lbl);
+//			console.log(lbl);
 			var styleMap = {};
 			var txt = lbl[mxGraphMlConstants.TEXT];
 			
@@ -670,12 +1170,127 @@ mxGraphMlCodec.prototype.getDirectFirstChildElement = function (parent) {
     return null;
 };
 
+var mxGraphMlArrowsMap =
+{
+	"SIMPLE": "open",
+	"TRIANGLE": "block",
+	"DIAMOND": "diamond",
+	"CIRCLE": "oval",
+	"CROSS": "cross",
+	"SHORT": "classicThin",
+	
+};
+
 var mxGraphMlShapesMap =
 {
 	"STAR5": "mxgraph.basic.star;flipV=1", //TODO This is not close enough!
+	"STAR6": "mxgraph.basic.6_point_star;rotation=30", //TODO requires rotation!
+	"STAR8": "mxgraph.basic.8_point_star",
 	"SHEARED_RECTANGLE": "parallelogram",
+	"SHEARED_RECTANGLE2": "parallelogram;flipH=1",
 	"HEXAGON": "hexagon",
-	"ELLIPSE": "ellipse"
+	"OCTAGON": "mxgraph.basic.octagon",
+	"ELLIPSE": "ellipse",
+	"ROUND_RECTANGLE": "rect;rounded=1;arcSize=30",
+	"DIAMOND": "rhombus",
+	"FAT_ARROW": "step;perimeter=stepPerimeter",
+	"FAT_ARROW2": "step;perimeter=stepPerimeter;flipH=1",
+	"TRAPEZ": "trapezoid;perimeter=trapezoidPerimeter;flipV=1",
+	"TRAPEZ2": "trapezoid;perimeter=trapezoidPerimeter",
+	"TRIANGLE": "triangle;rotation=270", //TODO requires rotation!
+	"TRIANGLE2": "triangle;rotation=90", //TODO requires rotation!
+	//flowchart
+	"process": "mxgraph.flowchart.process",
+	"decision": "mxgraph.flowchart.decision",
+	"start1": "mxgraph.flowchart.start_1",
+	"start2": "mxgraph.flowchart.start_2;aspect=fixed",
+	"terminator": "mxgraph.flowchart.terminator",
+	"cloud": "cloud",
+	"data": "mxgraph.flowchart.data",
+	"directData": "mxgraph.flowchart.direct_data",
+	"dataBase": "mxgraph.flowchart.database",
+	"document": "mxgraph.flowchart.document",
+	"predefinedProcess": "mxgraph.flowchart.predefined_process",
+	"storedData": "mxgraph.flowchart.stored_data",
+	"internalStorage": "mxgraph.flowchart.internal_storage",
+	"sequentialData": "mxgraph.flowchart.sequential_data;aspect=fixed",
+	"manualInput": "mxgraph.flowchart.manual_input",
+	"card": "card;size=10",
+	"paperType": "mxgraph.flowchart.paper_tape",
+	"delay": "mxgraph.flowchart.delay",
+	"display": "mxgraph.flowchart.display",
+	"manualOperation": "mxgraph.flowchart.manual_operation",
+	"preparation": "mxgraph.flowchart.preparation",
+	"loopLimit": "mxgraph.flowchart.loop_limit",
+	"loopLimitEnd": "mxgraph.flowchart.loop_limit;flipV=1",
+	"onPageReference": "mxgraph.flowchart.on-page_reference;aspect=fixed",
+	"offPageReference": "mxgraph.flowchart.off-page_reference",
+	"annotation": "mxgraph.flowchart.annotation_1", //TODO not similar!
+	"userMessage": "mxgraph.arrows2.arrow;dy=0;dx=10;notch=0", //TODO requires rotation!
+	"networkMessage": "mxgraph.arrows2.arrow;dy=0;dx=0;notch=10",
+	//icons (network)
+	"database.svg": "mxgraph.networks.storage", //TODO not similar!
+	"laptop.svg": "mxgraph.networks.laptop",//TODO not similar!
+	"server.svg": "mxgraph.networks.server",//TODO not similar!
+	"smartphone.svg": "mxgraph.networks.mobile",//TODO not similar! //TODO fixed aspect ratio
+	"switch.svg": "mxgraph.networks.switch",//TODO not similar! //TODO fixed aspect ratio
+	"wlan.svg": "mxgraph.networks.wireless_hub",//TODO not similar!
+	"workstation.svg": "mxgraph.networks.pc",//TODO not similar!
+	//bpmn
+	"TRANSACTION": "ext;double=1;rounded=1",
+	"SUB_PROCESS": "ext;rounded=1",
+	"CALL_ACTIVITY": "ext;rounded=1;strokeWidth=3",
+	//TODO two colors for stroke!
+	"EXCLUSIVE_WITH_MARKER": "mxgraph.bpmn.shape;perimeter=rhombusPerimeter;background=gateway;outline=none;symbol=exclusiveGw",  
+	"EVENT_BASED": "mxgraph.bpmn.shape;perimeter=rhombusPerimeter;background=gateway;outline=boundInt;symbol=multiple", 
+	"PARALLEL": "mxgraph.bpmn.shape;perimeter=rhombusPerimeter;background=gateway;outline=none;symbol=parallelGw",
+	"INCLUSIVE": "mxgraph.bpmn.shape;perimeter=rhombusPerimeter;background=gateway;outline=end;symbol=general",
+	"COMPLEX": "mxgraph.bpmn.shape;perimeter=rhombusPerimeter;background=gateway;outline=none;symbol=complexGw",
+	"EXCLUSIVE_EVENT_BASED": "mxgraph.bpmn.shape;perimeter=rhombusPerimeter;background=gateway;outline=standard;symbol=multiple", 
+	"PARALLEL_EVENT_BASED": "mxgraph.bpmn.shape;perimeter=rhombusPerimeter;background=gateway;outline=standard;symbol=parallelMultiple",
+	//hexagon
+	"CALLING_GLOBAL_CONVERSATION": "hexagon;strokeWidth=4",
+	//mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=general
+	"MESSAGE": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=message",
+	"TIMER": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=timer",
+	"ESCALATION": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=escalation",
+	"CONDITIONAL": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=conditional",
+	"LINK": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=link",
+	"ERROR": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=error",
+	"CANCEL": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=cancel",
+	"COMPENSATION": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=compensation",
+	"SIGNAL": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=signal",
+	"MULTIPLE": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=multiple",
+	"PARALLEL_MULTIPLE": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=parallelMultiple",
+	"TERMINATE": "mxgraph.bpmn.shape;perimeter=ellipsePerimeter;symbol=terminate",
+	bpmnOutline: {
+		"SUB_PROCESS_INTERRUPTING": "eventInt",
+		"SUB_PROCESS_NON_INTERRUPTING": "eventNonint",
+		"CATCHING": "catching",
+		"BOUNDARY_INTERRUPTING": "boundInt",
+		"BOUNDARY_NON_INTERRUPTING": "boundNonint",
+		"THROWING": "throwing",
+		"END": "end",
+		"CATCHING": "catching"
+	},
+	//Male/Female icons (FIXME Not similar and unsafe as it refers to remote resources)
+	"usericon_female1.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/100/female1-128.png",
+	"usericon_female2.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/100/female1-128.png",
+	"usericon_female3.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/100/female1-128.png",
+	"usericon_female4.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/100/female1-128.png",
+	"usericon_female5.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/100/female1-128.png",
+	"usericon_male1.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/101/malecostume-128.png",
+	"usericon_male2.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/101/malecostume-128.png",
+	"usericon_male3.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/101/malecostume-128.png",
+	"usericon_male4.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/101/malecostume-128.png",
+	"usericon_male5.svg": "image;image=https://cdn1.iconfinder.com/data/icons/user-pictures/101/malecostume-128.png",
+	"": "",
+	"": "",
+	"": "",
+	"": "",
+	"": "",
+	"": "",
+	"": ""
 };
 
 var mxGraphMlConstants =

+ 64 - 357
war/js/diagramly/sidebar/Sidebar-AWS3.js

@@ -8,6 +8,7 @@
 		this.addAWS3ArtificialIntelligencePalette();
 		this.addAWS3BusinessProductivityPalette();
 		this.addAWS3ComputePalette();
+		this.addAWS3ContactCenterPalette();
 		this.addAWS3DatabasePalette();
 		this.addAWS3DesktopAndAppStreamingPalette();
 		this.addAWS3DeveloperToolsPalette();
@@ -64,6 +65,8 @@
 					 s * 55, s * 40, '', 'EMR engine MapR M5', null, null, this.getTagsForStencil(gn, 'emr engine MapR M5', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'emr_engine_mapr_m7;fillColor=#F58534;gradientColor=none;',
 					 s * 55, s * 40, '', 'EMR engine MapR M7', null, null, this.getTagsForStencil(gn, 'emr engine MapR M7', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'glue;fillColor=#F58534;gradientColor=none;',
+					 s * 55, s * 66, '', 'Glue', null, null, this.getTagsForStencil(gn, 'glue', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'hdfs_cluster;fillColor=#F58534;gradientColor=none;',
 					 s * 41, s * 42, '', 'HDFS Cluster', null, null, this.getTagsForStencil(gn, 'hdfs Cluster', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'kinesis_analytics;fillColor=#F58534;gradientColor=none;',
@@ -95,8 +98,6 @@
 					 s * 51, s * 62, '', 'Elastic Transcoder', null, null, this.getTagsForStencil(gn, 'elastic transcoder', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'api_gateway;fillColor=#D9A741;gradientColor=none;',
 					 s * 51, s * 62, '', 'API Gateway', null, null, this.getTagsForStencil(gn, 'api gateway', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'appstream;fillColor=#D9A741;gradientColor=none;',
-					 s * 51, s * 62, '', 'AppStream', null, null, this.getTagsForStencil(gn, 'appstream', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'step_functions;fillColor=#D9A741;gradientColor=none;',
 					 s * 51, s * 62, '', 'Step Functions', null, null, this.getTagsForStencil(gn, 'step functions', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'swf;fillColor=#D9A741;gradientColor=none;',
@@ -139,10 +140,12 @@
 		
 		this.addPaletteFunctions('aws3Business Productivity', 'AWS / Business Productivity', false,
 		[
-			 this.createVertexTemplateEntry(n + 'workmail;fillColor=#D16A28;gradientColor=#F58435;gradientDirection=north;',
-					 s * 55, s * 63, '', 'WorkMail', null, null, this.getTagsForStencil(gn, 'workmail work mail', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'chime;fillColor=#03B5BB;gradientColor=none;',
+					 s * 66, s * 66, '', 'Chime', null, null, this.getTagsForStencil(gn, 'chime', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'workdocs;fillColor=#D16A28;gradientColor=#F58435;gradientDirection=north;',
-					 s * 55, s * 63, '', 'WorkDocs', null, null, this.getTagsForStencil(gn, 'workdocs work docs documents', dt).join(' '))
+					 s * 55, s * 63, '', 'WorkDocs', null, null, this.getTagsForStencil(gn, 'workdocs work docs documents', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'workmail;fillColor=#D16A28;gradientColor=#F58435;gradientDirection=north;',
+					 s * 55, s * 63, '', 'WorkMail', null, null, this.getTagsForStencil(gn, 'workmail work mail', dt).join(' '))
 		]);
 	};
 	
@@ -197,6 +200,8 @@
 					 s * 50, s * 60, '', 'Elastic Network Adapter', null, null, this.getTagsForStencil(gn, 'elastic network adapter', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'optimized_instance;fillColor=#F58534;gradientColor=none;',
 					 s * 40, s * 42, '', 'Optimized Instance', null, null, this.getTagsForStencil(gn, 'optimized instance', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'rescue;fillColor=#F58534;gradientColor=none;',
+					 s * 42, s * 44, '', 'Rescue', null, null, this.getTagsForStencil(gn, 'rescue', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'spot_instance;fillColor=#F58534;gradientColor=none;',
 					 s * 40, s * 42, '', 'Spot Instance', null, null, this.getTagsForStencil(gn, 'spot instance', dt).join(' ')),
 					 
@@ -238,6 +243,8 @@
 					 s * 46, s * 48, '', 'Router', null, null, this.getTagsForStencil(gn, 'router', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'vpc;fillColor=#F58534;gradientColor=none;',
 					 s * 45, s * 54, '', 'VPC', null, null, this.getTagsForStencil(gn, 'vpc virtual private cloud', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'network_access_controllist;fillColor=#F58534;gradientColor=none;',
+					 s * 46, s * 48, '', 'Network Access Controllist', null, null, this.getTagsForStencil(gn, 'network access controllist', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'lambda_function;fillColor=#F58534;gradientColor=none;',
 					 s * 46, s * 48, '', 'Lambda Function', null, null, this.getTagsForStencil(gn, 'lambda function', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'classic_load_balancer;fillColor=#F58534;gradientColor=none;',
@@ -249,6 +256,21 @@
 		]);
 	};
 	
+	Sidebar.prototype.addAWS3ContactCenterPalette = function()
+	{
+		var sb = this;
+		var n = 'dashed=0;html=1;' + mxConstants.STYLE_SHAPE + "=mxgraph.aws3.";
+		var gn = 'mxgraph.aws3';
+		var dt = 'aws group amazon web service contact center';
+		var s = 1.5; //scale
+		
+		this.addPaletteFunctions('aws3Contact Center', 'AWS / Contact Center', false,
+		[
+			 this.createVertexTemplateEntry(n + 'connect;fillColor=#759C3E;gradientColor=none;',
+					 s * 60, s * 46, '', 'Connect', null, null, this.getTagsForStencil(gn, 'connect', dt).join(' '))
+		]);
+	};
+	
 	Sidebar.prototype.addAWS3DatabasePalette = function()
 	{
 		var sb = this;
@@ -287,6 +309,8 @@
 					 s * 45, s * 44, '', 'Global Secondary Index', null, null, this.getTagsForStencil(gn, 'global secondary index', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'items;fillColor=#2E73B8;gradientColor=none;',
 					 s * 42, s * 44, '', 'Items', null, null, this.getTagsForStencil(gn, 'items', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'db_accelerator;fillColor=#2E73B8;gradientColor=none;',
+					 s * 48, s * 54, '', 'DB Accelerator', null, null, this.getTagsForStencil(gn, 'db database accelerator', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'table;fillColor=#2E73B8;gradientColor=none;',
 					 s * 45, s * 44, '', 'Table', null, null, this.getTagsForStencil(gn, 'table', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'memcached;fillColor=#2E73B8;gradientColor=none;',
@@ -332,10 +356,10 @@
 		
 		this.addPaletteFunctions('aws3Desktop and App Streaming', 'AWS / Desktop and App Streaming', false,
 		[
-			 this.createVertexTemplateEntry(n + 'workmail;fillColor=#D16A28;gradientColor=#F58435;gradientDirection=north;',
-					 s * 55, s * 63, '', 'WorkMail', null, null, this.getTagsForStencil(gn, 'workmail work mail', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'appstream;fillColor=#D9A741;gradientColor=none;',
-					 s * 51, s * 62, '', 'AppStream', null, null, this.getTagsForStencil(gn, 'appstream', dt).join(' '))
+					 s * 51, s * 62, '', 'AppStream', null, null, this.getTagsForStencil(gn, 'appstream', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'workspaces;fillColor=#D16A28;gradientColor=#F58435;gradientDirection=north;',
+					 s * 55, s * 63, '', 'WorkSpaces', null, null, this.getTagsForStencil(gn, 'workspaces work spaces', dt).join(' '))
 		]);
 	};
 	
@@ -355,355 +379,12 @@
 					 s * 45, s * 54, '', 'CodeDeploy', null, null, this.getTagsForStencil(gn, 'codedeploy code deploy', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'codepipeline;fillColor=#759C3E;gradientColor=none;',
 					 s * 45, s * 54, '', 'CodePipeline', null, null, this.getTagsForStencil(gn, 'codepipeline code pipeline', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'codestar;fillColor=#759C3E;gradientColor=none;',
+					 s * 45, s * 54, '', 'CodeStar', null, null, this.getTagsForStencil(gn, 'codestar code star', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'codebuild;fillColor=#759C3E;gradientColor=none;',
 					 s * 51, s * 62, '', 'CodeBuild', null, null, this.getTagsForStencil(gn, 'codebuild code build', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'x_ray;fillColor=#759C3E;gradientColor=none;',
-					 s * 51, s * 57, '', 'X-Ray', null, null, this.getTagsForStencil(gn, 'x ray', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'gamelift;fillColor=#AD688B;gradientColor=none;',
-					 s * 47, s * 57, '', 'GameLift', null, null, this.getTagsForStencil(gn, 'gamelift game lift', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'management_console;fillColor=#F58534;gradientColor=none;',
-					 s * 42, s * 42, '', 'Management Console', null, null, this.getTagsForStencil(gn, 'management console', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'cloud;fillColor=#F58534;gradientColor=none;',
-					 s * 53, s * 35, '', 'Cloud', null, null, this.getTagsForStencil(gn, 'cloud', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'forums;fillColor=#F58534;gradientColor=none;',
-					 s * 57, s * 55, '', 'Forums', null, null, this.getTagsForStencil(gn, 'forums', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'virtual_private_cloud;fillColor=#F58534;gradientColor=none;',
-					 s * 53, s * 35, '', 'Virtual Private Cloud', null, null, this.getTagsForStencil(gn, 'virtual private cloud vpc', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'management_console;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 42, s * 42, '', 'Client', null, null, this.getTagsForStencil(gn, 'client', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'mobile_client;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 27, s * 42, '', 'Mobile Client', null, null, this.getTagsForStencil(gn, 'mobile client', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'multimedia;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 44, s * 42, '', 'Multimedia', null, null, this.getTagsForStencil(gn, 'multimedia', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'user;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 30, s * 42, '', 'User', null, null, this.getTagsForStencil(gn, 'user', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'users;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 44, s * 42, '', 'Users', null, null, this.getTagsForStencil(gn, 'users', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'tape_storage;fillColor=#7D7C7C;gradientColor=none;',
-					 s * 50, s * 25, '', 'Tape Storage', null, null, this.getTagsForStencil(gn, 'tape storage', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'corporate_data_center;fillColor=#7D7C7C;gradientColor=none;',
-					 s * 31, s * 42, '', 'Corporate Data Center', null, null, this.getTagsForStencil(gn, 'corporate data center', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'traditional_server;fillColor=#7D7C7C;gradientColor=none;',
-					 s * 31, s * 42, '', 'Traditional Server', null, null, this.getTagsForStencil(gn, 'traditional server', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'disk;fillColor=#7D7C7C;gradientColor=none;',
-					 s * 41, s * 43, '', 'Disk', null, null, this.getTagsForStencil(gn, 'disk', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'generic_database;fillColor=#7D7C7C;gradientColor=none;',
-					 s * 33, s * 43, '', 'Generic Database', null, null, this.getTagsForStencil(gn, 'generic database', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'internet;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 53, s * 53, '', 'Internet', null, null, this.getTagsForStencil(gn, 'internet', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'internet_2;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 53, s * 36, '', 'Internet', null, null, this.getTagsForStencil(gn, 'internet', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'internet_3;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 53, s * 36, '', 'Internet', null, null, this.getTagsForStencil(gn, 'internet', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'office_building;fillColor=#7D7C7C;gradientColor=none;',
-					 s * 22, s * 53, '', 'Office Building', null, null, this.getTagsForStencil(gn, 'office building', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'saml_token;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 46, s * 48, '', 'SAML Token', null, null, this.getTagsForStencil(gn, 'saml token', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'ssl_padlock;fillColor=#D2D3D3;gradientColor=none;',
-					 s * 42, s * 52, '', 'SSL Padlock', null, null, this.getTagsForStencil(gn, 'ssl padlock', dt).join(' ')),
-			 this.createVertexTemplateEntry('rounded=1;arcSize=10;dashed=1;strokeColor=#000000;fillColor=none;gradientColor=none;dashPattern=8 3 1 3;strokeWidth=2;',
-					 s * 133, s * 133, '', 'Auto Scaling Group', null, null, this.getTagsForStencil(gn, 'auto scaling group', dt).join(' ')),
-			 this.createVertexTemplateEntry('rounded=1;arcSize=10;dashed=1;strokeColor=#F59D56;fillColor=none;gradientColor=none;dashPattern=8 4;strokeWidth=2;',
-					 s * 133, s * 133, '', 'Availability Zone', null, null, this.getTagsForStencil(gn, 'availability zone', dt).join(' ')),
-			 this.createVertexTemplateEntry('rounded=1;arcSize=10;dashed=1;strokeColor=#000000;fillColor=none;gradientColor=none;dashPattern=1 1;strokeWidth=2;',
-					 s * 133, s * 133, '', 'Region', null, null, this.getTagsForStencil(gn, 'region', dt).join(' ')),
-			 this.createVertexTemplateEntry('rounded=1;arcSize=10;dashed=1;strokeColor=#ff0000;fillColor=none;gradientColor=none;dashPattern=8 4;strokeWidth=2;',
-					 s * 133, s * 133, '', 'Security Group', null, null, this.getTagsForStencil(gn, 'security group', dt).join(' ')),
-					 
-  			 this.addEntry(dt + 'elastic beanstalk container', function()
-			 {
-				var bg1 = new mxCell('', new mxGeometry(0, 20, 200, 200), 'rounded=1;arcSize=10;dashed=0;strokeColor=#000000;fillColor=none;gradientColor=none;strokeWidth=2;');
-				bg1.vertex = true;
-				var bg2 = new mxCell('', new mxGeometry(20, 0, 30, 41), n + 'elastic_beanstalk;fillColor=#F58536;gradientColor=none;dashed=0;');
-				bg2.vertex = true;
-			    
-			   	return sb.createVertexTemplateFromCells([bg1, bg2], 200, 220, 'Elastic Beanstalk Container');
-			 }),
-			 
-  			 this.addEntry(dt + 'ec2 instance container', function()
-			 {
-				var bg1 = new mxCell('', new mxGeometry(0, 20, 200, 200), 'rounded=1;arcSize=10;dashed=0;strokeColor=#000000;fillColor=none;gradientColor=none;strokeWidth=2;');
-				bg1.vertex = true;
-				var bg2 = new mxCell('', new mxGeometry(20, 0, 40, 41), n + 'instance;fillColor=#F58536;gradientColor=none;dashed=0;');
-				bg2.vertex = true;
-			    
-			   	return sb.createVertexTemplateFromCells([bg1, bg2], 200, 220, 'EC2 Instance Container');
-			 }),
-
-  			 this.addEntry(dt + 'vpc subnet', function()
-			 {
-				var bg1 = new mxCell('', new mxGeometry(0, 20, 200, 200), 'rounded=1;arcSize=10;dashed=0;strokeColor=#000000;fillColor=none;gradientColor=none;strokeWidth=2;');
-				bg1.vertex = true;
-				var bg2 = new mxCell('', new mxGeometry(20, 0, 30, 35), n + 'permissions;fillColor=#D9A741;gradientColor=none;dashed=0;');
-				bg2.vertex = true;
-			    
-			   	return sb.createVertexTemplateFromCells([bg1, bg2], 200, 220, 'VPC Subnet');
-			 }),
-			 
-			 this.createVertexTemplateEntry('rounded=1;arcSize=10;strokeColor=none;fillColor=#DBDBDB;gradientColor=none;',
-					 s * 133, s * 133, '', 'Server Contents', null, null, this.getTagsForStencil(gn, 'server contents', dt).join(' ')),
-			 
-  			 this.addEntry(dt + 'virtual private cloud', function()
-			 {
-				var bg1 = new mxCell('', new mxGeometry(0, 20, 200, 200), 'rounded=1;arcSize=10;dashed=0;strokeColor=#000000;fillColor=none;gradientColor=none;strokeWidth=2;');
-				bg1.vertex = true;
-				var bg2 = new mxCell('', new mxGeometry(20, 0, 52, 36), n + 'virtual_private_cloud;fillColor=#F58536;gradientColor=none;dashed=0;');
-				bg2.vertex = true;
-			    
-			   	return sb.createVertexTemplateFromCells([bg1, bg2], 200, 220, 'Virtual Private Cloud');
-			 }),
-
-  			 this.addEntry(dt + 'cloud', function()
-			 {
-				var bg1 = new mxCell('', new mxGeometry(0, 20, 200, 200), 'rounded=1;arcSize=10;dashed=0;strokeColor=#000000;fillColor=none;gradientColor=none;strokeWidth=2;');
-				bg1.vertex = true;
-				var bg2 = new mxCell('', new mxGeometry(20, 0, 52, 36), n + 'cloud;fillColor=#F58536;gradientColor=none;dashed=0;');
-				bg2.vertex = true;
-			    
-			   	return sb.createVertexTemplateFromCells([bg1, bg2], 200, 220, 'AWS Cloud');
-			 }),
-			 
-  			 this.addEntry(dt + 'corporate data center', function()
-			 {
-				var bg1 = new mxCell('', new mxGeometry(0, 20, 200, 200), 'rounded=1;arcSize=10;dashed=0;strokeColor=#000000;fillColor=none;gradientColor=none;strokeWidth=2;');
-				bg1.vertex = true;
-				var bg2 = new mxCell('', new mxGeometry(20, 0, 30, 42), n + 'corporate_data_center;fillColor=#7D7C7C;gradientColor=none;dashed=0;');
-				bg2.vertex = true;
-			    
-			   	return sb.createVertexTemplateFromCells([bg1, bg2], 200, 220, 'Corporate Data Center');
-			 }),
-			 
-			 
-			 this.createVertexTemplateEntry(n + 'aws_iot;fillColor=#5294CF;gradientColor=none;',
-					 s * 45, s * 54, '', 'AWS IoT', null, null, this.getTagsForStencil(gn, 'iot internet of things', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'greengrass;fillColor=#5294CF;gradientColor=none;',
-					 s * 51, s * 62, '', 'Greengrass', null, null, this.getTagsForStencil(gn, 'greengrass', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'action;fillColor=#5294CF;gradientColor=none;',
-					 s * 42, s * 43, '', 'Action', null, null, this.getTagsForStencil(gn, 'action', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'actuator;fillColor=#5294CF;gradientColor=none;',
-					 s * 51, s * 60, '', 'Actuator', null, null, this.getTagsForStencil(gn, 'actuator', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'certificate;fillColor=#5294CF;gradientColor=none;',
-					 s * 42, s * 57, '', 'Certificate', null, null, this.getTagsForStencil(gn, 'certificate', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'desired_state;fillColor=#5294CF;gradientColor=none;',
-					 s * 40, s * 42, '', 'Desired State', null, null, this.getTagsForStencil(gn, 'desired state', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'hardware_board;fillColor=#5294CF;gradientColor=none;',
-					 s * 56, s * 67, '', 'Hardware Board', null, null, this.getTagsForStencil(gn, 'hardware board', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'http_protocol;fillColor=#5294CF;gradientColor=none;',
-					 s * 42, s * 44, '', 'HTTP Protocol', null, null, this.getTagsForStencil(gn, 'http protocol', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'http_2_protocol;fillColor=#5294CF;gradientColor=none;',
-					 s * 42, s * 44, '', 'HTTP/2 Protocol', null, null, this.getTagsForStencil(gn, 'http 2 protocol', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'mqtt_protocol;fillColor=#5294CF;gradientColor=none;',
-					 s * 42, s * 44, '', 'MQTT Protocol', null, null, this.getTagsForStencil(gn, 'mqtt protocol', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'policy;fillColor=#5294CF;gradientColor=none;',
-					 s * 37, s * 60, '', 'Policy', null, null, this.getTagsForStencil(gn, 'policy', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'reported_state;fillColor=#5294CF;gradientColor=none;',
-					 s * 40, s * 42, '', 'Reported State', null, null, this.getTagsForStencil(gn, 'reported state', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'rule;fillColor=#5294CF;gradientColor=none;',
-					 s * 33, s * 66, '', 'Rule', null, null, this.getTagsForStencil(gn, 'rule', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'sensor;fillColor=#5294CF;gradientColor=none;',
-					 s * 51, s * 60, '', 'Sensor', null, null, this.getTagsForStencil(gn, 'sensor', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'servo;fillColor=#5294CF;gradientColor=none;',
-					 s * 56, s * 40, '', 'Servo', null, null, this.getTagsForStencil(gn, 'servo', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'shadow;fillColor=#5294CF;gradientColor=none;',
-					 s * 57, s * 61, '', 'Shadow', null, null, this.getTagsForStencil(gn, 'shadow', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'simulator;fillColor=#5294CF;gradientColor=none;',
-					 s * 50, s * 52, '', 'Simulator', null, null, this.getTagsForStencil(gn, 'simulator', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'topic;fillColor=#5294CF;gradientColor=none;',
-					 s * 33, s * 44, '', 'Topic', null, null, this.getTagsForStencil(gn, 'topic', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'bank;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Bank', null, null, this.getTagsForStencil(gn, 'bank', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'bicycle;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Bicycle', null, null, this.getTagsForStencil(gn, 'bicycle', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'camera;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Camera', null, null, this.getTagsForStencil(gn, 'camera', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'utility;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Utility', null, null, this.getTagsForStencil(gn, 'utility', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'cart;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Cart', null, null, this.getTagsForStencil(gn, 'cart', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'car;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Car', null, null, this.getTagsForStencil(gn, 'car', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'windfarm;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Windfarm', null, null, this.getTagsForStencil(gn, 'windfarm', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'house;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'House', null, null, this.getTagsForStencil(gn, 'house', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'generic;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Generic', null, null, this.getTagsForStencil(gn, 'generic', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'factory;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Factory', null, null, this.getTagsForStencil(gn, 'factory', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'coffee_pot;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Coffee Pot', null, null, this.getTagsForStencil(gn, 'coffee pot', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'door_lock;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Door Lock', null, null, this.getTagsForStencil(gn, 'door lock', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'lightbulb;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Lightbulb', null, null, this.getTagsForStencil(gn, 'lightbulb', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'medical_emergency;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Medical Emergency', null, null, this.getTagsForStencil(gn, 'medical emergency', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'police_emergency;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Police Emergency', null, null, this.getTagsForStencil(gn, 'police emergency', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'thermostat;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Thermostat', null, null, this.getTagsForStencil(gn, 'thermostat', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'travel;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Travel', null, null, this.getTagsForStencil(gn, 'travel', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'echo;fillColor=#205B99;gradientColor=none;',
-					 s * 27, s * 62, '', 'Echo', null, null, this.getTagsForStencil(gn, 'echo', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'alexa_skill;fillColor=#5294CF;gradientColor=none;',
-					 s * 40, s * 42, '', 'Alexa Skill', null, null, this.getTagsForStencil(gn, 'alexa skill', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'alexa_smart_home_skill;fillColor=#5294CF;gradientColor=none;',
-					 s * 60, s * 47, '', 'Alexa Smart Home Skill', null, null, this.getTagsForStencil(gn, 'alexa smart home skill', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'alexa_voice_service;fillColor=#5294CF;gradientColor=none;',
-					 s * 40, s * 42, '', 'Alexa Voice Service', null, null, this.getTagsForStencil(gn, 'alexa voice service', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'alexa_enabled_device;fillColor=#5294CF;gradientColor=none;',
-					 s * 53, s * 53, '', 'Alexa Enabled Device', null, null, this.getTagsForStencil(gn, 'alexa enabled device', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'lambda_function_2;fillColor=#5294CF;gradientColor=none;',
-					 s * 40, s * 42, '', 'Lambda Function', null, null, this.getTagsForStencil(gn, 'lambda function', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'fire_tv;fillColor=#5294CF;gradientColor=none;',
-					 s * 50, s * 37, '', 'Fire TV', null, null, this.getTagsForStencil(gn, 'fire tv', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'fire_tv_stick;fillColor=#5294CF;gradientColor=none;',
-					 s * 57, s * 22, '', 'Fire TV Stick', null, null, this.getTagsForStencil(gn, 'fire tv stick', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'cloudwatch;fillColor=#759C3E;gradientColor=none;',
-					 s * 55, s * 62, '', 'CloudWatch', null, null, this.getTagsForStencil(gn, 'cloudwatch cloud watch', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'application_discovery_service;fillColor=#759C3E;gradientColor=none;',
-					 s * 51, s * 62, '', 'Application Discovery Service', null, null, this.getTagsForStencil(gn, 'application discovery service', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'cloudformation;fillColor=#759C3E;gradientColor=none;',
-					 s * 51, s * 62, '', 'CloudFormation', null, null, this.getTagsForStencil(gn, 'cloudformation cloud formation', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'cloudtrail;fillColor=#759C3E;gradientColor=none;',
-					 s * 51, s * 62, '', 'CloudTrail', null, null, this.getTagsForStencil(gn, 'cloudtrail cloud trail', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'config;fillColor=#759C3E;gradientColor=none;',
-					 s * 51, s * 62, '', 'Config', null, null, this.getTagsForStencil(gn, 'config', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'managed_services;fillColor=#759C3E;gradientColor=none;',
-					 s * 51, s * 62, '', 'Managed Services', null, null, this.getTagsForStencil(gn, 'managed services', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'opsworks;fillColor=#759C3E;gradientColor=none;',
-					 s * 51, s * 62, '', 'OpsWorks', null, null, this.getTagsForStencil(gn, 'opsworks ops works', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'service_catalog;fillColor=#759C3E;gradientColor=none;',
-					 s * 51, s * 62, '', 'Service Catalog', null, null, this.getTagsForStencil(gn, 'service catalog', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'trusted_advisor;fillColor=#759C3E;gradientColor=none;',
-					 s * 45, s * 54, '', 'Trusted Advisor', null, null, this.getTagsForStencil(gn, 'trusted advisor', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'alarm;fillColor=#759C3E;gradientColor=none;',
-					 s * 36, s * 44, '', 'Alarm', null, null, this.getTagsForStencil(gn, 'alarm', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'event_time_based;fillColor=#759C3E;gradientColor=none;',
-					 s * 42, s * 55, '', 'Event (Time Based)', null, null, this.getTagsForStencil(gn, 'event time based', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'event_event_based;fillColor=#759C3E;gradientColor=none;',
-					 s * 40, s * 55, '', 'Event (Event Based)', null, null, this.getTagsForStencil(gn, 'event based', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'config_rule;fillColor=#759C3E;gradientColor=none;',
-					 s * 37, s * 48, '', 'Config Rule', null, null, this.getTagsForStencil(gn, 'config rule', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'stack_aws_cloudformation;fillColor=#759C3E;gradientColor=none;',
-					 s * 49, s * 39, '', 'Stack AWS CloudFormation', null, null, this.getTagsForStencil(gn, 'stack cloudformation cloud formation', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'change_set;fillColor=#759C3E;gradientColor=none;',
-					 s * 37, s * 43, '', 'Change Set', null, null, this.getTagsForStencil(gn, 'change set', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'template;fillColor=#759C3E;gradientColor=none;',
-					 s * 37, s * 43, '', 'Template', null, null, this.getTagsForStencil(gn, 'template', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'apps;fillColor=#759C3E;gradientColor=none;',
-					 s * 54, s * 53, '', 'Apps', null, null, this.getTagsForStencil(gn, 'apps', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'deployments;fillColor=#759C3E;gradientColor=none;',
-					 s * 54, s * 51, '', 'Deployments', null, null, this.getTagsForStencil(gn, 'deployments', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'instances_2;fillColor=#759C3E;gradientColor=none;',
-					 s * 54, s * 54, '', 'Instances', null, null, this.getTagsForStencil(gn, 'instances', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'layers;fillColor=#759C3E;gradientColor=none;',
-					 s * 54, s * 53, '', 'Layers', null, null, this.getTagsForStencil(gn, 'layers', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'monitoring;fillColor=#759C3E;gradientColor=none;',
-					 s * 54, s * 45, '', 'Monitoring', null, null, this.getTagsForStencil(gn, 'monitoring', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'permissions;fillColor=#759C3E;gradientColor=none;',
-					 s * 45, s * 53, '', 'Permissions', null, null, this.getTagsForStencil(gn, 'permissions', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'resources;fillColor=#759C3E;gradientColor=none;',
-					 s * 45, s * 53, '', 'Resources', null, null, this.getTagsForStencil(gn, 'resources', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'stack_aws_opsworks;fillColor=#759C3E;gradientColor=none;',
-					 s * 53, s * 53, '', 'Stack AWS OpsWorks', null, null, this.getTagsForStencil(gn, 'stack opsworks ops works', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'checklist;fillColor=#759C3E;gradientColor=none;',
-					 s * 37, s * 43, '', 'Checklist', null, null, this.getTagsForStencil(gn, 'checklist', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'checklist_cost;fillColor=#759C3E;gradientColor=none;',
-					 s * 45, s * 50, '', 'Checklist Cost', null, null, this.getTagsForStencil(gn, 'checklist cost', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'checklist_fault_tolerance;fillColor=#759C3E;gradientColor=none;',
-					 s * 38, s * 48, '', 'Checklist Fault Tolerance', null, null, this.getTagsForStencil(gn, 'checklist fault tolerance', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'checklist_performance;fillColor=#759C3E;gradientColor=none;',
-					 s * 41, s * 49, '', 'Checklist Performance', null, null, this.getTagsForStencil(gn, 'checklist performance', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'checklist_security;fillColor=#759C3E;gradientColor=none;',
-					 s * 36, s * 46, '', 'Checklist Security', null, null, this.getTagsForStencil(gn, 'checklist security', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'pinpoint;fillColor=#AD688B;gradientColor=none;',
-					 s * 51, s * 58, '', 'Pinpoint', null, null, this.getTagsForStencil(gn, 'pinpoint', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'ses;fillColor=#D9A741;gradientColor=none;',
-					 s * 53, s * 62, '', 'SES', null, null, this.getTagsForStencil(gn, 'ses', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'sns;fillColor=#D9A741;gradientColor=none;',
-					 s * 51, s * 51, '', 'SNS', null, null, this.getTagsForStencil(gn, 'sns', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'sqs;fillColor=#D9A741;gradientColor=none;',
-					 s * 51, s * 62, '', 'SQS', null, null, this.getTagsForStencil(gn, 'sqs', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'swf;fillColor=#D9A741;gradientColor=none;',
-					 s * 51, s * 62, '', 'SWF', null, null, this.getTagsForStencil(gn, 'swf', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'search_documents;fillColor=#D9A741;gradientColor=none;',
-					 s * 40, s * 42, '', 'SDF Metadata', null, null, this.getTagsForStencil(gn, 'sdf metadata', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'email;fillColor=#D9A741;gradientColor=none;',
-					 s * 54, s * 41, '', 'Email', null, null, this.getTagsForStencil(gn, 'email', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'message;fillColor=#D9A741;gradientColor=none;',
-					 s * 28, s * 33, '', 'Message', null, null, this.getTagsForStencil(gn, 'message', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'queue;fillColor=#D9A741;gradientColor=none;',
-					 s * 49, s * 32, '', 'Queue', null, null, this.getTagsForStencil(gn, 'queue', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'decider;fillColor=#D9A741;gradientColor=none;',
-					 s * 41, s * 43, '', 'Decider', null, null, this.getTagsForStencil(gn, 'decider', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'worker;fillColor=#D9A741;gradientColor=none;',
-					 s * 40, s * 42, '', 'Worker', null, null, this.getTagsForStencil(gn, 'worker', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'email_notification;fillColor=#D9A741;gradientColor=none;',
-					 s * 67, s * 42, '', 'Email Notification', null, null, this.getTagsForStencil(gn, 'email notification', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'http_notification;fillColor=#D9A741;gradientColor=none;',
-					 s * 67, s * 42, '', 'HTTP Notification', null, null, this.getTagsForStencil(gn, 'http notification', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'topic_2;fillColor=#D9A741;gradientColor=none;',
-					 s * 62, s * 39, '', 'Topic', null, null, this.getTagsForStencil(gn, 'topic', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'snowball;fillColor=#E05243;gradientColor=none;',
-					 s * 45, s * 54, '', 'Snowball', null, null, this.getTagsForStencil(gn, 'snowball', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'server_migration_service;fillColor=#5294CF;gradientColor=none;',
-					 s * 51, s * 62, '', 'Server Migration Service', null, null, this.getTagsForStencil(gn, 'server migration service', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'import_export;fillColor=#E05243;gradientColor=none;',
-					 s * 43, s * 42, '', 'Import/Export', null, null, this.getTagsForStencil(gn, 'Import Export', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'migration_hub;fillColor=#5294CF;gradientColor=none;',
-					 s * 51, s * 48, '', 'Migration Hub', null, null, this.getTagsForStencil(gn, 'migration hub', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'database_migration_service;fillColor=#5294CF;gradientColor=none;',
-					 s * 48, s * 54, '', 'Database Migration Service', null, null, this.getTagsForStencil(gn, 'database migration service', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'database_migration_workflow_job;fillColor=#5294CF;gradientColor=none;',
-					 s * 31, s * 58, '', 'Database Migration Workflow Job', null, null, this.getTagsForStencil(gn, 'database migration workflow job', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'api_gateway;fillColor=#D9A741;gradientColor=none;',
-					 s * 51, s * 62, '', 'API Gateway', null, null, this.getTagsForStencil(gn, 'api gateway', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'cognito;fillColor=#AD688B;gradientColor=none;',
-					 s * 51, s * 62, '', 'Cognito', null, null, this.getTagsForStencil(gn, 'cognito', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'mobile_analytics;fillColor=#AD688B;gradientColor=none;',
-					 s * 60, s * 62, '', 'Mobile Analytics', null, null, this.getTagsForStencil(gn, 'mobile analytics', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'device_farm;fillColor=#AD688B;gradientColor=none;',
-					 s * 51, s * 62, '', 'Device Farm', null, null, this.getTagsForStencil(gn, 'device farm', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'mobile_hub;fillColor=#AD688A;gradientColor=#F58435;gradientDirection=west;',
-					 s * 50, s * 54, '', 'Mobile Hub', null, null, this.getTagsForStencil(gn, 'mobile hub', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'cloudfront;fillColor=#F58536;gradientColor=none;',
-					 s * 51, s * 62, '', 'CloudFront', null, null, this.getTagsForStencil(gn, 'cloudfront cloud front', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'route_53;fillColor=#F58536;gradientColor=none;',
-					 s * 47, s * 57, '', 'Route 53', null, null, this.getTagsForStencil(gn, 'route 53', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'vpc;fillColor=#F58536;gradientColor=none;',
-					 s * 45, s * 54, '', 'VPC', null, null, this.getTagsForStencil(gn, 'vpc virtual private cloud', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'elastic_load_balancing;fillColor=#F58536;gradientColor=none;',
-					 s * 51, s * 62, '', 'Elastic Load Balancing', null, null, this.getTagsForStencil(gn, 'elastic load balancing', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'direct_connect;fillColor=#F58536;gradientColor=none;',
-					 s * 45, s * 54, '', 'Direct Connect', null, null, this.getTagsForStencil(gn, 'direct connect', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'hosted_zone;fillColor=#F58536;gradientColor=none;',
-					 s * 42, s * 43, '', 'Hosted Zone', null, null, this.getTagsForStencil(gn, 'hosted zone', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'route_table;fillColor=#F58536;gradientColor=none;',
-					 s * 50, s * 46, '', 'Route Table', null, null, this.getTagsForStencil(gn, 'route table', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'customer_gateway;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'Customer Gateway', null, null, this.getTagsForStencil(gn, 'customer gateway', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'endpoints;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'Endpoints', null, null, this.getTagsForStencil(gn, 'endpoints', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'flow_logs;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'Flow Logs', null, null, this.getTagsForStencil(gn, 'flow logs', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'internet_gateway;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'Internet Gateway', null, null, this.getTagsForStencil(gn, 'internet gateway', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'router;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'Router', null, null, this.getTagsForStencil(gn, 'router', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'vpc_nat_gateway;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'VPC NAT Gateway', null, null, this.getTagsForStencil(gn, 'vpc nat gateway virtual private cloud', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'vpc_peering;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'VPC Peering', null, null, this.getTagsForStencil(gn, 'vpc peering', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'vpn_connection;fillColor=#F58536;gradientColor=none;',
-					 s * 39, s * 32, '', 'VPN Connection', null, null, this.getTagsForStencil(gn, 'vpn connection virtual private network', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'vpn_gateway;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'VPN Gateway', null, null, this.getTagsForStencil(gn, 'vpn_gateway', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'el_load_balancer;fillColor=#F58536;gradientColor=none;',
-					 s * 46, s * 48, '', 'EL Load Balancer', null, null, this.getTagsForStencil(gn, 'el load balancer', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'elastic_network_adapter;fillColor=#F58536;gradientColor=none;',
-					 s * 50, s * 60, '', 'Elastic Network Adapter', null, null, this.getTagsForStencil(gn, 'elastic network adapter', dt).join(' '))
+					 s * 51, s * 57, '', 'X-Ray', null, null, this.getTagsForStencil(gn, 'x ray', dt).join(' '))
 		]);
 	};
 	
@@ -887,6 +568,8 @@
 					 s * 42, s * 44, '', 'HTTP Protocol', null, null, this.getTagsForStencil(gn, 'http protocol', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'http_2_protocol;fillColor=#5294CF;gradientColor=none;',
 					 s * 42, s * 44, '', 'HTTP/2 Protocol', null, null, this.getTagsForStencil(gn, 'http 2 protocol', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'lambda_function;fillColor=#5294CF;gradientColor=none;',
+					 s * 40, s * 42, '', 'Lambda Function', null, null, this.getTagsForStencil(gn, 'lambda function', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'mqtt_protocol;fillColor=#5294CF;gradientColor=none;',
 					 s * 42, s * 44, '', 'MQTT Protocol', null, null, this.getTagsForStencil(gn, 'mqtt protocol', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'policy;fillColor=#5294CF;gradientColor=none;',
@@ -949,8 +632,6 @@
 					 s * 40, s * 42, '', 'Alexa Voice Service', null, null, this.getTagsForStencil(gn, 'alexa voice service', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'alexa_enabled_device;fillColor=#5294CF;gradientColor=none;',
 					 s * 53, s * 53, '', 'Alexa Enabled Device', null, null, this.getTagsForStencil(gn, 'alexa enabled device', dt).join(' ')),
-			 this.createVertexTemplateEntry(n + 'lambda_function_2;fillColor=#5294CF;gradientColor=none;',
-					 s * 40, s * 42, '', 'Lambda Function', null, null, this.getTagsForStencil(gn, 'lambda function', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'fire_tv;fillColor=#5294CF;gradientColor=none;',
 					 s * 50, s * 37, '', 'Fire TV', null, null, this.getTagsForStencil(gn, 'fire tv', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'fire_tv_stick;fillColor=#5294CF;gradientColor=none;',
@@ -992,6 +673,24 @@
 					 s * 40, s * 55, '', 'Event (Event Based)', null, null, this.getTagsForStencil(gn, 'event based', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'config_rule;fillColor=#759C3E;gradientColor=none;',
 					 s * 37, s * 48, '', 'Config Rule', null, null, this.getTagsForStencil(gn, 'config rule', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'automation;fillColor=#759C3E;gradientColor=none;',
+					 s * 52, s * 54, '', 'Automation', null, null, this.getTagsForStencil(gn, 'automation', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'documents;fillColor=#759C3E;gradientColor=none;',
+					 s * 60, s * 67, '', 'Documents', null, null, this.getTagsForStencil(gn, 'documents', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'inventory;fillColor=#759C3E;gradientColor=none;',
+					 s * 60, s * 70, '', 'Inventory', null, null, this.getTagsForStencil(gn, 'inventory', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'maintenance_window;fillColor=#759C3E;gradientColor=none;',
+					 s * 50, s * 52, '', 'Maintenance Window', null, null, this.getTagsForStencil(gn, 'maintenance window', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'parameter_store;fillColor=#759C3E;gradientColor=none;',
+					 s * 50, s * 68, '', 'Parameter Store', null, null, this.getTagsForStencil(gn, 'parameter store', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'patch_manager;fillColor=#759C3E;gradientColor=none;',
+					 s * 57, s * 60, '', 'Patch Manager', null, null, this.getTagsForStencil(gn, 'patch manager', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'run_command;fillColor=#759C3E;gradientColor=none;',
+					 s * 76, s * 55, '', 'Run Command', null, null, this.getTagsForStencil(gn, 'run command', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'state_manager;fillColor=#759C3E;gradientColor=none;',
+					 s * 53, s * 55, '', 'State Manager', null, null, this.getTagsForStencil(gn, 'state manager', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'ec2_systems_manager;fillColor=#759C3E;gradientColor=none;',
+					 s * 53, s * 55, '', 'EC2 Systems Manager', null, null, this.getTagsForStencil(gn, 'ec2 systems manager', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'stack_aws_cloudformation;fillColor=#759C3E;gradientColor=none;',
 					 s * 49, s * 39, '', 'Stack AWS CloudFormation', null, null, this.getTagsForStencil(gn, 'stack cloudformation cloud formation', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'change_set;fillColor=#759C3E;gradientColor=none;',
@@ -1081,7 +780,9 @@
 			 this.createVertexTemplateEntry(n + 'database_migration_workflow_job;fillColor=#5294CF;gradientColor=none;',
 					 s * 31, s * 58, '', 'Database Migration Workflow Job', null, null, this.getTagsForStencil(gn, 'database migration workflow job', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'application_discovery_service;fillColor=#5294CF;gradientColor=none;',
-					 s * 51, s * 62, '', 'Application Discovery Service', null, null, this.getTagsForStencil(gn, 'application discovery service', dt).join(' '))
+					 s * 51, s * 62, '', 'Application Discovery Service', null, null, this.getTagsForStencil(gn, 'application discovery service', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'migration_hub_2;fillColor=#ABABAB;gradientColor=none;',
+					 s * 76, s * 81, '', 'Migration Hub', null, null, this.getTagsForStencil(gn, 'migration hub', dt).join(' '))
 		]);
 	};
 	
@@ -1126,6 +827,8 @@
 					 s * 47, s * 57, '', 'Route 53', null, null, this.getTagsForStencil(gn, 'route 53', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'vpc;fillColor=#F58536;gradientColor=none;',
 					 s * 45, s * 54, '', 'VPC', null, null, this.getTagsForStencil(gn, 'vpc virtual private cloud', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'network_access_controllist;fillColor=#F58534;gradientColor=none;',
+					 s * 46, s * 48, '', 'Network Access Controllist', null, null, this.getTagsForStencil(gn, 'network access controllist', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'elastic_load_balancing;fillColor=#F58536;gradientColor=none;',
 					 s * 51, s * 62, '', 'Elastic Load Balancing', null, null, this.getTagsForStencil(gn, 'elastic load balancing', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'direct_connect;fillColor=#F58536;gradientColor=none;',
@@ -1245,6 +948,8 @@
 		[
 			 this.createVertexTemplateEntry(n + 'inspector;fillColor=#759C3E;gradientColor=none;',
 					 s * 45, s * 54, '', 'Inspector', null, null, this.getTagsForStencil(gn, 'inspector', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'macie;fillColor=#34BBC9;gradientColor=none;',
+					 s * 89, s * 36, '', 'Macie', null, null, this.getTagsForStencil(gn, 'macie', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'artifact;fillColor=#759C3E;gradientColor=none;',
 					 s * 50, s * 60, '', 'Artifact', null, null, this.getTagsForStencil(gn, 'artifact', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'certificate_manager;fillColor=#759C3E;gradientColor=none;',
@@ -1267,6 +972,8 @@
 					 s * 46, s * 48, '', 'Agent', null, null, this.getTagsForStencil(gn, 'agent', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'certificate_manager_2;fillColor=#759C3E;gradientColor=none;',
 					 s * 49, s * 42, '', 'Certificate Manager', null, null, this.getTagsForStencil(gn, 'certificate manager', dt).join(' ')),
+			 this.createVertexTemplateEntry(n + 'clouddirectory;fillColor=#759C3E;gradientColor=none;',
+					 s * 68, s * 73, '', 'CloudDirectory', null, null, this.getTagsForStencil(gn, 'cloud directory', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'add_on;fillColor=#759C3E;gradientColor=none;',
 					 s * 33, s * 18, '', 'Add-On', null, null, this.getTagsForStencil(gn, 'add on', dt).join(' ')),
 			 this.createVertexTemplateEntry(n + 'sts;fillColor=#759C3E;gradientColor=none;',

+ 1 - 1
war/js/diagramly/sidebar/Sidebar.js

@@ -86,7 +86,7 @@
 	/**
 	 *
 	 */
-	Sidebar.prototype.aws3 = ['Analytics', 'Application Services', 'Artificial Intelligence', 'Business Productivity', 'Compute', 'Database', 'Desktop and App Streaming', 'Developer Tools', 
+	Sidebar.prototype.aws3 = ['Analytics', 'Application Services', 'Artificial Intelligence', 'Business Productivity', 'Compute', 'Contact Center', 'Database', 'Desktop and App Streaming', 'Developer Tools', 
 	                          'Game Development', 'General', 'Groups', 'Internet of Things',  
 	                          'Management Tools', 'Messaging', 'Migration', 'Mobile Services', 'Networking and Content Delivery', 'On Demand Workforce', 'SDKs', 'Security Identity and Compliance', 'Storage'];
 	

File diff suppressed because it is too large
+ 1 - 1
war/js/embed-static.min.js


File diff suppressed because it is too large
+ 1 - 1
war/js/reader.min.js


File diff suppressed because it is too large
+ 3 - 3
war/js/viewer.min.js


+ 119 - 119
war/resources/dia_nl.txt

@@ -2,29 +2,29 @@
 # https://docs.google.com/spreadsheet/ccc?key=0AmQEO36liL4FdDJLWVNMaVV2UmRKSnpXU09MYkdGbEE
 aboutDrawio=Over draw.io
 accessDenied=Toegang geweigerd
-actualSize=Ware Grootte
+actualSize=Ware grootte
 add=Toevoegen
-addedFile=Toegevoegd {1}
-addImages=Afbeeldingen Toevoegen
-addImageUrl=Afbeelding-URL Toevoegen
-addLayer=Laag Toevoegen
-addProperty=Eigenschap Toevoegen
+addedFile={1} toegevoegd
+addImages=Afbeeldingen toevoegen
+addImageUrl=Afbeelding-URL toevoegen
+addLayer=Laag toevoegen
+addProperty=Eigenschap toevoegen
 address=Adres
-addToExistingDrawing=Aan Bestaande Tekening Toevoegen
-addWaypoint=Tussenpunt Toevoegen
-adjustTo=Aanpassen Aan
+addToExistingDrawing=Aan bestaande tekening toevoegen
+addWaypoint=Tussenpunt toevoegen
+adjustTo=Aanpassen aan
 advanced=Geavanceerd
 align=Uitlijnen
 alignment=Uitlijning
 allChangesLost=Alle wijzigingen zullen verloren gaan!
-allPages=Alle Pagina's
-allProjects=Alle Projecten
-allSpaces=Alle Ruimtes
-allTags=Alle Tags
+allPages=Alle pagina's
+allProjects=Alle projecten
+allSpaces=Alle ruimtes
+allTags=Alle tags
 anchor=Anker
 android=Android
 angle=Hoek
-arc=Arc
+arc=Boog
 areYouSure=Weet u het zeker?
 ensureDataSaved=Zorg dat uw gegevens zijn opgeslagen alvorens af te sluiten.
 allChangesSaved=Alle wijzigingen opgeslagen
@@ -37,7 +37,7 @@ archiMate21=ArchiMate 2.1
 arrange=Ordenen
 arrow=Pijl
 arrows=Pijlen
-asNew=Als Nieuw
+asNew=Als nieuw
 atlas=Atlas
 author=Auteur
 authorizationRequired=Autorisatie vereist
@@ -55,8 +55,8 @@ background=Achtergrond
 backgroundColor=Achtergrondkleur
 backgroundImage=Achtergrondafbeelding
 basic=Eenvoudig
-blankDrawing=Lege Tekening
-blankDiagram=Leeg Diagram
+blankDrawing=Lege tekening
+blankDiagram=Leeg diagram
 block=Blok
 blockquote=Blockquote
 blog=Blog
@@ -79,7 +79,7 @@ center=Centreren
 cannotLoad=Pogingen tot laden mislukt. Probeer het later nog eens.
 cannotLogin=Pogingen tot inloggen mislukt. Probeer het later nog eens.
 cannotOpenFile=Kan bestand niet openen
-cardName=Card Name
+cardName=Naam kaart
 change=Wijzigen
 changeOrientation=Oriëntatie wijzigen
 changeUser=Gebruiker wijzigen
@@ -99,9 +99,9 @@ check=Controleren
 circle=Cirkel
 cisco=Cisco
 classic=Klassiek
-clearDefaultStyle=Standaardstijl Verwijderen
-clearFilter=Clear Filter
-clearWaypoints=Tussenpunten Verwijderen
+clearDefaultStyle=Standaardstijl wissen
+clearFilter=Filter wissen
+clearWaypoints=Tussenpunten wissen
 clipart=Clipart
 close=Sluiten
 collaborator=Medewerker
@@ -128,9 +128,9 @@ copyOf=Kopie van {1}
 copyOfDrawing=Kopie van Tekening
 copyStyle=Stijl Kopiëren
 create=Aanmaken
-createNewDiagram=Nieuw Diagram Aanmaken
-createRevision=Revisie Aanmaken
-createShape=Vorm Aanmaken
+createNewDiagram=Nieuw diagram aanmaken
+createRevision=Revisie aanmaken
+createShape=Vorm aanmaken
 crop=Bijsnijden
 curved=Gewelfd
 custom=Aangepast
@@ -140,18 +140,18 @@ dashed=Gestreept
 decideLater=Later beslissen
 default=Standaard
 delete=Verwijderen
-deleteColumn=Kolom Verwijderen
+deleteColumn=Kolom verwijderen
 deleteLibrary401=Onvoldoende rechten om deze bibliotheek te verwijderen
 deleteLibrary404=Geselecteerde bibliotheek kon niet worden gevonden
 deleteLibrary500=Fout bij verwijderen bibliotheek
 deleteLibraryConfirm=U staat op het punt deze bibliotheek permanent te verwijderen. Weet u zeker dat u dit wilt doen?
-deleteRow=Rij Verwijderen
+deleteRow=Rij verwijderen
 description=Beschrijving
 device=Apparaat
 diagram=Diagram
-diagramContent=Inhoud van Diagram
-diagramLocked=Diagram is vergrendeld om verder dataverlies te voorkomen.
-diagramName=Naam Diagram
+diagramContent=Inhoud diagram
+diagramLocked=Diagram is vergrendeld om verder gegevensverlies te voorkomen.
+diagramName=Naam diagram
 diagramIsPublic=Diagram is openbaar
 diagramIsNotPublic=Diagram is niet openbaar
 diamond=Diamant
@@ -159,9 +159,9 @@ diamondThin=Diamant (dun)
 didYouKnow=Wist u dat...
 direction=Richting
 discard=Negeren
-discardChangesAndReconnect=Wijzigingen Negeren en Opnieuw Verbinden
+discardChangesAndReconnect=Wijzigingen negeren en opnieuw verbinden
 googleDriveMissingClickHere=Ontbreekt Google Drive? Klik hier!
-discardChanges=Wijzigingen Negeren
+discardChanges=Wijzigingen negeren
 disconnected=Verbinding verbroken
 distribute=Distribueren
 done=Klaar
@@ -171,7 +171,7 @@ doubleClickTooltip=Dubbelklik om tekst in te voegen
 doubleClickChangeProperty=Dubbelklik om eigenschapsnaam te wijzigen
 download=Downloaden
 downloadAs=Downloaden als
-clickHereToSave=Hier klikken om op te slaan.
+clickHereToSave=Klik hier om op te slaan.
 draftDiscarded=Concept genegeerd
 draftSaved=Concept opgeslagen
 dragElementsHere=Sleep elementen hierheen
@@ -184,7 +184,7 @@ drawingTooLarge=Tekening is te groot
 drawioForWork=Draw.io voor GSuite
 dropbox=Dropbox
 duplicate=Dupliceren
-duplicateIt=Dupliceer {1}
+duplicateIt={1} dupliceren
 divider=Verdeler
 east=Oost
 edit=Bewerken
@@ -200,7 +200,7 @@ editText=Tekst bewerken
 editTooltip=Tooltip bewerken
 glass=Glas
 googleImages=Google Afbeeldingen
-imageSearch=Afbeelding Zoeken
+imageSearch=Afbeelding zoeken
 eip=EIP
 embed=Insluiten
 embedImages=Afbeeldingen Insluiten
@@ -208,15 +208,15 @@ mainEmbedNotice=Dit op de pagina plakken
 electrical=Elektrisch
 embedNotice=Dit eenmalig aan het einde van de pagina plakken
 enterGroup=Groep Invullen
-enterName=Naam Invullen
-enterPropertyName=Eigenschapsnaam Invullen
-enterValue=Waarde Invullen
+enterName=Naam invullen
+enterPropertyName=Eigenschapsnaam invullen
+enterValue=Waarde invullen
 entityRelation=Entiteitrelatie
 error=Fout
-errorDeletingFile=Fout bij Verwijderen Bestand
+errorDeletingFile=Fout bij verwijderen bestand
 errorLoadingFile=Fout bij laden bestand
 errorRenamingFile=Fout bij hernoemen bestand.
-errorRenamingFileNotFound=Fout bij hernoemen bestand. Bestand niet gevonden.
+errorRenamingFileNotFound=Fout bij hernoemen bestand. Bestand was niet gevonden.
 errorRenamingFileForbidden=Fout bij hernoemen bestand. Onvoldoende toegangsrechten.
 errorSavingDraft=Fout bij opslaan concept
 errorSavingFile=Fout bij opslaan bestand
@@ -228,7 +228,7 @@ errorSavingFileSessionTimeout=Uw sessie is verlopen. Graag <a target='_blank' hr
 errorSendingFeedback=Fout bij versturen feedback.
 errorUpdatingPreview=Fout bij bijwerken voorbeeld.
 exit=Afsluiten
-exitGroup=Groep Verlaten
+exitGroup=Groep verlaten
 expand=Uitklappen
 export=Exporteren
 exporting=Bezig met exporteren
@@ -256,8 +256,8 @@ fileNotSaved=Bestand niet opgeslagen
 fileOpenLocation=Hoe wilt u dit/deze bestand(en) openen?
 fileWillBeSavedInAppFolder={1} zal in de appfolder worden opgeslagen.
 fill=Vullen
-fillColor=Kleur Vullen
-filterCards=Filter Cards
+fillColor=Vulkleur
+filterCards=Kaarten filteren
 find=Vinden
 fit=Inpassen
 fitContainer=Containergrootte Aanpassen
@@ -268,11 +268,11 @@ fitTo=Aanpassen aan
 fitToSheetsAcross=blad(en) naast elkaar
 fitToBy=bij
 fitToSheetsDown=blad(en) onder elkaar
-fitTwoPages=Twee Pagina's
+fitTwoPages=Twee pagina's
 fitWindow=Venster Aanpassen
 flip=Spiegelen
-flipH=Horizontaal Spiegelen
-flipV=Verticaal Spiegelen
+flipH=Horizontaal spiegelen
+flipV=Verticaal spiegelen
 flowchart=Stroomschema
 folder=Map
 font=Lettertype
@@ -293,7 +293,7 @@ formatHtmlEmbedded=HTML
 formatSvgEmbedded=SVG (met XML)
 formatVsdx=VSDX
 formatVssx=VSSX
-formatXmlPlain=XML (Plat)
+formatXmlPlain=XML (plat)
 formatXml=XML
 forum=Discussie-/Helpforums
 fromTemplate=Van Sjabloon
@@ -314,23 +314,23 @@ googlePlus=Google+
 googleSites=Google Sites
 gradient=Overgang
 gradientColor=Kleur
-grid=Rooster
-gridColor=Roosterkleur
-gridSize=Roostergrootte
+grid=Raster
+gridColor=Rasterkleur
+gridSize=Rastergrootte
 group=Groeperen
-guides=Gidsen
+guides=Hulplijnen
 hateApp=Ik haat draw.io
 heading=Kop
 height=Hoogte
-help=Helpen
+help=Help
 helpTranslate=Help ons deze applicatie te vertalen
 hide=Verbergen
-hideIt=Verberg {1}
+hideIt={1} verbergen
 hidden=Verborgen
 home=Home
 horizontal=Horizontaal
-horizontalFlow=Horizontale Stroom
-horizontalTree=Horizontale Boom
+horizontalFlow=Horizontale stroom
+horizontalTree=Horizontale boom
 howTranslate=Hoe goed is de vertaling naar uw taal?
 html=HTML
 htmlText=HTML-tekst
@@ -348,19 +348,19 @@ includeCopyOfMyDiagram=Een kopie van mijn diagram toevoegen
 increaseIndent=Inspringen vergroten
 decreaseIndent=Inspringen verkleinen
 insert=Invoegen
-insertColumnBefore=Kolom Links Invoegen
-insertColumnAfter=Kolom Rechts Invoegen
-insertEllipse=Ellips Invoegen
-insertImage=Afbeelding Invoegen
-insertHorizontalRule=Horizontale Lijn Invoegen
-insertLink=Link Invoegen
-insertPage=Pagina Invoegen
-insertRectangle=Rechthoek Invoegen
+insertColumnBefore=Kolom links invoegen
+insertColumnAfter=Kolom rechts invoegen
+insertEllipse=Ellips invoegen
+insertImage=Afbeelding invoegen
+insertHorizontalRule=Horizontale lijn invoegen
+insertLink=Link invoegen
+insertPage=Pagina invoegen
+insertRectangle=Rechthoek invoegen
 insertRhombus=Insert Rhombus
-insertRowBefore=Rij Bovenaan Invoegen
-insertRowAfter=Rij Onderaan Invoegen
-insertText=Tekst Invoegen
-inserting=Bezig Met Invoegen
+insertRowBefore=Rij bovenaan invoegen
+insertRowAfter=Rij onderaan invoegen
+insertText=Tekst invoegen
+inserting=Bezig met invoegen
 invalidFilename=Diagrammen mogen niet de volgende tekens bevatten: \ / | : ; { } < > & + ? = "
 invalidLicenseSeeThisPage=Uw licentie is ongeldig, bekijk deze <a target="_blank" href="https://support.draw.io/display/DFCS/Licensing+your+draw.io+plugin">pagina</a>.
 invalidName=Ongeldige naam
@@ -398,7 +398,7 @@ left=Links
 leftAlign=Links Uitlijnen
 leftToRight=Links naar rechts
 libraryTooltip=Sleep en plaats de vormen hier of klik + om in te voegen. Dubbelklik om aan te passen.
-lightbox=Lichtbak
+lightbox=Lightbox
 line=Lijn
 lineend=Einde van de lijn
 lineheight=Lijnhoogte
@@ -413,7 +413,7 @@ logIn=Inloggen
 loveIt=Ik hou van {1}
 lucidchart=Lucidchart
 mathematicalTypesetting=Wiskundige Typografie
-makeCopy=Een Kopie Maken
+makeCopy=Een kopie maken
 manual=Handleiding
 middle=Midden
 misc=Overige
@@ -421,21 +421,21 @@ mockups=Mock-ups
 modificationDate=Aanpassingsdatum
 modifiedBy=Aangepast door
 more=Meer
-moreResults=Meer Resultaten
-moreShapes=Meer Vormen
+moreResults=Meer resultaten
+moreShapes=Meer vormen
 move=Verplaatsen
-moveToFolder=Naar Map Verplaatsen
+moveToFolder=Naar map verplaatsen
 moving=Bezig met verplaatsen
 moveSelectionTo=Selectie naar {1} verplaatsen
 name=Naam
 navigation=Navigatie
 networking=Netwerken
 new=Nieuw
-newLibrary=Nieuwe Bibliotheek
-nextPage=Volgende Pagina
+newLibrary=Nieuwe bibliotheek
+nextPage=Volgende pagina
 noAttachments=Geen bijlagen gevonden
-noColor=Geen Kleur
-noFiles=Geen Bestanden
+noColor=Geen kleur
+noFiles=Geen bestanden
 noFileSelected=Geen bestand geselecteerd
 noLibraries=Geen bibliotheken gevonden
 noMoreResults=Geen verdere resultaten
@@ -465,15 +465,15 @@ online=Online
 opacity=Ondoorzichtigheid
 open=Openen
 openArrow=Open Pijl
-openExistingDiagram=Bestaand Diagram Openen
-openFile=Bestand Openen
+openExistingDiagram=Bestaand diagram openen
+openFile=Bestand openen
 openFrom=Openen vanaf
 openLibrary=Bibliotheek openen
 openLibraryFrom=Bibliotheek openen vanaf
-openLink=Link Openen
-openInNewWindow=In Nieuw Venster Openen
-openInThisWindow=In Dit Venster Openen
-openIt=Open {1}
+openLink=Link openen
+openInNewWindow=In nieuw venster openen
+openInThisWindow=In dit venster openen
+openIt={1} openen
 openRecent=Openen Recente
 openSupported=Ondersteunde formaten zijn bestanden opgeslagen vanuit deze software (,xml), .vsdx en .gliffy
 options=Opties
@@ -496,13 +496,13 @@ panTooltip=Spatie+slepen om te zoomen
 paperSize=Papiergrootte
 pattern=Patroon
 paste=Plakken
-pasteHere=Hier Plakken
-pasteStyle=Stijl Plakken
+pasteHere=Hier plakken
+pasteStyle=Stijl plakken
 perimeter=Begrenzing
 permissionAnyone=Iedereen kan bewerken
 permissionAuthor=Alleen ik kan bewerken
 pickFolder=Kies een map
-pickLibraryDialogTitle=Bibliotheek Selecteren
+pickLibraryDialogTitle=Bibliotheek selecteren
 publicDiagramUrl=Openbare URL van het diagram
 placeholders=Plaatshouder
 plantUml=PlantUML
@@ -528,23 +528,23 @@ rack=Rack
 radialTree=Radiale Boom
 readOnly=Alleen-lezen
 reconnecting=Bezig met opnieuw verbinden
-recentlyUpdated=Recent Bijgewerkt
-recentlyViewed=Recent Bekeken
+recentlyUpdated=Recent bijgewerkt
+recentlyViewed=Recent bekeken
 redirectToNewApp=Dit bestand is aangemaakt of aangepast in een nieuwere versie van deze app. U wordt nu doorgestuurd.
 realtimeTimeout=Het lijkt alsof u enkele wijzigingen hebt aangebracht terwijl u offline was. Het spijt ons, maar deze wijzigingen kunnen niet worden opgeslagen.
 redo=Opnieuw doen
 refresh=Herladen
-regularExpression=Reguliere Expressie
-relativeUrlNotAllowed=Relative URL not allowed
+regularExpression=Reguliere expressie
+relativeUrlNotAllowed=Relatieve URL niet toegestaan
 rememberMe=Onthoud mij
 rememberThisSetting=Onthoud deze instelling
-removeFormat=Opmaak Wissen
-removeFromGroup=Uit groep Verwijderen
-removeIt=Verwijder {1}
-removeWaypoint=Tussenpunt Verwijderen
+removeFormat=Opmaak wissen
+removeFromGroup=Uit groep verwijderen
+removeIt={1} verwijderen
+removeWaypoint=Tussenpunt verwijderen
 rename=Hernoemen
 renamed=Hernoemd
-renameIt=Hernoem {1}
+renameIt={1} hernoemen
 renaming=Bezig met hernoemen
 replace=Vervangen
 replaceIt={1} bestaat al. Wilt u het vervangen?
@@ -567,14 +567,14 @@ revisionHistory=Revisiegeschiedenis
 right=Rechts
 rightAlign=Rechts Uitlijnen
 rightToLeft=Rechts naar links
-rotate=Roteren
-rotateTooltip=Klik en sleep om te roteren, klik om 90 graden te draaien
+rotate=Draaien
+rotateTooltip=Klik en sleep om te draaien, klik om 90 graden te draaien
 rotation=Rotatie
 rounded=Afgerond
 save=Opslaan
-saveAndExit=Opslaan & Afsluiten
+saveAndExit=Opslaan & afsluiten
 saveAs=Opslaan als
-saveAsXmlFile=Opslaan als XML-bestand?
+saveAsXmlFile=Als XML-bestand opslaan?
 saved=Opgeslagen
 saveDiagramsTo=Diagrammen opslaan naar
 saveLibrary403=Onvoldoende rechten om deze bibliotheek te bewerken
@@ -583,16 +583,16 @@ saving=Bezig met opslaan
 scratchpad=Scratchpad
 scrollbars=Schuifbalken
 search=Zoeken
-searchShapes=Vormen Zoeken
-selectAll=Alles Selecteren
-selectionOnly=Alleen Selectie
-selectCard=Select Card
-selectEdges=Randen Selecteren
-selectFile=Bestand Selecteren
-selectFolder=Map Selecteren
-selectFont=Lettertype Selecteren
-selectNone=Niets Selecteren
-selectVertices=Hoekpunten Selecteren
+searchShapes=Vormen zoeken
+selectAll=Alles selecteren
+selectionOnly=Alleen selectie
+selectCard=Kaart selecteren
+selectEdges=Randen selecteren
+selectFile=Bestand selecteren
+selectFolder=Map selecteren
+selectFont=Lettertype selecteren
+selectNone=Niets selecteren
+selectVertices=Hoekpunten selecteren
 sendMessage=Versturen
 sendYourFeedbackToDrawIo=Stuur uw feedback door naar draw.io
 serviceUnavailableOrBlocked=Dienst niet beschikbaar of geblokkeerd
@@ -606,12 +606,12 @@ share=Delen
 shareLink=Link voor gedeeld bewerken
 sharp=Scherp
 show=Tonen
-showStartScreen=Startscherm Tonen
+showStartScreen=Startscherm tonen
 sidebarTooltip=Klik om uit te breiden. Sleep en plaats vormen in het diagram. Shift+klik om selectie te wijzigen. Alt+klik om in te voegen en te verbinden.
 signs=Tekens
 signOut=Afmelden
 simple=Eenvoudig
-simpleArrow=Eenvoudige Pijl
+simpleArrow=Eenvoudige pijl
 size=Grootte
 solid=Massief
 sourceSpacing=Bron Afstand
@@ -642,19 +642,19 @@ theme=Thema
 timeout=Time-out
 title=Titel
 to=tot
-toBack=Naar Achterzijde
-toFront=Naar Voorzijde
+toBack=Naar achteren
+toFront=Naar voren
 tooltips=Tooltips
 top=Boven
 topAlign=Boven Uitlijnen
 topLeft=Linksboven
 topRight=Rechtsboven
 transparent=Transparant
-transparentBackground=Transparante Achtergrond
+transparentBackground=Transparante achtergrond
 trello=Trello
 tryAgain=Opnieuw proberen
 tryOpeningViaThisPage=Probeer via deze pagina te openen.
-turn=90% draaien
+turn=90° draaien
 type=Type
 twitter=Twitter
 uml=UML
@@ -664,11 +664,11 @@ ungroup=Degroeperen
 unsavedChanges=Niet-opgeslagen wijzigingen
 unsavedChangesClickHereToSave=Niet-opgeslagen wijzigingen. Klik hier om op te slaan.
 untitled=Zonder titel
-untitledDiagram=Diagram Zonder Titel
-untitledLayer=Laag Zonder Titel
-untitledLibrary=Bibliotheek Zonder Titel
+untitledDiagram=Diagram zonder titel
+untitledLayer=Laag zonder titel
+untitledLibrary=Bibliotheek zonder titel
 unknownError=Onbekende fout
-updateFile=Bijwerken {1}
+updateFile={1} bijwerken
 updatingDocument=Document wordt bijgewerkt. Even wachten...
 updatingPreview=Voorbeeld wordt bijgewerkt. Even wachten...
 updatingSelection=Selectie wordt bijgewerkt. Even wachten...
@@ -676,8 +676,8 @@ upload=Uploaden
 url=URL
 userManual=Gebruikershandleiding
 vertical=Verticaal
-verticalFlow=Verticale Stroom
-verticalTree=Verticale Boom
+verticalFlow=Verticale stroom
+verticalTree=Verticale boom
 view=Bekijken
 viewUrl=Link om te bekijken: {1}
 voiceAssistant=Spraakassistent (beta)

+ 3 - 3
war/resources/dia_ru.txt

@@ -30,7 +30,7 @@ ensureDataSaved=Пожалуйста, перед закрытием убедит
 allChangesSaved=Все изменения сохранены
 allChangesSavedInDrive=Все изменения сохранены на диске
 allowPopups=Разрешите всплывающие окна, чтобы убрать этот диалог.
-allowRelativeUrl=Allow relative URL
+allowRelativeUrl=Разрешить относительные адреса
 alreadyConnected=Узлы уже соединены
 apply=Применить
 archiMate21=ArchiMate 2.1
@@ -356,7 +356,7 @@ insertHorizontalRule=Вставить горизонтальную направ
 insertLink=Вставить ссылку
 insertPage=Вставить страницу
 insertRectangle=Вставить прямоугольник
-insertRhombus=Insert Rhombus
+insertRhombus=Вставить ромб
 insertRowBefore=Вставить строку сверху
 insertRowAfter=Вставить строку снизу
 insertText=Вставить текст
@@ -535,7 +535,7 @@ realtimeTimeout=Похоже, вы внесли некоторые правки,
 redo=Вернуть
 refresh=Обновить
 regularExpression=Регулярное выражение
-relativeUrlNotAllowed=Relative URL not allowed
+relativeUrlNotAllowed=Использование относительных адресов запрещено
 rememberMe=Запомнить меня
 rememberThisSetting=Запомнить эту настройку
 removeFormat=Очистить форматирование

File diff suppressed because it is too large
+ 2383 - 12
war/stencils.xml


File diff suppressed because it is too large
+ 2393 - 22
war/stencils/aws3.xml