-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.diagram;\r
-\r
-import java.awt.BasicStroke;\r
-import java.awt.Color;\r
-import java.awt.Font;\r
-import java.awt.geom.AffineTransform;\r
-import java.awt.geom.Rectangle2D;\r
-import java.util.Set;\r
-\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.WriteGraph;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.exception.DoesNotContainValueException;\r
-import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;\r
-import org.simantics.db.exception.NoSingleResultException;\r
-import org.simantics.db.exception.ServiceException;\r
-import org.simantics.diagram.stubs.DiagramResource;\r
-import org.simantics.diagram.stubs.G2DResource;\r
-import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;\r
-import org.simantics.g2d.svg.LineCap;\r
-import org.simantics.g2d.svg.LineJoin;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.utils.strings.format.MetricsFormat;\r
-\r
-\r
-/**\r
- * Utility class for handling G2D ontology concepts.\r
- * \r
- * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
- */\r
-public class G2DUtils {\r
-\r
- /**\r
- * Utility to wrap resource to a object\r
- * \r
- * @param g\r
- * @param resource\r
- * @return\r
- * @throws ServiceException\r
- * @throws NoSingleResultException\r
- * @throws DoesNotContainValueException\r
- * @throws ManyObjectsForFunctionalRelationException\r
- */\r
- public static Object getObject(ReadGraph g, Resource resource) throws ServiceException, NoSingleResultException, DoesNotContainValueException, ManyObjectsForFunctionalRelationException {\r
- G2DResource g2d = G2DResource.getInstance(g);\r
- Set<Resource> types = g.getTypes(resource);\r
- if (types.contains(g2d.Font)) {\r
- return getFont(g, resource);\r
- }\r
- if (types.contains(g2d.Color)) {\r
- return getColor(g, resource);\r
- }\r
- if (types.contains(g2d.Transform)) {\r
- return getTransform(g, resource);\r
- }\r
- if (types.contains(g2d.Rectangle2D)) {\r
- return getRectangle(g, resource);\r
- }\r
-\r
- return g.getPossibleValue(resource);\r
- }\r
-\r
- public static Font getFont(ReadGraph g, Resource fontResource) throws ServiceException, NoSingleResultException, DoesNotContainValueException, ManyObjectsForFunctionalRelationException {\r
- G2DResource g2d = G2DResource.getInstance(g);\r
- if (!g.isInstanceOf(fontResource, g2d.Font))\r
- throw new IllegalArgumentException("Resource " + fontResource + " is not a font");\r
-\r
- String name = g.getRelatedValue(fontResource, g2d.HasFontFamily);\r
- int size = g.getRelatedValue(fontResource, g2d.HasFontSize);\r
- int style = Font.PLAIN;\r
- Resource styleResource = g.getPossibleObject(fontResource, g2d.HasFontStyle);\r
- if (styleResource != null) {\r
- if (styleResource.equals(g2d.FontStyle_bold_italic_style)) {\r
- style = Font.BOLD | Font.ITALIC;\r
- } else if (styleResource.equals(g2d.FontStyle_bold_font_style)) {\r
- style = Font.BOLD;\r
- } else if (styleResource.equals(g2d.FontStyle_italic_font_style)) {\r
- style = Font.ITALIC;\r
- } else if (styleResource.equals(g2d.FontStyle_normal_font_style)) {\r
- style = Font.PLAIN;\r
- } else {\r
- throw new IllegalArgumentException("Given font " + fontResource + " does not contain valid style. Current style is " + styleResource);\r
- }\r
- }\r
-\r
- return new Font(name, style, size);\r
- }\r
-\r
- public static Color getColor(ReadGraph g, Resource colorResource) throws DoesNotContainValueException, ServiceException {\r
- G2DResource g2d = G2DResource.getInstance(g);\r
- if (!g.isInstanceOf(colorResource, g2d.Color))\r
- throw new IllegalArgumentException("Resource " + colorResource + " is not a color");\r
-\r
- float value[] = (float[])g.getValue(colorResource);\r
- if (value.length != 4)\r
- throw new IllegalArgumentException("Color " + colorResource + " does not have proper definition, expected 4 components, got " + value.length + " components");\r
-\r
- return new Color(value[0], value[1], value[2], value[3]);\r
- }\r
-\r
- public static AffineTransform getTransform(ReadGraph g, Resource resource) throws DoesNotContainValueException, ServiceException {\r
- G2DResource g2d = G2DResource.getInstance(g);\r
- if (!g.isInstanceOf(resource, g2d.Transform))\r
- throw new IllegalArgumentException("Resource " + resource + " is not a transform");\r
-\r
- double values[] = (double[])g.getValue(resource);\r
- if (values.length != 6)\r
- throw new IllegalArgumentException("Transform " + resource + " does not have proper definition, expected 6 components, got " + values.length + " components");\r
-\r
- return new AffineTransform(values);\r
- }\r
-\r
- public static Rectangle2D getRectangle(ReadGraph g, Resource resource) throws DoesNotContainValueException, ServiceException {\r
- G2DResource g2d = G2DResource.getInstance(g);\r
- if (!g.isInstanceOf(resource, g2d.Rectangle2D))\r
- throw new IllegalArgumentException("Resource " + resource + " is not a rectangle");\r
-\r
- double values[] = (double[])g.getValue(resource);\r
- if (values.length != 4)\r
- throw new IllegalArgumentException("Transform " + resource + " does not have proper definition, expected 4 components, got " + values.length + " components");\r
-\r
- return new Rectangle2D.Double(values[0], values[1], values[2], values[3]);\r
- }\r
-\r
- public static Resource createFont(WriteGraph g, Font font) throws ServiceException, ManyObjectsForFunctionalRelationException {\r
- Layer0 b = Layer0.getInstance(g);\r
- G2DResource g2d = G2DResource.getInstance(g);\r
- Resource fontResource = g.newResource();\r
- g.claim(fontResource, b.InstanceOf, null, g2d.Font);\r
- g.claimLiteral(fontResource, g2d.HasFontFamily, font.getFamily());\r
- g.claimLiteral(fontResource, g2d.HasFontSize, font.getSize());\r
- if (font.getStyle() == (Font.BOLD|Font.ITALIC)) {\r
- g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_bold_italic_style);\r
- } else if (font.getStyle() == Font.BOLD) {\r
- g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_bold_font_style);\r
- } else if (font.getStyle() == Font.ITALIC) {\r
- g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_italic_font_style);\r
- } else {\r
- g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_normal_font_style);\r
- }\r
-\r
- return fontResource;\r
- }\r
-\r
- public static Resource createColor(WriteGraph g, Color color) throws ServiceException {\r
- Layer0 b = Layer0.getInstance(g);\r
- G2DResource g2d = G2DResource.getInstance(g);\r
- Resource colorResource = g.newResource();\r
- g.claim(colorResource, b.InstanceOf, null, g2d.Color);\r
- g.claimValue(colorResource, color.getRGBComponents(null));\r
- return colorResource;\r
- }\r
-\r
- /*\r
- * Metrics Format\r
- */\r
-\r
- public static Resource createMetricsFormat(WriteGraph g, MetricsFormat format) throws ServiceException, ManyObjectsForFunctionalRelationException {\r
- Layer0 b = Layer0.getInstance(g);\r
- DiagramResource dr = DiagramResource.getInstance(g);\r
- Resource formatResource = g.newResource();\r
- g.claim(formatResource, b.InstanceOf, null, dr.Format);\r
- g.claimLiteral(formatResource, b.HasName, format.getName());\r
- g.claimLiteral(formatResource, dr.HasPattern, format.getPattern());\r
- return formatResource;\r
- }\r
-\r
- public static MetricsFormat getMetricsFormat(ReadGraph g, Resource formatResource) throws NoSingleResultException, DoesNotContainValueException, ServiceException {\r
- Layer0 l0 = Layer0.getInstance(g);\r
- DiagramResource dr = DiagramResource.getInstance(g);\r
- String name = g.getRelatedValue(formatResource, l0.HasName);\r
- String pattern = g.getRelatedValue(formatResource, dr.HasPattern);\r
- return new MetricsFormat(pattern,1.0,name);\r
- }\r
-\r
- public static final Float DEFAULT_DASH_OFFSET = 0f;\r
- public static final Float DEFAULT_STROKE_WIDTH = 1f;\r
- public static final Float DEFAULT_MITER_LIMIT = 10f;\r
-\r
- public static BasicStroke getStroke(ReadGraph graph, Resource stroke) throws DatabaseException {\r
- return getStroke(graph, stroke, DEFAULT_DASH_OFFSET, DEFAULT_STROKE_WIDTH, DEFAULT_MITER_LIMIT);\r
- }\r
-\r
- public static BasicStroke getStroke(ReadGraph graph, Resource stroke, Float defaultDashOffset, Float defaultStrokeWidth, Float defaultMiterLimit) throws DatabaseException {\r
- if (stroke == null)\r
- return null;\r
-\r
- G2DResource g2d = G2DResource.getInstance(graph);\r
- float[] dashArray = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasDashArray, float[].class, null);\r
- Float dashOffset = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasDashOffset, Float.class, defaultDashOffset);\r
- Float strokeWidth = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasStrokeWidth, Float.class, defaultStrokeWidth);\r
- Float miterLimit = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasMiterLimit, Float.class, defaultMiterLimit);\r
- LineJoin lineJoin = DiagramGraphUtil.toLineJoin(g2d, graph.getPossibleObject(stroke, g2d.HasLineJoin));\r
- LineCap lineCap = DiagramGraphUtil.toLineCap(g2d, graph.getPossibleObject(stroke, g2d.HasLineCap));\r
-\r
- // Sanity checks.\r
- if (strokeWidth < 0)\r
- strokeWidth = 0f;\r
-\r
- return new BasicStroke(strokeWidth, lineCap.ordinal(), lineJoin.ordinal(), miterLimit, dashArray, dashOffset);\r
- }\r
-\r
- public static Resource createStroke(WriteGraph graph, BasicStroke stroke) throws DatabaseException {\r
- if (stroke == null)\r
- return null;\r
-\r
- Layer0 L0 = Layer0.getInstance(graph);\r
- G2DResource g2d = G2DResource.getInstance(graph);\r
- Resource result = graph.newResource();\r
- graph.claim(result, L0.InstanceOf, null, g2d.Stroke);\r
- if (stroke.getDashArray() != null)\r
- graph.claimLiteral(result, g2d.HasDashArray, L0.FloatArray, stroke.getDashArray(), Bindings.FLOAT_ARRAY);\r
- graph.claimLiteral(result, g2d.HasDashOffset, L0.Float, stroke.getDashPhase(), Bindings.FLOAT);\r
- graph.claimLiteral(result, g2d.HasStrokeWidth, L0.Float, stroke.getLineWidth(), Bindings.FLOAT);\r
- graph.claimLiteral(result, g2d.HasMiterLimit, L0.Float, stroke.getMiterLimit(), Bindings.FLOAT);\r
- graph.claim(result, g2d.HasLineJoin, null, DiagramGraphUtil.toLineJoin(g2d, LineJoin.values()[stroke.getLineJoin()]));\r
- graph.claim(result, g2d.HasLineCap, null, DiagramGraphUtil.toLineCap(g2d, LineCap.values()[stroke.getEndCap()]));\r
-\r
- return result;\r
- }\r
-\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.diagram;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.util.Set;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.exception.DoesNotContainValueException;
+import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;
+import org.simantics.db.exception.NoSingleResultException;
+import org.simantics.db.exception.ServiceException;
+import org.simantics.diagram.stubs.DiagramResource;
+import org.simantics.diagram.stubs.G2DResource;
+import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;
+import org.simantics.g2d.svg.LineCap;
+import org.simantics.g2d.svg.LineJoin;
+import org.simantics.layer0.Layer0;
+import org.simantics.utils.strings.format.MetricsFormat;
+
+
+/**
+ * Utility class for handling G2D ontology concepts.
+ *
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
+ */
+public class G2DUtils {
+
+ /**
+ * Utility to wrap resource to a object
+ *
+ * @param g
+ * @param resource
+ * @return
+ * @throws ServiceException
+ * @throws NoSingleResultException
+ * @throws DoesNotContainValueException
+ * @throws ManyObjectsForFunctionalRelationException
+ */
+ public static Object getObject(ReadGraph g, Resource resource) throws ServiceException, NoSingleResultException, DoesNotContainValueException, ManyObjectsForFunctionalRelationException {
+ G2DResource g2d = G2DResource.getInstance(g);
+ Set<Resource> types = g.getTypes(resource);
+ if (types.contains(g2d.Font)) {
+ return getFont(g, resource);
+ }
+ if (types.contains(g2d.Color)) {
+ return getColor(g, resource);
+ }
+ if (types.contains(g2d.Transform)) {
+ return getTransform(g, resource);
+ }
+ if (types.contains(g2d.Rectangle2D)) {
+ return getRectangle(g, resource);
+ }
+
+ return g.getPossibleValue(resource);
+ }
+
+ public static Font getFont(ReadGraph g, Resource fontResource) throws ServiceException, NoSingleResultException, DoesNotContainValueException, ManyObjectsForFunctionalRelationException {
+ G2DResource g2d = G2DResource.getInstance(g);
+ if (!g.isInstanceOf(fontResource, g2d.Font))
+ throw new IllegalArgumentException("Resource " + fontResource + " is not a font");
+
+ String name = g.getRelatedValue(fontResource, g2d.HasFontFamily);
+ int size = g.getRelatedValue(fontResource, g2d.HasFontSize);
+ int style = Font.PLAIN;
+ Resource styleResource = g.getPossibleObject(fontResource, g2d.HasFontStyle);
+ if (styleResource != null) {
+ if (styleResource.equals(g2d.FontStyle_bold_italic_style)) {
+ style = Font.BOLD | Font.ITALIC;
+ } else if (styleResource.equals(g2d.FontStyle_bold_font_style)) {
+ style = Font.BOLD;
+ } else if (styleResource.equals(g2d.FontStyle_italic_font_style)) {
+ style = Font.ITALIC;
+ } else if (styleResource.equals(g2d.FontStyle_normal_font_style)) {
+ style = Font.PLAIN;
+ } else {
+ throw new IllegalArgumentException("Given font " + fontResource + " does not contain valid style. Current style is " + styleResource);
+ }
+ }
+
+ return new Font(name, style, size);
+ }
+
+ public static Color getColor(ReadGraph g, Resource colorResource) throws DoesNotContainValueException, ServiceException {
+ G2DResource g2d = G2DResource.getInstance(g);
+ if (!g.isInstanceOf(colorResource, g2d.Color))
+ throw new IllegalArgumentException("Resource " + colorResource + " is not a color");
+
+ float value[] = (float[])g.getValue(colorResource);
+ if (value.length != 4)
+ throw new IllegalArgumentException("Color " + colorResource + " does not have proper definition, expected 4 components, got " + value.length + " components");
+
+ return new Color(value[0], value[1], value[2], value[3]);
+ }
+
+ public static AffineTransform getTransform(ReadGraph g, Resource resource) throws DoesNotContainValueException, ServiceException {
+ G2DResource g2d = G2DResource.getInstance(g);
+ if (!g.isInstanceOf(resource, g2d.Transform))
+ throw new IllegalArgumentException("Resource " + resource + " is not a transform");
+
+ double values[] = (double[])g.getValue(resource);
+ if (values.length != 6)
+ throw new IllegalArgumentException("Transform " + resource + " does not have proper definition, expected 6 components, got " + values.length + " components");
+
+ return new AffineTransform(values);
+ }
+
+ public static Rectangle2D getRectangle(ReadGraph g, Resource resource) throws DoesNotContainValueException, ServiceException {
+ G2DResource g2d = G2DResource.getInstance(g);
+ if (!g.isInstanceOf(resource, g2d.Rectangle2D))
+ throw new IllegalArgumentException("Resource " + resource + " is not a rectangle");
+
+ double values[] = (double[])g.getValue(resource);
+ if (values.length != 4)
+ throw new IllegalArgumentException("Transform " + resource + " does not have proper definition, expected 4 components, got " + values.length + " components");
+
+ return new Rectangle2D.Double(values[0], values[1], values[2], values[3]);
+ }
+
+ public static Resource createFont(WriteGraph g, Font font) throws ServiceException, ManyObjectsForFunctionalRelationException {
+ Layer0 b = Layer0.getInstance(g);
+ G2DResource g2d = G2DResource.getInstance(g);
+ Resource fontResource = g.newResource();
+ g.claim(fontResource, b.InstanceOf, null, g2d.Font);
+ g.claimLiteral(fontResource, g2d.HasFontFamily, font.getFamily());
+ g.claimLiteral(fontResource, g2d.HasFontSize, font.getSize());
+ if (font.getStyle() == (Font.BOLD|Font.ITALIC)) {
+ g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_bold_italic_style);
+ } else if (font.getStyle() == Font.BOLD) {
+ g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_bold_font_style);
+ } else if (font.getStyle() == Font.ITALIC) {
+ g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_italic_font_style);
+ } else {
+ g.claim(fontResource, g2d.HasFontStyle, g2d.FontStyle_normal_font_style);
+ }
+
+ return fontResource;
+ }
+
+ public static Resource createColor(WriteGraph g, Color color) throws ServiceException {
+ Layer0 b = Layer0.getInstance(g);
+ G2DResource g2d = G2DResource.getInstance(g);
+ Resource colorResource = g.newResource();
+ g.claim(colorResource, b.InstanceOf, null, g2d.Color);
+ g.claimValue(colorResource, color.getRGBComponents(null));
+ return colorResource;
+ }
+
+ /*
+ * Metrics Format
+ */
+
+ public static Resource createMetricsFormat(WriteGraph g, MetricsFormat format) throws ServiceException, ManyObjectsForFunctionalRelationException {
+ Layer0 b = Layer0.getInstance(g);
+ DiagramResource dr = DiagramResource.getInstance(g);
+ Resource formatResource = g.newResource();
+ g.claim(formatResource, b.InstanceOf, null, dr.Format);
+ g.claimLiteral(formatResource, b.HasName, format.getName());
+ g.claimLiteral(formatResource, dr.HasPattern, format.getPattern());
+ return formatResource;
+ }
+
+ public static MetricsFormat getMetricsFormat(ReadGraph g, Resource formatResource) throws NoSingleResultException, DoesNotContainValueException, ServiceException {
+ Layer0 l0 = Layer0.getInstance(g);
+ DiagramResource dr = DiagramResource.getInstance(g);
+ String name = g.getRelatedValue(formatResource, l0.HasName);
+ String pattern = g.getRelatedValue(formatResource, dr.HasPattern);
+ return new MetricsFormat(pattern,1.0,name);
+ }
+
+ public static final Float DEFAULT_DASH_OFFSET = 0f;
+ public static final Float DEFAULT_STROKE_WIDTH = 1f;
+ public static final Float DEFAULT_MITER_LIMIT = 10f;
+
+ public static BasicStroke getStroke(ReadGraph graph, Resource stroke) throws DatabaseException {
+ return getStroke(graph, stroke, DEFAULT_DASH_OFFSET, DEFAULT_STROKE_WIDTH, DEFAULT_MITER_LIMIT);
+ }
+
+ public static BasicStroke getStroke(ReadGraph graph, Resource stroke, Float defaultDashOffset, Float defaultStrokeWidth, Float defaultMiterLimit) throws DatabaseException {
+ if (stroke == null)
+ return null;
+
+ G2DResource g2d = G2DResource.getInstance(graph);
+ float[] dashArray = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasDashArray, float[].class, null);
+ Float dashOffset = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasDashOffset, Float.class, defaultDashOffset);
+ Float strokeWidth = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasStrokeWidth, Float.class, defaultStrokeWidth);
+ Float miterLimit = DiagramGraphUtil.getPossibleRelatedValue(graph, stroke, g2d.HasMiterLimit, Float.class, defaultMiterLimit);
+ LineJoin lineJoin = DiagramGraphUtil.toLineJoin(g2d, graph.getPossibleObject(stroke, g2d.HasLineJoin));
+ LineCap lineCap = DiagramGraphUtil.toLineCap(g2d, graph.getPossibleObject(stroke, g2d.HasLineCap));
+
+ // Sanity checks.
+ if (strokeWidth < 0)
+ strokeWidth = 0f;
+
+ return new BasicStroke(strokeWidth, lineCap.ordinal(), lineJoin.ordinal(), miterLimit, dashArray, dashOffset);
+ }
+
+ public static Resource createStroke(WriteGraph graph, BasicStroke stroke) throws DatabaseException {
+ if (stroke == null)
+ return null;
+
+ Layer0 L0 = Layer0.getInstance(graph);
+ G2DResource g2d = G2DResource.getInstance(graph);
+ Resource result = graph.newResource();
+ graph.claim(result, L0.InstanceOf, null, g2d.Stroke);
+ if (stroke.getDashArray() != null)
+ graph.claimLiteral(result, g2d.HasDashArray, L0.FloatArray, stroke.getDashArray(), Bindings.FLOAT_ARRAY);
+ graph.claimLiteral(result, g2d.HasDashOffset, L0.Float, stroke.getDashPhase(), Bindings.FLOAT);
+ graph.claimLiteral(result, g2d.HasStrokeWidth, L0.Float, stroke.getLineWidth(), Bindings.FLOAT);
+ graph.claimLiteral(result, g2d.HasMiterLimit, L0.Float, stroke.getMiterLimit(), Bindings.FLOAT);
+ graph.claim(result, g2d.HasLineJoin, null, DiagramGraphUtil.toLineJoin(g2d, LineJoin.values()[stroke.getLineJoin()]));
+ graph.claim(result, g2d.HasLineCap, null, DiagramGraphUtil.toLineCap(g2d, LineCap.values()[stroke.getEndCap()]));
+
+ return result;
+ }
+
+}