1(function()
2{
3	Sidebar.prototype.addGCP2Palette = function()
4	{
5		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Paths');
6		this.addGCP2PathsPalette();
7		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Zones');
8		this.addGCP2ZonesPalette();
9		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Service Cards');
10		this.addGCP2ServiceCardsPalette();
11		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2User Device Cards');
12		this.addGCP2UserDeviceCardsPalette();
13		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Compute');
14		this.addGCP2ComputePalette();
15		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2API Management');
16		this.addGCP2APIManagementPalette();
17		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Security');
18		this.addGCP2SecurityPalette();
19		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Data Analytics');
20		this.addGCP2DataAnalyticsPalette();
21		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Data Transfer');
22		this.addGCP2DataTransferPalette();
23		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Cloud AI');
24		this.addGCP2CloudAIPalette();
25		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Internet of Things');
26		this.addGCP2InternetOfThingsPalette();
27		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Databases');
28		this.addGCP2DatabasesPalette();
29		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Storage');
30		this.addGCP2StoragePalette();
31		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Management Tools');
32		this.addGCP2ManagementToolsPalette();
33		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Networking');
34		this.addGCP2NetworkingPalette();
35		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Developer Tools');
36		this.addGCP2DeveloperToolsPalette();
37		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Expanded Product Cards');
38		this.addGCP2ExpandedProductCardsPalette();
39		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Product Cards');
40		this.addGCP2ProductCardsPalette();
41		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2General Icons');
42		this.addGCP2GeneralIconsPalette();
43		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons AI Machine Learning');
44		this.addGCP2IconsAIMachineLearningPalette();
45		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Compute');
46		this.addGCP2IconsComputePalette();
47		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Data Analytics');
48		this.addGCP2IconsDataAnalyticsPalette();
49		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Management Tools');
50		this.addGCP2IconsManagementToolsPalette();
51		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Networking');
52		this.addGCP2IconsNetworkingPalette();
53		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Developer Tools');
54		this.addGCP2IconsDeveloperToolsPalette();
55		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons API Management');
56		this.addGCP2IconsAPIManagementPalette()
57		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Internet of Things');
58		this.addGCP2IconsInternetOfThingsPalette();
59		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Databases');
60		this.addGCP2IconsDatabasesPalette();
61		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Storage');
62		this.addGCP2IconsStoragePalette();
63		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Security');
64		this.addGCP2IconsSecurityPalette();
65		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Migration');
66		this.addGCP2IconsMigrationPalette();
67		this.setCurrentSearchEntryLibrary('gcp2', 'gcp2Icons Hybrid and Multi Cloud');
68		this.addGCP2IconsHybridAndMultiCloudPalette();
69		this.setCurrentSearchEntryLibrary();
70	};
71
72	Sidebar.prototype.addGCP2PathsPalette = function()
73	{
74		var s = 'edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;strokeWidth=2;endSize=4;startSize=4;';
75		var dt = 'gcp google cloud platform path ';
76		var fns = [];
77
78		var fns = [
79			this.createEdgeTemplateEntry(s + 'dashed=0;strokeColor=#4284F3;', 100, 0, '', 'Primary Path', null, dt + 'primary'),
80			this.createEdgeTemplateEntry(s + 'dashed=1;dashPattern=1 3;strokeColor=#4284F3;', 100, 0, '', 'Optional Primary Path', null, dt + 'optional primary'),
81			this.createEdgeTemplateEntry(s + 'dashed=0;strokeColor=#9E9E9E;', 100, 0, '', 'Secondary Path', null, dt + 'secondary'),
82			this.createEdgeTemplateEntry(s + 'dashed=1;dashPattern=1 3;strokeColor=#9E9E9E;', 100, 0, '', 'Optional Secondary Path', null, dt + 'optional secondary'),
83			this.createEdgeTemplateEntry(s + 'strokeColor=#34A853;dashed=0;', 100, 0, '', 'Success Status', null, dt + 'success status'),
84			this.createEdgeTemplateEntry(s + 'strokeColor=#EA4335;dashed=0;', 100, 0, '', 'Failure Status', null, dt + 'failure status')
85	 	];
86
87		this.addPalette('gcp2Paths', 'GCP / Paths', false, mxUtils.bind(this, function(content)
88		{
89			for (var i = 0; i < fns.length; i++)
90			{
91				content.appendChild(fns[i](content));
92			}
93		}));
94	};
95
96	Sidebar.prototype.addGCP2ZonesPalette = function()
97	{
98		var sb = this;
99		var s = 'sketch=0;points=[[0,0,0],[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[1,1,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];rounded=1;absoluteArcSize=1;arcSize=2;html=1;strokeColor=none;gradientColor=none;shadow=0;dashed=0;fontSize=12;fontColor=#9E9E9E;align=left;verticalAlign=top;spacing=10;spacingTop=-4;';
100		var dt = 'gcp google cloud platform zone ';
101		var gn = 'mxgraph.gcp2.zones';
102		var fns = [];
103
104		var fns = [
105		    this.createVertexTemplateEntry(s + '',
106		    		120, 70, 'User 1', 'User 1 (Default)', null, null, this.getTagsForStencil(gn, '', dt + 'user').join(' ')),
107		    this.createVertexTemplateEntry(s + 'fillColor=#F3E5F5;',
108		    		120, 150, 'Infrastructure\nSystem', 'Infrastructure System', null, null, this.getTagsForStencil(gn, '', dt + 'infrastructure system').join(' ')),
109		    this.createVertexTemplateEntry(s + 'fillColor=#EFEBE9;',
110		    		120, 200, 'colo / dc /\non-premises', 'colo / dc / on-premises', null, null, this.getTagsForStencil(gn, '', dt + 'colo dc on premises').join(' ')),
111		    this.createVertexTemplateEntry(s + 'fillColor=#F1F8E9;',
112		    		120, 70, 'System 1', 'System 1', null, null, this.getTagsForStencil(gn, '', dt + 'system').join(' ')),
113		    this.createVertexTemplateEntry(s + 'fillColor=#FFEBEE;',
114		    		120, 70, 'External SaaS\nProviders', 'External SaaS Providers', null, null, this.getTagsForStencil(gn, '', dt + 'external saas providers').join(' ')),
115		    this.createVertexTemplateEntry(s + 'fillColor=#FFF8E1;',
116		    		120, 70, 'External Data\nSources', 'External Data Sources', null, null, this.getTagsForStencil(gn, '', dt + 'external data sources').join(' ')),
117		    this.createVertexTemplateEntry(s + 'fillColor=#E0F2F1;',
118		    		120, 75, 'External\nInfrastructure\n3<sup>rd</sup> Party', 'External Infrastructure 3rd party', null, null, this.getTagsForStencil(gn, '', dt + 'external infrastructure 3rd party').join(' ')),
119		    this.createVertexTemplateEntry(s + 'fillColor=#E1F5FE;',
120		    		120, 75, 'External\nInfrastructure\n1<sup>st</sup> Party', 'External Infrastructure 1st party', null, null, this.getTagsForStencil(gn, '', dt + 'external infrastructure 1st party').join(' ')),
121
122			this.addEntry(dt + 'project cloud service provider', function()
123		   	{
124			    var bg = new mxCell('Project Zone / Cloud Service Provider', new mxGeometry(0, 0, 530, 490), s + 'fillColor=#F6F6F6;');
125		    	bg.vertex = true;
126
127			    var zone1Cell = new mxCell('Logical Grouping of Services / Instances',
128			    		new mxGeometry(0, 0, 250, 180), s + 'fillColor=#E3F2FD;');
129			    zone1Cell.geometry.relative = true;
130			    zone1Cell.geometry.offset = new mxPoint(10, 50);
131			    zone1Cell.vertex = true;
132		    	bg.insert(zone1Cell);
133
134			    var zone2Cell = new mxCell('Zone',
135			    		new mxGeometry(0, 0, 230, 120), s + 'fillColor=#FFF3E0;');
136			    zone2Cell.geometry.relative = true;
137			    zone2Cell.geometry.offset = new mxPoint(10, 50);
138			    zone2Cell.vertex = true;
139			    zone1Cell.insert(zone2Cell);
140
141			    var zone3Cell = new mxCell('SubNetwork',
142			    		new mxGeometry(0, 0, 210, 60), s + 'fillColor=#EDE7F6;');
143			    zone3Cell.geometry.relative = true;
144			    zone3Cell.geometry.offset = new mxPoint(10, 50);
145			    zone3Cell.vertex = true;
146			    zone2Cell.insert(zone3Cell);
147
148			    var zone4Cell = new mxCell('Kubernetes cluster',
149			    		new mxGeometry(0, 0, 250, 120), s + 'fillColor=#FCE4EC;');
150			    zone4Cell.geometry.relative = true;
151			    zone4Cell.geometry.offset = new mxPoint(10, 240);
152			    zone4Cell.vertex = true;
153		    	bg.insert(zone4Cell);
154
155			    var zone5Cell = new mxCell('pod',
156			    		new mxGeometry(0, 0, 210, 60), s + 'fillColor=#E8F5E9;');
157			    zone5Cell.geometry.relative = true;
158			    zone5Cell.geometry.offset = new mxPoint(10, 50);
159			    zone5Cell.vertex = true;
160			    zone4Cell.insert(zone5Cell);
161
162			    var zone6Cell = new mxCell('Account',
163			    		new mxGeometry(0, 0, 250, 60), s + 'fillColor=#E8EAF6;');
164			    zone6Cell.geometry.relative = true;
165			    zone6Cell.geometry.offset = new mxPoint(10, 370);
166			    zone6Cell.vertex = true;
167			    bg.insert(zone6Cell);
168
169			    var zone7Cell = new mxCell('Region',
170			    		new mxGeometry(0, 0, 250, 310), s + 'fillColor=#ECEFF1;');
171			    zone7Cell.geometry.relative = true;
172			    zone7Cell.geometry.offset = new mxPoint(270, 50);
173			    zone7Cell.vertex = true;
174		    	bg.insert(zone7Cell);
175
176			    var zone8Cell = new mxCell('Zone',
177			    		new mxGeometry(0, 0, 230, 250), s + 'fillColor=#FFF3E0;');
178			    zone8Cell.geometry.relative = true;
179			    zone8Cell.geometry.offset = new mxPoint(10, 50);
180			    zone8Cell.vertex = true;
181			    zone7Cell.insert(zone8Cell);
182
183			    var zone9Cell = new mxCell('Firewall',
184			    		new mxGeometry(0, 0, 210, 190), s + 'fillColor=#FBE9E7;');
185			    zone9Cell.geometry.relative = true;
186			    zone9Cell.geometry.offset = new mxPoint(10, 50);
187			    zone9Cell.vertex = true;
188			    zone8Cell.insert(zone9Cell);
189
190			    var zone10Cell = new mxCell('Instance Group',
191			    		new mxGeometry(0, 0, 190, 60), s + 'fillColor=#F9FBE7;');
192			    zone10Cell.geometry.relative = true;
193			    zone10Cell.geometry.offset = new mxPoint(10, 50);
194			    zone10Cell.vertex = true;
195			    zone9Cell.insert(zone10Cell);
196
197			    var zone11Cell = new mxCell('Replica Pool',
198			    		new mxGeometry(0, 0, 190, 60), s + 'fillColor=#E0F7FA;');
199			    zone11Cell.geometry.relative = true;
200			    zone11Cell.geometry.offset = new mxPoint(10, 120);
201			    zone11Cell.vertex = true;
202			    zone9Cell.insert(zone11Cell);
203
204			    var zone12Cell = new mxCell('Optional Component',
205			    		new mxGeometry(0, 0, 250, 60),
206			    		'rounded=1;absoluteArcSize=1;arcSize=2;html=1;strokeColor=none;gradientColor=none;shadow=0;dashed=1;strokeColor=#4284F3;fontSize=12;fontColor=#9E9E9E;align=left;verticalAlign=top;spacing=10;spacingTop=-4;fillColor=none;dashPattern=1 2;strokeWidth=2;');
207			    zone12Cell.geometry.relative = true;
208			    zone12Cell.geometry.offset = new mxPoint(270, 370);
209			    zone12Cell.vertex = true;
210			    bg.insert(zone12Cell);
211
212			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, 'Project Zone / Cloud Service Provider');
213			}),
214
215		    this.createVertexTemplateEntry('fillColor=#4DA1F5;strokeColor=none;shadow=1;gradientColor=none;fontSize=14;align=left;spacingLeft=50;fontColor=#ffffff;',
216		    		1000, 40, 'Architecture: App Engine and Cloud Endpoints', 'Title bar', null, null, this.getTagsForStencil(gn, '', dt + 'title bar').join(' ')),
217		    this.createVertexTemplateEntry('strokeColor=none;shadow=0;gradientColor=none;fontSize=11;align=left;spacing=10;fontColor=#;9E9E9E;verticalAlign=top;spacingTop=100;',
218		    		300, 350, 'Use this note to call out\nor clarify parts of a diagram', 'Note', null, null, this.getTagsForStencil(gn, '', dt + 'note').join(' ')),
219
220			this.addEntry(dt + 'project', function()
221		   	{
222			    var bg = new mxCell('<b>Google </b>Cloud Platform', new mxGeometry(0, 0, 650, 350),
223			    		'fillColor=#F6F6F6;strokeColor=none;shadow=0;gradientColor=none;fontSize=14;align=left;spacing=10;fontColor=#717171;9E9E9E;verticalAlign=top;spacingTop=-4;fontStyle=0;spacingLeft=40;html=1;');
224		    	bg.vertex = true;
225
226			    var zone1Cell = new mxCell('',
227			    		new mxGeometry(0, 0, 23, 20),
228			    		'shape=mxgraph.gcp2.google_cloud_platform;fillColor=#F6F6F6;strokeColor=none;shadow=0;gradientColor=none;');
229			    zone1Cell.geometry.relative = true;
230			    zone1Cell.geometry.offset = new mxPoint(20, 10);
231			    zone1Cell.vertex = true;
232		    	bg.insert(zone1Cell);
233
234			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, 'Project Zone');
235			}),
236
237			this.addEntry(dt + 'markers', function()
238		   	{
239				s = 'shape=ellipse;perimeter=ellipsePerimeter;strokeColor=#BDBDBD;strokeWidth=2;shadow=0;gradientColor=none;fontColor=#757575;align=center;html=1;fontStyle=1;spacingTop=-1;';
240
241			    var icon1 = new mxCell('1', new mxGeometry(0, 0, 20, 20), s);
242			    icon1.vertex = true;
243			    var icon2 = new mxCell('2', new mxGeometry(40, 0, 20, 20), s);
244			    icon2.vertex = true;
245			    var icon3 = new mxCell('3', new mxGeometry(80, 0, 20, 20), s);
246			    icon3.vertex = true;
247			    var icon4 = new mxCell('4', new mxGeometry(120, 0, 20, 20), s);
248			    icon4.vertex = true;
249			    var icon5 = new mxCell('5', new mxGeometry(160, 0, 20, 20), s);
250			    icon5.vertex = true;
251			    var icon6 = new mxCell('6', new mxGeometry(200, 0, 20, 20), s);
252			    icon6.vertex = true;
253			    var icon7 = new mxCell('7', new mxGeometry(240, 0, 20, 20), s);
254			    icon7.vertex = true;
255			    var label1 = new mxCell('Markers to be used with the legend', new mxGeometry(0, 20, 260, 30),
256			    		'strokeColor=none;fillColor=none;fontColor=#757575;align=left;html=1;fontStyle=0;fontSize=11;');
257			    label1.vertex = true;
258
259			   	return sb.createVertexTemplateFromCells([icon1, icon2, icon3, icon4, icon5, icon6, icon7, label1], 260, 50, 'Markers');
260			}),
261
262			this.addEntry(dt + 'markers', function()
263		   	{
264				var s = 'strokeColor=none;fillColor=none;fontColor=#757575;align=left;html=1;fontStyle=0;spacingLeft=5;fontSize=11;verticalAlign=top;whiteSpace=wrap;spacingRight=5;';
265
266			    var bg = new mxCell('', new mxGeometry(0, 0, 600, 70),
267	    			'strokeColor=#BDBDBD;strokeWidth=1;shadow=0;gradientColor=none;');
268			    bg.vertex = true;
269
270			    var label1 = new mxCell('1 Commit code', new mxGeometry(0, 0, 200, 30), s);
271			    label1.geometry.relative = true;
272			    label1.vertex = true;
273			    bg.insert(label1);
274
275			    var label2 = new mxCell('2 Detect code change', new mxGeometry(0, 0, 200, 30), s);
276			    label2.geometry.relative = true;
277			    label2.geometry.offset = new mxPoint(0, 30);
278			    label2.vertex = true;
279			    bg.insert(label2);
280
281			    var label3 = new mxCell('3 Build immutable image', new mxGeometry(0, 0, 200, 30), s);
282			    label3.geometry.relative = true;
283			    label3.geometry.offset = new mxPoint(200, 0);
284			    label3.vertex = true;
285			    bg.insert(label3);
286
287			    var label4 = new mxCell('4 Launch test instance from image', new mxGeometry(0, 0, 200, 30), s);
288			    label4.geometry.relative = true;
289			    label4.geometry.offset = new mxPoint(200, 30);
290			    label4.vertex = true;
291			    bg.insert(label4);
292
293			    var label5 = new mxCell('5 Run tests', new mxGeometry(0, 0, 200, 30), s);
294			    label5.geometry.relative = true;
295			    label5.geometry.offset = new mxPoint(400, 0);
296			    label5.vertex = true;
297			    bg.insert(label5);
298
299			    var label6 = new mxCell('6 Perform rolling update of image to autoscaler', new mxGeometry(0, 0, 200, 30), s);
300			    label6.geometry.relative = true;
301			    label6.geometry.offset = new mxPoint(400, 30);
302			    label6.vertex = true;
303			    bg.insert(label6);
304
305			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, 'Markers');
306			})
307	 	];
308
309		this.addPalette('gcp2Zones', 'GCP / Zones', false, mxUtils.bind(this, function(content)
310		{
311			for (var i = 0; i < fns.length; i++)
312			{
313				content.appendChild(fns[i](content));
314			}
315		}));
316	};
317
318	Sidebar.prototype.addGCP2GeneralIconsPalette = function()
319	{
320		var sb = this;
321		var s = 1;
322		var n = 'sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#3B8DF1;shape=mxgraph.gcp2.';
323		var dt = 'gcp google cloud platform general icons icon ';
324		var gn = 'mxgraph.gcp2';
325		var fns = [];
326
327		var fns = [
328		    this.createVertexTemplateEntry(n + 'biomedical_trio',
329		    		s * 100, s * 68, null, 'Biomedical Trio', null, null, this.getTagsForStencil(gn, '', dt + 'biomedical trio').join(' ')),
330		    this.createVertexTemplateEntry(n + 'biomedical_beaker',
331		    		s * 69, s * 100, null, 'Biomedical Beaker', null, null, this.getTagsForStencil(gn, '', dt + 'biomedical beaker').join(' ')),
332		    this.createVertexTemplateEntry(n + 'biomedical_test_tube',
333		    		s * 31, s * 100, null, 'Biomedical Test Tube', null, null, this.getTagsForStencil(gn, '', dt + 'biomedical test tube').join(' ')),
334		    this.createVertexTemplateEntry(n + 'check_available',
335		    		s * 100, s * 87, null, 'Check Available', null, null, this.getTagsForStencil(gn, '', dt + 'check available').join(' ')),
336		    this.createVertexTemplateEntry(n + 'cloud_monitoring',
337		    		s * 90, s * 100, null, 'Cloud Monitoring', null, null, this.getTagsForStencil(gn, '', dt + 'cloud monitoring').join(' ')),
338		    this.createVertexTemplateEntry(n + 'repository',
339		    		s * 60, s * 100, null, 'Repository', null, null, this.getTagsForStencil(gn, '', dt + 'repository').join(' ')),
340		    this.createVertexTemplateEntry(n + 'compute_engine_2',
341		    		s * 54, s * 100, null, 'Compute Engine', null, null, this.getTagsForStencil(gn, '', dt + 'compute engine').join(' ')),
342		    this.createVertexTemplateEntry(n + 'capabilities',
343		    		s * 100, s * 76, null, 'Capabilities', null, null, this.getTagsForStencil(gn, '', dt + 'capabilities thumbs up gear').join(' ')),
344		    this.createVertexTemplateEntry(n + 'globe_world',
345		    		s * 100, s * 95, null, 'World Network', null, null, this.getTagsForStencil(gn, '', dt + 'globe global world network upload anywhere').join(' ')),
346		    this.createVertexTemplateEntry(n + 'process',
347		    		s * 84, s * 100, null, 'Process', null, null, this.getTagsForStencil(gn, '', dt + 'process').join(' ')),
348		    this.createVertexTemplateEntry(n + 'arrow_cycle',
349		    		s * 100, s * 95, null, 'Arrow Cycle', null, null, this.getTagsForStencil(gn, '', dt + 'arrow cycle').join(' ')),
350		    this.createVertexTemplateEntry(n + 'arrows_system',
351		    		s * 100, s * 95, null, 'Arrows System', null, null, this.getTagsForStencil(gn, '', dt + 'arrows system').join(' ')),
352		    this.createVertexTemplateEntry(n + 'half_cloud',
353		    		s * 100, s * 50, null, 'Half Cloud', null, null, this.getTagsForStencil(gn, '', dt + 'half cloud').join(' ')),
354		    this.createVertexTemplateEntry(n + 'cloud',
355		    		s * 100, s * 69, null, 'Cloud', null, null, this.getTagsForStencil(gn, '', dt + 'cloud').join(' ')),
356		    this.createVertexTemplateEntry(n + 'speed',
357		    		s * 100, s * 57, null, 'Speed', null, null, this.getTagsForStencil(gn, '', dt + 'speed').join(' ')),
358		    this.createVertexTemplateEntry(n + 'time_clock',
359		    		s * 86, s * 100, null, 'Overtime', null, null, this.getTagsForStencil(gn, '', dt + 'time clock frozen cold overtime').join(' ')),
360		    this.createVertexTemplateEntry(n + 'loading',
361		    		s * 100, s * 100, null, 'Loading', null, null, this.getTagsForStencil(gn, '', dt + 'loading').join(' ')),
362		    this.createVertexTemplateEntry(n + 'clock',
363		    		s * 100, s * 100, null, 'Clock', null, null, this.getTagsForStencil(gn, '', dt + 'clock').join(' ')),
364		    this.createVertexTemplateEntry(n + 'check',
365		    		s * 100, s * 80, null, 'Check', null, null, this.getTagsForStencil(gn, '', dt + 'check').join(' ')),
366		    this.createVertexTemplateEntry('sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#F4AF20;shape=mxgraph.gcp2.check',
367		    		s * 100, s * 80, null, 'Check (yellow)', null, null, this.getTagsForStencil(gn, '', dt + 'check').join(' ')),
368		    this.createVertexTemplateEntry('sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#2D9C5E;shape=mxgraph.gcp2.check',
369		    		s * 100, s * 80, null, 'Check (green)', null, null, this.getTagsForStencil(gn, '', dt + 'check').join(' ')),
370		    this.createVertexTemplateEntry(n + 'lock',
371		    		s * 78, s * 100, null, 'Lock', null, null, this.getTagsForStencil(gn, '', dt + 'lock').join(' ')),
372		    this.createVertexTemplateEntry(n + 'cloud_security',
373		    		s * 100, s * 70, null, 'Cloud Security', null, null, this.getTagsForStencil(gn, '', dt + 'cloud security').join(' ')),
374		    this.createVertexTemplateEntry(n + 'cloud_checkmark',
375		    		s * 100, s * 67, null, 'Cloud Checkmark', null, null, this.getTagsForStencil(gn, '', dt + 'cloud checkmark').join(' ')),
376		    this.createVertexTemplateEntry(n + 'key',
377		    		s * 100, s * 47, null, 'Key', null, null, this.getTagsForStencil(gn, '', dt + 'key').join(' ')),
378		    this.createVertexTemplateEntry(n + 'aspect_ratio',
379		    		s * 100, s * 92, null, 'Aspect Ratio', null, null, this.getTagsForStencil(gn, '', dt + 'aspect ratio').join(' ')),
380		    this.createVertexTemplateEntry(n + 'scale',
381		    		s * 100, s * 92, null, 'Check', null, null, this.getTagsForStencil(gn, '', dt + 'check scale aspect ratio').join(' ')),
382		    this.createVertexTemplateEntry(n + 'big_query',
383		    		s * 99, s * 100, null, 'Big Query', null, null, this.getTagsForStencil(gn, '', dt + 'big query').join(' ')),
384		    this.createVertexTemplateEntry(n + 'search',
385		    		s * 99, s * 100, null, 'Search', null, null, this.getTagsForStencil(gn, '', dt + 'search').join(' ')),
386		    this.createVertexTemplateEntry('sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#2D9C5E;shape=mxgraph.gcp2.search',
387		    		s * 99, s * 100, null, 'Search (green)', null, null, this.getTagsForStencil(gn, '', dt + 'search').join(' ')),
388		    this.createVertexTemplateEntry(n + 'solution',
389		    		s * 99, s * 100, null, 'Solution', null, null, this.getTagsForStencil(gn, '', dt + 'solution').join(' ')),
390		    this.createVertexTemplateEntry(n + 'visibility',
391		    		s * 100, s * 94, null, 'Visibility', null, null, this.getTagsForStencil(gn, '', dt + 'visibility').join(' ')),
392		    this.createVertexTemplateEntry(n + 'anomaly_detection',
393		    		s * 78, s * 100, null, 'Anomaly Detection', null, null, this.getTagsForStencil(gn, '', dt + 'anomaly detection').join(' ')),
394		    this.createVertexTemplateEntry(n + 'view_list',
395		    		s * 81, s * 100, null, 'View List', null, null, this.getTagsForStencil(gn, '', dt + 'view list').join(' ')),
396		    this.createVertexTemplateEntry(n + 'connected',
397		    		s * 100, s * 72, null, 'Admin', null, null, this.getTagsForStencil(gn, '', dt + 'admin system connected').join(' ')),
398		    this.createVertexTemplateEntry(n + 'cloud_server',
399		    		s * 100, s * 89, null, 'Cloud Server', null, null, this.getTagsForStencil(gn, '', dt + 'cloud server').join(' ')),
400		    this.createVertexTemplateEntry(n + 'primary',
401		    		s * 100, s * 15, null, 'Primary', null, null, this.getTagsForStencil(gn, '', dt + 'primary').join(' ')),
402		    this.createVertexTemplateEntry(n + 'monitor',
403		    		s * 100, s * 85, null, 'Monitor', null, null, this.getTagsForStencil(gn, '', dt + 'monitor save help').join(' ')),
404		    this.createVertexTemplateEntry(n + 'monitor_2',
405		    		s * 100, s * 85, null, 'Monitor', null, null, this.getTagsForStencil(gn, '', dt + 'monitor').join(' ')),
406		    this.createVertexTemplateEntry(n + 'website',
407		    		s * 100, s * 97, null, 'Website', null, null, this.getTagsForStencil(gn, '', dt + 'website').join(' ')),
408		    this.createVertexTemplateEntry(n + 'safety',
409		    		s * 100, s * 96, null, 'Safety', null, null, this.getTagsForStencil(gn, '', dt + 'safety').join(' ')),
410		    this.createVertexTemplateEntry(n + 'gear_load',
411		    		s * 100, s * 92, null, 'Gear Load', null, null, this.getTagsForStencil(gn, '', dt + 'gear load').join(' ')),
412		    this.createVertexTemplateEntry(n + 'files',
413		    		s * 100, s * 97, null, 'Files', null, null, this.getTagsForStencil(gn, '', dt + 'files data sharing').join(' ')),
414		    this.createVertexTemplateEntry(n + 'play_gear',
415		    		s * 100, s * 100, null, 'Play Gear', null, null, this.getTagsForStencil(gn, '', dt + 'play gear').join(' ')),
416		    this.createVertexTemplateEntry(n + 'play_start',
417		    		s * 100, s * 100, null, 'Play Start', null, null, this.getTagsForStencil(gn, '', dt + 'play start').join(' ')),
418		    this.createVertexTemplateEntry(n + 'replication_controller',
419		    		s * 100, s * 91, null, 'Replication Controller', null, null, this.getTagsForStencil(gn, '', dt + 'replication controller').join(' ')),
420		    this.createVertexTemplateEntry(n + 'replication_controller_2',
421		    		s * 100, s * 91, null, 'Replication Controller', null, null, this.getTagsForStencil(gn, '', dt + 'replication controller').join(' ')),
422		    this.createVertexTemplateEntry(n + 'replication_controller_3',
423		    		s * 100, s * 66, null, 'Replication Controller', null, null, this.getTagsForStencil(gn, '', dt + 'replication controller').join(' ')),
424		    this.createVertexTemplateEntry(n + 'repository_2',
425		    		s * 94, s * 100, null, 'Repository', null, null, this.getTagsForStencil(gn, '', dt + 'repository upload swap').join(' ')),
426		    this.createVertexTemplateEntry(n + 'repository_3',
427		    		s * 100, s * 100, null, 'Repository', null, null, this.getTagsForStencil(gn, '', dt + 'repository').join(' ')),
428		    this.createVertexTemplateEntry(n + 'repository_primary',
429		    		s * 100, s * 100, null, 'Repository', null, null, this.getTagsForStencil(gn, '', dt + 'repository primary').join(' ')),
430		    this.createVertexTemplateEntry(n + 'database_3',
431		    		s * 70, s * 100, null, 'Database', null, null, this.getTagsForStencil(gn, '', dt + 'database db files').join(' ')),
432		    this.createVertexTemplateEntry(n + 'database_uploading',
433		    		s * 100, s * 84, null, 'Database Uploading', null, null, this.getTagsForStencil(gn, '', dt + 'database db uploading').join(' ')),
434		    this.createVertexTemplateEntry(n + 'servers_stacked',
435		    		s * 100, s * 100, null, 'Servers Stacked', null, null, this.getTagsForStencil(gn, '', dt + 'servers stacked').join(' ')),
436		    this.createVertexTemplateEntry(n + 'segments',
437		    		s * 100, s * 100, null, 'Segments', null, null, this.getTagsForStencil(gn, '', dt + 'segments').join(' ')),
438		    this.createVertexTemplateEntry(n + 'segments_2',
439		    		s * 100, s * 92, null, 'Segments', null, null, this.getTagsForStencil(gn, '', dt + 'segments').join(' ')),
440		    this.createVertexTemplateEntry(n + 'segments_overlap',
441		    		s * 100, s * 100, null, 'Segments Overlap', null, null, this.getTagsForStencil(gn, '', dt + 'segments overlap').join(' ')),
442		    this.createVertexTemplateEntry(n + 'cost_savings',
443		    		s * 66, s * 100, null, 'Cost Savings', null, null, this.getTagsForStencil(gn, '', dt + 'cost savings').join(' ')),
444		    this.createVertexTemplateEntry(n + 'enhance_ui',
445		    		s * 76, s * 100, null, 'Enhance UI', null, null, this.getTagsForStencil(gn, '', dt + 'enhance ui').join(' ')),
446		    this.createVertexTemplateEntry(n + 'phone_android',
447		    		s * 56, s * 100, null, 'Phone', null, null, this.getTagsForStencil(gn, '', dt + 'phone android').join(' ')),
448		    this.createVertexTemplateEntry(n + 'cost_arrows',
449		    		s * 76, s * 100, null, 'Cost Arrows', null, null, this.getTagsForStencil(gn, '', dt + 'cost arrows').join(' ')),
450		    this.createVertexTemplateEntry(n + 'increase_cost_arrows',
451		    		s * 100, s * 92, null, 'Increase Cost Arrows', null, null, this.getTagsForStencil(gn, '', dt + 'increase cost arrows').join(' ')),
452		    this.createVertexTemplateEntry(n + 'cost',
453		    		s * 85, s * 100, null, 'Cost File', null, null, this.getTagsForStencil(gn, '', dt + 'cost file').join(' ')),
454		    this.createVertexTemplateEntry(n + 'database_2',
455		    		s * 78, s * 100, null, 'Database', null, null, this.getTagsForStencil(gn, '', dt + 'database db').join(' ')),
456		    this.createVertexTemplateEntry(n + 'database_speed',
457		    		s * 69, s * 100, null, 'Database Speed', null, null, this.getTagsForStencil(gn, '', dt + 'database db speed').join(' ')),
458		    this.createVertexTemplateEntry(n + 'data_access',
459		    		s * 93, s * 100, null, 'Data Access', null, null, this.getTagsForStencil(gn, '', dt + 'data access file gear').join(' ')),
460		    this.createVertexTemplateEntry(n + 'database_cycle',
461		    		s * 100, s * 98, null, 'Database Cycle', null, null, this.getTagsForStencil(gn, '', dt + 'database db cycle').join(' ')),
462		    this.createVertexTemplateEntry(n + 'data_increase',
463		    		s * 78, s * 100, null, 'Data Increase', null, null, this.getTagsForStencil(gn, '', dt + 'data increase').join(' ')),
464		    this.createVertexTemplateEntry(n + 'data_storage_cost',
465		    		s * 78, s * 100, null, 'Data Storage Cost', null, null, this.getTagsForStencil(gn, '', dt + 'data storage cost').join(' ')),
466		    this.createVertexTemplateEntry(n + 'gear',
467		    		s * 100, s * 100, null, 'Gear', null, null, this.getTagsForStencil(gn, '', dt + 'gear').join(' ')),
468		    this.createVertexTemplateEntry(n + 'gear_chain',
469		    		s * 100, s * 100, null, 'Gear Chain', null, null, this.getTagsForStencil(gn, '', dt + 'gear chain').join(' ')),
470		    this.createVertexTemplateEntry(n + 'bucket_scale',
471		    		s * 100, s * 81, null, 'Bucket Scale', null, null, this.getTagsForStencil(gn, '', dt + 'bucket scale').join(' ')),
472		    this.createVertexTemplateEntry(n + 'a7_power',
473		    		s * 100, s * 100, null, 'A7 Power', null, null, this.getTagsForStencil(gn, '', dt + 'a7 power').join(' ')),
474		    this.createVertexTemplateEntry(n + 'gear_arrow',
475		    		s * 100, s * 61, null, 'Gear Arrow', null, null, this.getTagsForStencil(gn, '', dt + 'gear arrow').join(' ')),
476		    this.createVertexTemplateEntry(n + 'swap',
477		    		s * 100, s * 51, null, 'Swap', null, null, this.getTagsForStencil(gn, '', dt + 'swap').join(' ')),
478		    this.createVertexTemplateEntry(n + 'save',
479		    		s * 100, s * 84, null, 'Save', null, null, this.getTagsForStencil(gn, '', dt + 'save').join(' ')),
480		    this.createVertexTemplateEntry(n + 'social_media_time',
481		    		s * 97, s * 100, null, 'Social Media Time', null, null, this.getTagsForStencil(gn, '', dt + 'social media time').join(' ')),
482		    this.createVertexTemplateEntry(n + 'tape_record',
483		    		s * 100, s * 71, null, 'Tape Record', null, null, this.getTagsForStencil(gn, '', dt + 'tape record').join(' ')),
484		    this.createVertexTemplateEntry(n + 'folders',
485		    		s * 100, s * 85, null, 'Folders', null, null, this.getTagsForStencil(gn, '', dt + 'folders extensible').join(' ')),
486		    this.createVertexTemplateEntry(n + 'maps_api',
487		    		s * 61, s * 100, null, 'Maps API', null, null, this.getTagsForStencil(gn, '', dt + 'maps api application programming interface').join(' ')),
488		    this.createVertexTemplateEntry(n + 'enhance_ui_2',
489		    		s * 100, s * 91, null, 'Enhance UI', null, null, this.getTagsForStencil(gn, '', dt + 'enhance ui user interface').join(' ')),
490		    this.createVertexTemplateEntry(n + 'certified_industry_standard',
491		    		s * 100, s * 78, null, 'Certified Industry Standard', null, null, this.getTagsForStencil(gn, '', dt + 'certified industry standard').join(' ')),
492		    this.createVertexTemplateEntry(n + 'calculator',
493		    		s * 100, s * 74, null, 'Calculator', null, null, this.getTagsForStencil(gn, '', dt + 'calculator').join(' ')),
494		    this.createVertexTemplateEntry(n + 'network',
495		    		s * 100, s * 100, null, 'Network', null, null, this.getTagsForStencil(gn, '', dt + 'network').join(' ')),
496		    this.createVertexTemplateEntry(n + 'cloud_computer',
497		    		s * 100, s * 88, null, 'Cloud Computer', null, null, this.getTagsForStencil(gn, '', dt + 'cloud computer').join(' ')),
498		    this.createVertexTemplateEntry(n + 'cloud_connected_insight',
499		    		s * 100, s * 91, null, 'Cloud Connected Insight', null, null, this.getTagsForStencil(gn, '', dt + 'cloud connected insight').join(' ')),
500		    this.createVertexTemplateEntry(n + 'cloud_information',
501		    		s * 100, s * 79, null, 'Cloud Information Portable', null, null, this.getTagsForStencil(gn, '', dt + 'cloud information portable').join(' ')),
502		    this.createVertexTemplateEntry(n + 'lifecycle',
503		    		s * 100, s * 100, null, 'Lifecycle', null, null, this.getTagsForStencil(gn, '', dt + 'lifecycle time folder loading').join(' ')),
504		    this.createVertexTemplateEntry(n + 'thumbs_up',
505		    		s * 100, s * 100, null, 'Thumbs Up', null, null, this.getTagsForStencil(gn, '', dt + 'thumbs up').join(' ')),
506		    this.createVertexTemplateEntry(n + 'loading_2',
507		    		s * 93, s * 100, null, 'Loading', null, null, this.getTagsForStencil(gn, '', dt + 'loading').join(' ')),
508		    this.createVertexTemplateEntry(n + 'internet_connection',
509		    		s * 100, s * 83, null, 'Internet Connection', null, null, this.getTagsForStencil(gn, '', dt + 'internet connection').join(' ')),
510		    this.createVertexTemplateEntry(n + 'check_scale',
511		    		s * 100, s * 75, null, 'Check Scale', null, null, this.getTagsForStencil(gn, '', dt + 'check scale').join(' ')),
512		    this.createVertexTemplateEntry(n + 'load_balancing',
513		    		s * 100, s * 26, null, 'Load Balancing', null, null, this.getTagsForStencil(gn, '', dt + 'load balancing').join(' ')),
514		    this.createVertexTemplateEntry(n + 'cloud_messaging',
515		    		s * 100, s * 64, null, 'Cloud Messaging', null, null, this.getTagsForStencil(gn, '', dt + 'cloud messaging').join(' ')),
516		    this.createVertexTemplateEntry(n + 'memory_card',
517		    		s * 93, s * 100, null, 'Memory Card', null, null, this.getTagsForStencil(gn, '', dt + 'memory card').join(' ')),
518		    this.createVertexTemplateEntry(n + 'admin_connected',
519		    		s * 100, s * 100, null, 'Admin Connected', null, null, this.getTagsForStencil(gn, '', dt + 'admin connected').join(' ')),
520		    this.createVertexTemplateEntry('sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#3B8DF1;shape=ellipse',
521		    		s * 100, s * 100, null, 'Images Service', null, null, this.getTagsForStencil(gn, '', dt + 'images service').join(' ')),
522		    this.createVertexTemplateEntry(n + 'task_queues_2',
523		    		s * 100, s * 61, null, 'Task Queues', null, null, this.getTagsForStencil(gn, '', dt + 'task queues').join(' ')),
524		    this.createVertexTemplateEntry(n + 'systems_check',
525		    		s * 99, s * 100, null, 'Systems Check', null, null, this.getTagsForStencil(gn, '', dt + 'systems check').join(' ')),
526		    this.createVertexTemplateEntry(n + 'google_network',
527		    		s * 100, s * 100, null, 'Google Network', null, null, this.getTagsForStencil(gn, '', dt + 'google network').join(' ')),
528		    this.createVertexTemplateEntry(n + 'check_2',
529		    		s * 100, s * 100, null, 'Check', null, null, this.getTagsForStencil(gn, '', dt + 'check').join(' ')),
530		    this.createVertexTemplateEntry(n + 'people_security_management',
531		    		s * 100, s * 100, null, 'People Security Management', null, null, this.getTagsForStencil(gn, '', dt + 'people security management').join(' ')),
532		    this.createVertexTemplateEntry(n + 'search_api',
533		    		s * 100, s * 100, null, 'Search API', null, null, this.getTagsForStencil(gn, '', dt + 'search api application programming interface').join(' ')),
534		    this.createVertexTemplateEntry(n + 'management_security',
535		    		s * 100, s * 100, null, 'Management Security', null, null, this.getTagsForStencil(gn, '', dt + 'management security').join(' ')),
536		    this.createVertexTemplateEntry(n + 'loading_3',
537		    		s * 100, s * 100, null, 'Loading', null, null, this.getTagsForStencil(gn, '', dt + 'loading').join(' ')),
538		    this.createVertexTemplateEntry(n + 'stacked_ownership',
539		    		s * 100, s * 100, null, 'Stacked Ownership', null, null, this.getTagsForStencil(gn, '', dt + 'stacked ownership').join(' ')),
540		    this.createVertexTemplateEntry(n + 'vpn',
541		    		s * 100, s * 50, null, 'VPN', null, null, this.getTagsForStencil(gn, '', dt + 'vpn virtual private network').join(' ')),
542		    this.createVertexTemplateEntry(n + 'node',
543		    		s * 80, s * 100, null, 'Node', null, null, this.getTagsForStencil(gn, '', dt + 'node').join(' ')),
544		    this.createVertexTemplateEntry(n + 'service',
545		    		s * 70, s * 100, null, 'Service', null, null, this.getTagsForStencil(gn, '', dt + 'service').join(' ')),
546		    this.createVertexTemplateEntry('sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#2D9C5E;shape=mxgraph.gcp2.external_data_center',
547		    		s * 77, s * 100, null, 'External Data Center', null, null, this.getTagsForStencil(gn, '', dt + 'external data center').join(' ')),
548		    this.createVertexTemplateEntry('sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#2D9C5E;shape=mxgraph.gcp2.external_data_resource',
549		    		s * 79, s * 100, null, 'External Data Resource', null, null, this.getTagsForStencil(gn, '', dt + 'external data resource').join(' ')),
550		    this.createVertexTemplateEntry('sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#2D9C5E;shape=mxgraph.gcp2.legacy_cloud',
551		    		s * 100, s * 69, null, 'Legacy Cloud', null, null, this.getTagsForStencil(gn, '', dt + 'legacy cloud').join(' ')),
552		    this.createVertexTemplateEntry('sketch=0;html=1;aspect=fixed;strokeColor=none;shadow=0;align=center;verticalAlign=top;fillColor=#2D9C5E;shape=mxgraph.gcp2.legacy_cloud_2',
553		    		s * 100, s * 69, null, 'Legacy Cloud', null, null, this.getTagsForStencil(gn, '', dt + 'legacy cloud').join(' ')),
554		    this.createVertexTemplateEntry(n + 'mem_instances',
555		    		s * 100, s * 87, null, 'Mem Instances', null, null, this.getTagsForStencil(gn, '', dt + 'mem instances').join(' '))
556	 	];
557
558		this.addPalette('gcp2General Icons', 'GCP / General Icons', false, mxUtils.bind(this, function(content)
559		{
560			for (var i = 0; i < fns.length; i++)
561			{
562				content.appendChild(fns[i](content));
563			}
564		}));
565	};
566
567	Sidebar.prototype.addGCP2ServiceCardsPalette = function()
568	{
569		var dt = 'gcp google cloud platform service cards ';
570		var fns = [];
571
572		this.addGCP2ServiceCard('Gateway', 'gateway', 100, 44, dt + 'gateway', fns);
573		this.addGCP2ServiceCard('Memcache', 'memcache', 110, 44, dt + 'memcache', fns);
574		this.addGCP2ServiceCard('Logs API', 'logs_api', 100, 44, dt + 'logs api application programming interface', fns);
575		this.addGCP2ServiceCard('Cluster', 'cluster', 90, 44, dt + 'cluster', fns);//TODO fix parser or source
576		this.addGCP2ServiceCard('NAT', 'nat', 80, 44, dt + 'nat network address translation', fns);
577		this.addGCP2ServiceCard('Squid Proxy', 'squid_proxy', 120, 44, dt + 'squid proxy', fns);
578		this.addGCP2ServiceCard('Bucket', 'bucket', 100, 44, dt + 'bucket', fns);
579		this.addGCP2ServiceCard('Service Discovery', 'service_discovery', 150, 44, dt + 'service discovery', fns);
580		this.addGCP2ServiceCard('Task\nQueues', 'task_queues', 90, 44, dt + 'task queues', fns);
581		this.addGCP2ServiceCard('Image\nServices', 'image_services', 100, 44, dt + 'image services', fns);
582		this.addGCP2ServiceCard('Dedicated\nGame Server', 'dedicated_game_server', 120, 44, dt + 'dedicated game server', fns);
583		this.addGCP2ServiceCard('Frontend\nPlatform Services', 'frontend_platform_services', 150, 44, dt + 'frontend platform services', fns);
584		this.addGCP2ServiceCard('Google\nEdge POP', 'google_network_edge_cache', 110, 56, dt + 'google edge pop point of presence', fns);
585		this.addGCP2ServiceCard('External\nPayment Form', 'external_payment_form', 130, 44, dt + 'external payment form', fns);
586		this.addGCP2ServiceCard('Internal Payment\nAuthorization', 'internal_payment_authorization', 150, 44, dt + 'internal payment authorization', fns);
587		this.addGCP2ServiceCard('VPN Gateway', 'gateway', 130, 44, dt + 'vpn gateway virtual private network', fns);
588		this.addGCP2ServiceCard('Application\nSystem(s)', 'application_system', 110, 44, dt + 'application system systems', fns);
589		this.addGCP2ServiceCard('Virtual\nFile System', 'virtual_file_system', 110, 44, dt + 'virtual file system', fns);
590		this.addGCP2ServiceCard('CDN\nInterconnect', 'google_network_edge_cache', 120, 44, dt + 'cdn content delivery network interconnect', fns);
591		this.addGCP2ServiceCard('Scheduled\nTasks', 'scheduled_tasks', 110, 44, dt + 'scheduled tasks', fns);
592		this.addGCP2ServiceCard('HTTPS\nLoad Balancer', 'network_load_balancer', 130, 44, dt + 'https secure load balancer', fns);
593		this.addGCP2ServiceCard('Persistent\nDisk Snapshot', 'persistent_disk_snapshot', 130, 44, dt + 'persistent disk snapshot', fns);
594		this.addGCP2ServiceCard('Persistent\nDisk', 'persistent_disk_snapshot', 110, 44, dt + 'persistent disk', fns);
595		this.addGCP2ServiceCard('Network\nLoad\nBalancer', 'network_load_balancer', 100, 56, dt + 'network load balancer', fns);
596		this.addGCP2ServiceCard('Google\n Network W/\nEdge Cache', 'google_network_edge_cache', 120, 56, dt + 'google network witch edge cache', fns);
597		this.addGCP2ServiceCard('Push\nNotification\nService', 'push_notification_service', 110, 56, dt + 'push notification service', fns);
598		this.addGCP2ServiceCard('Blank One Line', 'blank', 140, 44, dt + 'blank one line', fns);
599
600		fns.push(
601			this.addEntry(dt + 'blank one line', function()
602		   	{
603			    var bg = new mxCell('Blank One Line', new mxGeometry(0, 0, 100, 44), 'dashed=0;strokeColor=#dddddd;shadow=1;strokeWidth=1;labelPosition=center;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontSize=12;');
604		    	bg.vertex = true;
605
606			   	return sb.createVertexTemplateFromCells([bg], 100, 44, 'Blank One Line');
607			})
608		);
609
610		this.addGCP2ServiceCard('Blank Two\n\& Three Line', 'blank', 120, 44, dt + 'blank two and three line', fns);
611
612		fns.push(
613			this.addEntry(dt + 'blank two and three line', function()
614		   	{
615			    var bg = new mxCell('Blank Two\n\& Three Line', new mxGeometry(0, 0, 90, 44), 'dashed=0;strokeColor=#dddddd;shadow=1;strokeWidth=1;labelPosition=center;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontSize=12;');
616		    	bg.vertex = true;
617
618			   	return sb.createVertexTemplateFromCells([bg], 100, 44, 'Blank One Line');
619			})
620		);
621
622		this.addPalette('gcp2Service Cards', 'GCP / Service Cards', false, mxUtils.bind(this, function(content)
623		{
624			for (var i = 0; i < fns.length; i++)
625			{
626				content.appendChild(fns[i](content));
627			}
628		}));
629	};
630
631	Sidebar.prototype.addGCP2ComputePalette = function()
632	{
633		var dt = 'gcp google cloud platform compute ';
634		var fns = [];
635
636		this.addGCP2CardSet('Compute\nEngine', 'compute_engine', 110, 160, dt + 'compute engine', fns);
637		this.addGCP2CardSet('GPU', 'gpu', 90, 100, dt + 'gpu graphics processing unit', fns);
638		this.addGCP2CardSet('App\nEngine', 'app_engine', 100, 130, dt + 'app engine application', fns);
639		this.addGCP2CardSet('Cloud\nFunctions', 'cloud_functions', 120, 150, dt + 'functions', fns);
640		this.addGCP2CardSet('Kubernetes\nEngine', 'container_engine', 130, 170, dt + 'kubernetes engine', fns);
641		this.addGCP2CardSet('Container-\nOptimized OS', 'container_optimized_os', 140, 200, dt + 'container optimized os operating system', fns);
642		this.addGCP2CardSet('Cloud Run', 'cloud_run', 120, 120, dt + 'cloud run', fns);
643		this.addGCP2CardSet('GKE-on-Prem', 'gke_on_prem', 140, 140, dt + 'gke on prem premise', fns);
644
645		this.addPalette('gcp2Compute', 'GCP / Compute', false, mxUtils.bind(this, function(content)
646		{
647			for (var i = 0; i < fns.length; i++)
648			{
649				content.appendChild(fns[i](content));
650			}
651		}));
652	};
653
654	Sidebar.prototype.addGCP2APIManagementPalette = function()
655	{
656		var dt = 'gcp google cloud platform api management ';
657		var fns = [];
658
659		this.addGCP2CardSet('API\nAnalytics', 'api_analytics', 110, 140, dt + 'api analytics application programming interface', fns);
660		this.addGCP2CardSet('Apigee\nSense', 'apigee_sense', 100, 140, dt + 'apigee sense', fns);
661		this.addGCP2CardSet('API\nMonetization', 'api_monetization', 130, 160, dt + 'api monetization application programming interface', fns);
662		this.addGCP2CardSet('Cloud\nEndpoints', 'cloud_endpoints', 120, 150, dt + 'cloud endpoints', fns);
663		this.addGCP2CardSet('Apigee API\nPlatform', 'apigee_api_platform', 130, 170, dt + 'apigee api platform application programming interface', fns);
664		this.addGCP2CardSet('Developer\nPortal', 'developer_portal', 120, 160, dt + 'developer portal', fns);
665
666		this.addPalette('gcp2API Management', 'GCP / API Management', false, mxUtils.bind(this, function(content)
667		{
668			for (var i = 0; i < fns.length; i++)
669			{
670				content.appendChild(fns[i](content));
671			}
672		}));
673	};
674
675	Sidebar.prototype.addGCP2SecurityPalette = function()
676	{
677		var dt = 'gcp google cloud platform security ';
678		var fns = [];
679
680		this.addGCP2CardSet('Cloud\nIAM', 'cloud_iam', 100, 120, dt + 'cloud iam', fns);
681		this.addGCP2CardSet('BeyondCorp', 'beyondcorp', 130, 130, dt + 'beyondcorp', fns);
682		this.addGCP2CardSet('Cloud Resource\nManager', 'cloud_iam', 150, 200, dt + 'cloud resource manager', fns);
683		this.addGCP2CardSet('Data Loss\nPrevention API', 'data_loss_prevention_api', 140, 200, dt + 'data loss prevention api application programming interface', fns);
684		this.addGCP2CardSet('Cloud Security\nScanner', 'cloud_security_scanner', 140, 190, dt + 'cloud security scanner', fns);
685		this.addGCP2CardSet('Key Management\nService', 'key_management_service', 160, 200, dt + 'key management service', fns);
686		this.addGCP2CardSet('Identity-Aware\nProxy', 'identity_aware_proxy', 140, 180, dt + 'identity aware proxy', fns);
687		this.addGCP2CardSet('Cloud Security\nCommand Center', 'cloud_security_command_center', 160, 240, dt + 'cloud security command center', fns);
688		this.addGCP2CardSet('Security Key\nEnforcement', 'security_key_enforcement', 130, 200, dt + 'security key enforcement', fns);
689
690		this.addPalette('gcp2Security', 'GCP / Security', false, mxUtils.bind(this, function(content)
691		{
692			for (var i = 0; i < fns.length; i++)
693			{
694				content.appendChild(fns[i](content));
695			}
696		}));
697	};
698
699	Sidebar.prototype.addGCP2DataAnalyticsPalette = function()
700	{
701		var dt = 'gcp google cloud platform data analytics ';
702		var fns = [];
703
704		this.addGCP2CardSet('BigQuery', 'bigquery', 120, 120, dt + 'bigquery', fns);
705		this.addGCP2CardSet('Cloud\nDatalab', 'cloud_datalab', 110, 140, dt + 'datalab', fns);
706		this.addGCP2CardSet('Cloud\nDataflow', 'cloud_dataflow', 110, 150, dt + 'dataflow', fns);
707		this.addGCP2CardSet('Cloud\nPub/Sub', 'cloud_pubsub', 110, 150, dt + 'pub sub', fns);
708		this.addGCP2CardSet('Cloud\nDataproc', 'cloud_dataproc', 110, 150, dt + 'dataproc', fns);
709		this.addGCP2CardSet('Genomics', 'genomics', 120, 120, dt + 'genomics', fns);
710		this.addGCP2CardSet('Cloud\nDataprep', 'cloud_dataprep', 110, 150, dt + 'dataprep', fns);
711		this.addGCP2CardSet('Cloud\nComposer', 'cloud_composer', 120, 150, dt + 'cloud composer', fns);
712		this.addGCP2CardSet('Cloud Data Catalog', 'cloud_data_catalog', 170, 170, dt + 'cloud data catalog', fns);
713		this.addGCP2CardSet('Cloud Data Fusion', 'cloud_data_fusion', 160, 160, dt + 'cloud data fusion', fns);
714
715		this.addPalette('gcp2Data Analytics', 'GCP / Data Analytics', false, mxUtils.bind(this, function(content)
716		{
717			for (var i = 0; i < fns.length; i++)
718			{
719				content.appendChild(fns[i](content));
720			}
721		}));
722	};
723
724	Sidebar.prototype.addGCP2DataTransferPalette = function()
725	{
726		var dt = 'gcp google cloud platform data transfer ';
727		var fns = [];
728
729		this.addGCP2CardSet('Transfer\nAppliance', 'transfer_appliance', 120, 170, dt + 'appliance', fns);
730
731		this.addPalette('gcp2Data Transfer', 'GCP / Data Transfer', false, mxUtils.bind(this, function(content)
732		{
733			for (var i = 0; i < fns.length; i++)
734			{
735				content.appendChild(fns[i](content));
736			}
737		}));
738	};
739
740	Sidebar.prototype.addGCP2CloudAIPalette = function()
741	{
742		var dt = 'gcp google cloud platform ai artificial intelligence ';
743		var fns = [];
744
745		this.addGCP2CardSet('Cloud Machine\nLearning', 'cloud_machine_learning', 150, 200, dt + 'cloud machine learning', fns);
746		this.addGCP2CardSet('Natural\nLanguage API', 'cloud_natural_language_api', 140, 180, dt + 'natural language api application programming interface', fns);
747		this.addGCP2CardSet('Vision\nAPI', 'cloud_vision_api', 100, 120, dt + 'vision api application programming interface', fns);
748		this.addGCP2CardSet('Translation\nAPI', 'cloud_translation_api', 120, 150, dt + 'translation api application programming interface', fns);
749		this.addGCP2CardSet('Speech\nAPI', 'cloud_speech_api', 110, 130, dt + 'speech api application programming interface', fns);
750		this.addGCP2CardSet('Jobs\nAPI', 'cloud_jobs_api', 90, 110, dt + 'jobs api application programming interface', fns);
751		this.addGCP2CardSet('Cloud Video\nIntelligence API', 'cloud_video_intelligence_api', 150, 220, dt + 'cloud video intelligence api application programming interface', fns);
752		this.addGCP2CardSet('Advanced\nSolutions Lab', 'advanced_solutions_lab', 140, 200, dt + 'advanced solutions lab', fns);
753
754		this.addPalette('gcp2Cloud AI', 'GCP / Cloud AI', false, mxUtils.bind(this, function(content)
755		{
756			for (var i = 0; i < fns.length; i++)
757			{
758				content.appendChild(fns[i](content));
759			}
760		}));
761	};
762
763	Sidebar.prototype.addGCP2InternetOfThingsPalette = function()
764	{
765		var dt = 'gcp google cloud platform iot internet of things ';
766		var fns = [];
767
768		this.addGCP2CardSet('Cloud\nIoT Core', 'cloud_iot_core', 110, 150, dt + 'core', fns);
769
770		this.addPalette('gcp2Internet of Things', 'GCP / Internet of Things', false, mxUtils.bind(this, function(content)
771		{
772			for (var i = 0; i < fns.length; i++)
773			{
774				content.appendChild(fns[i](content));
775			}
776		}));
777	};
778
779	Sidebar.prototype.addGCP2DatabasesPalette = function()
780	{
781		var dt = 'gcp google cloud platform databases ';
782		var fns = [];
783
784		this.addGCP2CardSet('Cloud\nSQL', 'cloud_sql', 100, 120, dt + 'sql', fns);
785		this.addGCP2CardSet('Cloud\nBigtable', 'cloud_bigtable', 110, 140, dt + 'bigtable', fns);
786		this.addGCP2CardSet('Cloud\nSpanner', 'cloud_spanner', 110, 150, dt + 'spanner', fns);
787		this.addGCP2CardSet('Cloud\nMemorystore', 'cloud_memorystore', 140, 170, dt + 'memorystore', fns);
788		this.addGCP2CardSet('Cloud\nFirestore', 'cloud_firestore', 110, 150, dt + 'filestore', fns);
789		this.addGCP2CardSet('Cloud\nDatastore', 'cloud_datastore', 120, 150, dt + 'datastore', fns);
790
791		this.addPalette('gcp2Databases', 'GCP / Databases', false, mxUtils.bind(this, function(content)
792		{
793			for (var i = 0; i < fns.length; i++)
794			{
795				content.appendChild(fns[i](content));
796			}
797		}));
798	};
799
800	Sidebar.prototype.addGCP2StoragePalette = function()
801	{
802		var dt = 'gcp google cloud platform storage ';
803		var fns = [];
804
805		this.addGCP2CardSet('Cloud\nStorage', 'cloud_storage', 110, 140, dt, fns);
806		this.addGCP2CardSet('Persistent\nDisk', 'persistent_disk', 120, 150, dt + 'persistent disk', fns);
807		this.addGCP2CardSet('Cloud\nFilestore', 'cloud_filestore', 110, 150, dt + 'filestore', fns);
808
809		this.addPalette('gcp2Storage', 'GCP / Storage', false, mxUtils.bind(this, function(content)
810		{
811			for (var i = 0; i < fns.length; i++)
812			{
813				content.appendChild(fns[i](content));
814			}
815		}));
816	};
817
818	Sidebar.prototype.addGCP2ManagementToolsPalette = function()
819	{
820		var dt = 'gcp google cloud platform management tools ';
821		var fns = [];
822
823		this.addGCP2CardSet('Stackdriver', 'stackdriver', 130, 130, dt + 'stackdriver', fns);
824		this.addGCP2CardSet('Debugger', 'debugger', 120, 120, dt + 'debugger', fns);
825		this.addGCP2CardSet('Monitoring', 'cloud_deployment_manager', 120, 120, dt + 'monitoring', fns);
826		this.addGCP2CardSet('Deployment\nManager', 'cloud_deployment_manager', 130, 180, dt + 'deployment manager', fns);
827		this.addGCP2CardSet('Logging', 'logging', 110, 110, dt + 'logging', fns);
828		this.addGCP2CardSet('Cloud\nConsole', 'placeholder', 110, 140, dt + 'console', fns);
829		this.addGCP2CardSet('Error\nReporting', 'error_reporting', 120, 150, dt + 'error reporting', fns);
830		this.addGCP2CardSet('Cloud\nShell', 'placeholder', 100, 130, dt + 'shell', fns);
831		this.addGCP2CardSet('Trace', 'trace', 100, 100, dt + 'trace', fns);
832		this.addGCP2CardSet('Cloud\nMobile App', 'placeholder', 130, 160, dt + 'mobile app', fns);
833		this.addGCP2CardSet('Profiler', 'profiler', 110, 110, dt + 'profiler', fns);
834		this.addGCP2CardSet('Billing\nAPI', 'placeholder', 100, 120, dt + 'billing api application programming interface', fns);
835		this.addGCP2CardSet('Cloud\nAPIs', 'cloud_apis', 100, 130, dt + 'api application programming interface', fns);
836
837		this.addPalette('gcp2Management Tools', 'GCP / Management Tools', false, mxUtils.bind(this, function(content)
838		{
839			for (var i = 0; i < fns.length; i++)
840			{
841				content.appendChild(fns[i](content));
842			}
843		}));
844	};
845
846	Sidebar.prototype.addGCP2NetworkingPalette = function()
847	{
848		var dt = 'gcp google cloud platform networking ';
849		var fns = [];
850
851		this.addGCP2CardSet('Virtual\nPrivate Cloud', 'virtual_private_cloud', 140, 180, dt + 'virtual private', fns);
852		this.addGCP2CardSet('Dedicated\nInterconnect', 'dedicated_interconnect', 130, 190, dt + 'dedicated interconnect', fns);
853		this.addGCP2CardSet('Cloud Load\nBalancing', 'cloud_load_balancing', 130, 180, dt + 'load balancing', fns);
854		this.addGCP2CardSet('Cloud \nDNS', 'cloud_dns', 100, 130, dt + 'dns domain name server', fns);
855		this.addGCP2CardSet('Cloud \nCDN', 'cloud_cdn', 100, 130, dt + 'cdn content delivery network', fns);
856		this.addGCP2CardSet('Cloud\nNetwork', 'cloud_network', 110, 140, dt + 'network', fns);
857		this.addGCP2CardSet('Cloud External\nIP Addresses', 'cloud_external_ip_addresses', 150, 220, dt + 'external ip addresses internet protocol', fns);
858		this.addGCP2CardSet('Cloud\nRoutes', 'cloud_routes', 100, 140, dt + 'routes', fns);
859		this.addGCP2CardSet('Cloud\nFirewall Rules', 'cloud_firewall_rules', 140, 170, dt + 'firewall rules', fns);
860		this.addGCP2CardSet('Cloud\nVPN', 'cloud_vpn', 100, 120, dt + 'vpn virtual private network', fns);
861		this.addGCP2CardSet('Cloud\nRouter', 'cloud_router', 100, 140, dt + 'router', fns);
862		this.addGCP2CardSet('Cloud\nArmor', 'cloud_armor', 100, 130, dt + 'armor', fns);
863		this.addGCP2CardSet('Standard\nNetwork Tier', 'standard_network_tier', 130, 180, dt + 'standard network tier', fns);
864		this.addGCP2CardSet('Premium\nNetwork Tier', 'premium_network_tier', 130, 180, dt + 'premium network tier', fns);
865		this.addGCP2CardSet('Partner\nInterconnect', 'partner_interconnect', 130, 180, dt + 'partner interconnect', fns);
866
867		this.addPalette('gcp2Networking', 'GCP / Networking', false, mxUtils.bind(this, function(content)
868		{
869			for (var i = 0; i < fns.length; i++)
870			{
871				content.appendChild(fns[i](content));
872			}
873		}));
874	};
875
876	Sidebar.prototype.addGCP2DeveloperToolsPalette = function()
877	{
878		var dt = 'gcp google cloud platform dev developer tools ';
879		var fns = [];
880
881		this.addGCP2CardSet('Cloud\nSDK', 'placeholder', 100, 120, dt + 'sdk software development kit', fns);
882		this.addGCP2CardSet('Cloud\nBuild', 'container_builder', 100, 130, dt + 'build', fns);
883		this.addGCP2CardSet('Gradle App\nEnginge Plugin', 'placeholder', 150, 210, dt + 'gradle app engine plugin application', fns);
884		this.addGCP2CardSet('Cloud Tools for\nVisual Studio', 'cloud_tools_for_powershell', 150, 220, dt + 'tools for visual studio', fns);
885		this.addGCP2CardSet('Cloud Source\nRepositories', 'placeholder', 140, 210, dt + 'cloud source repositories', fns);
886		this.addGCP2CardSet('Maven App\nEngine Plugin', 'placeholder', 140, 200, dt + 'maven app engine plugin', fns);
887		this.addGCP2CardSet('Cloud Tools\nfor Eclipse', 'placeholder', 130, 190, dt + 'tools for eclipse', fns);
888		this.addGCP2CardSet('Cloud Tools\nfor IntelliJ', 'placeholder', 130, 180, dt + 'tools for intellij', fns);
889		this.addGCP2CardSet('Cloud\nTest Lab', 'placeholder', 110, 150, dt + 'test lab', fns);
890		this.addGCP2CardSet('Cloud Tools for\nPowerShell', 'cloud_tools_for_powershell', 150, 210, dt + 'tools for powershell', fns);
891		this.addGCP2CardSet('IDE Plugins', 'cloud_tools_for_powershell', 130, 130, dt + 'ide plugins integrated development environment', fns);
892		this.addGCP2CardSet('Container\nRegistry', 'container_registry', 120, 160, dt + 'container registry', fns);
893
894		this.addPalette('gcp2Developer Tools', 'GCP / Developer Tools', false, mxUtils.bind(this, function(content)
895		{
896			for (var i = 0; i < fns.length; i++)
897			{
898				content.appendChild(fns[i](content));
899			}
900		}));
901	};
902
903	Sidebar.prototype.addGCP2ExpandedProductCardsPalette = function()
904	{
905		var dt = 'gcp google cloud platform expanded product cards ';
906		var fns = [];
907
908		this.addGCP2ExpandedProductCardSet('Compute Engine', 'compute_engine', 150, dt + 'compute engine', fns);
909		this.addGCP2ExpandedProductCardSet('BigQuery', 'bigquery', 140, dt + 'bigquery', fns);
910		this.addGCP2ExpandedProductCardSet('App Engine', 'app_engine', 140, dt + 'app application engine', fns);
911		this.addGCP2ExpandedProductCardSet('Cloud Dataflow', 'cloud_dataflow', 150, dt + 'cloud dataflow', fns);
912		this.addGCP2ExpandedProductCardSet('Kubernetes Engine', 'container_engine', 170, dt + 'kubernetes engine', fns);
913		this.addGCP2ExpandedProductCardSet('Cloud Storage', 'cloud_storage', 140, dt + 'cloud storage', fns);
914		this.addGCP2ExpandedProductCardSet('Cloud Bigtable', 'cloud_bigtable', 140, dt + 'cloud bigtable', fns);
915		this.addGCP2ExpandedProductCardSet('Cloud Pub/Sub', 'cloud_pubsub', 150, dt + 'cloud pub sub', fns);
916		this.addGCP2ExpandedProductCardSet('Cloud SQL', 'cloud_sql', 140, dt + 'cloud sql', fns);
917
918		this.addGCP2ExpandedMachineCard('App Engine', 'app_engine_icon', 1, 0.84, '10GB PD', '1', 'modifiers_standard_machine', '1', 'modifiers_storage', '1', 'modifiers_autoscaling', 150, dt + 'app engine machine', fns);
919		this.addGCP2ExpandedMachineCard('Cloud Dataflow', 'cloud_dataflow_icon', 0.72, 1, '10GB PD', '1', 'modifiers_standard_machine', '1', 'modifiers_storage', '1', 'modifiers_autoscaling', 150, dt + 'app engine machine', fns);
920		this.addGCP2ExpandedMachineCard('Kubernetes Engine', 'container_engine_icon', 0.88, 1, '10GB PD', '1', 'modifiers_standard_machine', '1', 'modifiers_storage', '1', 'modifiers_autoscaling', 150, dt + 'app engine machine', fns);
921		this.addGCP2ExpandedMachineCard('Cloud Dataproc', 'cloud_dataproc_icon', 1, 0.92, '10GB PD', '1', 'modifiers_standard_machine', '1', 'modifiers_storage', '1', 'modifiers_autoscaling', 150, dt + 'app engine machine', fns);
922		this.addGCP2ExpandedMachineCard('Compute Engine', 'compute_engine_icon', 1, 1, '10GB PD', '1', 'modifiers_standard_machine', '1', 'modifiers_storage', '1', 'modifiers_autoscaling', 150, dt + 'app engine machine', fns);
923
924		this.addPalette('gcp2Expanded Product Cards', 'GCP / Expanded Product Cards', false, mxUtils.bind(this, function(content)
925		{
926			for (var i = 0; i < fns.length; i++)
927			{
928				content.appendChild(fns[i](content));
929			}
930		}));
931	};
932
933	Sidebar.prototype.addGCP2UserDeviceCardsPalette = function()
934	{
935		var dt = 'gcp google cloud platform user and device cards ';
936		var fns = [];
937
938		this.addGCP2UserDeviceCard('Application', 'application', 1, 0.8, 0, dt + 'application', fns);
939		this.addGCP2UserDeviceCard('Beacon', 'beacon', 0.73, 1, 0, dt + 'beacon', fns);
940		this.addGCP2UserDeviceCard('Circuit-Board', 'circuit_board', 1, 0.9, 15, dt + 'circuit board', fns);
941		this.addGCP2UserDeviceCard('Database', 'database', 1, 0.9, 0, dt + 'database db', fns);
942		this.addGCP2UserDeviceCard('Desktop', 'desktop', 1, 0.9, 0, dt + 'desktop', fns);
943		this.addGCP2UserDeviceCard('Desktop and Mobile', 'desktop_and_mobile', 1, 0.66, 15, dt + 'desktop and mobile', fns);
944		this.addGCP2UserDeviceCard('Game', 'game', 1, 0.54, 0, dt + 'game', fns);
945		this.addGCP2UserDeviceCard('Gateway', 'gateway_icon', 1, 0.44, 0, dt + 'gateway icon', fns);
946		this.addGCP2UserDeviceCard('Laptop', 'laptop', 1, 0.66, 0, dt + 'laptop', fns);
947		this.addGCP2UserDeviceCard('Lightbulb', 'lightbulb', 0.7, 1, 0, dt + 'lighbulb', fns);
948		this.addGCP2UserDeviceCard('List', 'list', 0.89, 1, 0, dt + 'list', fns);
949		this.addGCP2UserDeviceCard('Live', 'live', 0.74, 1, 0, dt + 'live', fns);
950		this.addGCP2UserDeviceCard('Local-Compute', 'compute_engine_icon', 1, 0.89, 15, dt + 'local compute', fns);
951		this.addGCP2UserDeviceCard('Mobile Devices', 'mobile_devices', 1, 0.73, 15, dt + 'mobile devices', fns);
952		this.addGCP2UserDeviceCard('Payment', 'payment', 1, 0.8, 0, dt + 'payment', fns);
953		this.addGCP2UserDeviceCard('Phone', 'phone', 0.64, 1, 0, dt + 'phone', fns);
954		this.addGCP2UserDeviceCard('Record', 'record', 1, 0.66, 0, dt + 'record', fns);
955		this.addGCP2UserDeviceCard('Report', 'report', 1, 1, 0, dt + 'report', fns);
956		this.addGCP2UserDeviceCard('Retail', 'retail', 1, 0.89, 0, dt + 'retail', fns);
957		this.addGCP2UserDeviceCard('Speaker', 'speaker', 0.7, 1, 0, dt + 'speaker', fns);
958		this.addGCP2UserDeviceCard('Storage', 'storage', 1, 0.8, 0, dt + 'storage', fns);
959		this.addGCP2UserDeviceCard('Stream', 'stream', 1, 0.82, 0, dt + 'stream', fns);
960		this.addGCP2UserDeviceCard('Users', 'users', 1, 0.63, 0, dt + 'users', fns);
961		this.addGCP2UserDeviceCard('Webcam', 'webcam', 0.5, 1, 0, dt + 'webcam', fns);
962
963		this.addPalette('gcp2User Device Cards', 'GCP / User and Device Cards', false, mxUtils.bind(this, function(content)
964		{
965			for (var i = 0; i < fns.length; i++)
966			{
967				content.appendChild(fns[i](content));
968			}
969		}));
970	};
971
972
973	Sidebar.prototype.addGCP2ProductCardsPalette = function()
974	{
975		var dt = 'gcp google cloud platform product ';
976		var fns = [];
977
978		this.addGCP2ProductCardSet('Kubernetes', 'kubernetes_logo', 1, 0.97, 130, 130, dt + 'kubernetes', fns);
979		this.addGCP2ProductCardSet('TensorFlow', 'tensorflow_logo', 0.94, 1, 130, 130, dt + 'tensorflow', fns);
980		this.addGCP2ProductCardSet('Forseti\nSecurity', 'forseti_logo', 0.98, 1, 110, 150, dt + 'forseti', fns);
981		this.addGCP2ProductCardSet('Istio', 'istio_logo', 0.67, 1, 80, 90, dt + 'forseti', fns);
982		this.addGCP2ProductCardSet('Firebase', 'firebase', 0.72, 1, 100, 100, dt + 'firebase', fns);
983		this.addGCP2ProductCardSet('Fastly', 'fastly', 1, 0.39, 100, 100, dt + 'fastly', fns);
984		this.addGCP2ProductCardSet('AdMob', 'admob', 1, 1, 110, 110, dt + 'admob', fns);
985		this.addGCP2ProductCardSet('Google Play\nGame Services', 'google_play_game_service', 1, 0.69, 150, 220, dt + 'google play game services', fns);
986		this.addGCP2ProductCardSet('Campaign\nManager', 'campaign_manager', 1, 1, 120, 170, dt + 'campaign manager', fns);
987		this.addGCP2ProductCardSet('Google\nAnalytics', 'google_analytics', 1, 1, 120, 160, dt + 'google analytics', fns);
988		this.addGCP2ProductCardSet('Google\nAds', 'google_ads', 1, 1, 100, 130, dt + 'google ads', fns);
989		this.addGCP2ProductCardSet('Avere Physical\nAppliance', 'avere', 1, 0.33, 150, 200, dt + 'avere physical appliance', fns);
990		this.addGCP2ProductCardSet('Google\nAnalytics 360', 'google_analytics_360', 1, 0.98, 140, 180, dt + 'google analytics 360', fns);
991		this.addGCP2ProductCardSet('Google Ad\nManager', 'google_ad_manager', 1, 1, 120, 170, dt + 'google ad manager', fns);
992
993		this.addPalette('gcp2Product Cards', 'GCP / Product Cards', false, mxUtils.bind(this, function(content)
994		{
995			for (var i = 0; i < fns.length; i++)
996			{
997				content.appendChild(fns[i](content));
998			}
999		}));
1000	};
1001
1002	Sidebar.prototype.addGCP2IconsAIMachineLearningPalette = function()
1003	{
1004		var sb = this;
1005		var s = 1.5;
1006		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1007		var dt = 'gcp google cloud platform icons icon ai machine learning ';
1008		var gn = 'mxgraph.gcp2';
1009		var fns = [];
1010
1011		var fns = [
1012		    this.createVertexTemplateEntry(n + 'cloud_machine_learning',
1013		    		s * 44, s * 39, 'AI Platform', null, null, null, this.getTagsForStencil(gn, '', dt + 'ai artificial intelligence platform').join(' ')),
1014		    this.createVertexTemplateEntry(n + 'cloud_vision_api',
1015		    		s * 44, s * 39, 'Cloud\nVision API', null, null, null, this.getTagsForStencil(gn, '', dt + 'vision api application programming interface').join(' ')),
1016		    this.createVertexTemplateEntry(n + 'cloud_speech_api',
1017		    		s * 44, s * 39, 'Cloud\nSpeech-to-Text', null, null, null, this.getTagsForStencil(gn, '', dt + 'speech to text').join(' ')),
1018		    this.createVertexTemplateEntry(n + 'cloud_video_intelligence_api',
1019		    		s * 44, s * 39, 'Cloud Video\nIntelligence\nAPI', null, null, null, this.getTagsForStencil(gn, '', dt + 'compute engine').join(' ')),
1020		    this.createVertexTemplateEntry(n + 'cloud_automl',
1021		    		s * 44, s * 39, 'Cloud\nAutoML', null, null, null, this.getTagsForStencil(gn, '', dt + 'automl').join(' ')),
1022		    this.createVertexTemplateEntry(n + 'cloud_tpu',
1023		    		s * 44, s * 39, 'Cloud TPU', null, null, null, this.getTagsForStencil(gn, '', dt + 'tpu').join(' ')),
1024		    this.createVertexTemplateEntry(n + 'cloud_natural_language_api',
1025		    		s * 44, s * 39, 'Cloud Natural\nLanguage API', null, null, null, this.getTagsForStencil(gn, '', dt + 'natural language api application programming interface').join(' ')),
1026		    this.createVertexTemplateEntry(n + 'cloud_translation_api',
1027		    		s * 44, s * 39, 'Cloud\nTranslation\nAPI', null, null, null, this.getTagsForStencil(gn, '', dt + 'translation api application programming interface').join(' ')),
1028		    this.createVertexTemplateEntry(n + 'cloud_jobs_api',
1029		    		s * 44, s * 39, 'Cloud\nJobs API', null, null, null, this.getTagsForStencil(gn, '', dt + 'jobs api application programming interface').join(' ')),
1030		    this.createVertexTemplateEntry(n + 'advanced_solutions_lab',
1031		    		s * 44, s * 39, 'Advanced\nSolutions Lab', null, null, null, this.getTagsForStencil(gn, '', dt + 'advanced solutions lab').join(' ')),
1032		    this.createVertexTemplateEntry(n + 'cloud_text_to_speech',
1033		    		s * 44, s * 39, 'Cloud\nText-to-Speech', null, null, null, this.getTagsForStencil(gn, '', dt + 'text to speech').join(' ')),
1034		    this.createVertexTemplateEntry(n + 'dialogflow_enterprise_edition',
1035		    		s * 44, s * 39, 'Dialogflow\nEnterprise\nEdition', null, null, null, this.getTagsForStencil(gn, '', dt + 'dialogflow enterprise edition').join(' ')),
1036		    this.createVertexTemplateEntry(n + 'ai_hub',
1037		    		s * 44, s * 39, 'AI Hub', null, null, null, this.getTagsForStencil(gn, '', dt + 'ai artificial intelligence hub').join(' ')),
1038		    this.createVertexTemplateEntry(n + 'automl_video_intelligence',
1039		    		s * 44, s * 39, 'AutoML Video\nIntelligence', null, null, null, this.getTagsForStencil(gn, '', dt + 'automl video intelligence').join(' ')),
1040		    this.createVertexTemplateEntry(n + 'automl_natural_language',
1041		    		s * 44, s * 39, 'AutoML Natural\nLanguage', null, null, null, this.getTagsForStencil(gn, '', dt + 'automl natural language').join(' ')),
1042		    this.createVertexTemplateEntry(n + 'automl_tables',
1043		    		s * 44, s * 39, 'AutoML Tables', null, null, null, this.getTagsForStencil(gn, '', dt + 'automl tables').join(' ')),
1044		    this.createVertexTemplateEntry(n + 'automl_translation',
1045		    		s * 44, s * 39, 'AutoML\nTranslation', null, null, null, this.getTagsForStencil(gn, '', dt + 'automl translation').join(' ')),
1046		    this.createVertexTemplateEntry(n + 'automl_vision',
1047		    		s * 44, s * 39, 'AutoML Vision', null, null, null, this.getTagsForStencil(gn, '', dt + 'automl vision').join(' ')),
1048		    this.createVertexTemplateEntry(n + 'recommendations_ai',
1049		    		s * 44, s * 39, 'Recommendations\nAI', null, null, null, this.getTagsForStencil(gn, '', dt + 'recommendations ai artificial intelligence').join(' ')),
1050		    this.createVertexTemplateEntry(n + 'cloud_inference_api',
1051		    		s * 44, s * 39, 'Cloud\nInference API', null, null, null, this.getTagsForStencil(gn, '', dt + 'cloud inference api application programming interface').join(' ')),
1052		    this.createVertexTemplateEntry(n + 'placeholder',
1053		    		s * 44, s * 39, 'AI Platform\nData Labeling\nService', null, null, null, this.getTagsForStencil(gn, '', dt + 'ai artificial intelligence platform data labeling service').join(' ')),
1054		    this.createVertexTemplateEntry(n + 'placeholder',
1055		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1056	 	];
1057
1058		this.addPalette('gcp2Icons AI Machine Learning', 'GCP Icons / AI and Machine Learning', false, mxUtils.bind(this, function(content)
1059		{
1060			for (var i = 0; i < fns.length; i++)
1061			{
1062				content.appendChild(fns[i](content));
1063			}
1064		}));
1065	};
1066
1067	Sidebar.prototype.addGCP2IconsComputePalette = function()
1068	{
1069		var sb = this;
1070		var s = 1.5;
1071		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1072		var dt = 'gcp google cloud platform icons icon compute ';
1073		var gn = 'mxgraph.gcp2';
1074		var fns = [];
1075
1076		var fns = [
1077		    this.createVertexTemplateEntry(n + 'compute_engine',
1078		    		s * 44, s * 39, 'Compute\nEngine', null, null, null, this.getTagsForStencil(gn, '', dt + 'compute engine').join(' ')),
1079		    this.createVertexTemplateEntry(n + 'app_engine',
1080		    		s * 44, s * 39, 'App\nEngine', null, null, null, this.getTagsForStencil(gn, '', dt + 'app engine').join(' ')),
1081		    this.createVertexTemplateEntry(n + 'container_engine',
1082		    		s * 44, s * 39, 'Kubernetes\nEngine', null, null, null, this.getTagsForStencil(gn, '', dt + 'kubernetes engine').join(' ')),
1083		    this.createVertexTemplateEntry(n + 'cloud_run',
1084		    		s * 44, s * 39, 'Cloud Run', null, null, null, this.getTagsForStencil(gn, '', dt + 'cloud run').join(' ')),
1085		    this.createVertexTemplateEntry(n + 'gpu',
1086		    		s * 44, s * 39, 'GPU', null, null, null, this.getTagsForStencil(gn, '', dt + 'gpu graphics processing unit').join(' ')),
1087		    this.createVertexTemplateEntry(n + 'cloud_functions',
1088		    		s * 44, s * 39, 'Cloud\nFunctions', null, null, null, this.getTagsForStencil(gn, '', dt + 'functions').join(' ')),
1089		    this.createVertexTemplateEntry(n + 'container_optimized_os',
1090		    		s * 44, s * 39, 'Container-\nOptimized OS', null, null, null, this.getTagsForStencil(gn, '', dt + 'container optimized os operating system').join(' ')),
1091		    this.createVertexTemplateEntry(n + 'gke_on_prem',
1092		    		s * 44, s * 39, 'Cloud Run', null, null, null, this.getTagsForStencil(gn, '', dt + 'cloud run').join(' ')),
1093		    this.createVertexTemplateEntry(n + 'placeholder',
1094		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1095	 	];
1096
1097		this.addPalette('gcp2Icons Compute', 'GCP Icons / Compute', false, mxUtils.bind(this, function(content)
1098		{
1099			for (var i = 0; i < fns.length; i++)
1100			{
1101				content.appendChild(fns[i](content));
1102			}
1103		}));
1104	};
1105
1106	Sidebar.prototype.addGCP2IconsDataAnalyticsPalette = function()
1107	{
1108		var sb = this;
1109		var s = 1.5;
1110		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1111		var dt = 'gcp google cloud platform icons icon data analytics ';
1112		var gn = 'mxgraph.gcp2';
1113		var fns = [];
1114
1115		var fns = [
1116		    this.createVertexTemplateEntry(n + 'bigquery',
1117		    		s * 44, s * 39, 'BigQuery', null, null, null, this.getTagsForStencil(gn, '', dt + 'bigquery big query').join(' ')),
1118		    this.createVertexTemplateEntry(n + 'cloud_dataflow',
1119		    		s * 44, s * 39, 'Cloud\nDataflow', null, null, null, this.getTagsForStencil(gn, '', dt + 'dataflow').join(' ')),
1120		    this.createVertexTemplateEntry(n + 'cloud_dataproc',
1121		    		s * 44, s * 39, 'Cloud\nDataproc', null, null, null, this.getTagsForStencil(gn, '', dt + 'dataproc').join(' ')),
1122		    this.createVertexTemplateEntry(n + 'cloud_dataprep',
1123		    		s * 44, s * 39, 'Cloud\nDataprep', null, null, null, this.getTagsForStencil(gn, '', dt + 'dataprep').join(' ')),
1124		    this.createVertexTemplateEntry(n + 'cloud_data_catalog',
1125		    		s * 44, s * 39, 'Cloud Data Catalog', null, null, null, this.getTagsForStencil(gn, '', dt + 'cloud data catalog').join(' ')),
1126		    this.createVertexTemplateEntry(n + 'cloud_datalab',
1127		    		s * 44, s * 39, 'Cloud\nDatalab', null, null, null, this.getTagsForStencil(gn, '', dt + 'datalab').join(' ')),
1128		    this.createVertexTemplateEntry(n + 'cloud_pubsub',
1129		    		s * 44, s * 39, 'Cloud\nPub/Sub', null, null, null, this.getTagsForStencil(gn, '', dt + 'pubsub').join(' ')),
1130		    this.createVertexTemplateEntry(n + 'genomics',
1131		    		s * 44, s * 39, 'Genomics', null, null, null, this.getTagsForStencil(gn, '', dt + 'genomics').join(' ')),
1132		    this.createVertexTemplateEntry(n + 'cloud_composer',
1133		    		s * 44, s * 39, 'Cloud\nComposer', null, null, null, this.getTagsForStencil(gn, '', dt + 'composer').join(' ')),
1134		    this.createVertexTemplateEntry(n + 'cloud_data_fusion',
1135		    		s * 44, s * 39, 'Cloud Data\nFusion', null, null, null, this.getTagsForStencil(gn, '', dt + 'cloud data fusion').join(' ')),
1136		    this.createVertexTemplateEntry(n + 'placeholder',
1137		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1138	 	];
1139
1140		this.addPalette('gcp2Icons Data Analytics', 'GCP Icons / Data Analytics', false, mxUtils.bind(this, function(content)
1141		{
1142			for (var i = 0; i < fns.length; i++)
1143			{
1144				content.appendChild(fns[i](content));
1145			}
1146		}));
1147	};
1148
1149	Sidebar.prototype.addGCP2IconsManagementToolsPalette = function()
1150	{
1151		var sb = this;
1152		var s = 1.5;
1153		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1154		var dt = 'gcp google cloud platform icons icon management tools ';
1155		var gn = 'mxgraph.gcp2';
1156		var fns = [];
1157
1158		var fns = [
1159		    this.createVertexTemplateEntry(n + 'stackdriver',
1160		    		s * 44, s * 39, 'Stackdriver', null, null, null, this.getTagsForStencil(gn, '', dt + 'stackdriver').join(' ')),
1161		    this.createVertexTemplateEntry(n + 'cloud_deployment_manager',
1162		    		s * 44, s * 39, 'Monitoring', null, null, null, this.getTagsForStencil(gn, '', dt + 'monitoring').join(' ')),
1163		    this.createVertexTemplateEntry(n + 'logging',
1164		    		s * 44, s * 39, 'Logging', null, null, null, this.getTagsForStencil(gn, '', dt + 'logging').join(' ')),
1165		    this.createVertexTemplateEntry(n + 'error_reporting',
1166		    		s * 44, s * 39, 'Error\nReporting', null, null, null, this.getTagsForStencil(gn, '', dt + 'error reporting').join(' ')),
1167		    this.createVertexTemplateEntry(n + 'trace',
1168		    		s * 44, s * 39, 'Trace', null, null, null, this.getTagsForStencil(gn, '', dt + 'trace').join(' ')),
1169		    this.createVertexTemplateEntry(n + 'debugger',
1170		    		s * 44, s * 39, 'Debugger', null, null, null, this.getTagsForStencil(gn, '', dt + 'debugger').join(' ')),
1171		    this.createVertexTemplateEntry(n + 'cloud_deployment_manager',
1172		    		s * 44, s * 39, 'Cloud\nDeployment\nManager', null, null, null, this.getTagsForStencil(gn, '', dt + 'deployment manager').join(' ')),
1173		    this.createVertexTemplateEntry(n + 'cloud_apis',
1174		    		s * 44, s * 39, 'Cloud\nAPIs', null, null, null, this.getTagsForStencil(gn, '', dt + 'apis api application programming interface interfaces').join(' ')),
1175		    this.createVertexTemplateEntry(n + 'placeholder',
1176		    		s * 44, s * 39, 'Cloud\nConsole', null, null, null, this.getTagsForStencil(gn, '', dt + 'console').join(' ')),
1177		    this.createVertexTemplateEntry(n + 'placeholder',
1178		    		s * 44, s * 39, 'Cloud\nShell', null, null, null, this.getTagsForStencil(gn, '', dt + 'shell').join(' ')),
1179		    this.createVertexTemplateEntry(n + 'placeholder',
1180		    		s * 44, s * 39, 'Cloud Mobile\nApp', null, null, null, this.getTagsForStencil(gn, '', dt + 'mobile app application').join(' ')),
1181		    this.createVertexTemplateEntry(n + 'placeholder',
1182		    		s * 44, s * 39, 'Cloud\nBilling API', null, null, null, this.getTagsForStencil(gn, '', dt + 'billing api application programming interface').join(' ')),
1183		    this.createVertexTemplateEntry(n + 'profiler',
1184		    		s * 44, s * 39, 'Profiler', null, null, null, this.getTagsForStencil(gn, '', dt + 'profiler').join(' ')),
1185		    this.createVertexTemplateEntry(n + 'cloud_service_mesh',
1186		    		s * 44, s * 39, 'Cloud Service Mesh', null, null, null, this.getTagsForStencil(gn, '', dt + 'cloud service mesh').join(' ')),
1187		    this.createVertexTemplateEntry(n + 'placeholder',
1188		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1189	 	];
1190
1191		this.addPalette('gcp2Icons Management Tools', 'GCP Icons / Management Tools', false, mxUtils.bind(this, function(content)
1192		{
1193			for (var i = 0; i < fns.length; i++)
1194			{
1195				content.appendChild(fns[i](content));
1196			}
1197		}));
1198	};
1199
1200	Sidebar.prototype.addGCP2IconsNetworkingPalette = function()
1201	{
1202		var sb = this;
1203		var s = 1.5;
1204		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1205		var dt = 'gcp google cloud platform icons icon networking ';
1206		var gn = 'mxgraph.gcp2';
1207		var fns = [];
1208
1209		var fns = [
1210		    this.createVertexTemplateEntry(n + 'virtual_private_cloud',
1211		    		s * 44, s * 39, 'Virtual\nPrivate Cloud', null, null, null, this.getTagsForStencil(gn, '', dt + 'vpc virtual private').join(' ')),
1212		    this.createVertexTemplateEntry(n + 'cloud_load_balancing',
1213		    		s * 44, s * 39, 'Cloud Load\nBalancing', null, null, null, this.getTagsForStencil(gn, '', dt + 'load balancing').join(' ')),
1214		    this.createVertexTemplateEntry(n + 'cloud_cdn',
1215		    		s * 44, s * 39, 'Cloud\nCDN', null, null, null, this.getTagsForStencil(gn, '', dt + 'cdn').join(' ')),
1216		    this.createVertexTemplateEntry(n + 'cloud_external_ip_addresses',
1217		    		s * 44, s * 39, 'Cloud\nExternal IP\nAddresses', null, null, null, this.getTagsForStencil(gn, '', dt + 'extrernal ip internet protocol address addresses').join(' ')),
1218		    this.createVertexTemplateEntry(n + 'cloud_firewall_rules',
1219		    		s * 44, s * 39, 'Cloud\nFirewall Rules', null, null, null, this.getTagsForStencil(gn, '', dt + 'firewall rules rule').join(' ')),
1220		    this.createVertexTemplateEntry(n + 'cloud_router',
1221		    		s * 44, s * 39, 'Cloud\nRouter', null, null, null, this.getTagsForStencil(gn, '', dt + 'router').join(' ')),
1222		    this.createVertexTemplateEntry(n + 'dedicated_interconnect',
1223		    		s * 44, s * 39, 'Dedicated\nInterconnect', null, null, null, this.getTagsForStencil(gn, '', dt + 'dedicated interconnect').join(' ')),
1224		    this.createVertexTemplateEntry(n + 'cloud_dns',
1225		    		s * 44, s * 39, 'Cloud\nDNS', null, null, null, this.getTagsForStencil(gn, '', dt + 'dns domain name server').join(' ')),
1226		    this.createVertexTemplateEntry(n + 'cloud_network',
1227		    		s * 44, s * 39, 'Cloud\nNetwork', null, null, null, this.getTagsForStencil(gn, '', dt + 'network').join(' ')),
1228		    this.createVertexTemplateEntry(n + 'cloud_routes',
1229		    		s * 44, s * 39, 'Cloud\nRoutes', null, null, null, this.getTagsForStencil(gn, '', dt + 'routes').join(' ')),
1230		    this.createVertexTemplateEntry(n + 'cloud_vpn',
1231		    		s * 44, s * 39, 'Cloud VPN', null, null, null, this.getTagsForStencil(gn, '', dt + 'vpn virtual private network').join(' ')),
1232		    this.createVertexTemplateEntry(n + 'partner_interconnect',
1233		    		s * 44, s * 39, 'Partner\nInterconnect', null, null, null, this.getTagsForStencil(gn, '', dt + 'partner interconnect').join(' ')),
1234		    this.createVertexTemplateEntry(n + 'cloud_armor',
1235		    		s * 44, s * 39, 'Cloud Armor', null, null, null, this.getTagsForStencil(gn, '', dt + 'armor').join(' ')),
1236		    this.createVertexTemplateEntry(n + 'standard_network_tier',
1237		    		s * 44, s * 39, 'Standard\nNetwork Tier', null, null, null, this.getTagsForStencil(gn, '', dt + 'standard network tier').join(' ')),
1238		    this.createVertexTemplateEntry(n + 'premium_network_tier',
1239		    		s * 44, s * 39, 'Premium\nNetwork Tier', null, null, null, this.getTagsForStencil(gn, '', dt + 'premium network tier').join(' ')),
1240		    this.createVertexTemplateEntry(n + 'cloud_nat',
1241		    		s * 44, s * 39, 'Cloud NAT', null, null, null, this.getTagsForStencil(gn, '', dt + 'nat').join(' ')),
1242		    this.createVertexTemplateEntry(n + 'traffic_director',
1243		    		s * 44, s * 39, 'Traffic Director', null, null, null, this.getTagsForStencil(gn, '', dt + 'traffic director').join(' ')),
1244		    this.createVertexTemplateEntry(n + 'placeholder',
1245		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1246	 	];
1247
1248		this.addPalette('gcp2Icons Networking', 'GCP Icons / Networking', false, mxUtils.bind(this, function(content)
1249		{
1250			for (var i = 0; i < fns.length; i++)
1251			{
1252				content.appendChild(fns[i](content));
1253			}
1254		}));
1255	};
1256
1257	Sidebar.prototype.addGCP2IconsDeveloperToolsPalette = function()
1258	{
1259		var sb = this;
1260		var s = 1.5;
1261		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1262		var dt = 'gcp google cloud platform icons icon developer tools ';
1263		var gn = 'mxgraph.gcp2';
1264		var fns = [];
1265
1266		var fns = [
1267		    this.createVertexTemplateEntry(n + 'placeholder',
1268		    		s * 44, s * 39, 'Cloud SDK', null, null, null, this.getTagsForStencil(gn, '', dt + 'sdk software development kit').join(' ')),
1269		    this.createVertexTemplateEntry(n + 'cloud_test_lab',
1270		    		s * 44, s * 39, 'Cloud\nTest Lab', null, null, null, this.getTagsForStencil(gn, '', dt + 'test lab').join(' ')),
1271		    this.createVertexTemplateEntry(n + 'placeholder',
1272		    		s * 44, s * 39, 'Cloud Source\nRepositories', null, null, null, this.getTagsForStencil(gn, '', dt + 'source repositories').join(' ')),
1273		    this.createVertexTemplateEntry(n + 'placeholder',
1274		    		s * 44, s * 39, 'Maven App\nEngine Plugin', null, null, null, this.getTagsForStencil(gn, '', dt + 'maven app engine plugin').join(' ')),
1275		    this.createVertexTemplateEntry(n + 'cloud_tools_for_powershell',
1276		    		s * 44, s * 39, 'Cloud\nTools for\nPowerShell', null, null, null, this.getTagsForStencil(gn, '', dt + 'tools for powershell power shell').join(' ')),
1277		    this.createVertexTemplateEntry(n + 'cloud_tools_for_powershell',
1278		    		s * 44, s * 39, 'Clout\nTools for\nVisual Studio', null, null, null, this.getTagsForStencil(gn, '', dt + 'tools for visual studio').join(' ')),
1279		    this.createVertexTemplateEntry(n + 'container_registry',
1280		    		s * 44, s * 39, 'Container\nRegistry', null, null, null, this.getTagsForStencil(gn, '', dt + 'container registry').join(' ')),
1281		    this.createVertexTemplateEntry(n + 'placeholder',
1282		    		s * 44, s * 39, 'Cloud Tools\nfor Eclipse', null, null, null, this.getTagsForStencil(gn, '', dt + 'tools for eclipse').join(' ')),
1283		    this.createVertexTemplateEntry(n + 'cloud_tools_for_powershell',
1284		    		s * 44, s * 39, 'IDE Plugins', null, null, null, this.getTagsForStencil(gn, '', dt + 'ide integrated development environment plugins').join(' ')),
1285		    this.createVertexTemplateEntry(n + 'placeholder',
1286		    		s * 44, s * 39, 'Gradle App\nEngine Plugin', null, null, null, this.getTagsForStencil(gn, '', dt + 'gradle app application engine plugin').join(' ')),
1287		    this.createVertexTemplateEntry(n + 'container_builder',
1288		    		s * 44, s * 39, 'Cloud Build', null, null, null, this.getTagsForStencil(gn, '', dt + 'build').join(' ')),
1289		    this.createVertexTemplateEntry(n + 'placeholder',
1290		    		s * 44, s * 39, 'Cloud Tools\nfor IntelliJ', null, null, null, this.getTagsForStencil(gn, '', dt + 'tools for intellij').join(' ')),
1291		    this.createVertexTemplateEntry(n + 'cloud_code',
1292		    		s * 44, s * 39, 'Cloud Code', null, null, null, this.getTagsForStencil(gn, '', dt + 'code').join(' ')),
1293		    this.createVertexTemplateEntry(n + 'cloud_tasks',
1294		    		s * 44, s * 39, 'Cloud Tasks', null, null, null, this.getTagsForStencil(gn, '', dt + 'tasks').join(' ')),
1295		    this.createVertexTemplateEntry('html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;fontSize=11;fontStyle=1;fontColor=#999999;shape=mxgraph.gcp2.cloud_scheduler',
1296		    		s * 20, s * 23, 'Cloud Scheduler', null, null, null, this.getTagsForStencil(gn, '', dt + 'scheduler').join(' ')),
1297		    this.createVertexTemplateEntry(n + 'placeholder',
1298		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1299	 	];
1300
1301		this.addPalette('gcp2Icons Developer Tools', 'GCP Icons / Developer Tools', false, mxUtils.bind(this, function(content)
1302		{
1303			for (var i = 0; i < fns.length; i++)
1304			{
1305				content.appendChild(fns[i](content));
1306			}
1307		}));
1308	};
1309
1310	Sidebar.prototype.addGCP2IconsAPIManagementPalette = function()
1311	{
1312		var sb = this;
1313		var s = 1.5;
1314		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1315		var dt = 'gcp google cloud platform icons icon api application programming interface management';
1316		var gn = 'mxgraph.gcp2';
1317		var fns = [];
1318
1319		var fns = [
1320		    this.createVertexTemplateEntry(n + 'api_analytics',
1321		    		s * 44, s * 39, 'API\nAnalytics', null, null, null, this.getTagsForStencil(gn, '', dt + 'api application programming interface analytics').join(' ')),
1322		    this.createVertexTemplateEntry(n + 'api_monetization',
1323		    		s * 44, s * 39, 'API\nMonetization', null, null, null, this.getTagsForStencil(gn, '', dt + 'api application programming interface monetization').join(' ')),
1324		    this.createVertexTemplateEntry(n + 'apigee_api_platform',
1325		    		s * 44, s * 39, 'Apigee API\nPlatform', null, null, null, this.getTagsForStencil(gn, '', dt + 'apigee api application programming interface platform').join(' ')),
1326		    this.createVertexTemplateEntry(n + 'cloud_endpoints',
1327		    		s * 44, s * 39, 'Cloud\nEndpoints', null, null, null, this.getTagsForStencil(gn, '', dt + 'endpoints').join(' ')),
1328		    this.createVertexTemplateEntry(n + 'developer_portal',
1329		    		s * 44, s * 39, 'Developer\nPortal', null, null, null, this.getTagsForStencil(gn, '', dt + 'developer portal').join(' ')),
1330		    this.createVertexTemplateEntry(n + 'apigee_sense',
1331		    		s * 44, s * 39, 'Apigee\nSense', null, null, null, this.getTagsForStencil(gn, '', dt + 'apigee sense').join(' ')),
1332		    this.createVertexTemplateEntry(n + 'placeholder',
1333		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1334	 	];
1335
1336		this.addPalette('gcp2Icons API Management', 'GCP Icons / API Management', false, mxUtils.bind(this, function(content)
1337		{
1338			for (var i = 0; i < fns.length; i++)
1339			{
1340				content.appendChild(fns[i](content));
1341			}
1342		}));
1343	};
1344
1345	Sidebar.prototype.addGCP2IconsInternetOfThingsPalette = function()
1346	{
1347		var sb = this;
1348		var s = 1.5;
1349		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1350		var dt = 'gcp google cloud platform icons icon internet of things iot ';
1351		var gn = 'mxgraph.gcp2';
1352		var fns = [];
1353
1354		var fns = [
1355		    this.createVertexTemplateEntry(n + 'cloud_iot_core',
1356		    		s * 44, s * 39, 'Cloud IoT\nCore', null, null, null, this.getTagsForStencil(gn, '', dt + 'iot internet of things core').join(' ')),
1357		    this.createVertexTemplateEntry(n + 'placeholder',
1358		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1359	 	];
1360
1361		this.addPalette('gcp2Icons Internet of Things', 'GCP Icons / Internet of Things', false, mxUtils.bind(this, function(content)
1362		{
1363			for (var i = 0; i < fns.length; i++)
1364			{
1365				content.appendChild(fns[i](content));
1366			}
1367		}));
1368	};
1369
1370	Sidebar.prototype.addGCP2IconsDatabasesPalette = function()
1371	{
1372		var sb = this;
1373		var s = 1.5;
1374		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1375		var dt = 'gcp google cloud platform icons icon databases db ';
1376		var gn = 'mxgraph.gcp2';
1377		var fns = [];
1378
1379		var fns = [
1380		    this.createVertexTemplateEntry(n + 'cloud_bigtable',
1381		    		s * 44, s * 39, 'Cloud\nBigtable', null, null, null, this.getTagsForStencil(gn, '', dt + 'bigtable').join(' ')),
1382		    this.createVertexTemplateEntry(n + 'cloud_datastore',
1383		    		s * 44, s * 39, 'Cloud\nDatastore', null, null, null, this.getTagsForStencil(gn, '', dt + 'datastore').join(' ')),
1384		    this.createVertexTemplateEntry(n + 'cloud_memorystore',
1385		    		s * 44, s * 39, 'Cloud\nMemorystore', null, null, null, this.getTagsForStencil(gn, '', dt + 'memorystore').join(' ')),
1386		    this.createVertexTemplateEntry(n + 'cloud_sql',
1387		    		s * 44, s * 39, 'Cloud SQL', null, null, null, this.getTagsForStencil(gn, '', dt + 'sql').join(' ')),
1388		    this.createVertexTemplateEntry(n + 'cloud_spanner',
1389		    		s * 44, s * 39, 'Cloud\nSpanner', null, null, null, this.getTagsForStencil(gn, '', dt + 'spanner').join(' ')),
1390		    this.createVertexTemplateEntry(n + 'cloud_firestore',
1391		    		s * 44, s * 39, 'Cloud\nFirestore', null, null, null, this.getTagsForStencil(gn, '', dt + 'firestore').join(' ')),
1392		    this.createVertexTemplateEntry(n + 'placeholder',
1393		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1394	 	];
1395
1396		this.addPalette('gcp2Icons Databases', 'GCP Icons / Databases', false, mxUtils.bind(this, function(content)
1397		{
1398			for (var i = 0; i < fns.length; i++)
1399			{
1400				content.appendChild(fns[i](content));
1401			}
1402		}));
1403	};
1404
1405	Sidebar.prototype.addGCP2IconsStoragePalette = function()
1406	{
1407		var sb = this;
1408		var s = 1.5;
1409		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1410		var dt = 'gcp google cloud platform icons icon storage ';
1411		var gn = 'mxgraph.gcp2';
1412		var fns = [];
1413
1414		var fns = [
1415		    this.createVertexTemplateEntry(n + 'persistent_disk',
1416		    		s * 44, s * 39, 'Persistent\nDisk', null, null, null, this.getTagsForStencil(gn, '', dt + 'persistent disk').join(' ')),
1417		    this.createVertexTemplateEntry(n + 'cloud_filestore',
1418		    		s * 44, s * 39, 'Cloud\nFilestore', null, null, null, this.getTagsForStencil(gn, '', dt + 'filestore').join(' ')),
1419		    this.createVertexTemplateEntry(n + 'cloud_storage',
1420		    		s * 44, s * 39, 'Cloud\nStorage', null, null, null, this.getTagsForStencil(gn, '', dt + 'storage').join(' ')),
1421		    this.createVertexTemplateEntry(n + 'placeholder',
1422		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1423	 	];
1424
1425		this.addPalette('gcp2Icons Storage', 'GCP Icons / Storage', false, mxUtils.bind(this, function(content)
1426		{
1427			for (var i = 0; i < fns.length; i++)
1428			{
1429				content.appendChild(fns[i](content));
1430			}
1431		}));
1432	};
1433
1434	Sidebar.prototype.addGCP2IconsSecurityPalette = function()
1435	{
1436		var sb = this;
1437		var s = 1.5;
1438		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1439		var dt = 'gcp google cloud platform icons icon security ';
1440		var gn = 'mxgraph.gcp2';
1441		var fns = [];
1442
1443		var fns = [
1444		    this.createVertexTemplateEntry(n + 'cloud_iam',
1445		    		s * 44, s * 39, 'Cloud IAM', null, null, null, this.getTagsForStencil(gn, '', dt + 'iam').join(' ')),
1446		    this.createVertexTemplateEntry(n + 'cloud_iam',
1447		    		s * 44, s * 39, 'Cloud Resource\nManager', null, null, null, this.getTagsForStencil(gn, '', dt + 'resource manager').join(' ')),
1448		    this.createVertexTemplateEntry(n + 'cloud_security_scanner',
1449		    		s * 44, s * 39, 'Cloud Security\nScanner', null, null, null, this.getTagsForStencil(gn, '', dt + 'security scanner').join(' ')),
1450		    this.createVertexTemplateEntry(n + 'key_management_service',
1451		    		s * 44, s * 39, 'Key\nManagement\nService', null, null, null, this.getTagsForStencil(gn, '', dt + 'key management service').join(' ')),
1452		    this.createVertexTemplateEntry(n + 'cloud_security_command_center',
1453		    		s * 44, s * 39, 'Cloud Security\nCommand\nCenter', null, null, null, this.getTagsForStencil(gn, '', dt + 'security command center').join(' ')),
1454		    this.createVertexTemplateEntry(n + 'placeholder',
1455		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1456	 	];
1457
1458		this.addPalette('gcp2Icons Security', 'GCP Icons / Security', false, mxUtils.bind(this, function(content)
1459		{
1460			for (var i = 0; i < fns.length; i++)
1461			{
1462				content.appendChild(fns[i](content));
1463			}
1464		}));
1465	};
1466
1467	Sidebar.prototype.addGCP2IconsMigrationPalette = function()
1468	{
1469		var sb = this;
1470		var s = 1.5;
1471		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1472		var dt = 'gcp google cloud platform icons icon migration ';
1473		var gn = 'mxgraph.gcp2';
1474		var fns = [];
1475
1476		var fns = [
1477		    this.createVertexTemplateEntry(n + 'transfer_appliance',
1478		    		s * 44, s * 39, 'Transfer\nAppliance', null, null, null, this.getTagsForStencil(gn, '', dt + 'transfer appliance').join(' ')),
1479		    this.createVertexTemplateEntry(n + 'placeholder',
1480		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1481	 	];
1482
1483		this.addPalette('gcp2Icons Migration', 'GCP Icons / Migration', false, mxUtils.bind(this, function(content)
1484		{
1485			for (var i = 0; i < fns.length; i++)
1486			{
1487				content.appendChild(fns[i](content));
1488			}
1489		}));
1490	};
1491
1492	Sidebar.prototype.addGCP2IconsHybridAndMultiCloudPalette = function()
1493	{
1494		var sb = this;
1495		var s = 1.5;
1496		var n = 'sketch=0;html=1;fillColor=#5184F3;strokeColor=none;verticalAlign=top;labelPosition=center;verticalLabelPosition=bottom;align=center;spacingTop=-6;fontSize=11;fontStyle=1;fontColor=#999999;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1497		var dt = 'gcp google cloud platform icons icon migration ';
1498		var gn = 'mxgraph.gcp2';
1499		var fns = [];
1500
1501		var fns = [
1502		    this.createVertexTemplateEntry(n + 'traffic_director',
1503		    		s * 44, s * 39, 'Traffic Director', null, null, null, this.getTagsForStencil(gn, '', dt + 'traffic director').join(' ')),
1504		    this.createVertexTemplateEntry(n + 'stackdriver',
1505		    		s * 44, s * 39, 'Stackdriver', null, null, null, this.getTagsForStencil(gn, '', dt + 'stackdriver').join(' ')),
1506		    this.createVertexTemplateEntry(n + 'placeholder',
1507		    		s * 44, s * 39, 'Generic GCP\nProduct', null, null, null, this.getTagsForStencil(gn, '', dt + 'generic placeholder product').join(' '))
1508	 	];
1509
1510		this.addPalette('gcp2Icons Hybrid and Multi Cloud', 'GCP Icons / Hybrid and Multi Cloud', false, mxUtils.bind(this, function(content)
1511		{
1512			for (var i = 0; i < fns.length; i++)
1513			{
1514				content.appendChild(fns[i](content));
1515			}
1516		}));
1517	};
1518
1519	Sidebar.prototype.addGCP2CardSet = function(label, icon, w1, w2, dt, fns)
1520	{
1521		var sb = this;
1522		var s = 'sketch=0;dashed=0;connectable=0;html=1;fillColor=#5184F3;strokeColor=none;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.hexIcon;prIcon=';
1523		var label1 = label.replace('\n', ' ');
1524		var label1 = label1.replace('- ', '-');
1525
1526		fns.push(
1527			this.addEntry(dt, function()
1528		   	{
1529			    var bg = new mxCell('', new mxGeometry(0, 0, w1, 60), 'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;');
1530		    	bg.vertex = true;
1531			    var icon1 = new mxCell(label, new mxGeometry(0, 0.5, 44, 39), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontColor=#999999;fontSize=12;');
1532			    icon1.geometry.relative = true;
1533			    icon1.geometry.offset = new mxPoint(5, -19.5);
1534		    	icon1.vertex = true;
1535		    	bg.insert(icon1);
1536
1537			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1538			})
1539		);
1540
1541		fns.push(
1542			this.addEntry(dt, function()
1543		   	{
1544			    var bg = new mxCell('', new mxGeometry(0, 0, w2, 60), 'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;');
1545		    	bg.vertex = true;
1546			    var icon1 = new mxCell('<font color="#000000">Name</font><br>' + label1, new mxGeometry(0, 0.5, 44, 39), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontColor=#999999;fontSize=12;');
1547			    icon1.geometry.relative = true;
1548			    icon1.geometry.offset = new mxPoint(5, -19.5);
1549		    	icon1.vertex = true;
1550		    	bg.insert(icon1);
1551
1552			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1553			})
1554		);
1555
1556		fns.push(
1557			this.addEntry(dt, function()
1558		   	{
1559			    var bg = new mxCell('', new mxGeometry(0, 0, w2 + 8, 68), 'shape=mxgraph.gcp2.doubleRect;strokeColor=#dddddd;shadow=1;strokeWidth=1;');
1560		    	bg.vertex = true;
1561			    var icon1 = new mxCell('<font color="#000000">Name</font><br>' + label1, new mxGeometry(0, 0.5, 44, 39), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontColor=#999999;fontSize=12;');
1562			    icon1.geometry.relative = true;
1563			    icon1.geometry.offset = new mxPoint(5, -19.5);
1564		    	icon1.vertex = true;
1565		    	bg.insert(icon1);
1566
1567			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1568			})
1569		);
1570	};
1571
1572	Sidebar.prototype.addGCP2ProductCardSet = function(label, icon, scaleX, scaleY, w1, w2, dt, fns)
1573	{
1574		var sb = this;
1575		var s = 'sketch=0;dashed=0;connectable=0;html=1;fillColor=#5184F3;strokeColor=none;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.';
1576		var label1 = label.replace('\n', ' ');
1577		var label1 = label1.replace('- ', '-');
1578
1579		fns.push(
1580			this.addEntry(dt, function()
1581		   	{
1582			    var bg = new mxCell('', new mxGeometry(0, 0, w1, 60), 'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;');
1583		    	bg.vertex = true;
1584			    var icon1 = new mxCell(label, new mxGeometry(0, 0, 45 * scaleX, 45 * scaleY), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontColor=#999999;fontSize=12;');
1585			    icon1.geometry.relative = true;
1586			    icon1.geometry.offset = new mxPoint(5, 7 + (1 - scaleY) * 22.5);
1587		    	icon1.vertex = true;
1588
1589		    	bg.insert(icon1);
1590
1591			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1592			})
1593		);
1594
1595		fns.push(
1596			this.addEntry(dt, function()
1597		   	{
1598			    var bg = new mxCell('', new mxGeometry(0, 0, w2, 60), 'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;');
1599		    	bg.vertex = true;
1600			    var icon1 = new mxCell('<font color="#000000">Name</font><br>' + label1, new mxGeometry(0, 0, 45 * scaleX, 45 * scaleY), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontColor=#999999;fontSize=12;');
1601			    icon1.geometry.relative = true;
1602			    icon1.geometry.offset = new mxPoint(5, 7 + (1 - scaleY) * 22.5);
1603		    	icon1.vertex = true;
1604		    	bg.insert(icon1);
1605
1606			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1607			})
1608		);
1609
1610		fns.push(
1611			this.addEntry(dt, function()
1612		   	{
1613			    var bg = new mxCell('', new mxGeometry(0, 0, w2 + 8, 68), 'shape=mxgraph.gcp2.doubleRect;strokeColor=#dddddd;shadow=1;strokeWidth=1;');
1614		    	bg.vertex = true;
1615			    var icon1 = new mxCell('<font color="#000000">Name</font><br>' + label1, new mxGeometry(0, 0, 45 * scaleX, 45 * scaleY), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontColor=#999999;fontSize=12;');
1616			    icon1.geometry.relative = true;
1617			    icon1.geometry.offset = new mxPoint(5, 7 + (1 - scaleY) * 22.5);
1618		    	icon1.vertex = true;
1619		    	bg.insert(icon1);
1620
1621			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1622			})
1623		);
1624	};
1625
1626	Sidebar.prototype.addGCP2ServiceCard = function(label, icon, w, h, dt, fns)
1627	{
1628		var sb = this;
1629		var s = 'sketch=0;dashed=0;connectable=0;html=1;fillColor=#757575;strokeColor=none;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.';
1630		var label1 = label.replace('\n', ' ');
1631		var label1 = label1.replace('- ', '-');
1632
1633		fns.push(
1634			this.addEntry(dt, function()
1635		   	{
1636			    var bg = new mxCell('', new mxGeometry(0, 0, w, h), 'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;');
1637		    	bg.vertex = true;
1638			    var icon1 = new mxCell(label, new mxGeometry(0, 0.5, 32, 32), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;fontSize=12;');
1639			    icon1.geometry.relative = true;
1640			    icon1.geometry.offset = new mxPoint(5, -16);
1641		    	icon1.vertex = true;
1642		    	bg.insert(icon1);
1643
1644			   	return sb.createVertexTemplateFromCells([bg], w, h, label1);
1645			})
1646		);
1647	};
1648
1649	Sidebar.prototype.addGCP2ExpandedProductCardSet = function(label, icon, w, dt, fns)
1650	{
1651		var sb = this;
1652		var s = 'sketch=0;dashed=0;connectable=0;html=1;fillColor=#5184F3;strokeColor=none;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.';
1653		var label1 = label.replace('\n', ' ');
1654		var label1 = label1.replace('- ', '-');
1655
1656		fns.push(
1657			this.addEntry(dt, function()
1658		   	{
1659			    var bg = new mxCell('', new mxGeometry(0, 0, w, 70), 'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;');
1660		    	bg.vertex = true;
1661			    var icon1 = new mxCell('<font color="#000000">Name</font><br>' + label1 + '<hr><font style="font-size: 11px">Attribute Name</font>',
1662			    		new mxGeometry(0, 0, 44, 39), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=top;spacingLeft=5;fontColor=#999999;fontSize=12;spacingTop=-8;');
1663			    icon1.geometry.relative = true;
1664			    icon1.geometry.offset = new mxPoint(5, 7);
1665		    	icon1.vertex = true;
1666		    	bg.insert(icon1);
1667
1668			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1669			})
1670		);
1671
1672		fns.push(
1673			this.addEntry(dt, function()
1674		   	{
1675			    var bg = new mxCell('', new mxGeometry(0, 0, w + 8, 78), 'shape=mxgraph.gcp2.doubleRect;strokeColor=#dddddd;shadow=1;strokeWidth=1;');
1676		    	bg.vertex = true;
1677			    var icon1 = new mxCell('<font color="#000000">Name</font><br>' + label1 + '<hr><font style="font-size: 11px">Attribute Name</font>',
1678			    		new mxGeometry(0, 0, 44, 39), s + icon + ';part=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=top;spacingLeft=5;fontColor=#999999;fontSize=12;spacingTop=-8;');
1679			    icon1.geometry.relative = true;
1680			    icon1.geometry.offset = new mxPoint(5, 7);
1681		    	icon1.vertex = true;
1682		    	bg.insert(icon1);
1683
1684			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1685			})
1686		);
1687	};
1688
1689	Sidebar.prototype.addGCP2ExpandedMachineCard = function(label, mainIcon, aspectX, aspectY, capacityLabel, machineNum1, machineIcon, machineNum2, storageIcon, storageNum, additionalModifierIcon, w, dt, fns)
1690	{
1691		var sb = this;
1692		var s = 'sketch=0;dashed=0;connectable=0;html=1;fillColor=#757575;strokeColor=none;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.';
1693		var label1 = label.replace('\n', ' ');
1694		var label1 = label1.replace('- ', '-');
1695
1696		fns.push(
1697			this.addEntry(dt, function()
1698		   	{
1699			    var bg = new mxCell('', new mxGeometry(0, 0, w, 95), 'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;');
1700		    	bg.vertex = true;
1701
1702			    var mainTitleCell = new mxCell('<font color="#000000">' + label1 + '</font><hr>' + capacityLabel,
1703			    		new mxGeometry(0, 0, w, 50), 'text;part=1;html=1;align=left;verticalAlign=top;spacingLeft=35;fontColor=#999999;fontSize=11;resizeWidth=1;');
1704			    mainTitleCell.geometry.relative = true;
1705			    mainTitleCell.vertex = true;
1706		    	bg.insert(mainTitleCell);
1707
1708			    var mainIconCell = new mxCell('',
1709			    		new mxGeometry(0, 0, 25 * aspectX, 25 * aspectY), s + mainIcon + ';part=1;');
1710			    mainIconCell.geometry.relative = true;
1711			    mainIconCell.geometry.offset = new mxPoint(4 + 12.5 * (1 - aspectX), 6 + 12.5 * (1 - aspectY));
1712			    mainIconCell.vertex = true;
1713		    	bg.insert(mainIconCell);
1714
1715			    var machineCell = new mxCell('',
1716			    		new mxGeometry(0, 0, 20, 20), s + machineIcon + ';part=1;');
1717			    machineCell.geometry.relative = true;
1718			    machineCell.geometry.offset = new mxPoint(35, 55);
1719			    machineCell.vertex = true;
1720		    	bg.insert(machineCell);
1721
1722			    var machineNum1Cell = new mxCell(machineNum1,
1723			    		new mxGeometry(0, 0, 18, 18), 'sketch=0;rounded=1;arcSize=50;part=1;fillColor=#3B8CF0;strokeColor=none;html=1;fontColor=#ffffff;spacingTop=-2;');
1724			    machineNum1Cell.geometry.relative = true;
1725			    machineNum1Cell.geometry.offset = new mxPoint(24, 69);
1726			    machineNum1Cell.vertex = true;
1727		    	bg.insert(machineNum1Cell);
1728
1729			    var machineNum2Cell = new mxCell(machineNum2,
1730			    		new mxGeometry(0, 0, 18, 18), 'sketch=0;rounded=1;arcSize=50;part=1;fillColor=#3B8CF0;strokeColor=none;html=1;fontColor=#ffffff;spacingTop=-2;');
1731			    machineNum2Cell.geometry.relative = true;
1732			    machineNum2Cell.geometry.offset = new mxPoint(50, 69);
1733			    machineNum2Cell.vertex = true;
1734		    	bg.insert(machineNum2Cell);
1735
1736			    var storageCell = new mxCell('',
1737			    		new mxGeometry(0, 0, 20, 18), s + storageIcon + ';part=1;');
1738			    storageCell.geometry.relative = true;
1739			    storageCell.geometry.offset = new mxPoint(75, 56);
1740			    storageCell.vertex = true;
1741		    	bg.insert(storageCell);
1742
1743			    var storageNumCell = new mxCell(storageNum,
1744			    		new mxGeometry(0, 0, 18, 18), 'sketch=0;rounded=1;arcSize=50;part=1;fillColor=#3B8CF0;strokeColor=none;html=1;fontColor=#ffffff;spacingTop=-2;');
1745			    storageNumCell.geometry.relative = true;
1746			    storageNumCell.geometry.offset = new mxPoint(88, 69);
1747			    storageNumCell.vertex = true;
1748		    	bg.insert(storageNumCell);
1749
1750			    var additionalModifierCell = new mxCell('',
1751			    		new mxGeometry(0, 0, 20, 20), s + additionalModifierIcon + ';part=1;');
1752			    additionalModifierCell.geometry.relative = true;
1753			    additionalModifierCell.geometry.offset = new mxPoint(115, 55);
1754			    additionalModifierCell.vertex = true;
1755		    	bg.insert(additionalModifierCell);
1756
1757			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1758			})
1759		);
1760
1761		fns.push(
1762				this.addEntry(dt, function()
1763			   	{
1764				    var bg = new mxCell('', new mxGeometry(0, 0, w, 95), 'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;');
1765			    	bg.vertex = true;
1766
1767				    var mainTitleCell = new mxCell('<font color="#000000">' + label1 + '</font><hr>' + capacityLabel,
1768				    		new mxGeometry(0, 0, w, 50), 'text;connectable=0;part=1;html=1;align=left;verticalAlign=top;spacingLeft=35;fontColor=#999999;fontSize=11;resizeWidth=1;');
1769				    mainTitleCell.geometry.relative = true;
1770				    mainTitleCell.vertex = true;
1771			    	bg.insert(mainTitleCell);
1772
1773				    var mainIconCell = new mxCell('',
1774				    		new mxGeometry(0, 0, 25 * aspectX, 25 * aspectY), s + mainIcon + ';part=1;');
1775				    mainIconCell.geometry.relative = true;
1776				    mainIconCell.geometry.offset = new mxPoint(4 + 12.5 * (1 - aspectX), 6 + 12.5 * (1 - aspectY));
1777				    mainIconCell.vertex = true;
1778			    	bg.insert(mainIconCell);
1779
1780				    var machineCell = new mxCell('',
1781				    		new mxGeometry(0, 0, 20, 20), s + machineIcon + ';part=1;');
1782				    machineCell.geometry.relative = true;
1783				    machineCell.geometry.offset = new mxPoint(35, 55);
1784				    machineCell.vertex = true;
1785			    	bg.insert(machineCell);
1786
1787				    var machineNum1Cell = new mxCell(machineNum1,
1788				    		new mxGeometry(0, 0, 18, 18), 'sketch=0;connectable=0;rounded=1;arcSize=50;part=1;fillColor=#3B8CF0;strokeColor=none;html=1;fontColor=#ffffff;spacingTop=-2;');
1789				    machineNum1Cell.geometry.relative = true;
1790				    machineNum1Cell.geometry.offset = new mxPoint(24, 69);
1791				    machineNum1Cell.vertex = true;
1792			    	bg.insert(machineNum1Cell);
1793
1794				    var machineNum2Cell = new mxCell(machineNum2,
1795				    		new mxGeometry(0, 0, 18, 18), 'sketch=0;connectable=0;rounded=1;arcSize=50;part=1;fillColor=#3B8CF0;strokeColor=none;html=1;fontColor=#ffffff;spacingTop=-2;');
1796				    machineNum2Cell.geometry.relative = true;
1797				    machineNum2Cell.geometry.offset = new mxPoint(50, 69);
1798				    machineNum2Cell.vertex = true;
1799			    	bg.insert(machineNum2Cell);
1800
1801				    var storageCell = new mxCell('',
1802				    		new mxGeometry(0, 0, 20, 18), s + storageIcon + ';part=1;');
1803				    storageCell.geometry.relative = true;
1804				    storageCell.geometry.offset = new mxPoint(75, 56);
1805				    storageCell.vertex = true;
1806			    	bg.insert(storageCell);
1807
1808				    var storageNumCell = new mxCell('123',
1809				    		new mxGeometry(0, 0, 25, 18), 'sketch=0;connectable=0;rounded=1;arcSize=50;part=1;fillColor=#3B8CF0;strokeColor=none;html=1;fontColor=#ffffff;spacingTop=-2;');
1810				    storageNumCell.geometry.relative = true;
1811				    storageNumCell.geometry.offset = new mxPoint(81, 69);
1812				    storageNumCell.vertex = true;
1813			    	bg.insert(storageNumCell);
1814
1815				    var additionalModifierCell = new mxCell('',
1816				    		new mxGeometry(0, 0, 20, 20), s + additionalModifierIcon + ';part=1;');
1817				    additionalModifierCell.geometry.relative = true;
1818				    additionalModifierCell.geometry.offset = new mxPoint(115, 55);
1819				    additionalModifierCell.vertex = true;
1820			    	bg.insert(additionalModifierCell);
1821
1822				   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1823				})
1824			);
1825	};
1826
1827	Sidebar.prototype.addGCP2UserDeviceCard = function(label, icon, scaleX, scaleY, h1, dt, fns)
1828	{
1829		var sb = this;
1830		var s = 'sketch=0;dashed=0;connectable=0;html=1;fillColor=#757575;strokeColor=none;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.';
1831		var label1 = label.replace('\n', ' ');
1832		var label1 = label1.replace('- ', '-');
1833
1834		fns.push(
1835			this.addEntry(dt, function()
1836		   	{
1837			    var bg = new mxCell(label, new mxGeometry(0, 0, 70, 85  + h1),
1838			    		'strokeColor=#dddddd;shadow=1;strokeWidth=1;rounded=1;absoluteArcSize=1;arcSize=2;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=bottom;spacingLeft=0;fontColor=#999999;fontSize=12;whiteSpace=wrap;spacingBottom=2;');
1839		    	bg.vertex = true;
1840			    var icon1 = new mxCell('', new mxGeometry(0.5, 0, 50 * scaleX, 50 * scaleY), s + icon + ';part=1;');
1841			    icon1.geometry.relative = true;
1842			    icon1.geometry.offset = new mxPoint(- scaleX * 25, 10 + (1 - scaleY) * 25);
1843		    	icon1.vertex = true;
1844		    	bg.insert(icon1);
1845
1846			   	return sb.createVertexTemplateFromCells([bg], bg.geometry.width, bg.geometry.height, label1);
1847			})
1848		);
1849	};
1850})();
1851