org.apache.maven.plugins
maven-checkstyle-plugin
@@ -109,6 +132,7 @@
../../releng/syson-resources/checkstyle/CheckstyleConfiguration.xml
true
+ org/eclipse/syson/diagram/general/view/directedit/grammars/generated/*
true
true
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/GeneralViewDirectEditListener.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/GeneralViewDirectEditListener.java
new file mode 100644
index 0000000..48aea7f
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/GeneralViewDirectEditListener.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.directedit;
+
+import java.util.Objects;
+
+import org.antlr.v4.runtime.tree.ErrorNode;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.syson.diagram.general.view.directedit.grammars.generated.DirectEditBaseListener;
+import org.eclipse.syson.diagram.general.view.directedit.grammars.generated.DirectEditParser.ExpressionContext;
+import org.eclipse.syson.diagram.general.view.directedit.grammars.generated.DirectEditParser.TypingExpressionContext;
+import org.eclipse.syson.diagram.general.view.directedit.grammars.generated.DirectEditParser.ValueExpressionContext;
+import org.eclipse.syson.diagram.general.view.services.GeneralViewUtilService;
+import org.eclipse.syson.sysml.Definition;
+import org.eclipse.syson.sysml.Element;
+import org.eclipse.syson.sysml.FeatureTyping;
+import org.eclipse.syson.sysml.SysmlFactory;
+import org.eclipse.syson.sysml.SysmlPackage;
+import org.eclipse.syson.sysml.Usage;
+
+/**
+ * The ANTLR Listener for the direct edit grammar for General View.
+ *
+ * @author arichard
+ */
+public class GeneralViewDirectEditListener extends DirectEditBaseListener {
+
+ private final Element element;
+
+ private final GeneralViewUtilService generalViewUtilService;
+
+ public GeneralViewDirectEditListener(Element element) {
+ this.element = Objects.requireNonNull(element);
+ this.generalViewUtilService = new GeneralViewUtilService();
+ }
+
+ @Override
+ public void exitExpression(ExpressionContext ctx) {
+ var identifier = ctx.Ident();
+ this.element.setDeclaredName(identifier.getText());
+ }
+
+ @Override
+ public void exitTypingExpression(TypingExpressionContext ctx) {
+ if (this.element instanceof Usage) {
+ var identifier = ctx.Ident();
+ var typeAsString = identifier.getText();
+ var definition = this.generalViewUtilService.findDefinitionByName(this.element, typeAsString);
+ if (definition == null) {
+ var containerPackage = this.generalViewUtilService.getContainerPackage(this.element);
+ var newMembership = SysmlFactory.eINSTANCE.createOwningMembership();
+ containerPackage.getOwnedMembership().add(newMembership);
+ EClassifier eClassifier = SysmlPackage.eINSTANCE.getEClassifier(this.element.eClass().getInstanceTypeName().replace("Usage", "Definition"));
+ if (eClassifier instanceof EClass eClass) {
+ definition = (Definition) SysmlFactory.eINSTANCE.create(eClass);
+ definition.setDeclaredName(typeAsString);
+ }
+ }
+ var featureTyping = this.element.getOwnedRelationship().stream()
+ .filter(FeatureTyping.class::isInstance)
+ .map(FeatureTyping.class::cast)
+ .findFirst();
+ if (featureTyping.isPresent()) {
+ featureTyping.get().setType(definition);
+ } else {
+ var newFeatureTyping = SysmlFactory.eINSTANCE.createFeatureTyping();
+ this.element.getOwnedRelationship().add(newFeatureTyping);
+ featureTyping.get().setType(definition);
+ }
+ }
+ }
+
+ @Override
+ public void exitValueExpression(ValueExpressionContext ctx) {
+ super.exitValueExpression(ctx);
+ }
+
+ @Override
+ public void visitErrorNode(ErrorNode node) {
+ super.visitErrorNode(node);
+ }
+}
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEdit.interp b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEdit.interp
new file mode 100644
index 0000000..066d550
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEdit.interp
@@ -0,0 +1,222 @@
+token literal names:
+null
+':'
+'='
+'.*'
+null
+null
+null
+null
+null
+'about'
+'abstract'
+'alias'
+'all'
+'and'
+'as'
+'assign'
+'assoc'
+'behavior'
+'binding'
+'bool'
+'by'
+'chains'
+'class'
+'classifier'
+'comment'
+'composite'
+'conjugate'
+'conjugates'
+'conjugation'
+'connector'
+'datatype'
+'default'
+'dependency'
+'derived'
+'differences'
+'disjoining'
+'disjoint'
+'doc'
+'else'
+'END'
+'expr'
+'false'
+'feature'
+'featured'
+'featuring'
+'filter'
+'first'
+'flow'
+'for'
+'from'
+'function'
+'hastype'
+'if'
+'intersects'
+'implies'
+'import'
+'in'
+'inout'
+'interaction'
+'inv'
+'inverse'
+'inverting'
+'istype'
+'language'
+'member'
+'metaclass'
+'metadata'
+'multiplicity'
+'namespace'
+'nonunique'
+'not'
+'null'
+'of'
+'or'
+'ordered'
+'out'
+'package'
+'portion'
+'predicate'
+'private'
+'protected'
+'public'
+'readonly'
+'redefines'
+'redefinition'
+'references'
+'rep'
+'return'
+'specialization'
+'specializes'
+'step'
+'struct'
+'subclassifier'
+'subset'
+'subsets'
+'subtype'
+'succession'
+'then'
+'to'
+'true'
+'type'
+'typed'
+'typing'
+'unions'
+'xor'
+
+token symbolic names:
+null
+null
+null
+null
+WS
+Integer
+Real
+String
+Ident
+ABOUT
+ABSTRACT
+ALIAS
+ALL
+AND
+AS
+ASSIGN
+ASSOC
+BEAHVIOR
+BINDING
+BOOL
+BY
+CHAINS
+CLASS
+CLASSIFIER
+COMMENT
+COMPOSITE
+CONJUGATE
+CONJUGATES
+CONJUGATION
+CONNECTOR
+DATATYPE
+DEFAULT
+DEPENDENCY
+DERIVED
+DIFFERENCES
+DISJOINING
+DISJOINT
+DOC
+ELSE
+END
+EXPR
+FALSE
+FEATURE
+FEATURED
+FEATURING
+FILTER
+FIRST
+FLOW
+FOR
+FROM
+FUNCTION
+HASTYPE
+IF
+INTERSECTS
+IMPLIES
+IMPORT
+IN
+INPUT
+INTERACTION
+INV
+INVERSE
+INVERTING
+ISTYPE
+LANGUAGE
+MEMBER
+METACLASS
+METADATA
+MULTIPLICITY
+NAMESPACE
+NONUNIQUE
+NOT
+NULL
+OF
+OR
+ORDERED
+OUT
+PACKAGE
+PORTION
+PREDICATE
+PRIAVTE
+PROTECTED
+PUBLIC
+READONLY
+REDEFINES
+REDEFINITION
+RFERENCES
+REP
+RETURN
+SPECIALIZTION
+SPECIALIZES
+STEP
+STRCUT
+SUBCLASSIFIER
+SUBSET
+SUBSETS
+SUBTYPE
+SUCCESSION
+THEN
+TO
+TRUE
+TYPE
+TYPED
+TYPING
+UNIONS
+XOR
+
+rule names:
+expression
+typingExpression
+valueExpression
+
+
+atn:
+[4, 1, 104, 22, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 1, 0, 1, 0, 3, 0, 9, 8, 0, 1, 0, 3, 0, 12, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 3, 0, 2, 4, 0, 0, 20, 0, 6, 1, 0, 0, 0, 2, 15, 1, 0, 0, 0, 4, 18, 1, 0, 0, 0, 6, 8, 5, 8, 0, 0, 7, 9, 3, 2, 1, 0, 8, 7, 1, 0, 0, 0, 8, 9, 1, 0, 0, 0, 9, 11, 1, 0, 0, 0, 10, 12, 3, 4, 2, 0, 11, 10, 1, 0, 0, 0, 11, 12, 1, 0, 0, 0, 12, 13, 1, 0, 0, 0, 13, 14, 5, 0, 0, 1, 14, 1, 1, 0, 0, 0, 15, 16, 5, 1, 0, 0, 16, 17, 5, 8, 0, 0, 17, 3, 1, 0, 0, 0, 18, 19, 5, 2, 0, 0, 19, 20, 5, 3, 0, 0, 20, 5, 1, 0, 0, 0, 2, 8, 11]
\ No newline at end of file
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEdit.tokens b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEdit.tokens
new file mode 100644
index 0000000..d8e5e9d
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEdit.tokens
@@ -0,0 +1,203 @@
+T__0=1
+T__1=2
+T__2=3
+WS=4
+Integer=5
+Real=6
+String=7
+Ident=8
+ABOUT=9
+ABSTRACT=10
+ALIAS=11
+ALL=12
+AND=13
+AS=14
+ASSIGN=15
+ASSOC=16
+BEAHVIOR=17
+BINDING=18
+BOOL=19
+BY=20
+CHAINS=21
+CLASS=22
+CLASSIFIER=23
+COMMENT=24
+COMPOSITE=25
+CONJUGATE=26
+CONJUGATES=27
+CONJUGATION=28
+CONNECTOR=29
+DATATYPE=30
+DEFAULT=31
+DEPENDENCY=32
+DERIVED=33
+DIFFERENCES=34
+DISJOINING=35
+DISJOINT=36
+DOC=37
+ELSE=38
+END=39
+EXPR=40
+FALSE=41
+FEATURE=42
+FEATURED=43
+FEATURING=44
+FILTER=45
+FIRST=46
+FLOW=47
+FOR=48
+FROM=49
+FUNCTION=50
+HASTYPE=51
+IF=52
+INTERSECTS=53
+IMPLIES=54
+IMPORT=55
+IN=56
+INPUT=57
+INTERACTION=58
+INV=59
+INVERSE=60
+INVERTING=61
+ISTYPE=62
+LANGUAGE=63
+MEMBER=64
+METACLASS=65
+METADATA=66
+MULTIPLICITY=67
+NAMESPACE=68
+NONUNIQUE=69
+NOT=70
+NULL=71
+OF=72
+OR=73
+ORDERED=74
+OUT=75
+PACKAGE=76
+PORTION=77
+PREDICATE=78
+PRIAVTE=79
+PROTECTED=80
+PUBLIC=81
+READONLY=82
+REDEFINES=83
+REDEFINITION=84
+RFERENCES=85
+REP=86
+RETURN=87
+SPECIALIZTION=88
+SPECIALIZES=89
+STEP=90
+STRCUT=91
+SUBCLASSIFIER=92
+SUBSET=93
+SUBSETS=94
+SUBTYPE=95
+SUCCESSION=96
+THEN=97
+TO=98
+TRUE=99
+TYPE=100
+TYPED=101
+TYPING=102
+UNIONS=103
+XOR=104
+':'=1
+'='=2
+'.*'=3
+'about'=9
+'abstract'=10
+'alias'=11
+'all'=12
+'and'=13
+'as'=14
+'assign'=15
+'assoc'=16
+'behavior'=17
+'binding'=18
+'bool'=19
+'by'=20
+'chains'=21
+'class'=22
+'classifier'=23
+'comment'=24
+'composite'=25
+'conjugate'=26
+'conjugates'=27
+'conjugation'=28
+'connector'=29
+'datatype'=30
+'default'=31
+'dependency'=32
+'derived'=33
+'differences'=34
+'disjoining'=35
+'disjoint'=36
+'doc'=37
+'else'=38
+'END'=39
+'expr'=40
+'false'=41
+'feature'=42
+'featured'=43
+'featuring'=44
+'filter'=45
+'first'=46
+'flow'=47
+'for'=48
+'from'=49
+'function'=50
+'hastype'=51
+'if'=52
+'intersects'=53
+'implies'=54
+'import'=55
+'in'=56
+'inout'=57
+'interaction'=58
+'inv'=59
+'inverse'=60
+'inverting'=61
+'istype'=62
+'language'=63
+'member'=64
+'metaclass'=65
+'metadata'=66
+'multiplicity'=67
+'namespace'=68
+'nonunique'=69
+'not'=70
+'null'=71
+'of'=72
+'or'=73
+'ordered'=74
+'out'=75
+'package'=76
+'portion'=77
+'predicate'=78
+'private'=79
+'protected'=80
+'public'=81
+'readonly'=82
+'redefines'=83
+'redefinition'=84
+'references'=85
+'rep'=86
+'return'=87
+'specialization'=88
+'specializes'=89
+'step'=90
+'struct'=91
+'subclassifier'=92
+'subset'=93
+'subsets'=94
+'subtype'=95
+'succession'=96
+'then'=97
+'to'=98
+'true'=99
+'type'=100
+'typed'=101
+'typing'=102
+'unions'=103
+'xor'=104
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditBaseListener.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditBaseListener.java
new file mode 100644
index 0000000..1a9fb98
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditBaseListener.java
@@ -0,0 +1,89 @@
+// Generated from DirectEdit.g4 by ANTLR 4.10.1
+
+/*******************************************************************************
+ * Copyright (c) 2023 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.directedit.grammars.generated;
+
+
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.tree.ErrorNode;
+import org.antlr.v4.runtime.tree.TerminalNode;
+
+/**
+ * This class provides an empty implementation of {@link DirectEditListener},
+ * which can be extended to create a listener which only needs to handle a subset
+ * of the available methods.
+ */
+public class DirectEditBaseListener implements DirectEditListener {
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExpression(DirectEditParser.ExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExpression(DirectEditParser.ExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypingExpression(DirectEditParser.TypingExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypingExpression(DirectEditParser.TypingExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterValueExpression(DirectEditParser.ValueExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitValueExpression(DirectEditParser.ValueExpressionContext ctx) { }
+
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterEveryRule(ParserRuleContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitEveryRule(ParserRuleContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void visitTerminal(TerminalNode node) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void visitErrorNode(ErrorNode node) { }
+}
\ No newline at end of file
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.interp b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.interp
new file mode 100644
index 0000000..c14f42a
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.interp
@@ -0,0 +1,331 @@
+token literal names:
+null
+':'
+'='
+'.*'
+null
+null
+null
+null
+null
+'about'
+'abstract'
+'alias'
+'all'
+'and'
+'as'
+'assign'
+'assoc'
+'behavior'
+'binding'
+'bool'
+'by'
+'chains'
+'class'
+'classifier'
+'comment'
+'composite'
+'conjugate'
+'conjugates'
+'conjugation'
+'connector'
+'datatype'
+'default'
+'dependency'
+'derived'
+'differences'
+'disjoining'
+'disjoint'
+'doc'
+'else'
+'END'
+'expr'
+'false'
+'feature'
+'featured'
+'featuring'
+'filter'
+'first'
+'flow'
+'for'
+'from'
+'function'
+'hastype'
+'if'
+'intersects'
+'implies'
+'import'
+'in'
+'inout'
+'interaction'
+'inv'
+'inverse'
+'inverting'
+'istype'
+'language'
+'member'
+'metaclass'
+'metadata'
+'multiplicity'
+'namespace'
+'nonunique'
+'not'
+'null'
+'of'
+'or'
+'ordered'
+'out'
+'package'
+'portion'
+'predicate'
+'private'
+'protected'
+'public'
+'readonly'
+'redefines'
+'redefinition'
+'references'
+'rep'
+'return'
+'specialization'
+'specializes'
+'step'
+'struct'
+'subclassifier'
+'subset'
+'subsets'
+'subtype'
+'succession'
+'then'
+'to'
+'true'
+'type'
+'typed'
+'typing'
+'unions'
+'xor'
+
+token symbolic names:
+null
+null
+null
+null
+WS
+Integer
+Real
+String
+Ident
+ABOUT
+ABSTRACT
+ALIAS
+ALL
+AND
+AS
+ASSIGN
+ASSOC
+BEAHVIOR
+BINDING
+BOOL
+BY
+CHAINS
+CLASS
+CLASSIFIER
+COMMENT
+COMPOSITE
+CONJUGATE
+CONJUGATES
+CONJUGATION
+CONNECTOR
+DATATYPE
+DEFAULT
+DEPENDENCY
+DERIVED
+DIFFERENCES
+DISJOINING
+DISJOINT
+DOC
+ELSE
+END
+EXPR
+FALSE
+FEATURE
+FEATURED
+FEATURING
+FILTER
+FIRST
+FLOW
+FOR
+FROM
+FUNCTION
+HASTYPE
+IF
+INTERSECTS
+IMPLIES
+IMPORT
+IN
+INPUT
+INTERACTION
+INV
+INVERSE
+INVERTING
+ISTYPE
+LANGUAGE
+MEMBER
+METACLASS
+METADATA
+MULTIPLICITY
+NAMESPACE
+NONUNIQUE
+NOT
+NULL
+OF
+OR
+ORDERED
+OUT
+PACKAGE
+PORTION
+PREDICATE
+PRIAVTE
+PROTECTED
+PUBLIC
+READONLY
+REDEFINES
+REDEFINITION
+RFERENCES
+REP
+RETURN
+SPECIALIZTION
+SPECIALIZES
+STEP
+STRCUT
+SUBCLASSIFIER
+SUBSET
+SUBSETS
+SUBTYPE
+SUCCESSION
+THEN
+TO
+TRUE
+TYPE
+TYPED
+TYPING
+UNIONS
+XOR
+
+rule names:
+T__0
+T__1
+T__2
+WS
+Integer
+Real
+String
+Escape
+Ident
+Letter
+ABOUT
+ABSTRACT
+ALIAS
+ALL
+AND
+AS
+ASSIGN
+ASSOC
+BEAHVIOR
+BINDING
+BOOL
+BY
+CHAINS
+CLASS
+CLASSIFIER
+COMMENT
+COMPOSITE
+CONJUGATE
+CONJUGATES
+CONJUGATION
+CONNECTOR
+DATATYPE
+DEFAULT
+DEPENDENCY
+DERIVED
+DIFFERENCES
+DISJOINING
+DISJOINT
+DOC
+ELSE
+END
+EXPR
+FALSE
+FEATURE
+FEATURED
+FEATURING
+FILTER
+FIRST
+FLOW
+FOR
+FROM
+FUNCTION
+HASTYPE
+IF
+INTERSECTS
+IMPLIES
+IMPORT
+IN
+INPUT
+INTERACTION
+INV
+INVERSE
+INVERTING
+ISTYPE
+LANGUAGE
+MEMBER
+METACLASS
+METADATA
+MULTIPLICITY
+NAMESPACE
+NONUNIQUE
+NOT
+NULL
+OF
+OR
+ORDERED
+OUT
+PACKAGE
+PORTION
+PREDICATE
+PRIAVTE
+PROTECTED
+PUBLIC
+READONLY
+REDEFINES
+REDEFINITION
+RFERENCES
+REP
+RETURN
+SPECIALIZTION
+SPECIALIZES
+STEP
+STRCUT
+SUBCLASSIFIER
+SUBSET
+SUBSETS
+SUBTYPE
+SUCCESSION
+THEN
+TO
+TRUE
+TYPE
+TYPED
+TYPING
+UNIONS
+XOR
+
+channel names:
+DEFAULT_TOKEN_CHANNEL
+HIDDEN
+
+mode names:
+DEFAULT_MODE
+
+atn:
+[4, 0, 104, 998, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 4, 3, 222, 8, 3, 11, 3, 12, 3, 223, 1, 3, 1, 3, 1, 4, 4, 4, 229, 8, 4, 11, 4, 12, 4, 230, 1, 5, 4, 5, 234, 8, 5, 11, 5, 12, 5, 235, 1, 5, 1, 5, 4, 5, 240, 8, 5, 11, 5, 12, 5, 241, 1, 6, 1, 6, 1, 6, 5, 6, 247, 8, 6, 10, 6, 12, 6, 250, 9, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 258, 8, 7, 1, 8, 3, 8, 261, 8, 8, 1, 8, 1, 8, 1, 8, 5, 8, 266, 8, 8, 10, 8, 12, 8, 269, 9, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 248, 0, 106, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 0, 17, 8, 19, 0, 21, 9, 23, 10, 25, 11, 27, 12, 29, 13, 31, 14, 33, 15, 35, 16, 37, 17, 39, 18, 41, 19, 43, 20, 45, 21, 47, 22, 49, 23, 51, 24, 53, 25, 55, 26, 57, 27, 59, 28, 61, 29, 63, 30, 65, 31, 67, 32, 69, 33, 71, 34, 73, 35, 75, 36, 77, 37, 79, 38, 81, 39, 83, 40, 85, 41, 87, 42, 89, 43, 91, 44, 93, 45, 95, 46, 97, 47, 99, 48, 101, 49, 103, 50, 105, 51, 107, 52, 109, 53, 111, 54, 113, 55, 115, 56, 117, 57, 119, 58, 121, 59, 123, 60, 125, 61, 127, 62, 129, 63, 131, 64, 133, 65, 135, 66, 137, 67, 139, 68, 141, 69, 143, 70, 145, 71, 147, 72, 149, 73, 151, 74, 153, 75, 155, 76, 157, 77, 159, 78, 161, 79, 163, 80, 165, 81, 167, 82, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 1, 0, 4, 3, 0, 9, 10, 12, 13, 32, 32, 1, 0, 48, 57, 2, 0, 48, 57, 95, 95, 2, 0, 65, 90, 97, 122, 1005, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 1, 213, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 5, 217, 1, 0, 0, 0, 7, 221, 1, 0, 0, 0, 9, 228, 1, 0, 0, 0, 11, 233, 1, 0, 0, 0, 13, 243, 1, 0, 0, 0, 15, 257, 1, 0, 0, 0, 17, 260, 1, 0, 0, 0, 19, 270, 1, 0, 0, 0, 21, 272, 1, 0, 0, 0, 23, 278, 1, 0, 0, 0, 25, 287, 1, 0, 0, 0, 27, 293, 1, 0, 0, 0, 29, 297, 1, 0, 0, 0, 31, 301, 1, 0, 0, 0, 33, 304, 1, 0, 0, 0, 35, 311, 1, 0, 0, 0, 37, 317, 1, 0, 0, 0, 39, 326, 1, 0, 0, 0, 41, 334, 1, 0, 0, 0, 43, 339, 1, 0, 0, 0, 45, 342, 1, 0, 0, 0, 47, 349, 1, 0, 0, 0, 49, 355, 1, 0, 0, 0, 51, 366, 1, 0, 0, 0, 53, 374, 1, 0, 0, 0, 55, 384, 1, 0, 0, 0, 57, 394, 1, 0, 0, 0, 59, 405, 1, 0, 0, 0, 61, 417, 1, 0, 0, 0, 63, 427, 1, 0, 0, 0, 65, 436, 1, 0, 0, 0, 67, 444, 1, 0, 0, 0, 69, 455, 1, 0, 0, 0, 71, 463, 1, 0, 0, 0, 73, 475, 1, 0, 0, 0, 75, 486, 1, 0, 0, 0, 77, 495, 1, 0, 0, 0, 79, 499, 1, 0, 0, 0, 81, 504, 1, 0, 0, 0, 83, 508, 1, 0, 0, 0, 85, 513, 1, 0, 0, 0, 87, 519, 1, 0, 0, 0, 89, 527, 1, 0, 0, 0, 91, 536, 1, 0, 0, 0, 93, 546, 1, 0, 0, 0, 95, 553, 1, 0, 0, 0, 97, 559, 1, 0, 0, 0, 99, 564, 1, 0, 0, 0, 101, 568, 1, 0, 0, 0, 103, 573, 1, 0, 0, 0, 105, 582, 1, 0, 0, 0, 107, 590, 1, 0, 0, 0, 109, 593, 1, 0, 0, 0, 111, 604, 1, 0, 0, 0, 113, 612, 1, 0, 0, 0, 115, 619, 1, 0, 0, 0, 117, 622, 1, 0, 0, 0, 119, 628, 1, 0, 0, 0, 121, 640, 1, 0, 0, 0, 123, 644, 1, 0, 0, 0, 125, 652, 1, 0, 0, 0, 127, 662, 1, 0, 0, 0, 129, 669, 1, 0, 0, 0, 131, 678, 1, 0, 0, 0, 133, 685, 1, 0, 0, 0, 135, 695, 1, 0, 0, 0, 137, 704, 1, 0, 0, 0, 139, 717, 1, 0, 0, 0, 141, 727, 1, 0, 0, 0, 143, 737, 1, 0, 0, 0, 145, 741, 1, 0, 0, 0, 147, 746, 1, 0, 0, 0, 149, 749, 1, 0, 0, 0, 151, 752, 1, 0, 0, 0, 153, 760, 1, 0, 0, 0, 155, 764, 1, 0, 0, 0, 157, 772, 1, 0, 0, 0, 159, 780, 1, 0, 0, 0, 161, 790, 1, 0, 0, 0, 163, 798, 1, 0, 0, 0, 165, 808, 1, 0, 0, 0, 167, 815, 1, 0, 0, 0, 169, 824, 1, 0, 0, 0, 171, 834, 1, 0, 0, 0, 173, 847, 1, 0, 0, 0, 175, 858, 1, 0, 0, 0, 177, 862, 1, 0, 0, 0, 179, 869, 1, 0, 0, 0, 181, 884, 1, 0, 0, 0, 183, 896, 1, 0, 0, 0, 185, 901, 1, 0, 0, 0, 187, 908, 1, 0, 0, 0, 189, 922, 1, 0, 0, 0, 191, 929, 1, 0, 0, 0, 193, 937, 1, 0, 0, 0, 195, 945, 1, 0, 0, 0, 197, 956, 1, 0, 0, 0, 199, 961, 1, 0, 0, 0, 201, 964, 1, 0, 0, 0, 203, 969, 1, 0, 0, 0, 205, 974, 1, 0, 0, 0, 207, 980, 1, 0, 0, 0, 209, 987, 1, 0, 0, 0, 211, 994, 1, 0, 0, 0, 213, 214, 5, 58, 0, 0, 214, 2, 1, 0, 0, 0, 215, 216, 5, 61, 0, 0, 216, 4, 1, 0, 0, 0, 217, 218, 5, 46, 0, 0, 218, 219, 5, 42, 0, 0, 219, 6, 1, 0, 0, 0, 220, 222, 7, 0, 0, 0, 221, 220, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 224, 1, 0, 0, 0, 224, 225, 1, 0, 0, 0, 225, 226, 6, 3, 0, 0, 226, 8, 1, 0, 0, 0, 227, 229, 7, 1, 0, 0, 228, 227, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 10, 1, 0, 0, 0, 232, 234, 7, 1, 0, 0, 233, 232, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 239, 5, 46, 0, 0, 238, 240, 7, 1, 0, 0, 239, 238, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 12, 1, 0, 0, 0, 243, 248, 5, 39, 0, 0, 244, 247, 3, 15, 7, 0, 245, 247, 9, 0, 0, 0, 246, 244, 1, 0, 0, 0, 246, 245, 1, 0, 0, 0, 247, 250, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 249, 251, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 252, 5, 39, 0, 0, 252, 14, 1, 0, 0, 0, 253, 254, 5, 92, 0, 0, 254, 258, 5, 92, 0, 0, 255, 256, 5, 92, 0, 0, 256, 258, 5, 39, 0, 0, 257, 253, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 258, 16, 1, 0, 0, 0, 259, 261, 5, 95, 0, 0, 260, 259, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 267, 3, 19, 9, 0, 263, 266, 3, 19, 9, 0, 264, 266, 7, 2, 0, 0, 265, 263, 1, 0, 0, 0, 265, 264, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 18, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 270, 271, 7, 3, 0, 0, 271, 20, 1, 0, 0, 0, 272, 273, 5, 97, 0, 0, 273, 274, 5, 98, 0, 0, 274, 275, 5, 111, 0, 0, 275, 276, 5, 117, 0, 0, 276, 277, 5, 116, 0, 0, 277, 22, 1, 0, 0, 0, 278, 279, 5, 97, 0, 0, 279, 280, 5, 98, 0, 0, 280, 281, 5, 115, 0, 0, 281, 282, 5, 116, 0, 0, 282, 283, 5, 114, 0, 0, 283, 284, 5, 97, 0, 0, 284, 285, 5, 99, 0, 0, 285, 286, 5, 116, 0, 0, 286, 24, 1, 0, 0, 0, 287, 288, 5, 97, 0, 0, 288, 289, 5, 108, 0, 0, 289, 290, 5, 105, 0, 0, 290, 291, 5, 97, 0, 0, 291, 292, 5, 115, 0, 0, 292, 26, 1, 0, 0, 0, 293, 294, 5, 97, 0, 0, 294, 295, 5, 108, 0, 0, 295, 296, 5, 108, 0, 0, 296, 28, 1, 0, 0, 0, 297, 298, 5, 97, 0, 0, 298, 299, 5, 110, 0, 0, 299, 300, 5, 100, 0, 0, 300, 30, 1, 0, 0, 0, 301, 302, 5, 97, 0, 0, 302, 303, 5, 115, 0, 0, 303, 32, 1, 0, 0, 0, 304, 305, 5, 97, 0, 0, 305, 306, 5, 115, 0, 0, 306, 307, 5, 115, 0, 0, 307, 308, 5, 105, 0, 0, 308, 309, 5, 103, 0, 0, 309, 310, 5, 110, 0, 0, 310, 34, 1, 0, 0, 0, 311, 312, 5, 97, 0, 0, 312, 313, 5, 115, 0, 0, 313, 314, 5, 115, 0, 0, 314, 315, 5, 111, 0, 0, 315, 316, 5, 99, 0, 0, 316, 36, 1, 0, 0, 0, 317, 318, 5, 98, 0, 0, 318, 319, 5, 101, 0, 0, 319, 320, 5, 104, 0, 0, 320, 321, 5, 97, 0, 0, 321, 322, 5, 118, 0, 0, 322, 323, 5, 105, 0, 0, 323, 324, 5, 111, 0, 0, 324, 325, 5, 114, 0, 0, 325, 38, 1, 0, 0, 0, 326, 327, 5, 98, 0, 0, 327, 328, 5, 105, 0, 0, 328, 329, 5, 110, 0, 0, 329, 330, 5, 100, 0, 0, 330, 331, 5, 105, 0, 0, 331, 332, 5, 110, 0, 0, 332, 333, 5, 103, 0, 0, 333, 40, 1, 0, 0, 0, 334, 335, 5, 98, 0, 0, 335, 336, 5, 111, 0, 0, 336, 337, 5, 111, 0, 0, 337, 338, 5, 108, 0, 0, 338, 42, 1, 0, 0, 0, 339, 340, 5, 98, 0, 0, 340, 341, 5, 121, 0, 0, 341, 44, 1, 0, 0, 0, 342, 343, 5, 99, 0, 0, 343, 344, 5, 104, 0, 0, 344, 345, 5, 97, 0, 0, 345, 346, 5, 105, 0, 0, 346, 347, 5, 110, 0, 0, 347, 348, 5, 115, 0, 0, 348, 46, 1, 0, 0, 0, 349, 350, 5, 99, 0, 0, 350, 351, 5, 108, 0, 0, 351, 352, 5, 97, 0, 0, 352, 353, 5, 115, 0, 0, 353, 354, 5, 115, 0, 0, 354, 48, 1, 0, 0, 0, 355, 356, 5, 99, 0, 0, 356, 357, 5, 108, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 115, 0, 0, 359, 360, 5, 115, 0, 0, 360, 361, 5, 105, 0, 0, 361, 362, 5, 102, 0, 0, 362, 363, 5, 105, 0, 0, 363, 364, 5, 101, 0, 0, 364, 365, 5, 114, 0, 0, 365, 50, 1, 0, 0, 0, 366, 367, 5, 99, 0, 0, 367, 368, 5, 111, 0, 0, 368, 369, 5, 109, 0, 0, 369, 370, 5, 109, 0, 0, 370, 371, 5, 101, 0, 0, 371, 372, 5, 110, 0, 0, 372, 373, 5, 116, 0, 0, 373, 52, 1, 0, 0, 0, 374, 375, 5, 99, 0, 0, 375, 376, 5, 111, 0, 0, 376, 377, 5, 109, 0, 0, 377, 378, 5, 112, 0, 0, 378, 379, 5, 111, 0, 0, 379, 380, 5, 115, 0, 0, 380, 381, 5, 105, 0, 0, 381, 382, 5, 116, 0, 0, 382, 383, 5, 101, 0, 0, 383, 54, 1, 0, 0, 0, 384, 385, 5, 99, 0, 0, 385, 386, 5, 111, 0, 0, 386, 387, 5, 110, 0, 0, 387, 388, 5, 106, 0, 0, 388, 389, 5, 117, 0, 0, 389, 390, 5, 103, 0, 0, 390, 391, 5, 97, 0, 0, 391, 392, 5, 116, 0, 0, 392, 393, 5, 101, 0, 0, 393, 56, 1, 0, 0, 0, 394, 395, 5, 99, 0, 0, 395, 396, 5, 111, 0, 0, 396, 397, 5, 110, 0, 0, 397, 398, 5, 106, 0, 0, 398, 399, 5, 117, 0, 0, 399, 400, 5, 103, 0, 0, 400, 401, 5, 97, 0, 0, 401, 402, 5, 116, 0, 0, 402, 403, 5, 101, 0, 0, 403, 404, 5, 115, 0, 0, 404, 58, 1, 0, 0, 0, 405, 406, 5, 99, 0, 0, 406, 407, 5, 111, 0, 0, 407, 408, 5, 110, 0, 0, 408, 409, 5, 106, 0, 0, 409, 410, 5, 117, 0, 0, 410, 411, 5, 103, 0, 0, 411, 412, 5, 97, 0, 0, 412, 413, 5, 116, 0, 0, 413, 414, 5, 105, 0, 0, 414, 415, 5, 111, 0, 0, 415, 416, 5, 110, 0, 0, 416, 60, 1, 0, 0, 0, 417, 418, 5, 99, 0, 0, 418, 419, 5, 111, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 110, 0, 0, 421, 422, 5, 101, 0, 0, 422, 423, 5, 99, 0, 0, 423, 424, 5, 116, 0, 0, 424, 425, 5, 111, 0, 0, 425, 426, 5, 114, 0, 0, 426, 62, 1, 0, 0, 0, 427, 428, 5, 100, 0, 0, 428, 429, 5, 97, 0, 0, 429, 430, 5, 116, 0, 0, 430, 431, 5, 97, 0, 0, 431, 432, 5, 116, 0, 0, 432, 433, 5, 121, 0, 0, 433, 434, 5, 112, 0, 0, 434, 435, 5, 101, 0, 0, 435, 64, 1, 0, 0, 0, 436, 437, 5, 100, 0, 0, 437, 438, 5, 101, 0, 0, 438, 439, 5, 102, 0, 0, 439, 440, 5, 97, 0, 0, 440, 441, 5, 117, 0, 0, 441, 442, 5, 108, 0, 0, 442, 443, 5, 116, 0, 0, 443, 66, 1, 0, 0, 0, 444, 445, 5, 100, 0, 0, 445, 446, 5, 101, 0, 0, 446, 447, 5, 112, 0, 0, 447, 448, 5, 101, 0, 0, 448, 449, 5, 110, 0, 0, 449, 450, 5, 100, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 110, 0, 0, 452, 453, 5, 99, 0, 0, 453, 454, 5, 121, 0, 0, 454, 68, 1, 0, 0, 0, 455, 456, 5, 100, 0, 0, 456, 457, 5, 101, 0, 0, 457, 458, 5, 114, 0, 0, 458, 459, 5, 105, 0, 0, 459, 460, 5, 118, 0, 0, 460, 461, 5, 101, 0, 0, 461, 462, 5, 100, 0, 0, 462, 70, 1, 0, 0, 0, 463, 464, 5, 100, 0, 0, 464, 465, 5, 105, 0, 0, 465, 466, 5, 102, 0, 0, 466, 467, 5, 102, 0, 0, 467, 468, 5, 101, 0, 0, 468, 469, 5, 114, 0, 0, 469, 470, 5, 101, 0, 0, 470, 471, 5, 110, 0, 0, 471, 472, 5, 99, 0, 0, 472, 473, 5, 101, 0, 0, 473, 474, 5, 115, 0, 0, 474, 72, 1, 0, 0, 0, 475, 476, 5, 100, 0, 0, 476, 477, 5, 105, 0, 0, 477, 478, 5, 115, 0, 0, 478, 479, 5, 106, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 105, 0, 0, 481, 482, 5, 110, 0, 0, 482, 483, 5, 105, 0, 0, 483, 484, 5, 110, 0, 0, 484, 485, 5, 103, 0, 0, 485, 74, 1, 0, 0, 0, 486, 487, 5, 100, 0, 0, 487, 488, 5, 105, 0, 0, 488, 489, 5, 115, 0, 0, 489, 490, 5, 106, 0, 0, 490, 491, 5, 111, 0, 0, 491, 492, 5, 105, 0, 0, 492, 493, 5, 110, 0, 0, 493, 494, 5, 116, 0, 0, 494, 76, 1, 0, 0, 0, 495, 496, 5, 100, 0, 0, 496, 497, 5, 111, 0, 0, 497, 498, 5, 99, 0, 0, 498, 78, 1, 0, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 108, 0, 0, 501, 502, 5, 115, 0, 0, 502, 503, 5, 101, 0, 0, 503, 80, 1, 0, 0, 0, 504, 505, 5, 69, 0, 0, 505, 506, 5, 78, 0, 0, 506, 507, 5, 68, 0, 0, 507, 82, 1, 0, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 120, 0, 0, 510, 511, 5, 112, 0, 0, 511, 512, 5, 114, 0, 0, 512, 84, 1, 0, 0, 0, 513, 514, 5, 102, 0, 0, 514, 515, 5, 97, 0, 0, 515, 516, 5, 108, 0, 0, 516, 517, 5, 115, 0, 0, 517, 518, 5, 101, 0, 0, 518, 86, 1, 0, 0, 0, 519, 520, 5, 102, 0, 0, 520, 521, 5, 101, 0, 0, 521, 522, 5, 97, 0, 0, 522, 523, 5, 116, 0, 0, 523, 524, 5, 117, 0, 0, 524, 525, 5, 114, 0, 0, 525, 526, 5, 101, 0, 0, 526, 88, 1, 0, 0, 0, 527, 528, 5, 102, 0, 0, 528, 529, 5, 101, 0, 0, 529, 530, 5, 97, 0, 0, 530, 531, 5, 116, 0, 0, 531, 532, 5, 117, 0, 0, 532, 533, 5, 114, 0, 0, 533, 534, 5, 101, 0, 0, 534, 535, 5, 100, 0, 0, 535, 90, 1, 0, 0, 0, 536, 537, 5, 102, 0, 0, 537, 538, 5, 101, 0, 0, 538, 539, 5, 97, 0, 0, 539, 540, 5, 116, 0, 0, 540, 541, 5, 117, 0, 0, 541, 542, 5, 114, 0, 0, 542, 543, 5, 105, 0, 0, 543, 544, 5, 110, 0, 0, 544, 545, 5, 103, 0, 0, 545, 92, 1, 0, 0, 0, 546, 547, 5, 102, 0, 0, 547, 548, 5, 105, 0, 0, 548, 549, 5, 108, 0, 0, 549, 550, 5, 116, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 114, 0, 0, 552, 94, 1, 0, 0, 0, 553, 554, 5, 102, 0, 0, 554, 555, 5, 105, 0, 0, 555, 556, 5, 114, 0, 0, 556, 557, 5, 115, 0, 0, 557, 558, 5, 116, 0, 0, 558, 96, 1, 0, 0, 0, 559, 560, 5, 102, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 111, 0, 0, 562, 563, 5, 119, 0, 0, 563, 98, 1, 0, 0, 0, 564, 565, 5, 102, 0, 0, 565, 566, 5, 111, 0, 0, 566, 567, 5, 114, 0, 0, 567, 100, 1, 0, 0, 0, 568, 569, 5, 102, 0, 0, 569, 570, 5, 114, 0, 0, 570, 571, 5, 111, 0, 0, 571, 572, 5, 109, 0, 0, 572, 102, 1, 0, 0, 0, 573, 574, 5, 102, 0, 0, 574, 575, 5, 117, 0, 0, 575, 576, 5, 110, 0, 0, 576, 577, 5, 99, 0, 0, 577, 578, 5, 116, 0, 0, 578, 579, 5, 105, 0, 0, 579, 580, 5, 111, 0, 0, 580, 581, 5, 110, 0, 0, 581, 104, 1, 0, 0, 0, 582, 583, 5, 104, 0, 0, 583, 584, 5, 97, 0, 0, 584, 585, 5, 115, 0, 0, 585, 586, 5, 116, 0, 0, 586, 587, 5, 121, 0, 0, 587, 588, 5, 112, 0, 0, 588, 589, 5, 101, 0, 0, 589, 106, 1, 0, 0, 0, 590, 591, 5, 105, 0, 0, 591, 592, 5, 102, 0, 0, 592, 108, 1, 0, 0, 0, 593, 594, 5, 105, 0, 0, 594, 595, 5, 110, 0, 0, 595, 596, 5, 116, 0, 0, 596, 597, 5, 101, 0, 0, 597, 598, 5, 114, 0, 0, 598, 599, 5, 115, 0, 0, 599, 600, 5, 101, 0, 0, 600, 601, 5, 99, 0, 0, 601, 602, 5, 116, 0, 0, 602, 603, 5, 115, 0, 0, 603, 110, 1, 0, 0, 0, 604, 605, 5, 105, 0, 0, 605, 606, 5, 109, 0, 0, 606, 607, 5, 112, 0, 0, 607, 608, 5, 108, 0, 0, 608, 609, 5, 105, 0, 0, 609, 610, 5, 101, 0, 0, 610, 611, 5, 115, 0, 0, 611, 112, 1, 0, 0, 0, 612, 613, 5, 105, 0, 0, 613, 614, 5, 109, 0, 0, 614, 615, 5, 112, 0, 0, 615, 616, 5, 111, 0, 0, 616, 617, 5, 114, 0, 0, 617, 618, 5, 116, 0, 0, 618, 114, 1, 0, 0, 0, 619, 620, 5, 105, 0, 0, 620, 621, 5, 110, 0, 0, 621, 116, 1, 0, 0, 0, 622, 623, 5, 105, 0, 0, 623, 624, 5, 110, 0, 0, 624, 625, 5, 111, 0, 0, 625, 626, 5, 117, 0, 0, 626, 627, 5, 116, 0, 0, 627, 118, 1, 0, 0, 0, 628, 629, 5, 105, 0, 0, 629, 630, 5, 110, 0, 0, 630, 631, 5, 116, 0, 0, 631, 632, 5, 101, 0, 0, 632, 633, 5, 114, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 99, 0, 0, 635, 636, 5, 116, 0, 0, 636, 637, 5, 105, 0, 0, 637, 638, 5, 111, 0, 0, 638, 639, 5, 110, 0, 0, 639, 120, 1, 0, 0, 0, 640, 641, 5, 105, 0, 0, 641, 642, 5, 110, 0, 0, 642, 643, 5, 118, 0, 0, 643, 122, 1, 0, 0, 0, 644, 645, 5, 105, 0, 0, 645, 646, 5, 110, 0, 0, 646, 647, 5, 118, 0, 0, 647, 648, 5, 101, 0, 0, 648, 649, 5, 114, 0, 0, 649, 650, 5, 115, 0, 0, 650, 651, 5, 101, 0, 0, 651, 124, 1, 0, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 110, 0, 0, 654, 655, 5, 118, 0, 0, 655, 656, 5, 101, 0, 0, 656, 657, 5, 114, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 103, 0, 0, 661, 126, 1, 0, 0, 0, 662, 663, 5, 105, 0, 0, 663, 664, 5, 115, 0, 0, 664, 665, 5, 116, 0, 0, 665, 666, 5, 121, 0, 0, 666, 667, 5, 112, 0, 0, 667, 668, 5, 101, 0, 0, 668, 128, 1, 0, 0, 0, 669, 670, 5, 108, 0, 0, 670, 671, 5, 97, 0, 0, 671, 672, 5, 110, 0, 0, 672, 673, 5, 103, 0, 0, 673, 674, 5, 117, 0, 0, 674, 675, 5, 97, 0, 0, 675, 676, 5, 103, 0, 0, 676, 677, 5, 101, 0, 0, 677, 130, 1, 0, 0, 0, 678, 679, 5, 109, 0, 0, 679, 680, 5, 101, 0, 0, 680, 681, 5, 109, 0, 0, 681, 682, 5, 98, 0, 0, 682, 683, 5, 101, 0, 0, 683, 684, 5, 114, 0, 0, 684, 132, 1, 0, 0, 0, 685, 686, 5, 109, 0, 0, 686, 687, 5, 101, 0, 0, 687, 688, 5, 116, 0, 0, 688, 689, 5, 97, 0, 0, 689, 690, 5, 99, 0, 0, 690, 691, 5, 108, 0, 0, 691, 692, 5, 97, 0, 0, 692, 693, 5, 115, 0, 0, 693, 694, 5, 115, 0, 0, 694, 134, 1, 0, 0, 0, 695, 696, 5, 109, 0, 0, 696, 697, 5, 101, 0, 0, 697, 698, 5, 116, 0, 0, 698, 699, 5, 97, 0, 0, 699, 700, 5, 100, 0, 0, 700, 701, 5, 97, 0, 0, 701, 702, 5, 116, 0, 0, 702, 703, 5, 97, 0, 0, 703, 136, 1, 0, 0, 0, 704, 705, 5, 109, 0, 0, 705, 706, 5, 117, 0, 0, 706, 707, 5, 108, 0, 0, 707, 708, 5, 116, 0, 0, 708, 709, 5, 105, 0, 0, 709, 710, 5, 112, 0, 0, 710, 711, 5, 108, 0, 0, 711, 712, 5, 105, 0, 0, 712, 713, 5, 99, 0, 0, 713, 714, 5, 105, 0, 0, 714, 715, 5, 116, 0, 0, 715, 716, 5, 121, 0, 0, 716, 138, 1, 0, 0, 0, 717, 718, 5, 110, 0, 0, 718, 719, 5, 97, 0, 0, 719, 720, 5, 109, 0, 0, 720, 721, 5, 101, 0, 0, 721, 722, 5, 115, 0, 0, 722, 723, 5, 112, 0, 0, 723, 724, 5, 97, 0, 0, 724, 725, 5, 99, 0, 0, 725, 726, 5, 101, 0, 0, 726, 140, 1, 0, 0, 0, 727, 728, 5, 110, 0, 0, 728, 729, 5, 111, 0, 0, 729, 730, 5, 110, 0, 0, 730, 731, 5, 117, 0, 0, 731, 732, 5, 110, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 113, 0, 0, 734, 735, 5, 117, 0, 0, 735, 736, 5, 101, 0, 0, 736, 142, 1, 0, 0, 0, 737, 738, 5, 110, 0, 0, 738, 739, 5, 111, 0, 0, 739, 740, 5, 116, 0, 0, 740, 144, 1, 0, 0, 0, 741, 742, 5, 110, 0, 0, 742, 743, 5, 117, 0, 0, 743, 744, 5, 108, 0, 0, 744, 745, 5, 108, 0, 0, 745, 146, 1, 0, 0, 0, 746, 747, 5, 111, 0, 0, 747, 748, 5, 102, 0, 0, 748, 148, 1, 0, 0, 0, 749, 750, 5, 111, 0, 0, 750, 751, 5, 114, 0, 0, 751, 150, 1, 0, 0, 0, 752, 753, 5, 111, 0, 0, 753, 754, 5, 114, 0, 0, 754, 755, 5, 100, 0, 0, 755, 756, 5, 101, 0, 0, 756, 757, 5, 114, 0, 0, 757, 758, 5, 101, 0, 0, 758, 759, 5, 100, 0, 0, 759, 152, 1, 0, 0, 0, 760, 761, 5, 111, 0, 0, 761, 762, 5, 117, 0, 0, 762, 763, 5, 116, 0, 0, 763, 154, 1, 0, 0, 0, 764, 765, 5, 112, 0, 0, 765, 766, 5, 97, 0, 0, 766, 767, 5, 99, 0, 0, 767, 768, 5, 107, 0, 0, 768, 769, 5, 97, 0, 0, 769, 770, 5, 103, 0, 0, 770, 771, 5, 101, 0, 0, 771, 156, 1, 0, 0, 0, 772, 773, 5, 112, 0, 0, 773, 774, 5, 111, 0, 0, 774, 775, 5, 114, 0, 0, 775, 776, 5, 116, 0, 0, 776, 777, 5, 105, 0, 0, 777, 778, 5, 111, 0, 0, 778, 779, 5, 110, 0, 0, 779, 158, 1, 0, 0, 0, 780, 781, 5, 112, 0, 0, 781, 782, 5, 114, 0, 0, 782, 783, 5, 101, 0, 0, 783, 784, 5, 100, 0, 0, 784, 785, 5, 105, 0, 0, 785, 786, 5, 99, 0, 0, 786, 787, 5, 97, 0, 0, 787, 788, 5, 116, 0, 0, 788, 789, 5, 101, 0, 0, 789, 160, 1, 0, 0, 0, 790, 791, 5, 112, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 105, 0, 0, 793, 794, 5, 118, 0, 0, 794, 795, 5, 97, 0, 0, 795, 796, 5, 116, 0, 0, 796, 797, 5, 101, 0, 0, 797, 162, 1, 0, 0, 0, 798, 799, 5, 112, 0, 0, 799, 800, 5, 114, 0, 0, 800, 801, 5, 111, 0, 0, 801, 802, 5, 116, 0, 0, 802, 803, 5, 101, 0, 0, 803, 804, 5, 99, 0, 0, 804, 805, 5, 116, 0, 0, 805, 806, 5, 101, 0, 0, 806, 807, 5, 100, 0, 0, 807, 164, 1, 0, 0, 0, 808, 809, 5, 112, 0, 0, 809, 810, 5, 117, 0, 0, 810, 811, 5, 98, 0, 0, 811, 812, 5, 108, 0, 0, 812, 813, 5, 105, 0, 0, 813, 814, 5, 99, 0, 0, 814, 166, 1, 0, 0, 0, 815, 816, 5, 114, 0, 0, 816, 817, 5, 101, 0, 0, 817, 818, 5, 97, 0, 0, 818, 819, 5, 100, 0, 0, 819, 820, 5, 111, 0, 0, 820, 821, 5, 110, 0, 0, 821, 822, 5, 108, 0, 0, 822, 823, 5, 121, 0, 0, 823, 168, 1, 0, 0, 0, 824, 825, 5, 114, 0, 0, 825, 826, 5, 101, 0, 0, 826, 827, 5, 100, 0, 0, 827, 828, 5, 101, 0, 0, 828, 829, 5, 102, 0, 0, 829, 830, 5, 105, 0, 0, 830, 831, 5, 110, 0, 0, 831, 832, 5, 101, 0, 0, 832, 833, 5, 115, 0, 0, 833, 170, 1, 0, 0, 0, 834, 835, 5, 114, 0, 0, 835, 836, 5, 101, 0, 0, 836, 837, 5, 100, 0, 0, 837, 838, 5, 101, 0, 0, 838, 839, 5, 102, 0, 0, 839, 840, 5, 105, 0, 0, 840, 841, 5, 110, 0, 0, 841, 842, 5, 105, 0, 0, 842, 843, 5, 116, 0, 0, 843, 844, 5, 105, 0, 0, 844, 845, 5, 111, 0, 0, 845, 846, 5, 110, 0, 0, 846, 172, 1, 0, 0, 0, 847, 848, 5, 114, 0, 0, 848, 849, 5, 101, 0, 0, 849, 850, 5, 102, 0, 0, 850, 851, 5, 101, 0, 0, 851, 852, 5, 114, 0, 0, 852, 853, 5, 101, 0, 0, 853, 854, 5, 110, 0, 0, 854, 855, 5, 99, 0, 0, 855, 856, 5, 101, 0, 0, 856, 857, 5, 115, 0, 0, 857, 174, 1, 0, 0, 0, 858, 859, 5, 114, 0, 0, 859, 860, 5, 101, 0, 0, 860, 861, 5, 112, 0, 0, 861, 176, 1, 0, 0, 0, 862, 863, 5, 114, 0, 0, 863, 864, 5, 101, 0, 0, 864, 865, 5, 116, 0, 0, 865, 866, 5, 117, 0, 0, 866, 867, 5, 114, 0, 0, 867, 868, 5, 110, 0, 0, 868, 178, 1, 0, 0, 0, 869, 870, 5, 115, 0, 0, 870, 871, 5, 112, 0, 0, 871, 872, 5, 101, 0, 0, 872, 873, 5, 99, 0, 0, 873, 874, 5, 105, 0, 0, 874, 875, 5, 97, 0, 0, 875, 876, 5, 108, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 122, 0, 0, 878, 879, 5, 97, 0, 0, 879, 880, 5, 116, 0, 0, 880, 881, 5, 105, 0, 0, 881, 882, 5, 111, 0, 0, 882, 883, 5, 110, 0, 0, 883, 180, 1, 0, 0, 0, 884, 885, 5, 115, 0, 0, 885, 886, 5, 112, 0, 0, 886, 887, 5, 101, 0, 0, 887, 888, 5, 99, 0, 0, 888, 889, 5, 105, 0, 0, 889, 890, 5, 97, 0, 0, 890, 891, 5, 108, 0, 0, 891, 892, 5, 105, 0, 0, 892, 893, 5, 122, 0, 0, 893, 894, 5, 101, 0, 0, 894, 895, 5, 115, 0, 0, 895, 182, 1, 0, 0, 0, 896, 897, 5, 115, 0, 0, 897, 898, 5, 116, 0, 0, 898, 899, 5, 101, 0, 0, 899, 900, 5, 112, 0, 0, 900, 184, 1, 0, 0, 0, 901, 902, 5, 115, 0, 0, 902, 903, 5, 116, 0, 0, 903, 904, 5, 114, 0, 0, 904, 905, 5, 117, 0, 0, 905, 906, 5, 99, 0, 0, 906, 907, 5, 116, 0, 0, 907, 186, 1, 0, 0, 0, 908, 909, 5, 115, 0, 0, 909, 910, 5, 117, 0, 0, 910, 911, 5, 98, 0, 0, 911, 912, 5, 99, 0, 0, 912, 913, 5, 108, 0, 0, 913, 914, 5, 97, 0, 0, 914, 915, 5, 115, 0, 0, 915, 916, 5, 115, 0, 0, 916, 917, 5, 105, 0, 0, 917, 918, 5, 102, 0, 0, 918, 919, 5, 105, 0, 0, 919, 920, 5, 101, 0, 0, 920, 921, 5, 114, 0, 0, 921, 188, 1, 0, 0, 0, 922, 923, 5, 115, 0, 0, 923, 924, 5, 117, 0, 0, 924, 925, 5, 98, 0, 0, 925, 926, 5, 115, 0, 0, 926, 927, 5, 101, 0, 0, 927, 928, 5, 116, 0, 0, 928, 190, 1, 0, 0, 0, 929, 930, 5, 115, 0, 0, 930, 931, 5, 117, 0, 0, 931, 932, 5, 98, 0, 0, 932, 933, 5, 115, 0, 0, 933, 934, 5, 101, 0, 0, 934, 935, 5, 116, 0, 0, 935, 936, 5, 115, 0, 0, 936, 192, 1, 0, 0, 0, 937, 938, 5, 115, 0, 0, 938, 939, 5, 117, 0, 0, 939, 940, 5, 98, 0, 0, 940, 941, 5, 116, 0, 0, 941, 942, 5, 121, 0, 0, 942, 943, 5, 112, 0, 0, 943, 944, 5, 101, 0, 0, 944, 194, 1, 0, 0, 0, 945, 946, 5, 115, 0, 0, 946, 947, 5, 117, 0, 0, 947, 948, 5, 99, 0, 0, 948, 949, 5, 99, 0, 0, 949, 950, 5, 101, 0, 0, 950, 951, 5, 115, 0, 0, 951, 952, 5, 115, 0, 0, 952, 953, 5, 105, 0, 0, 953, 954, 5, 111, 0, 0, 954, 955, 5, 110, 0, 0, 955, 196, 1, 0, 0, 0, 956, 957, 5, 116, 0, 0, 957, 958, 5, 104, 0, 0, 958, 959, 5, 101, 0, 0, 959, 960, 5, 110, 0, 0, 960, 198, 1, 0, 0, 0, 961, 962, 5, 116, 0, 0, 962, 963, 5, 111, 0, 0, 963, 200, 1, 0, 0, 0, 964, 965, 5, 116, 0, 0, 965, 966, 5, 114, 0, 0, 966, 967, 5, 117, 0, 0, 967, 968, 5, 101, 0, 0, 968, 202, 1, 0, 0, 0, 969, 970, 5, 116, 0, 0, 970, 971, 5, 121, 0, 0, 971, 972, 5, 112, 0, 0, 972, 973, 5, 101, 0, 0, 973, 204, 1, 0, 0, 0, 974, 975, 5, 116, 0, 0, 975, 976, 5, 121, 0, 0, 976, 977, 5, 112, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 100, 0, 0, 979, 206, 1, 0, 0, 0, 980, 981, 5, 116, 0, 0, 981, 982, 5, 121, 0, 0, 982, 983, 5, 112, 0, 0, 983, 984, 5, 105, 0, 0, 984, 985, 5, 110, 0, 0, 985, 986, 5, 103, 0, 0, 986, 208, 1, 0, 0, 0, 987, 988, 5, 117, 0, 0, 988, 989, 5, 110, 0, 0, 989, 990, 5, 105, 0, 0, 990, 991, 5, 111, 0, 0, 991, 992, 5, 110, 0, 0, 992, 993, 5, 115, 0, 0, 993, 210, 1, 0, 0, 0, 994, 995, 5, 120, 0, 0, 995, 996, 5, 111, 0, 0, 996, 997, 5, 114, 0, 0, 997, 212, 1, 0, 0, 0, 11, 0, 223, 230, 235, 241, 246, 248, 257, 260, 265, 267, 1, 6, 0, 0]
\ No newline at end of file
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.java
new file mode 100644
index 0000000..492b77d
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.java
@@ -0,0 +1,762 @@
+// Generated from DirectEdit.g4 by ANTLR 4.10.1
+
+/*******************************************************************************
+ * Copyright (c) 2023 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.directedit.grammars.generated;
+
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class DirectEditLexer extends Lexer {
+ static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); }
+
+ protected static final DFA[] _decisionToDFA;
+ protected static final PredictionContextCache _sharedContextCache =
+ new PredictionContextCache();
+ public static final int
+ T__0=1, T__1=2, T__2=3, WS=4, Integer=5, Real=6, String=7, Ident=8, ABOUT=9,
+ ABSTRACT=10, ALIAS=11, ALL=12, AND=13, AS=14, ASSIGN=15, ASSOC=16, BEAHVIOR=17,
+ BINDING=18, BOOL=19, BY=20, CHAINS=21, CLASS=22, CLASSIFIER=23, COMMENT=24,
+ COMPOSITE=25, CONJUGATE=26, CONJUGATES=27, CONJUGATION=28, CONNECTOR=29,
+ DATATYPE=30, DEFAULT=31, DEPENDENCY=32, DERIVED=33, DIFFERENCES=34, DISJOINING=35,
+ DISJOINT=36, DOC=37, ELSE=38, END=39, EXPR=40, FALSE=41, FEATURE=42, FEATURED=43,
+ FEATURING=44, FILTER=45, FIRST=46, FLOW=47, FOR=48, FROM=49, FUNCTION=50,
+ HASTYPE=51, IF=52, INTERSECTS=53, IMPLIES=54, IMPORT=55, IN=56, INPUT=57,
+ INTERACTION=58, INV=59, INVERSE=60, INVERTING=61, ISTYPE=62, LANGUAGE=63,
+ MEMBER=64, METACLASS=65, METADATA=66, MULTIPLICITY=67, NAMESPACE=68, NONUNIQUE=69,
+ NOT=70, NULL=71, OF=72, OR=73, ORDERED=74, OUT=75, PACKAGE=76, PORTION=77,
+ PREDICATE=78, PRIAVTE=79, PROTECTED=80, PUBLIC=81, READONLY=82, REDEFINES=83,
+ REDEFINITION=84, RFERENCES=85, REP=86, RETURN=87, SPECIALIZTION=88, SPECIALIZES=89,
+ STEP=90, STRCUT=91, SUBCLASSIFIER=92, SUBSET=93, SUBSETS=94, SUBTYPE=95,
+ SUCCESSION=96, THEN=97, TO=98, TRUE=99, TYPE=100, TYPED=101, TYPING=102,
+ UNIONS=103, XOR=104;
+ public static String[] channelNames = {
+ "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
+ };
+
+ public static String[] modeNames = {
+ "DEFAULT_MODE"
+ };
+
+ private static String[] makeRuleNames() {
+ return new String[] {
+ "T__0", "T__1", "T__2", "WS", "Integer", "Real", "String", "Escape",
+ "Ident", "Letter", "ABOUT", "ABSTRACT", "ALIAS", "ALL", "AND", "AS",
+ "ASSIGN", "ASSOC", "BEAHVIOR", "BINDING", "BOOL", "BY", "CHAINS", "CLASS",
+ "CLASSIFIER", "COMMENT", "COMPOSITE", "CONJUGATE", "CONJUGATES", "CONJUGATION",
+ "CONNECTOR", "DATATYPE", "DEFAULT", "DEPENDENCY", "DERIVED", "DIFFERENCES",
+ "DISJOINING", "DISJOINT", "DOC", "ELSE", "END", "EXPR", "FALSE", "FEATURE",
+ "FEATURED", "FEATURING", "FILTER", "FIRST", "FLOW", "FOR", "FROM", "FUNCTION",
+ "HASTYPE", "IF", "INTERSECTS", "IMPLIES", "IMPORT", "IN", "INPUT", "INTERACTION",
+ "INV", "INVERSE", "INVERTING", "ISTYPE", "LANGUAGE", "MEMBER", "METACLASS",
+ "METADATA", "MULTIPLICITY", "NAMESPACE", "NONUNIQUE", "NOT", "NULL",
+ "OF", "OR", "ORDERED", "OUT", "PACKAGE", "PORTION", "PREDICATE", "PRIAVTE",
+ "PROTECTED", "PUBLIC", "READONLY", "REDEFINES", "REDEFINITION", "RFERENCES",
+ "REP", "RETURN", "SPECIALIZTION", "SPECIALIZES", "STEP", "STRCUT", "SUBCLASSIFIER",
+ "SUBSET", "SUBSETS", "SUBTYPE", "SUCCESSION", "THEN", "TO", "TRUE", "TYPE",
+ "TYPED", "TYPING", "UNIONS", "XOR"
+ };
+ }
+ public static final String[] ruleNames = makeRuleNames();
+
+ private static String[] makeLiteralNames() {
+ return new String[] {
+ null, "':'", "'='", "'.*'", null, null, null, null, null, "'about'",
+ "'abstract'", "'alias'", "'all'", "'and'", "'as'", "'assign'", "'assoc'",
+ "'behavior'", "'binding'", "'bool'", "'by'", "'chains'", "'class'", "'classifier'",
+ "'comment'", "'composite'", "'conjugate'", "'conjugates'", "'conjugation'",
+ "'connector'", "'datatype'", "'default'", "'dependency'", "'derived'",
+ "'differences'", "'disjoining'", "'disjoint'", "'doc'", "'else'", "'END'",
+ "'expr'", "'false'", "'feature'", "'featured'", "'featuring'", "'filter'",
+ "'first'", "'flow'", "'for'", "'from'", "'function'", "'hastype'", "'if'",
+ "'intersects'", "'implies'", "'import'", "'in'", "'inout'", "'interaction'",
+ "'inv'", "'inverse'", "'inverting'", "'istype'", "'language'", "'member'",
+ "'metaclass'", "'metadata'", "'multiplicity'", "'namespace'", "'nonunique'",
+ "'not'", "'null'", "'of'", "'or'", "'ordered'", "'out'", "'package'",
+ "'portion'", "'predicate'", "'private'", "'protected'", "'public'", "'readonly'",
+ "'redefines'", "'redefinition'", "'references'", "'rep'", "'return'",
+ "'specialization'", "'specializes'", "'step'", "'struct'", "'subclassifier'",
+ "'subset'", "'subsets'", "'subtype'", "'succession'", "'then'", "'to'",
+ "'true'", "'type'", "'typed'", "'typing'", "'unions'", "'xor'"
+ };
+ }
+ private static final String[] _LITERAL_NAMES = makeLiteralNames();
+ private static String[] makeSymbolicNames() {
+ return new String[] {
+ null, null, null, null, "WS", "Integer", "Real", "String", "Ident", "ABOUT",
+ "ABSTRACT", "ALIAS", "ALL", "AND", "AS", "ASSIGN", "ASSOC", "BEAHVIOR",
+ "BINDING", "BOOL", "BY", "CHAINS", "CLASS", "CLASSIFIER", "COMMENT",
+ "COMPOSITE", "CONJUGATE", "CONJUGATES", "CONJUGATION", "CONNECTOR", "DATATYPE",
+ "DEFAULT", "DEPENDENCY", "DERIVED", "DIFFERENCES", "DISJOINING", "DISJOINT",
+ "DOC", "ELSE", "END", "EXPR", "FALSE", "FEATURE", "FEATURED", "FEATURING",
+ "FILTER", "FIRST", "FLOW", "FOR", "FROM", "FUNCTION", "HASTYPE", "IF",
+ "INTERSECTS", "IMPLIES", "IMPORT", "IN", "INPUT", "INTERACTION", "INV",
+ "INVERSE", "INVERTING", "ISTYPE", "LANGUAGE", "MEMBER", "METACLASS",
+ "METADATA", "MULTIPLICITY", "NAMESPACE", "NONUNIQUE", "NOT", "NULL",
+ "OF", "OR", "ORDERED", "OUT", "PACKAGE", "PORTION", "PREDICATE", "PRIAVTE",
+ "PROTECTED", "PUBLIC", "READONLY", "REDEFINES", "REDEFINITION", "RFERENCES",
+ "REP", "RETURN", "SPECIALIZTION", "SPECIALIZES", "STEP", "STRCUT", "SUBCLASSIFIER",
+ "SUBSET", "SUBSETS", "SUBTYPE", "SUCCESSION", "THEN", "TO", "TRUE", "TYPE",
+ "TYPED", "TYPING", "UNIONS", "XOR"
+ };
+ }
+ private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+ public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+ /**
+ * @deprecated Use {@link #VOCABULARY} instead.
+ */
+ @Deprecated
+ public static final String[] tokenNames;
+ static {
+ tokenNames = new String[_SYMBOLIC_NAMES.length];
+ for (int i = 0; i < tokenNames.length; i++) {
+ tokenNames[i] = VOCABULARY.getLiteralName(i);
+ if (tokenNames[i] == null) {
+ tokenNames[i] = VOCABULARY.getSymbolicName(i);
+ }
+
+ if (tokenNames[i] == null) {
+ tokenNames[i] = "";
+ }
+ }
+ }
+
+ @Override
+ @Deprecated
+ public String[] getTokenNames() {
+ return tokenNames;
+ }
+
+ @Override
+
+ public Vocabulary getVocabulary() {
+ return VOCABULARY;
+ }
+
+
+ public DirectEditLexer(CharStream input) {
+ super(input);
+ _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+ }
+
+ @Override
+ public String getGrammarFileName() { return "DirectEdit.g4"; }
+
+ @Override
+ public String[] getRuleNames() { return ruleNames; }
+
+ @Override
+ public String getSerializedATN() { return _serializedATN; }
+
+ @Override
+ public String[] getChannelNames() { return channelNames; }
+
+ @Override
+ public String[] getModeNames() { return modeNames; }
+
+ @Override
+ public ATN getATN() { return _ATN; }
+
+ public static final String _serializedATN =
+ "\u0004\u0000h\u03e6\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+
+ "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+
+ "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+
+ "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+
+ "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+
+ "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+
+ "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+
+ "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+
+ "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+
+ "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+
+ "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+
+ "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+
+ "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+
+ "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+
+ "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+
+ "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+
+ ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+
+ "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+
+ "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+
+ "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+
+ "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+
+ "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+
+ "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+
+ "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+
+ "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+
+ "g\u0002h\u0007h\u0002i\u0007i\u0001\u0000\u0001\u0000\u0001\u0001\u0001"+
+ "\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0004\u0003\u00de"+
+ "\b\u0003\u000b\u0003\f\u0003\u00df\u0001\u0003\u0001\u0003\u0001\u0004"+
+ "\u0004\u0004\u00e5\b\u0004\u000b\u0004\f\u0004\u00e6\u0001\u0005\u0004"+
+ "\u0005\u00ea\b\u0005\u000b\u0005\f\u0005\u00eb\u0001\u0005\u0001\u0005"+
+ "\u0004\u0005\u00f0\b\u0005\u000b\u0005\f\u0005\u00f1\u0001\u0006\u0001"+
+ "\u0006\u0001\u0006\u0005\u0006\u00f7\b\u0006\n\u0006\f\u0006\u00fa\t\u0006"+
+ "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+
+ "\u0003\u0007\u0102\b\u0007\u0001\b\u0003\b\u0105\b\b\u0001\b\u0001\b\u0001"+
+ "\b\u0005\b\u010a\b\b\n\b\f\b\u010d\t\b\u0001\t\u0001\t\u0001\n\u0001\n"+
+ "\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+
+ "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+
+ "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001"+
+ "\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+
+ "\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+
+ "\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+
+ "\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+
+ "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+
+ "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+
+ "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+
+ "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+
+ "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017"+
+ "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+
+ "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+
+ "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+
+ "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+
+ "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+
+ "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b"+
+ "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+
+ "\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+
+ "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+
+ "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+
+ "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+
+ "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+
+ "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+
+ "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+
+ "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+
+ "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+
+ "!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+
+ "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+
+ "#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+
+ "$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+
+ "%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+
+ "\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+
+ "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001"+
+ "+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+
+ ",\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+
+ "-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+
+ "/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+
+ "0\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u0001"+
+ "3\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00014\u0001"+
+ "4\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u0001"+
+ "6\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+
+ "6\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00018\u0001"+
+ "8\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001:\u0001"+
+ ":\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001"+
+ ";\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001"+
+ "<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001"+
+ ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001"+
+ "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+
+ "@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+
+ "A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+
+ "B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+
+ "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+
+ "D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+
+ "E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+
+ "F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001"+
+ "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001K\u0001"+
+ "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001"+
+ "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+
+ "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+
+ "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001"+
+ "P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+
+ "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+
+ "R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+
+ "S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+
+ "T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+
+ "U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+
+ "V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+
+ "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+
+ "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+
+ "Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
+ "Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+
+ "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]"+
+ "\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+
+ "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001"+
+ "_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+
+ "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+
+ "a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001b\u0001c\u0001"+
+ "c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+
+ "e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001"+
+ "g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+
+ "h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001\u00f8\u0000j\u0001\u0001\u0003"+
+ "\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\u0000"+
+ "\u0011\b\u0013\u0000\u0015\t\u0017\n\u0019\u000b\u001b\f\u001d\r\u001f"+
+ "\u000e!\u000f#\u0010%\u0011\'\u0012)\u0013+\u0014-\u0015/\u00161\u0017"+
+ "3\u00185\u00197\u001a9\u001b;\u001c=\u001d?\u001eA\u001fC E!G\"I#K$M%"+
+ "O&Q\'S(U)W*Y+[,]-_.a/c0e1g2i3k4m5o6q7s8u9w:y;{<}=\u007f>\u0081?\u0083"+
+ "@\u0085A\u0087B\u0089C\u008bD\u008dE\u008fF\u0091G\u0093H\u0095I\u0097"+
+ "J\u0099K\u009bL\u009dM\u009fN\u00a1O\u00a3P\u00a5Q\u00a7R\u00a9S\u00ab"+
+ "T\u00adU\u00afV\u00b1W\u00b3X\u00b5Y\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf"+
+ "^\u00c1_\u00c3`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cff\u00d1g\u00d3"+
+ "h\u0001\u0000\u0004\u0003\u0000\t\n\f\r \u0001\u000009\u0002\u000009"+
+ "__\u0002\u0000AZaz\u03ed\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003"+
+ "\u0001\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007"+
+ "\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001"+
+ "\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000"+
+ "\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000"+
+ "\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000"+
+ "\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000"+
+ "\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000"+
+ "\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000"+
+ ")\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001"+
+ "\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000"+
+ "\u0000\u00003\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u0000"+
+ "7\u0001\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001"+
+ "\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?\u0001\u0000\u0000"+
+ "\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000\u0000"+
+ "E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0000I\u0001"+
+ "\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000\u0000M\u0001\u0000\u0000"+
+ "\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q\u0001\u0000\u0000\u0000\u0000"+
+ "S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000\u0000\u0000\u0000W\u0001"+
+ "\u0000\u0000\u0000\u0000Y\u0001\u0000\u0000\u0000\u0000[\u0001\u0000\u0000"+
+ "\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_\u0001\u0000\u0000\u0000\u0000"+
+ "a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000\u0000\u0000\u0000e\u0001"+
+ "\u0000\u0000\u0000\u0000g\u0001\u0000\u0000\u0000\u0000i\u0001\u0000\u0000"+
+ "\u0000\u0000k\u0001\u0000\u0000\u0000\u0000m\u0001\u0000\u0000\u0000\u0000"+
+ "o\u0001\u0000\u0000\u0000\u0000q\u0001\u0000\u0000\u0000\u0000s\u0001"+
+ "\u0000\u0000\u0000\u0000u\u0001\u0000\u0000\u0000\u0000w\u0001\u0000\u0000"+
+ "\u0000\u0000y\u0001\u0000\u0000\u0000\u0000{\u0001\u0000\u0000\u0000\u0000"+
+ "}\u0001\u0000\u0000\u0000\u0000\u007f\u0001\u0000\u0000\u0000\u0000\u0081"+
+ "\u0001\u0000\u0000\u0000\u0000\u0083\u0001\u0000\u0000\u0000\u0000\u0085"+
+ "\u0001\u0000\u0000\u0000\u0000\u0087\u0001\u0000\u0000\u0000\u0000\u0089"+
+ "\u0001\u0000\u0000\u0000\u0000\u008b\u0001\u0000\u0000\u0000\u0000\u008d"+
+ "\u0001\u0000\u0000\u0000\u0000\u008f\u0001\u0000\u0000\u0000\u0000\u0091"+
+ "\u0001\u0000\u0000\u0000\u0000\u0093\u0001\u0000\u0000\u0000\u0000\u0095"+
+ "\u0001\u0000\u0000\u0000\u0000\u0097\u0001\u0000\u0000\u0000\u0000\u0099"+
+ "\u0001\u0000\u0000\u0000\u0000\u009b\u0001\u0000\u0000\u0000\u0000\u009d"+
+ "\u0001\u0000\u0000\u0000\u0000\u009f\u0001\u0000\u0000\u0000\u0000\u00a1"+
+ "\u0001\u0000\u0000\u0000\u0000\u00a3\u0001\u0000\u0000\u0000\u0000\u00a5"+
+ "\u0001\u0000\u0000\u0000\u0000\u00a7\u0001\u0000\u0000\u0000\u0000\u00a9"+
+ "\u0001\u0000\u0000\u0000\u0000\u00ab\u0001\u0000\u0000\u0000\u0000\u00ad"+
+ "\u0001\u0000\u0000\u0000\u0000\u00af\u0001\u0000\u0000\u0000\u0000\u00b1"+
+ "\u0001\u0000\u0000\u0000\u0000\u00b3\u0001\u0000\u0000\u0000\u0000\u00b5"+
+ "\u0001\u0000\u0000\u0000\u0000\u00b7\u0001\u0000\u0000\u0000\u0000\u00b9"+
+ "\u0001\u0000\u0000\u0000\u0000\u00bb\u0001\u0000\u0000\u0000\u0000\u00bd"+
+ "\u0001\u0000\u0000\u0000\u0000\u00bf\u0001\u0000\u0000\u0000\u0000\u00c1"+
+ "\u0001\u0000\u0000\u0000\u0000\u00c3\u0001\u0000\u0000\u0000\u0000\u00c5"+
+ "\u0001\u0000\u0000\u0000\u0000\u00c7\u0001\u0000\u0000\u0000\u0000\u00c9"+
+ "\u0001\u0000\u0000\u0000\u0000\u00cb\u0001\u0000\u0000\u0000\u0000\u00cd"+
+ "\u0001\u0000\u0000\u0000\u0000\u00cf\u0001\u0000\u0000\u0000\u0000\u00d1"+
+ "\u0001\u0000\u0000\u0000\u0000\u00d3\u0001\u0000\u0000\u0000\u0001\u00d5"+
+ "\u0001\u0000\u0000\u0000\u0003\u00d7\u0001\u0000\u0000\u0000\u0005\u00d9"+
+ "\u0001\u0000\u0000\u0000\u0007\u00dd\u0001\u0000\u0000\u0000\t\u00e4\u0001"+
+ "\u0000\u0000\u0000\u000b\u00e9\u0001\u0000\u0000\u0000\r\u00f3\u0001\u0000"+
+ "\u0000\u0000\u000f\u0101\u0001\u0000\u0000\u0000\u0011\u0104\u0001\u0000"+
+ "\u0000\u0000\u0013\u010e\u0001\u0000\u0000\u0000\u0015\u0110\u0001\u0000"+
+ "\u0000\u0000\u0017\u0116\u0001\u0000\u0000\u0000\u0019\u011f\u0001\u0000"+
+ "\u0000\u0000\u001b\u0125\u0001\u0000\u0000\u0000\u001d\u0129\u0001\u0000"+
+ "\u0000\u0000\u001f\u012d\u0001\u0000\u0000\u0000!\u0130\u0001\u0000\u0000"+
+ "\u0000#\u0137\u0001\u0000\u0000\u0000%\u013d\u0001\u0000\u0000\u0000\'"+
+ "\u0146\u0001\u0000\u0000\u0000)\u014e\u0001\u0000\u0000\u0000+\u0153\u0001"+
+ "\u0000\u0000\u0000-\u0156\u0001\u0000\u0000\u0000/\u015d\u0001\u0000\u0000"+
+ "\u00001\u0163\u0001\u0000\u0000\u00003\u016e\u0001\u0000\u0000\u00005"+
+ "\u0176\u0001\u0000\u0000\u00007\u0180\u0001\u0000\u0000\u00009\u018a\u0001"+
+ "\u0000\u0000\u0000;\u0195\u0001\u0000\u0000\u0000=\u01a1\u0001\u0000\u0000"+
+ "\u0000?\u01ab\u0001\u0000\u0000\u0000A\u01b4\u0001\u0000\u0000\u0000C"+
+ "\u01bc\u0001\u0000\u0000\u0000E\u01c7\u0001\u0000\u0000\u0000G\u01cf\u0001"+
+ "\u0000\u0000\u0000I\u01db\u0001\u0000\u0000\u0000K\u01e6\u0001\u0000\u0000"+
+ "\u0000M\u01ef\u0001\u0000\u0000\u0000O\u01f3\u0001\u0000\u0000\u0000Q"+
+ "\u01f8\u0001\u0000\u0000\u0000S\u01fc\u0001\u0000\u0000\u0000U\u0201\u0001"+
+ "\u0000\u0000\u0000W\u0207\u0001\u0000\u0000\u0000Y\u020f\u0001\u0000\u0000"+
+ "\u0000[\u0218\u0001\u0000\u0000\u0000]\u0222\u0001\u0000\u0000\u0000_"+
+ "\u0229\u0001\u0000\u0000\u0000a\u022f\u0001\u0000\u0000\u0000c\u0234\u0001"+
+ "\u0000\u0000\u0000e\u0238\u0001\u0000\u0000\u0000g\u023d\u0001\u0000\u0000"+
+ "\u0000i\u0246\u0001\u0000\u0000\u0000k\u024e\u0001\u0000\u0000\u0000m"+
+ "\u0251\u0001\u0000\u0000\u0000o\u025c\u0001\u0000\u0000\u0000q\u0264\u0001"+
+ "\u0000\u0000\u0000s\u026b\u0001\u0000\u0000\u0000u\u026e\u0001\u0000\u0000"+
+ "\u0000w\u0274\u0001\u0000\u0000\u0000y\u0280\u0001\u0000\u0000\u0000{"+
+ "\u0284\u0001\u0000\u0000\u0000}\u028c\u0001\u0000\u0000\u0000\u007f\u0296"+
+ "\u0001\u0000\u0000\u0000\u0081\u029d\u0001\u0000\u0000\u0000\u0083\u02a6"+
+ "\u0001\u0000\u0000\u0000\u0085\u02ad\u0001\u0000\u0000\u0000\u0087\u02b7"+
+ "\u0001\u0000\u0000\u0000\u0089\u02c0\u0001\u0000\u0000\u0000\u008b\u02cd"+
+ "\u0001\u0000\u0000\u0000\u008d\u02d7\u0001\u0000\u0000\u0000\u008f\u02e1"+
+ "\u0001\u0000\u0000\u0000\u0091\u02e5\u0001\u0000\u0000\u0000\u0093\u02ea"+
+ "\u0001\u0000\u0000\u0000\u0095\u02ed\u0001\u0000\u0000\u0000\u0097\u02f0"+
+ "\u0001\u0000\u0000\u0000\u0099\u02f8\u0001\u0000\u0000\u0000\u009b\u02fc"+
+ "\u0001\u0000\u0000\u0000\u009d\u0304\u0001\u0000\u0000\u0000\u009f\u030c"+
+ "\u0001\u0000\u0000\u0000\u00a1\u0316\u0001\u0000\u0000\u0000\u00a3\u031e"+
+ "\u0001\u0000\u0000\u0000\u00a5\u0328\u0001\u0000\u0000\u0000\u00a7\u032f"+
+ "\u0001\u0000\u0000\u0000\u00a9\u0338\u0001\u0000\u0000\u0000\u00ab\u0342"+
+ "\u0001\u0000\u0000\u0000\u00ad\u034f\u0001\u0000\u0000\u0000\u00af\u035a"+
+ "\u0001\u0000\u0000\u0000\u00b1\u035e\u0001\u0000\u0000\u0000\u00b3\u0365"+
+ "\u0001\u0000\u0000\u0000\u00b5\u0374\u0001\u0000\u0000\u0000\u00b7\u0380"+
+ "\u0001\u0000\u0000\u0000\u00b9\u0385\u0001\u0000\u0000\u0000\u00bb\u038c"+
+ "\u0001\u0000\u0000\u0000\u00bd\u039a\u0001\u0000\u0000\u0000\u00bf\u03a1"+
+ "\u0001\u0000\u0000\u0000\u00c1\u03a9\u0001\u0000\u0000\u0000\u00c3\u03b1"+
+ "\u0001\u0000\u0000\u0000\u00c5\u03bc\u0001\u0000\u0000\u0000\u00c7\u03c1"+
+ "\u0001\u0000\u0000\u0000\u00c9\u03c4\u0001\u0000\u0000\u0000\u00cb\u03c9"+
+ "\u0001\u0000\u0000\u0000\u00cd\u03ce\u0001\u0000\u0000\u0000\u00cf\u03d4"+
+ "\u0001\u0000\u0000\u0000\u00d1\u03db\u0001\u0000\u0000\u0000\u00d3\u03e2"+
+ "\u0001\u0000\u0000\u0000\u00d5\u00d6\u0005:\u0000\u0000\u00d6\u0002\u0001"+
+ "\u0000\u0000\u0000\u00d7\u00d8\u0005=\u0000\u0000\u00d8\u0004\u0001\u0000"+
+ "\u0000\u0000\u00d9\u00da\u0005.\u0000\u0000\u00da\u00db\u0005*\u0000\u0000"+
+ "\u00db\u0006\u0001\u0000\u0000\u0000\u00dc\u00de\u0007\u0000\u0000\u0000"+
+ "\u00dd\u00dc\u0001\u0000\u0000\u0000\u00de\u00df\u0001\u0000\u0000\u0000"+
+ "\u00df\u00dd\u0001\u0000\u0000\u0000\u00df\u00e0\u0001\u0000\u0000\u0000"+
+ "\u00e0\u00e1\u0001\u0000\u0000\u0000\u00e1\u00e2\u0006\u0003\u0000\u0000"+
+ "\u00e2\b\u0001\u0000\u0000\u0000\u00e3\u00e5\u0007\u0001\u0000\u0000\u00e4"+
+ "\u00e3\u0001\u0000\u0000\u0000\u00e5\u00e6\u0001\u0000\u0000\u0000\u00e6"+
+ "\u00e4\u0001\u0000\u0000\u0000\u00e6\u00e7\u0001\u0000\u0000\u0000\u00e7"+
+ "\n\u0001\u0000\u0000\u0000\u00e8\u00ea\u0007\u0001\u0000\u0000\u00e9\u00e8"+
+ "\u0001\u0000\u0000\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb\u00e9"+
+ "\u0001\u0000\u0000\u0000\u00eb\u00ec\u0001\u0000\u0000\u0000\u00ec\u00ed"+
+ "\u0001\u0000\u0000\u0000\u00ed\u00ef\u0005.\u0000\u0000\u00ee\u00f0\u0007"+
+ "\u0001\u0000\u0000\u00ef\u00ee\u0001\u0000\u0000\u0000\u00f0\u00f1\u0001"+
+ "\u0000\u0000\u0000\u00f1\u00ef\u0001\u0000\u0000\u0000\u00f1\u00f2\u0001"+
+ "\u0000\u0000\u0000\u00f2\f\u0001\u0000\u0000\u0000\u00f3\u00f8\u0005\'"+
+ "\u0000\u0000\u00f4\u00f7\u0003\u000f\u0007\u0000\u00f5\u00f7\t\u0000\u0000"+
+ "\u0000\u00f6\u00f4\u0001\u0000\u0000\u0000\u00f6\u00f5\u0001\u0000\u0000"+
+ "\u0000\u00f7\u00fa\u0001\u0000\u0000\u0000\u00f8\u00f9\u0001\u0000\u0000"+
+ "\u0000\u00f8\u00f6\u0001\u0000\u0000\u0000\u00f9\u00fb\u0001\u0000\u0000"+
+ "\u0000\u00fa\u00f8\u0001\u0000\u0000\u0000\u00fb\u00fc\u0005\'\u0000\u0000"+
+ "\u00fc\u000e\u0001\u0000\u0000\u0000\u00fd\u00fe\u0005\\\u0000\u0000\u00fe"+
+ "\u0102\u0005\\\u0000\u0000\u00ff\u0100\u0005\\\u0000\u0000\u0100\u0102"+
+ "\u0005\'\u0000\u0000\u0101\u00fd\u0001\u0000\u0000\u0000\u0101\u00ff\u0001"+
+ "\u0000\u0000\u0000\u0102\u0010\u0001\u0000\u0000\u0000\u0103\u0105\u0005"+
+ "_\u0000\u0000\u0104\u0103\u0001\u0000\u0000\u0000\u0104\u0105\u0001\u0000"+
+ "\u0000\u0000\u0105\u0106\u0001\u0000\u0000\u0000\u0106\u010b\u0003\u0013"+
+ "\t\u0000\u0107\u010a\u0003\u0013\t\u0000\u0108\u010a\u0007\u0002\u0000"+
+ "\u0000\u0109\u0107\u0001\u0000\u0000\u0000\u0109\u0108\u0001\u0000\u0000"+
+ "\u0000\u010a\u010d\u0001\u0000\u0000\u0000\u010b\u0109\u0001\u0000\u0000"+
+ "\u0000\u010b\u010c\u0001\u0000\u0000\u0000\u010c\u0012\u0001\u0000\u0000"+
+ "\u0000\u010d\u010b\u0001\u0000\u0000\u0000\u010e\u010f\u0007\u0003\u0000"+
+ "\u0000\u010f\u0014\u0001\u0000\u0000\u0000\u0110\u0111\u0005a\u0000\u0000"+
+ "\u0111\u0112\u0005b\u0000\u0000\u0112\u0113\u0005o\u0000\u0000\u0113\u0114"+
+ "\u0005u\u0000\u0000\u0114\u0115\u0005t\u0000\u0000\u0115\u0016\u0001\u0000"+
+ "\u0000\u0000\u0116\u0117\u0005a\u0000\u0000\u0117\u0118\u0005b\u0000\u0000"+
+ "\u0118\u0119\u0005s\u0000\u0000\u0119\u011a\u0005t\u0000\u0000\u011a\u011b"+
+ "\u0005r\u0000\u0000\u011b\u011c\u0005a\u0000\u0000\u011c\u011d\u0005c"+
+ "\u0000\u0000\u011d\u011e\u0005t\u0000\u0000\u011e\u0018\u0001\u0000\u0000"+
+ "\u0000\u011f\u0120\u0005a\u0000\u0000\u0120\u0121\u0005l\u0000\u0000\u0121"+
+ "\u0122\u0005i\u0000\u0000\u0122\u0123\u0005a\u0000\u0000\u0123\u0124\u0005"+
+ "s\u0000\u0000\u0124\u001a\u0001\u0000\u0000\u0000\u0125\u0126\u0005a\u0000"+
+ "\u0000\u0126\u0127\u0005l\u0000\u0000\u0127\u0128\u0005l\u0000\u0000\u0128"+
+ "\u001c\u0001\u0000\u0000\u0000\u0129\u012a\u0005a\u0000\u0000\u012a\u012b"+
+ "\u0005n\u0000\u0000\u012b\u012c\u0005d\u0000\u0000\u012c\u001e\u0001\u0000"+
+ "\u0000\u0000\u012d\u012e\u0005a\u0000\u0000\u012e\u012f\u0005s\u0000\u0000"+
+ "\u012f \u0001\u0000\u0000\u0000\u0130\u0131\u0005a\u0000\u0000\u0131\u0132"+
+ "\u0005s\u0000\u0000\u0132\u0133\u0005s\u0000\u0000\u0133\u0134\u0005i"+
+ "\u0000\u0000\u0134\u0135\u0005g\u0000\u0000\u0135\u0136\u0005n\u0000\u0000"+
+ "\u0136\"\u0001\u0000\u0000\u0000\u0137\u0138\u0005a\u0000\u0000\u0138"+
+ "\u0139\u0005s\u0000\u0000\u0139\u013a\u0005s\u0000\u0000\u013a\u013b\u0005"+
+ "o\u0000\u0000\u013b\u013c\u0005c\u0000\u0000\u013c$\u0001\u0000\u0000"+
+ "\u0000\u013d\u013e\u0005b\u0000\u0000\u013e\u013f\u0005e\u0000\u0000\u013f"+
+ "\u0140\u0005h\u0000\u0000\u0140\u0141\u0005a\u0000\u0000\u0141\u0142\u0005"+
+ "v\u0000\u0000\u0142\u0143\u0005i\u0000\u0000\u0143\u0144\u0005o\u0000"+
+ "\u0000\u0144\u0145\u0005r\u0000\u0000\u0145&\u0001\u0000\u0000\u0000\u0146"+
+ "\u0147\u0005b\u0000\u0000\u0147\u0148\u0005i\u0000\u0000\u0148\u0149\u0005"+
+ "n\u0000\u0000\u0149\u014a\u0005d\u0000\u0000\u014a\u014b\u0005i\u0000"+
+ "\u0000\u014b\u014c\u0005n\u0000\u0000\u014c\u014d\u0005g\u0000\u0000\u014d"+
+ "(\u0001\u0000\u0000\u0000\u014e\u014f\u0005b\u0000\u0000\u014f\u0150\u0005"+
+ "o\u0000\u0000\u0150\u0151\u0005o\u0000\u0000\u0151\u0152\u0005l\u0000"+
+ "\u0000\u0152*\u0001\u0000\u0000\u0000\u0153\u0154\u0005b\u0000\u0000\u0154"+
+ "\u0155\u0005y\u0000\u0000\u0155,\u0001\u0000\u0000\u0000\u0156\u0157\u0005"+
+ "c\u0000\u0000\u0157\u0158\u0005h\u0000\u0000\u0158\u0159\u0005a\u0000"+
+ "\u0000\u0159\u015a\u0005i\u0000\u0000\u015a\u015b\u0005n\u0000\u0000\u015b"+
+ "\u015c\u0005s\u0000\u0000\u015c.\u0001\u0000\u0000\u0000\u015d\u015e\u0005"+
+ "c\u0000\u0000\u015e\u015f\u0005l\u0000\u0000\u015f\u0160\u0005a\u0000"+
+ "\u0000\u0160\u0161\u0005s\u0000\u0000\u0161\u0162\u0005s\u0000\u0000\u0162"+
+ "0\u0001\u0000\u0000\u0000\u0163\u0164\u0005c\u0000\u0000\u0164\u0165\u0005"+
+ "l\u0000\u0000\u0165\u0166\u0005a\u0000\u0000\u0166\u0167\u0005s\u0000"+
+ "\u0000\u0167\u0168\u0005s\u0000\u0000\u0168\u0169\u0005i\u0000\u0000\u0169"+
+ "\u016a\u0005f\u0000\u0000\u016a\u016b\u0005i\u0000\u0000\u016b\u016c\u0005"+
+ "e\u0000\u0000\u016c\u016d\u0005r\u0000\u0000\u016d2\u0001\u0000\u0000"+
+ "\u0000\u016e\u016f\u0005c\u0000\u0000\u016f\u0170\u0005o\u0000\u0000\u0170"+
+ "\u0171\u0005m\u0000\u0000\u0171\u0172\u0005m\u0000\u0000\u0172\u0173\u0005"+
+ "e\u0000\u0000\u0173\u0174\u0005n\u0000\u0000\u0174\u0175\u0005t\u0000"+
+ "\u0000\u01754\u0001\u0000\u0000\u0000\u0176\u0177\u0005c\u0000\u0000\u0177"+
+ "\u0178\u0005o\u0000\u0000\u0178\u0179\u0005m\u0000\u0000\u0179\u017a\u0005"+
+ "p\u0000\u0000\u017a\u017b\u0005o\u0000\u0000\u017b\u017c\u0005s\u0000"+
+ "\u0000\u017c\u017d\u0005i\u0000\u0000\u017d\u017e\u0005t\u0000\u0000\u017e"+
+ "\u017f\u0005e\u0000\u0000\u017f6\u0001\u0000\u0000\u0000\u0180\u0181\u0005"+
+ "c\u0000\u0000\u0181\u0182\u0005o\u0000\u0000\u0182\u0183\u0005n\u0000"+
+ "\u0000\u0183\u0184\u0005j\u0000\u0000\u0184\u0185\u0005u\u0000\u0000\u0185"+
+ "\u0186\u0005g\u0000\u0000\u0186\u0187\u0005a\u0000\u0000\u0187\u0188\u0005"+
+ "t\u0000\u0000\u0188\u0189\u0005e\u0000\u0000\u01898\u0001\u0000\u0000"+
+ "\u0000\u018a\u018b\u0005c\u0000\u0000\u018b\u018c\u0005o\u0000\u0000\u018c"+
+ "\u018d\u0005n\u0000\u0000\u018d\u018e\u0005j\u0000\u0000\u018e\u018f\u0005"+
+ "u\u0000\u0000\u018f\u0190\u0005g\u0000\u0000\u0190\u0191\u0005a\u0000"+
+ "\u0000\u0191\u0192\u0005t\u0000\u0000\u0192\u0193\u0005e\u0000\u0000\u0193"+
+ "\u0194\u0005s\u0000\u0000\u0194:\u0001\u0000\u0000\u0000\u0195\u0196\u0005"+
+ "c\u0000\u0000\u0196\u0197\u0005o\u0000\u0000\u0197\u0198\u0005n\u0000"+
+ "\u0000\u0198\u0199\u0005j\u0000\u0000\u0199\u019a\u0005u\u0000\u0000\u019a"+
+ "\u019b\u0005g\u0000\u0000\u019b\u019c\u0005a\u0000\u0000\u019c\u019d\u0005"+
+ "t\u0000\u0000\u019d\u019e\u0005i\u0000\u0000\u019e\u019f\u0005o\u0000"+
+ "\u0000\u019f\u01a0\u0005n\u0000\u0000\u01a0<\u0001\u0000\u0000\u0000\u01a1"+
+ "\u01a2\u0005c\u0000\u0000\u01a2\u01a3\u0005o\u0000\u0000\u01a3\u01a4\u0005"+
+ "n\u0000\u0000\u01a4\u01a5\u0005n\u0000\u0000\u01a5\u01a6\u0005e\u0000"+
+ "\u0000\u01a6\u01a7\u0005c\u0000\u0000\u01a7\u01a8\u0005t\u0000\u0000\u01a8"+
+ "\u01a9\u0005o\u0000\u0000\u01a9\u01aa\u0005r\u0000\u0000\u01aa>\u0001"+
+ "\u0000\u0000\u0000\u01ab\u01ac\u0005d\u0000\u0000\u01ac\u01ad\u0005a\u0000"+
+ "\u0000\u01ad\u01ae\u0005t\u0000\u0000\u01ae\u01af\u0005a\u0000\u0000\u01af"+
+ "\u01b0\u0005t\u0000\u0000\u01b0\u01b1\u0005y\u0000\u0000\u01b1\u01b2\u0005"+
+ "p\u0000\u0000\u01b2\u01b3\u0005e\u0000\u0000\u01b3@\u0001\u0000\u0000"+
+ "\u0000\u01b4\u01b5\u0005d\u0000\u0000\u01b5\u01b6\u0005e\u0000\u0000\u01b6"+
+ "\u01b7\u0005f\u0000\u0000\u01b7\u01b8\u0005a\u0000\u0000\u01b8\u01b9\u0005"+
+ "u\u0000\u0000\u01b9\u01ba\u0005l\u0000\u0000\u01ba\u01bb\u0005t\u0000"+
+ "\u0000\u01bbB\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005d\u0000\u0000\u01bd"+
+ "\u01be\u0005e\u0000\u0000\u01be\u01bf\u0005p\u0000\u0000\u01bf\u01c0\u0005"+
+ "e\u0000\u0000\u01c0\u01c1\u0005n\u0000\u0000\u01c1\u01c2\u0005d\u0000"+
+ "\u0000\u01c2\u01c3\u0005e\u0000\u0000\u01c3\u01c4\u0005n\u0000\u0000\u01c4"+
+ "\u01c5\u0005c\u0000\u0000\u01c5\u01c6\u0005y\u0000\u0000\u01c6D\u0001"+
+ "\u0000\u0000\u0000\u01c7\u01c8\u0005d\u0000\u0000\u01c8\u01c9\u0005e\u0000"+
+ "\u0000\u01c9\u01ca\u0005r\u0000\u0000\u01ca\u01cb\u0005i\u0000\u0000\u01cb"+
+ "\u01cc\u0005v\u0000\u0000\u01cc\u01cd\u0005e\u0000\u0000\u01cd\u01ce\u0005"+
+ "d\u0000\u0000\u01ceF\u0001\u0000\u0000\u0000\u01cf\u01d0\u0005d\u0000"+
+ "\u0000\u01d0\u01d1\u0005i\u0000\u0000\u01d1\u01d2\u0005f\u0000\u0000\u01d2"+
+ "\u01d3\u0005f\u0000\u0000\u01d3\u01d4\u0005e\u0000\u0000\u01d4\u01d5\u0005"+
+ "r\u0000\u0000\u01d5\u01d6\u0005e\u0000\u0000\u01d6\u01d7\u0005n\u0000"+
+ "\u0000\u01d7\u01d8\u0005c\u0000\u0000\u01d8\u01d9\u0005e\u0000\u0000\u01d9"+
+ "\u01da\u0005s\u0000\u0000\u01daH\u0001\u0000\u0000\u0000\u01db\u01dc\u0005"+
+ "d\u0000\u0000\u01dc\u01dd\u0005i\u0000\u0000\u01dd\u01de\u0005s\u0000"+
+ "\u0000\u01de\u01df\u0005j\u0000\u0000\u01df\u01e0\u0005o\u0000\u0000\u01e0"+
+ "\u01e1\u0005i\u0000\u0000\u01e1\u01e2\u0005n\u0000\u0000\u01e2\u01e3\u0005"+
+ "i\u0000\u0000\u01e3\u01e4\u0005n\u0000\u0000\u01e4\u01e5\u0005g\u0000"+
+ "\u0000\u01e5J\u0001\u0000\u0000\u0000\u01e6\u01e7\u0005d\u0000\u0000\u01e7"+
+ "\u01e8\u0005i\u0000\u0000\u01e8\u01e9\u0005s\u0000\u0000\u01e9\u01ea\u0005"+
+ "j\u0000\u0000\u01ea\u01eb\u0005o\u0000\u0000\u01eb\u01ec\u0005i\u0000"+
+ "\u0000\u01ec\u01ed\u0005n\u0000\u0000\u01ed\u01ee\u0005t\u0000\u0000\u01ee"+
+ "L\u0001\u0000\u0000\u0000\u01ef\u01f0\u0005d\u0000\u0000\u01f0\u01f1\u0005"+
+ "o\u0000\u0000\u01f1\u01f2\u0005c\u0000\u0000\u01f2N\u0001\u0000\u0000"+
+ "\u0000\u01f3\u01f4\u0005e\u0000\u0000\u01f4\u01f5\u0005l\u0000\u0000\u01f5"+
+ "\u01f6\u0005s\u0000\u0000\u01f6\u01f7\u0005e\u0000\u0000\u01f7P\u0001"+
+ "\u0000\u0000\u0000\u01f8\u01f9\u0005E\u0000\u0000\u01f9\u01fa\u0005N\u0000"+
+ "\u0000\u01fa\u01fb\u0005D\u0000\u0000\u01fbR\u0001\u0000\u0000\u0000\u01fc"+
+ "\u01fd\u0005e\u0000\u0000\u01fd\u01fe\u0005x\u0000\u0000\u01fe\u01ff\u0005"+
+ "p\u0000\u0000\u01ff\u0200\u0005r\u0000\u0000\u0200T\u0001\u0000\u0000"+
+ "\u0000\u0201\u0202\u0005f\u0000\u0000\u0202\u0203\u0005a\u0000\u0000\u0203"+
+ "\u0204\u0005l\u0000\u0000\u0204\u0205\u0005s\u0000\u0000\u0205\u0206\u0005"+
+ "e\u0000\u0000\u0206V\u0001\u0000\u0000\u0000\u0207\u0208\u0005f\u0000"+
+ "\u0000\u0208\u0209\u0005e\u0000\u0000\u0209\u020a\u0005a\u0000\u0000\u020a"+
+ "\u020b\u0005t\u0000\u0000\u020b\u020c\u0005u\u0000\u0000\u020c\u020d\u0005"+
+ "r\u0000\u0000\u020d\u020e\u0005e\u0000\u0000\u020eX\u0001\u0000\u0000"+
+ "\u0000\u020f\u0210\u0005f\u0000\u0000\u0210\u0211\u0005e\u0000\u0000\u0211"+
+ "\u0212\u0005a\u0000\u0000\u0212\u0213\u0005t\u0000\u0000\u0213\u0214\u0005"+
+ "u\u0000\u0000\u0214\u0215\u0005r\u0000\u0000\u0215\u0216\u0005e\u0000"+
+ "\u0000\u0216\u0217\u0005d\u0000\u0000\u0217Z\u0001\u0000\u0000\u0000\u0218"+
+ "\u0219\u0005f\u0000\u0000\u0219\u021a\u0005e\u0000\u0000\u021a\u021b\u0005"+
+ "a\u0000\u0000\u021b\u021c\u0005t\u0000\u0000\u021c\u021d\u0005u\u0000"+
+ "\u0000\u021d\u021e\u0005r\u0000\u0000\u021e\u021f\u0005i\u0000\u0000\u021f"+
+ "\u0220\u0005n\u0000\u0000\u0220\u0221\u0005g\u0000\u0000\u0221\\\u0001"+
+ "\u0000\u0000\u0000\u0222\u0223\u0005f\u0000\u0000\u0223\u0224\u0005i\u0000"+
+ "\u0000\u0224\u0225\u0005l\u0000\u0000\u0225\u0226\u0005t\u0000\u0000\u0226"+
+ "\u0227\u0005e\u0000\u0000\u0227\u0228\u0005r\u0000\u0000\u0228^\u0001"+
+ "\u0000\u0000\u0000\u0229\u022a\u0005f\u0000\u0000\u022a\u022b\u0005i\u0000"+
+ "\u0000\u022b\u022c\u0005r\u0000\u0000\u022c\u022d\u0005s\u0000\u0000\u022d"+
+ "\u022e\u0005t\u0000\u0000\u022e`\u0001\u0000\u0000\u0000\u022f\u0230\u0005"+
+ "f\u0000\u0000\u0230\u0231\u0005l\u0000\u0000\u0231\u0232\u0005o\u0000"+
+ "\u0000\u0232\u0233\u0005w\u0000\u0000\u0233b\u0001\u0000\u0000\u0000\u0234"+
+ "\u0235\u0005f\u0000\u0000\u0235\u0236\u0005o\u0000\u0000\u0236\u0237\u0005"+
+ "r\u0000\u0000\u0237d\u0001\u0000\u0000\u0000\u0238\u0239\u0005f\u0000"+
+ "\u0000\u0239\u023a\u0005r\u0000\u0000\u023a\u023b\u0005o\u0000\u0000\u023b"+
+ "\u023c\u0005m\u0000\u0000\u023cf\u0001\u0000\u0000\u0000\u023d\u023e\u0005"+
+ "f\u0000\u0000\u023e\u023f\u0005u\u0000\u0000\u023f\u0240\u0005n\u0000"+
+ "\u0000\u0240\u0241\u0005c\u0000\u0000\u0241\u0242\u0005t\u0000\u0000\u0242"+
+ "\u0243\u0005i\u0000\u0000\u0243\u0244\u0005o\u0000\u0000\u0244\u0245\u0005"+
+ "n\u0000\u0000\u0245h\u0001\u0000\u0000\u0000\u0246\u0247\u0005h\u0000"+
+ "\u0000\u0247\u0248\u0005a\u0000\u0000\u0248\u0249\u0005s\u0000\u0000\u0249"+
+ "\u024a\u0005t\u0000\u0000\u024a\u024b\u0005y\u0000\u0000\u024b\u024c\u0005"+
+ "p\u0000\u0000\u024c\u024d\u0005e\u0000\u0000\u024dj\u0001\u0000\u0000"+
+ "\u0000\u024e\u024f\u0005i\u0000\u0000\u024f\u0250\u0005f\u0000\u0000\u0250"+
+ "l\u0001\u0000\u0000\u0000\u0251\u0252\u0005i\u0000\u0000\u0252\u0253\u0005"+
+ "n\u0000\u0000\u0253\u0254\u0005t\u0000\u0000\u0254\u0255\u0005e\u0000"+
+ "\u0000\u0255\u0256\u0005r\u0000\u0000\u0256\u0257\u0005s\u0000\u0000\u0257"+
+ "\u0258\u0005e\u0000\u0000\u0258\u0259\u0005c\u0000\u0000\u0259\u025a\u0005"+
+ "t\u0000\u0000\u025a\u025b\u0005s\u0000\u0000\u025bn\u0001\u0000\u0000"+
+ "\u0000\u025c\u025d\u0005i\u0000\u0000\u025d\u025e\u0005m\u0000\u0000\u025e"+
+ "\u025f\u0005p\u0000\u0000\u025f\u0260\u0005l\u0000\u0000\u0260\u0261\u0005"+
+ "i\u0000\u0000\u0261\u0262\u0005e\u0000\u0000\u0262\u0263\u0005s\u0000"+
+ "\u0000\u0263p\u0001\u0000\u0000\u0000\u0264\u0265\u0005i\u0000\u0000\u0265"+
+ "\u0266\u0005m\u0000\u0000\u0266\u0267\u0005p\u0000\u0000\u0267\u0268\u0005"+
+ "o\u0000\u0000\u0268\u0269\u0005r\u0000\u0000\u0269\u026a\u0005t\u0000"+
+ "\u0000\u026ar\u0001\u0000\u0000\u0000\u026b\u026c\u0005i\u0000\u0000\u026c"+
+ "\u026d\u0005n\u0000\u0000\u026dt\u0001\u0000\u0000\u0000\u026e\u026f\u0005"+
+ "i\u0000\u0000\u026f\u0270\u0005n\u0000\u0000\u0270\u0271\u0005o\u0000"+
+ "\u0000\u0271\u0272\u0005u\u0000\u0000\u0272\u0273\u0005t\u0000\u0000\u0273"+
+ "v\u0001\u0000\u0000\u0000\u0274\u0275\u0005i\u0000\u0000\u0275\u0276\u0005"+
+ "n\u0000\u0000\u0276\u0277\u0005t\u0000\u0000\u0277\u0278\u0005e\u0000"+
+ "\u0000\u0278\u0279\u0005r\u0000\u0000\u0279\u027a\u0005a\u0000\u0000\u027a"+
+ "\u027b\u0005c\u0000\u0000\u027b\u027c\u0005t\u0000\u0000\u027c\u027d\u0005"+
+ "i\u0000\u0000\u027d\u027e\u0005o\u0000\u0000\u027e\u027f\u0005n\u0000"+
+ "\u0000\u027fx\u0001\u0000\u0000\u0000\u0280\u0281\u0005i\u0000\u0000\u0281"+
+ "\u0282\u0005n\u0000\u0000\u0282\u0283\u0005v\u0000\u0000\u0283z\u0001"+
+ "\u0000\u0000\u0000\u0284\u0285\u0005i\u0000\u0000\u0285\u0286\u0005n\u0000"+
+ "\u0000\u0286\u0287\u0005v\u0000\u0000\u0287\u0288\u0005e\u0000\u0000\u0288"+
+ "\u0289\u0005r\u0000\u0000\u0289\u028a\u0005s\u0000\u0000\u028a\u028b\u0005"+
+ "e\u0000\u0000\u028b|\u0001\u0000\u0000\u0000\u028c\u028d\u0005i\u0000"+
+ "\u0000\u028d\u028e\u0005n\u0000\u0000\u028e\u028f\u0005v\u0000\u0000\u028f"+
+ "\u0290\u0005e\u0000\u0000\u0290\u0291\u0005r\u0000\u0000\u0291\u0292\u0005"+
+ "t\u0000\u0000\u0292\u0293\u0005i\u0000\u0000\u0293\u0294\u0005n\u0000"+
+ "\u0000\u0294\u0295\u0005g\u0000\u0000\u0295~\u0001\u0000\u0000\u0000\u0296"+
+ "\u0297\u0005i\u0000\u0000\u0297\u0298\u0005s\u0000\u0000\u0298\u0299\u0005"+
+ "t\u0000\u0000\u0299\u029a\u0005y\u0000\u0000\u029a\u029b\u0005p\u0000"+
+ "\u0000\u029b\u029c\u0005e\u0000\u0000\u029c\u0080\u0001\u0000\u0000\u0000"+
+ "\u029d\u029e\u0005l\u0000\u0000\u029e\u029f\u0005a\u0000\u0000\u029f\u02a0"+
+ "\u0005n\u0000\u0000\u02a0\u02a1\u0005g\u0000\u0000\u02a1\u02a2\u0005u"+
+ "\u0000\u0000\u02a2\u02a3\u0005a\u0000\u0000\u02a3\u02a4\u0005g\u0000\u0000"+
+ "\u02a4\u02a5\u0005e\u0000\u0000\u02a5\u0082\u0001\u0000\u0000\u0000\u02a6"+
+ "\u02a7\u0005m\u0000\u0000\u02a7\u02a8\u0005e\u0000\u0000\u02a8\u02a9\u0005"+
+ "m\u0000\u0000\u02a9\u02aa\u0005b\u0000\u0000\u02aa\u02ab\u0005e\u0000"+
+ "\u0000\u02ab\u02ac\u0005r\u0000\u0000\u02ac\u0084\u0001\u0000\u0000\u0000"+
+ "\u02ad\u02ae\u0005m\u0000\u0000\u02ae\u02af\u0005e\u0000\u0000\u02af\u02b0"+
+ "\u0005t\u0000\u0000\u02b0\u02b1\u0005a\u0000\u0000\u02b1\u02b2\u0005c"+
+ "\u0000\u0000\u02b2\u02b3\u0005l\u0000\u0000\u02b3\u02b4\u0005a\u0000\u0000"+
+ "\u02b4\u02b5\u0005s\u0000\u0000\u02b5\u02b6\u0005s\u0000\u0000\u02b6\u0086"+
+ "\u0001\u0000\u0000\u0000\u02b7\u02b8\u0005m\u0000\u0000\u02b8\u02b9\u0005"+
+ "e\u0000\u0000\u02b9\u02ba\u0005t\u0000\u0000\u02ba\u02bb\u0005a\u0000"+
+ "\u0000\u02bb\u02bc\u0005d\u0000\u0000\u02bc\u02bd\u0005a\u0000\u0000\u02bd"+
+ "\u02be\u0005t\u0000\u0000\u02be\u02bf\u0005a\u0000\u0000\u02bf\u0088\u0001"+
+ "\u0000\u0000\u0000\u02c0\u02c1\u0005m\u0000\u0000\u02c1\u02c2\u0005u\u0000"+
+ "\u0000\u02c2\u02c3\u0005l\u0000\u0000\u02c3\u02c4\u0005t\u0000\u0000\u02c4"+
+ "\u02c5\u0005i\u0000\u0000\u02c5\u02c6\u0005p\u0000\u0000\u02c6\u02c7\u0005"+
+ "l\u0000\u0000\u02c7\u02c8\u0005i\u0000\u0000\u02c8\u02c9\u0005c\u0000"+
+ "\u0000\u02c9\u02ca\u0005i\u0000\u0000\u02ca\u02cb\u0005t\u0000\u0000\u02cb"+
+ "\u02cc\u0005y\u0000\u0000\u02cc\u008a\u0001\u0000\u0000\u0000\u02cd\u02ce"+
+ "\u0005n\u0000\u0000\u02ce\u02cf\u0005a\u0000\u0000\u02cf\u02d0\u0005m"+
+ "\u0000\u0000\u02d0\u02d1\u0005e\u0000\u0000\u02d1\u02d2\u0005s\u0000\u0000"+
+ "\u02d2\u02d3\u0005p\u0000\u0000\u02d3\u02d4\u0005a\u0000\u0000\u02d4\u02d5"+
+ "\u0005c\u0000\u0000\u02d5\u02d6\u0005e\u0000\u0000\u02d6\u008c\u0001\u0000"+
+ "\u0000\u0000\u02d7\u02d8\u0005n\u0000\u0000\u02d8\u02d9\u0005o\u0000\u0000"+
+ "\u02d9\u02da\u0005n\u0000\u0000\u02da\u02db\u0005u\u0000\u0000\u02db\u02dc"+
+ "\u0005n\u0000\u0000\u02dc\u02dd\u0005i\u0000\u0000\u02dd\u02de\u0005q"+
+ "\u0000\u0000\u02de\u02df\u0005u\u0000\u0000\u02df\u02e0\u0005e\u0000\u0000"+
+ "\u02e0\u008e\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005n\u0000\u0000\u02e2"+
+ "\u02e3\u0005o\u0000\u0000\u02e3\u02e4\u0005t\u0000\u0000\u02e4\u0090\u0001"+
+ "\u0000\u0000\u0000\u02e5\u02e6\u0005n\u0000\u0000\u02e6\u02e7\u0005u\u0000"+
+ "\u0000\u02e7\u02e8\u0005l\u0000\u0000\u02e8\u02e9\u0005l\u0000\u0000\u02e9"+
+ "\u0092\u0001\u0000\u0000\u0000\u02ea\u02eb\u0005o\u0000\u0000\u02eb\u02ec"+
+ "\u0005f\u0000\u0000\u02ec\u0094\u0001\u0000\u0000\u0000\u02ed\u02ee\u0005"+
+ "o\u0000\u0000\u02ee\u02ef\u0005r\u0000\u0000\u02ef\u0096\u0001\u0000\u0000"+
+ "\u0000\u02f0\u02f1\u0005o\u0000\u0000\u02f1\u02f2\u0005r\u0000\u0000\u02f2"+
+ "\u02f3\u0005d\u0000\u0000\u02f3\u02f4\u0005e\u0000\u0000\u02f4\u02f5\u0005"+
+ "r\u0000\u0000\u02f5\u02f6\u0005e\u0000\u0000\u02f6\u02f7\u0005d\u0000"+
+ "\u0000\u02f7\u0098\u0001\u0000\u0000\u0000\u02f8\u02f9\u0005o\u0000\u0000"+
+ "\u02f9\u02fa\u0005u\u0000\u0000\u02fa\u02fb\u0005t\u0000\u0000\u02fb\u009a"+
+ "\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005p\u0000\u0000\u02fd\u02fe\u0005"+
+ "a\u0000\u0000\u02fe\u02ff\u0005c\u0000\u0000\u02ff\u0300\u0005k\u0000"+
+ "\u0000\u0300\u0301\u0005a\u0000\u0000\u0301\u0302\u0005g\u0000\u0000\u0302"+
+ "\u0303\u0005e\u0000\u0000\u0303\u009c\u0001\u0000\u0000\u0000\u0304\u0305"+
+ "\u0005p\u0000\u0000\u0305\u0306\u0005o\u0000\u0000\u0306\u0307\u0005r"+
+ "\u0000\u0000\u0307\u0308\u0005t\u0000\u0000\u0308\u0309\u0005i\u0000\u0000"+
+ "\u0309\u030a\u0005o\u0000\u0000\u030a\u030b\u0005n\u0000\u0000\u030b\u009e"+
+ "\u0001\u0000\u0000\u0000\u030c\u030d\u0005p\u0000\u0000\u030d\u030e\u0005"+
+ "r\u0000\u0000\u030e\u030f\u0005e\u0000\u0000\u030f\u0310\u0005d\u0000"+
+ "\u0000\u0310\u0311\u0005i\u0000\u0000\u0311\u0312\u0005c\u0000\u0000\u0312"+
+ "\u0313\u0005a\u0000\u0000\u0313\u0314\u0005t\u0000\u0000\u0314\u0315\u0005"+
+ "e\u0000\u0000\u0315\u00a0\u0001\u0000\u0000\u0000\u0316\u0317\u0005p\u0000"+
+ "\u0000\u0317\u0318\u0005r\u0000\u0000\u0318\u0319\u0005i\u0000\u0000\u0319"+
+ "\u031a\u0005v\u0000\u0000\u031a\u031b\u0005a\u0000\u0000\u031b\u031c\u0005"+
+ "t\u0000\u0000\u031c\u031d\u0005e\u0000\u0000\u031d\u00a2\u0001\u0000\u0000"+
+ "\u0000\u031e\u031f\u0005p\u0000\u0000\u031f\u0320\u0005r\u0000\u0000\u0320"+
+ "\u0321\u0005o\u0000\u0000\u0321\u0322\u0005t\u0000\u0000\u0322\u0323\u0005"+
+ "e\u0000\u0000\u0323\u0324\u0005c\u0000\u0000\u0324\u0325\u0005t\u0000"+
+ "\u0000\u0325\u0326\u0005e\u0000\u0000\u0326\u0327\u0005d\u0000\u0000\u0327"+
+ "\u00a4\u0001\u0000\u0000\u0000\u0328\u0329\u0005p\u0000\u0000\u0329\u032a"+
+ "\u0005u\u0000\u0000\u032a\u032b\u0005b\u0000\u0000\u032b\u032c\u0005l"+
+ "\u0000\u0000\u032c\u032d\u0005i\u0000\u0000\u032d\u032e\u0005c\u0000\u0000"+
+ "\u032e\u00a6\u0001\u0000\u0000\u0000\u032f\u0330\u0005r\u0000\u0000\u0330"+
+ "\u0331\u0005e\u0000\u0000\u0331\u0332\u0005a\u0000\u0000\u0332\u0333\u0005"+
+ "d\u0000\u0000\u0333\u0334\u0005o\u0000\u0000\u0334\u0335\u0005n\u0000"+
+ "\u0000\u0335\u0336\u0005l\u0000\u0000\u0336\u0337\u0005y\u0000\u0000\u0337"+
+ "\u00a8\u0001\u0000\u0000\u0000\u0338\u0339\u0005r\u0000\u0000\u0339\u033a"+
+ "\u0005e\u0000\u0000\u033a\u033b\u0005d\u0000\u0000\u033b\u033c\u0005e"+
+ "\u0000\u0000\u033c\u033d\u0005f\u0000\u0000\u033d\u033e\u0005i\u0000\u0000"+
+ "\u033e\u033f\u0005n\u0000\u0000\u033f\u0340\u0005e\u0000\u0000\u0340\u0341"+
+ "\u0005s\u0000\u0000\u0341\u00aa\u0001\u0000\u0000\u0000\u0342\u0343\u0005"+
+ "r\u0000\u0000\u0343\u0344\u0005e\u0000\u0000\u0344\u0345\u0005d\u0000"+
+ "\u0000\u0345\u0346\u0005e\u0000\u0000\u0346\u0347\u0005f\u0000\u0000\u0347"+
+ "\u0348\u0005i\u0000\u0000\u0348\u0349\u0005n\u0000\u0000\u0349\u034a\u0005"+
+ "i\u0000\u0000\u034a\u034b\u0005t\u0000\u0000\u034b\u034c\u0005i\u0000"+
+ "\u0000\u034c\u034d\u0005o\u0000\u0000\u034d\u034e\u0005n\u0000\u0000\u034e"+
+ "\u00ac\u0001\u0000\u0000\u0000\u034f\u0350\u0005r\u0000\u0000\u0350\u0351"+
+ "\u0005e\u0000\u0000\u0351\u0352\u0005f\u0000\u0000\u0352\u0353\u0005e"+
+ "\u0000\u0000\u0353\u0354\u0005r\u0000\u0000\u0354\u0355\u0005e\u0000\u0000"+
+ "\u0355\u0356\u0005n\u0000\u0000\u0356\u0357\u0005c\u0000\u0000\u0357\u0358"+
+ "\u0005e\u0000\u0000\u0358\u0359\u0005s\u0000\u0000\u0359\u00ae\u0001\u0000"+
+ "\u0000\u0000\u035a\u035b\u0005r\u0000\u0000\u035b\u035c\u0005e\u0000\u0000"+
+ "\u035c\u035d\u0005p\u0000\u0000\u035d\u00b0\u0001\u0000\u0000\u0000\u035e"+
+ "\u035f\u0005r\u0000\u0000\u035f\u0360\u0005e\u0000\u0000\u0360\u0361\u0005"+
+ "t\u0000\u0000\u0361\u0362\u0005u\u0000\u0000\u0362\u0363\u0005r\u0000"+
+ "\u0000\u0363\u0364\u0005n\u0000\u0000\u0364\u00b2\u0001\u0000\u0000\u0000"+
+ "\u0365\u0366\u0005s\u0000\u0000\u0366\u0367\u0005p\u0000\u0000\u0367\u0368"+
+ "\u0005e\u0000\u0000\u0368\u0369\u0005c\u0000\u0000\u0369\u036a\u0005i"+
+ "\u0000\u0000\u036a\u036b\u0005a\u0000\u0000\u036b\u036c\u0005l\u0000\u0000"+
+ "\u036c\u036d\u0005i\u0000\u0000\u036d\u036e\u0005z\u0000\u0000\u036e\u036f"+
+ "\u0005a\u0000\u0000\u036f\u0370\u0005t\u0000\u0000\u0370\u0371\u0005i"+
+ "\u0000\u0000\u0371\u0372\u0005o\u0000\u0000\u0372\u0373\u0005n\u0000\u0000"+
+ "\u0373\u00b4\u0001\u0000\u0000\u0000\u0374\u0375\u0005s\u0000\u0000\u0375"+
+ "\u0376\u0005p\u0000\u0000\u0376\u0377\u0005e\u0000\u0000\u0377\u0378\u0005"+
+ "c\u0000\u0000\u0378\u0379\u0005i\u0000\u0000\u0379\u037a\u0005a\u0000"+
+ "\u0000\u037a\u037b\u0005l\u0000\u0000\u037b\u037c\u0005i\u0000\u0000\u037c"+
+ "\u037d\u0005z\u0000\u0000\u037d\u037e\u0005e\u0000\u0000\u037e\u037f\u0005"+
+ "s\u0000\u0000\u037f\u00b6\u0001\u0000\u0000\u0000\u0380\u0381\u0005s\u0000"+
+ "\u0000\u0381\u0382\u0005t\u0000\u0000\u0382\u0383\u0005e\u0000\u0000\u0383"+
+ "\u0384\u0005p\u0000\u0000\u0384\u00b8\u0001\u0000\u0000\u0000\u0385\u0386"+
+ "\u0005s\u0000\u0000\u0386\u0387\u0005t\u0000\u0000\u0387\u0388\u0005r"+
+ "\u0000\u0000\u0388\u0389\u0005u\u0000\u0000\u0389\u038a\u0005c\u0000\u0000"+
+ "\u038a\u038b\u0005t\u0000\u0000\u038b\u00ba\u0001\u0000\u0000\u0000\u038c"+
+ "\u038d\u0005s\u0000\u0000\u038d\u038e\u0005u\u0000\u0000\u038e\u038f\u0005"+
+ "b\u0000\u0000\u038f\u0390\u0005c\u0000\u0000\u0390\u0391\u0005l\u0000"+
+ "\u0000\u0391\u0392\u0005a\u0000\u0000\u0392\u0393\u0005s\u0000\u0000\u0393"+
+ "\u0394\u0005s\u0000\u0000\u0394\u0395\u0005i\u0000\u0000\u0395\u0396\u0005"+
+ "f\u0000\u0000\u0396\u0397\u0005i\u0000\u0000\u0397\u0398\u0005e\u0000"+
+ "\u0000\u0398\u0399\u0005r\u0000\u0000\u0399\u00bc\u0001\u0000\u0000\u0000"+
+ "\u039a\u039b\u0005s\u0000\u0000\u039b\u039c\u0005u\u0000\u0000\u039c\u039d"+
+ "\u0005b\u0000\u0000\u039d\u039e\u0005s\u0000\u0000\u039e\u039f\u0005e"+
+ "\u0000\u0000\u039f\u03a0\u0005t\u0000\u0000\u03a0\u00be\u0001\u0000\u0000"+
+ "\u0000\u03a1\u03a2\u0005s\u0000\u0000\u03a2\u03a3\u0005u\u0000\u0000\u03a3"+
+ "\u03a4\u0005b\u0000\u0000\u03a4\u03a5\u0005s\u0000\u0000\u03a5\u03a6\u0005"+
+ "e\u0000\u0000\u03a6\u03a7\u0005t\u0000\u0000\u03a7\u03a8\u0005s\u0000"+
+ "\u0000\u03a8\u00c0\u0001\u0000\u0000\u0000\u03a9\u03aa\u0005s\u0000\u0000"+
+ "\u03aa\u03ab\u0005u\u0000\u0000\u03ab\u03ac\u0005b\u0000\u0000\u03ac\u03ad"+
+ "\u0005t\u0000\u0000\u03ad\u03ae\u0005y\u0000\u0000\u03ae\u03af\u0005p"+
+ "\u0000\u0000\u03af\u03b0\u0005e\u0000\u0000\u03b0\u00c2\u0001\u0000\u0000"+
+ "\u0000\u03b1\u03b2\u0005s\u0000\u0000\u03b2\u03b3\u0005u\u0000\u0000\u03b3"+
+ "\u03b4\u0005c\u0000\u0000\u03b4\u03b5\u0005c\u0000\u0000\u03b5\u03b6\u0005"+
+ "e\u0000\u0000\u03b6\u03b7\u0005s\u0000\u0000\u03b7\u03b8\u0005s\u0000"+
+ "\u0000\u03b8\u03b9\u0005i\u0000\u0000\u03b9\u03ba\u0005o\u0000\u0000\u03ba"+
+ "\u03bb\u0005n\u0000\u0000\u03bb\u00c4\u0001\u0000\u0000\u0000\u03bc\u03bd"+
+ "\u0005t\u0000\u0000\u03bd\u03be\u0005h\u0000\u0000\u03be\u03bf\u0005e"+
+ "\u0000\u0000\u03bf\u03c0\u0005n\u0000\u0000\u03c0\u00c6\u0001\u0000\u0000"+
+ "\u0000\u03c1\u03c2\u0005t\u0000\u0000\u03c2\u03c3\u0005o\u0000\u0000\u03c3"+
+ "\u00c8\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005t\u0000\u0000\u03c5\u03c6"+
+ "\u0005r\u0000\u0000\u03c6\u03c7\u0005u\u0000\u0000\u03c7\u03c8\u0005e"+
+ "\u0000\u0000\u03c8\u00ca\u0001\u0000\u0000\u0000\u03c9\u03ca\u0005t\u0000"+
+ "\u0000\u03ca\u03cb\u0005y\u0000\u0000\u03cb\u03cc\u0005p\u0000\u0000\u03cc"+
+ "\u03cd\u0005e\u0000\u0000\u03cd\u00cc\u0001\u0000\u0000\u0000\u03ce\u03cf"+
+ "\u0005t\u0000\u0000\u03cf\u03d0\u0005y\u0000\u0000\u03d0\u03d1\u0005p"+
+ "\u0000\u0000\u03d1\u03d2\u0005e\u0000\u0000\u03d2\u03d3\u0005d\u0000\u0000"+
+ "\u03d3\u00ce\u0001\u0000\u0000\u0000\u03d4\u03d5\u0005t\u0000\u0000\u03d5"+
+ "\u03d6\u0005y\u0000\u0000\u03d6\u03d7\u0005p\u0000\u0000\u03d7\u03d8\u0005"+
+ "i\u0000\u0000\u03d8\u03d9\u0005n\u0000\u0000\u03d9\u03da\u0005g\u0000"+
+ "\u0000\u03da\u00d0\u0001\u0000\u0000\u0000\u03db\u03dc\u0005u\u0000\u0000"+
+ "\u03dc\u03dd\u0005n\u0000\u0000\u03dd\u03de\u0005i\u0000\u0000\u03de\u03df"+
+ "\u0005o\u0000\u0000\u03df\u03e0\u0005n\u0000\u0000\u03e0\u03e1\u0005s"+
+ "\u0000\u0000\u03e1\u00d2\u0001\u0000\u0000\u0000\u03e2\u03e3\u0005x\u0000"+
+ "\u0000\u03e3\u03e4\u0005o\u0000\u0000\u03e4\u03e5\u0005r\u0000\u0000\u03e5"+
+ "\u00d4\u0001\u0000\u0000\u0000\u000b\u0000\u00df\u00e6\u00eb\u00f1\u00f6"+
+ "\u00f8\u0101\u0104\u0109\u010b\u0001\u0006\u0000\u0000";
+ public static final ATN _ATN =
+ new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+ static {
+ _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+ for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+ _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.tokens b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.tokens
new file mode 100644
index 0000000..d8e5e9d
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditLexer.tokens
@@ -0,0 +1,203 @@
+T__0=1
+T__1=2
+T__2=3
+WS=4
+Integer=5
+Real=6
+String=7
+Ident=8
+ABOUT=9
+ABSTRACT=10
+ALIAS=11
+ALL=12
+AND=13
+AS=14
+ASSIGN=15
+ASSOC=16
+BEAHVIOR=17
+BINDING=18
+BOOL=19
+BY=20
+CHAINS=21
+CLASS=22
+CLASSIFIER=23
+COMMENT=24
+COMPOSITE=25
+CONJUGATE=26
+CONJUGATES=27
+CONJUGATION=28
+CONNECTOR=29
+DATATYPE=30
+DEFAULT=31
+DEPENDENCY=32
+DERIVED=33
+DIFFERENCES=34
+DISJOINING=35
+DISJOINT=36
+DOC=37
+ELSE=38
+END=39
+EXPR=40
+FALSE=41
+FEATURE=42
+FEATURED=43
+FEATURING=44
+FILTER=45
+FIRST=46
+FLOW=47
+FOR=48
+FROM=49
+FUNCTION=50
+HASTYPE=51
+IF=52
+INTERSECTS=53
+IMPLIES=54
+IMPORT=55
+IN=56
+INPUT=57
+INTERACTION=58
+INV=59
+INVERSE=60
+INVERTING=61
+ISTYPE=62
+LANGUAGE=63
+MEMBER=64
+METACLASS=65
+METADATA=66
+MULTIPLICITY=67
+NAMESPACE=68
+NONUNIQUE=69
+NOT=70
+NULL=71
+OF=72
+OR=73
+ORDERED=74
+OUT=75
+PACKAGE=76
+PORTION=77
+PREDICATE=78
+PRIAVTE=79
+PROTECTED=80
+PUBLIC=81
+READONLY=82
+REDEFINES=83
+REDEFINITION=84
+RFERENCES=85
+REP=86
+RETURN=87
+SPECIALIZTION=88
+SPECIALIZES=89
+STEP=90
+STRCUT=91
+SUBCLASSIFIER=92
+SUBSET=93
+SUBSETS=94
+SUBTYPE=95
+SUCCESSION=96
+THEN=97
+TO=98
+TRUE=99
+TYPE=100
+TYPED=101
+TYPING=102
+UNIONS=103
+XOR=104
+':'=1
+'='=2
+'.*'=3
+'about'=9
+'abstract'=10
+'alias'=11
+'all'=12
+'and'=13
+'as'=14
+'assign'=15
+'assoc'=16
+'behavior'=17
+'binding'=18
+'bool'=19
+'by'=20
+'chains'=21
+'class'=22
+'classifier'=23
+'comment'=24
+'composite'=25
+'conjugate'=26
+'conjugates'=27
+'conjugation'=28
+'connector'=29
+'datatype'=30
+'default'=31
+'dependency'=32
+'derived'=33
+'differences'=34
+'disjoining'=35
+'disjoint'=36
+'doc'=37
+'else'=38
+'END'=39
+'expr'=40
+'false'=41
+'feature'=42
+'featured'=43
+'featuring'=44
+'filter'=45
+'first'=46
+'flow'=47
+'for'=48
+'from'=49
+'function'=50
+'hastype'=51
+'if'=52
+'intersects'=53
+'implies'=54
+'import'=55
+'in'=56
+'inout'=57
+'interaction'=58
+'inv'=59
+'inverse'=60
+'inverting'=61
+'istype'=62
+'language'=63
+'member'=64
+'metaclass'=65
+'metadata'=66
+'multiplicity'=67
+'namespace'=68
+'nonunique'=69
+'not'=70
+'null'=71
+'of'=72
+'or'=73
+'ordered'=74
+'out'=75
+'package'=76
+'portion'=77
+'predicate'=78
+'private'=79
+'protected'=80
+'public'=81
+'readonly'=82
+'redefines'=83
+'redefinition'=84
+'references'=85
+'rep'=86
+'return'=87
+'specialization'=88
+'specializes'=89
+'step'=90
+'struct'=91
+'subclassifier'=92
+'subset'=93
+'subsets'=94
+'subtype'=95
+'succession'=96
+'then'=97
+'to'=98
+'true'=99
+'type'=100
+'typed'=101
+'typing'=102
+'unions'=103
+'xor'=104
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditListener.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditListener.java
new file mode 100644
index 0000000..1e6ac53
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditListener.java
@@ -0,0 +1,54 @@
+// Generated from DirectEdit.g4 by ANTLR 4.10.1
+
+/*******************************************************************************
+ * Copyright (c) 2023 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.directedit.grammars.generated;
+
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+
+/**
+ * This interface defines a complete listener for a parse tree produced by
+ * {@link DirectEditParser}.
+ */
+public interface DirectEditListener extends ParseTreeListener {
+ /**
+ * Enter a parse tree produced by {@link DirectEditParser#expression}.
+ * @param ctx the parse tree
+ */
+ void enterExpression(DirectEditParser.ExpressionContext ctx);
+ /**
+ * Exit a parse tree produced by {@link DirectEditParser#expression}.
+ * @param ctx the parse tree
+ */
+ void exitExpression(DirectEditParser.ExpressionContext ctx);
+ /**
+ * Enter a parse tree produced by {@link DirectEditParser#typingExpression}.
+ * @param ctx the parse tree
+ */
+ void enterTypingExpression(DirectEditParser.TypingExpressionContext ctx);
+ /**
+ * Exit a parse tree produced by {@link DirectEditParser#typingExpression}.
+ * @param ctx the parse tree
+ */
+ void exitTypingExpression(DirectEditParser.TypingExpressionContext ctx);
+ /**
+ * Enter a parse tree produced by {@link DirectEditParser#valueExpression}.
+ * @param ctx the parse tree
+ */
+ void enterValueExpression(DirectEditParser.ValueExpressionContext ctx);
+ /**
+ * Exit a parse tree produced by {@link DirectEditParser#valueExpression}.
+ * @param ctx the parse tree
+ */
+ void exitValueExpression(DirectEditParser.ValueExpressionContext ctx);
+}
\ No newline at end of file
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditParser.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditParser.java
new file mode 100644
index 0000000..1298bf3
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/grammars/generated/DirectEditParser.java
@@ -0,0 +1,318 @@
+// Generated from DirectEdit.g4 by ANTLR 4.10.1
+
+/*******************************************************************************
+ * Copyright (c) 2023 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.directedit.grammars.generated;
+
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class DirectEditParser extends Parser {
+ static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); }
+
+ protected static final DFA[] _decisionToDFA;
+ protected static final PredictionContextCache _sharedContextCache =
+ new PredictionContextCache();
+ public static final int
+ T__0=1, T__1=2, T__2=3, WS=4, Integer=5, Real=6, String=7, Ident=8, ABOUT=9,
+ ABSTRACT=10, ALIAS=11, ALL=12, AND=13, AS=14, ASSIGN=15, ASSOC=16, BEAHVIOR=17,
+ BINDING=18, BOOL=19, BY=20, CHAINS=21, CLASS=22, CLASSIFIER=23, COMMENT=24,
+ COMPOSITE=25, CONJUGATE=26, CONJUGATES=27, CONJUGATION=28, CONNECTOR=29,
+ DATATYPE=30, DEFAULT=31, DEPENDENCY=32, DERIVED=33, DIFFERENCES=34, DISJOINING=35,
+ DISJOINT=36, DOC=37, ELSE=38, END=39, EXPR=40, FALSE=41, FEATURE=42, FEATURED=43,
+ FEATURING=44, FILTER=45, FIRST=46, FLOW=47, FOR=48, FROM=49, FUNCTION=50,
+ HASTYPE=51, IF=52, INTERSECTS=53, IMPLIES=54, IMPORT=55, IN=56, INPUT=57,
+ INTERACTION=58, INV=59, INVERSE=60, INVERTING=61, ISTYPE=62, LANGUAGE=63,
+ MEMBER=64, METACLASS=65, METADATA=66, MULTIPLICITY=67, NAMESPACE=68, NONUNIQUE=69,
+ NOT=70, NULL=71, OF=72, OR=73, ORDERED=74, OUT=75, PACKAGE=76, PORTION=77,
+ PREDICATE=78, PRIAVTE=79, PROTECTED=80, PUBLIC=81, READONLY=82, REDEFINES=83,
+ REDEFINITION=84, RFERENCES=85, REP=86, RETURN=87, SPECIALIZTION=88, SPECIALIZES=89,
+ STEP=90, STRCUT=91, SUBCLASSIFIER=92, SUBSET=93, SUBSETS=94, SUBTYPE=95,
+ SUCCESSION=96, THEN=97, TO=98, TRUE=99, TYPE=100, TYPED=101, TYPING=102,
+ UNIONS=103, XOR=104;
+ public static final int
+ RULE_expression = 0, RULE_typingExpression = 1, RULE_valueExpression = 2;
+ private static String[] makeRuleNames() {
+ return new String[] {
+ "expression", "typingExpression", "valueExpression"
+ };
+ }
+ public static final String[] ruleNames = makeRuleNames();
+
+ private static String[] makeLiteralNames() {
+ return new String[] {
+ null, "':'", "'='", "'.*'", null, null, null, null, null, "'about'",
+ "'abstract'", "'alias'", "'all'", "'and'", "'as'", "'assign'", "'assoc'",
+ "'behavior'", "'binding'", "'bool'", "'by'", "'chains'", "'class'", "'classifier'",
+ "'comment'", "'composite'", "'conjugate'", "'conjugates'", "'conjugation'",
+ "'connector'", "'datatype'", "'default'", "'dependency'", "'derived'",
+ "'differences'", "'disjoining'", "'disjoint'", "'doc'", "'else'", "'END'",
+ "'expr'", "'false'", "'feature'", "'featured'", "'featuring'", "'filter'",
+ "'first'", "'flow'", "'for'", "'from'", "'function'", "'hastype'", "'if'",
+ "'intersects'", "'implies'", "'import'", "'in'", "'inout'", "'interaction'",
+ "'inv'", "'inverse'", "'inverting'", "'istype'", "'language'", "'member'",
+ "'metaclass'", "'metadata'", "'multiplicity'", "'namespace'", "'nonunique'",
+ "'not'", "'null'", "'of'", "'or'", "'ordered'", "'out'", "'package'",
+ "'portion'", "'predicate'", "'private'", "'protected'", "'public'", "'readonly'",
+ "'redefines'", "'redefinition'", "'references'", "'rep'", "'return'",
+ "'specialization'", "'specializes'", "'step'", "'struct'", "'subclassifier'",
+ "'subset'", "'subsets'", "'subtype'", "'succession'", "'then'", "'to'",
+ "'true'", "'type'", "'typed'", "'typing'", "'unions'", "'xor'"
+ };
+ }
+ private static final String[] _LITERAL_NAMES = makeLiteralNames();
+ private static String[] makeSymbolicNames() {
+ return new String[] {
+ null, null, null, null, "WS", "Integer", "Real", "String", "Ident", "ABOUT",
+ "ABSTRACT", "ALIAS", "ALL", "AND", "AS", "ASSIGN", "ASSOC", "BEAHVIOR",
+ "BINDING", "BOOL", "BY", "CHAINS", "CLASS", "CLASSIFIER", "COMMENT",
+ "COMPOSITE", "CONJUGATE", "CONJUGATES", "CONJUGATION", "CONNECTOR", "DATATYPE",
+ "DEFAULT", "DEPENDENCY", "DERIVED", "DIFFERENCES", "DISJOINING", "DISJOINT",
+ "DOC", "ELSE", "END", "EXPR", "FALSE", "FEATURE", "FEATURED", "FEATURING",
+ "FILTER", "FIRST", "FLOW", "FOR", "FROM", "FUNCTION", "HASTYPE", "IF",
+ "INTERSECTS", "IMPLIES", "IMPORT", "IN", "INPUT", "INTERACTION", "INV",
+ "INVERSE", "INVERTING", "ISTYPE", "LANGUAGE", "MEMBER", "METACLASS",
+ "METADATA", "MULTIPLICITY", "NAMESPACE", "NONUNIQUE", "NOT", "NULL",
+ "OF", "OR", "ORDERED", "OUT", "PACKAGE", "PORTION", "PREDICATE", "PRIAVTE",
+ "PROTECTED", "PUBLIC", "READONLY", "REDEFINES", "REDEFINITION", "RFERENCES",
+ "REP", "RETURN", "SPECIALIZTION", "SPECIALIZES", "STEP", "STRCUT", "SUBCLASSIFIER",
+ "SUBSET", "SUBSETS", "SUBTYPE", "SUCCESSION", "THEN", "TO", "TRUE", "TYPE",
+ "TYPED", "TYPING", "UNIONS", "XOR"
+ };
+ }
+ private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+ public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+ /**
+ * @deprecated Use {@link #VOCABULARY} instead.
+ */
+ @Deprecated
+ public static final String[] tokenNames;
+ static {
+ tokenNames = new String[_SYMBOLIC_NAMES.length];
+ for (int i = 0; i < tokenNames.length; i++) {
+ tokenNames[i] = VOCABULARY.getLiteralName(i);
+ if (tokenNames[i] == null) {
+ tokenNames[i] = VOCABULARY.getSymbolicName(i);
+ }
+
+ if (tokenNames[i] == null) {
+ tokenNames[i] = "";
+ }
+ }
+ }
+
+ @Override
+ @Deprecated
+ public String[] getTokenNames() {
+ return tokenNames;
+ }
+
+ @Override
+
+ public Vocabulary getVocabulary() {
+ return VOCABULARY;
+ }
+
+ @Override
+ public String getGrammarFileName() { return "DirectEdit.g4"; }
+
+ @Override
+ public String[] getRuleNames() { return ruleNames; }
+
+ @Override
+ public String getSerializedATN() { return _serializedATN; }
+
+ @Override
+ public ATN getATN() { return _ATN; }
+
+ public DirectEditParser(TokenStream input) {
+ super(input);
+ _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+ }
+
+ public static class ExpressionContext extends ParserRuleContext {
+ public TerminalNode Ident() { return getToken(DirectEditParser.Ident, 0); }
+ public TerminalNode EOF() { return getToken(DirectEditParser.EOF, 0); }
+ public TypingExpressionContext typingExpression() {
+ return getRuleContext(TypingExpressionContext.class,0);
+ }
+ public ValueExpressionContext valueExpression() {
+ return getRuleContext(ValueExpressionContext.class,0);
+ }
+ public ExpressionContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_expression; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterExpression(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitExpression(this);
+ }
+ }
+
+ public final ExpressionContext expression() throws RecognitionException {
+ ExpressionContext _localctx = new ExpressionContext(_ctx, getState());
+ enterRule(_localctx, 0, RULE_expression);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(6);
+ match(Ident);
+ setState(8);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==T__0) {
+ {
+ setState(7);
+ typingExpression();
+ }
+ }
+
+ setState(11);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==T__1) {
+ {
+ setState(10);
+ valueExpression();
+ }
+ }
+
+ setState(13);
+ match(EOF);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class TypingExpressionContext extends ParserRuleContext {
+ public TerminalNode Ident() { return getToken(DirectEditParser.Ident, 0); }
+ public TypingExpressionContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_typingExpression; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterTypingExpression(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitTypingExpression(this);
+ }
+ }
+
+ public final TypingExpressionContext typingExpression() throws RecognitionException {
+ TypingExpressionContext _localctx = new TypingExpressionContext(_ctx, getState());
+ enterRule(_localctx, 2, RULE_typingExpression);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(15);
+ match(T__0);
+ setState(16);
+ match(Ident);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ValueExpressionContext extends ParserRuleContext {
+ public ValueExpressionContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_valueExpression; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterValueExpression(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitValueExpression(this);
+ }
+ }
+
+ public final ValueExpressionContext valueExpression() throws RecognitionException {
+ ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState());
+ enterRule(_localctx, 4, RULE_valueExpression);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(18);
+ match(T__1);
+ setState(19);
+ match(T__2);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static final String _serializedATN =
+ "\u0004\u0001h\u0016\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+
+ "\u0002\u0007\u0002\u0001\u0000\u0001\u0000\u0003\u0000\t\b\u0000\u0001"+
+ "\u0000\u0003\u0000\f\b\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001"+
+ "\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0000"+
+ "\u0000\u0003\u0000\u0002\u0004\u0000\u0000\u0014\u0000\u0006\u0001\u0000"+
+ "\u0000\u0000\u0002\u000f\u0001\u0000\u0000\u0000\u0004\u0012\u0001\u0000"+
+ "\u0000\u0000\u0006\b\u0005\b\u0000\u0000\u0007\t\u0003\u0002\u0001\u0000"+
+ "\b\u0007\u0001\u0000\u0000\u0000\b\t\u0001\u0000\u0000\u0000\t\u000b\u0001"+
+ "\u0000\u0000\u0000\n\f\u0003\u0004\u0002\u0000\u000b\n\u0001\u0000\u0000"+
+ "\u0000\u000b\f\u0001\u0000\u0000\u0000\f\r\u0001\u0000\u0000\u0000\r\u000e"+
+ "\u0005\u0000\u0000\u0001\u000e\u0001\u0001\u0000\u0000\u0000\u000f\u0010"+
+ "\u0005\u0001\u0000\u0000\u0010\u0011\u0005\b\u0000\u0000\u0011\u0003\u0001"+
+ "\u0000\u0000\u0000\u0012\u0013\u0005\u0002\u0000\u0000\u0013\u0014\u0005"+
+ "\u0003\u0000\u0000\u0014\u0005\u0001\u0000\u0000\u0000\u0002\b\u000b";
+ public static final ATN _ATN =
+ new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+ static {
+ _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+ for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+ _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/AbstractNodeDescriptionProvider.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/AbstractNodeDescriptionProvider.java
index 9a445b7..05816d3 100644
--- a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/AbstractNodeDescriptionProvider.java
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/AbstractNodeDescriptionProvider.java
@@ -282,15 +282,24 @@ protected NodeStyleDescription createUsageCompartmentItemNodeStyle() {
}
protected NodePalette createDefaultNodePalette() {
- var changeContext = this.viewBuilderHelper.newChangeContext()
+ var callDeleteService = this.viewBuilderHelper.newChangeContext()
.expression(AQLConstants.AQL_SELF + ".deleteFromModel()");
var deleteTool = this.diagramBuilderHelper.newDeleteTool()
.name("Delete from Model")
- .body(changeContext.build());
+ .body(callDeleteService.build());
+
+ var callEditService = this.viewBuilderHelper.newChangeContext()
+ .expression(AQLConstants.AQL_SELF + ".directEdit(newLabel)");
+
+ var editTool = this.diagramBuilderHelper.newLabelEditTool()
+ .name("Edit")
+ .initialDirectEditLabelExpression(AQLConstants.AQL_SELF + ".getInitialDirectEditLabel()")
+ .body(callEditService.build());
return this.diagramBuilderHelper.newNodePalette()
.deleteTool(deleteTool.build())
+ .labelEditTool(editTool.build())
.build();
}
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewLabelService.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewLabelService.java
index ef6d0ee..7b91bde 100644
--- a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewLabelService.java
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewLabelService.java
@@ -12,8 +12,16 @@
*******************************************************************************/
package org.eclipse.syson.diagram.general.view.services;
+import org.antlr.v4.runtime.CharStreams;
+import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.eclipse.syson.diagram.general.view.GeneralViewDiagramDescriptionProvider;
import org.eclipse.syson.diagram.general.view.LabelConstants;
+import org.eclipse.syson.diagram.general.view.directedit.GeneralViewDirectEditListener;
+import org.eclipse.syson.diagram.general.view.directedit.grammars.generated.DirectEditLexer;
+import org.eclipse.syson.diagram.general.view.directedit.grammars.generated.DirectEditListener;
+import org.eclipse.syson.diagram.general.view.directedit.grammars.generated.DirectEditParser;
import org.eclipse.syson.sysml.Dependency;
import org.eclipse.syson.sysml.Element;
@@ -46,4 +54,35 @@ public String getDependencyEdgeLabel(Dependency dependency) {
return LabelConstants.OPEN_QUOTE + "dependency" + LabelConstants.CLOSE_QUOTE + LabelConstants.CR + dependency.getDeclaredName();
}
+ /**
+ * Apply the direct edit result (i.e. the newLabel) to the given {@link Element}.
+ *
+ * @param element
+ * the given {@link Element}.
+ * @param newLabel
+ * the new value to apply.
+ * @return the given {@link Element}.
+ */
+ public Element directEdit(Element element, String newLabel) {
+ DirectEditLexer lexer = new DirectEditLexer(CharStreams.fromString(newLabel));
+ CommonTokenStream tokens = new CommonTokenStream(lexer);
+ DirectEditParser parser = new DirectEditParser(tokens);
+ ParseTree tree = parser.expression();
+
+ ParseTreeWalker walker = new ParseTreeWalker();
+ DirectEditListener listener = new GeneralViewDirectEditListener(element);
+ walker.walk(listener, tree);
+ return element;
+ }
+
+ /**
+ * Get the value to display when a direct edit has been called on the given {@link Element}.
+ *
+ * @param element
+ * the given {@link Element}.
+ * @return the value to display.
+ */
+ public String getInitialDirectEditLabel(Element element) {
+ return element.getDeclaredName();
+ }
}
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewUtilService.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewUtilService.java
index 5304e3d..445ca12 100644
--- a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewUtilService.java
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewUtilService.java
@@ -12,6 +12,9 @@
*******************************************************************************/
package org.eclipse.syson.diagram.general.view.services;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.Spliterator;
import java.util.Spliterators;
@@ -21,12 +24,14 @@
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.syson.diagram.general.view.GeneralViewDiagramDescriptionProvider;
import org.eclipse.syson.diagram.general.view.SysMLMetamodelHelper;
+import org.eclipse.syson.sysml.Definition;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.Package;
@@ -127,6 +132,102 @@ public List getAllReachable(EObject eObject, EClass eClass, boolean wit
}
}
+ /**
+ * Find a {@link Definition} element that match the given name in the ResourceSet of the given element.
+ *
+ * @param object
+ * the object for which to find a corresponding type.
+ * @param typeName
+ * the type name to match.
+ * @return the found {@link Definition} element or null
+ */
+ public Definition findDefinitionByName(EObject object, String typeName) {
+ final Definition result = this.findDefinitionByName(this.getAllRootsInResourceSet(object), typeName);
+ return result;
+ }
+
+ /**
+ * Iterate over the given {@link Collection} of root elements to find a {@link Definition} element with the given
+ * name.
+ *
+ * @param roots
+ * the elements to inspect
+ * @param typeName
+ * the name to match
+ * @return the found {@link Definition} or null
+ */
+ public Definition findDefinitionByName(Collection roots, String typeName) {
+ for (final EObject root : roots) {
+ final Definition result = this.findDefinitionByNameFrom(root, typeName);
+ if (result != null) {
+ return result;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Iterate over the root children to find a {@link Definition} element with the given name.
+ *
+ * @param root
+ * the root object to iterate.
+ * @param typeName
+ * the name to match
+ * @return the found {@link Definition} or null
+ */
+ private Definition findDefinitionByNameFrom(EObject root, String typeName) {
+ Definition definition = null;
+
+ if (root instanceof Definition && this.nameMatches((Definition) root, typeName)) {
+ return (Definition) root;
+ }
+
+ TreeIterator eAllContents = root.eAllContents();
+ while (eAllContents.hasNext()) {
+ EObject obj = eAllContents.next();
+ if (obj instanceof Definition && this.nameMatches((Definition) obj, typeName)) {
+ definition = (Definition) obj;
+ }
+ }
+
+ return definition;
+ }
+
+ /**
+ * Retrieves all the root elements of the resource in the resource set of the given context object.
+ *
+ * @param context
+ * the context object on which to execute this service.
+ * @return a {@link Collection} of all the root element of the current resource set.
+ */
+ private Collection getAllRootsInResourceSet(EObject context) {
+ final Resource res = context.eResource();
+ if (res != null && res.getResourceSet() != null) {
+ final Collection roots = new ArrayList<>();
+ for (final Resource childRes : res.getResourceSet().getResources()) {
+ roots.addAll(childRes.getContents());
+ }
+ return roots;
+ }
+ return Collections.emptyList();
+ }
+
+ /**
+ * Check if the given element's name match the given String.
+ *
+ * @param element
+ * the {@link Element} to check.
+ * @param name
+ * the name to match.
+ * @return true
if the name match, false
otherwise.
+ */
+ private boolean nameMatches(Element element, String name) {
+ if (element != null && element.getName() != null && name != null) {
+ return element.getName().trim().equalsIgnoreCase(name.trim());
+ }
+ return false;
+ }
+
private Stream getSysMLv2Resources(EList resources) {
return resources.stream().filter(r -> !r.getContents().isEmpty() && r.getContents().get(0) instanceof Element);
}
diff --git a/backend/views/syson-diagram-general-view/src/main/resources/DirectEdit.g4 b/backend/views/syson-diagram-general-view/src/main/resources/DirectEdit.g4
new file mode 100644
index 0000000..a80d62c
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/resources/DirectEdit.g4
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+grammar DirectEdit;
+
+@header {
+/*******************************************************************************
+ * Copyright (c) 2023 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.directedit.grammars.generated;
+}
+
+expression :
+ Ident (typingExpression)? (valueExpression)? EOF
+;
+
+typingExpression :
+ ':' Ident
+;
+
+valueExpression :
+ '=' '.*'
+;
+
+WS :
+ [ \t\r\n\u000C]+ -> skip
+;
+
+Integer :
+ [0-9]+
+;
+
+Real :
+ [0-9]+'.'[0-9]+
+;
+
+String :
+ '\'' (Escape|.)*? '\''
+;
+
+fragment Escape : '\\\\' | '\\\''
+;
+
+Ident :
+ '_'? Letter (Letter | [0-9] | '_')*
+;
+
+fragment Letter : [a-zA-Z]
+;
+
+// Reserved Keywords
+
+ABOUT : 'about';
+ABSTRACT : 'abstract';
+ALIAS : 'alias';
+ALL : 'all';
+AND : 'and';
+AS : 'as';
+ASSIGN : 'assign';
+ASSOC : 'assoc';
+BEAHVIOR : 'behavior';
+BINDING : 'binding';
+BOOL : 'bool';
+BY : 'by';
+CHAINS : 'chains';
+CLASS : 'class';
+CLASSIFIER : 'classifier';
+COMMENT : 'comment';
+COMPOSITE : 'composite';
+CONJUGATE : 'conjugate';
+CONJUGATES : 'conjugates';
+CONJUGATION : 'conjugation';
+CONNECTOR : 'connector';
+DATATYPE : 'datatype';
+DEFAULT : 'default';
+DEPENDENCY : 'dependency';
+DERIVED : 'derived';
+DIFFERENCES : 'differences';
+DISJOINING : 'disjoining';
+DISJOINT : 'disjoint';
+DOC : 'doc';
+ELSE : 'else';
+END : 'END';
+EXPR : 'expr';
+FALSE : 'false';
+FEATURE : 'feature';
+FEATURED : 'featured';
+FEATURING : 'featuring';
+FILTER : 'filter';
+FIRST : 'first';
+FLOW : 'flow';
+FOR : 'for';
+FROM : 'from';
+FUNCTION : 'function';
+HASTYPE: 'hastype';
+IF : 'if';
+INTERSECTS : 'intersects';
+IMPLIES : 'implies';
+IMPORT : 'import';
+IN : 'in';
+INPUT : 'inout';
+INTERACTION : 'interaction';
+INV : 'inv';
+INVERSE : 'inverse';
+INVERTING : 'inverting';
+ISTYPE : 'istype';
+LANGUAGE : 'language';
+MEMBER : 'member';
+METACLASS : 'metaclass';
+METADATA : 'metadata';
+MULTIPLICITY : 'multiplicity';
+NAMESPACE : 'namespace';
+NONUNIQUE : 'nonunique';
+NOT : 'not';
+NULL : 'null';
+OF : 'of';
+OR : 'or';
+ORDERED : 'ordered';
+OUT : 'out';
+PACKAGE : 'package';
+PORTION : 'portion';
+PREDICATE : 'predicate';
+PRIAVTE : 'private';
+PROTECTED : 'protected';
+PUBLIC : 'public';
+READONLY : 'readonly';
+REDEFINES : 'redefines';
+REDEFINITION : 'redefinition';
+RFERENCES : 'references';
+REP : 'rep';
+RETURN : 'return';
+SPECIALIZTION : 'specialization';
+SPECIALIZES : 'specializes';
+STEP : 'step';
+STRCUT : 'struct';
+SUBCLASSIFIER : 'subclassifier';
+SUBSET : 'subset';
+SUBSETS : 'subsets';
+SUBTYPE : 'subtype';
+SUCCESSION : 'succession';
+THEN : 'then';
+TO : 'to';
+TRUE : 'true';
+TYPE : 'type';
+TYPED : 'typed';
+TYPING : 'typing';
+UNIONS : 'unions';
+XOR: 'xor';
diff --git a/doc/adrs/000_adopt_adrs.adoc b/doc/adrs/000_adopt_adrs.adoc
new file mode 100644
index 0000000..0148916
--- /dev/null
+++ b/doc/adrs/000_adopt_adrs.adoc
@@ -0,0 +1,58 @@
+= ADR-000 - Adopt Architecture Decision Records
+
+== Context
+
+Architecture for agile projects has to be described and defined differently. Not all decisions will be made at once, nor will all of them be done when the project begins.
+
+Agile methods are not opposed to documentation, only to valueless documentation. Documents that assist the team itself can have value, but only if they are kept up to date. Large documents are never kept up to date. Small, modular documents have at least a chance at being updated.
+
+Nobody ever reads large documents, either. Most developers have been on at least one project where the specification document was larger (in bytes) than the total source code size. Those documents are too large to open, read, or update. Bite sized pieces are easier for all stakeholders to consume.
+
+One of the hardest things to track during the life of a project is the motivation behind certain decisions. A new person coming on to a project may be perplexed, baffled, delighted, or infuriated by some past decision. Without understanding the rationale or consequences, this person has only two choices:
+
+1. _Blindly accept the decision._ This response may be OK, if the decision is still valid. It may not be good, however, if the context has changed and the decision should really be revisited. If the project accumulates too many decisions accepted without understanding, then the development team becomes afraid to change anything and the project collapses under its own weight.
+2. _Blindly change it._ Again, this may be OK if the decision needs to be reversed. On the other hand, changing the decision without understanding its motivation or consequences could mean damaging the project's overall value without realizing it. (E.g., the decision supported a non-functional requirement that hasn't been tested yet.)
+
+It's better to avoid either blind acceptance or blind reversal.
+
+== Decision
+
+We will keep a collection of records for "architecturally significant" decisions: those that affect the structure, non-functional characteristics, dependencies, interfaces, or construction techniques.
+
+An architecture decision record is a short text file in a format similar to an Alexandrian pattern. (Though the decisions themselves are not necessarily patterns, they share the characteristic balancing of forces.) Each record describes a set of forces and a single decision in response to those forces. Note that the decision is the central piece here, so specific forces may appear in multiple ADRs.
+
+We will keep ADRs in the project repository under `doc/adrs/adr-NNN.md`.
+
+We should use a lightweight text formatting language like AsciiDoc.
+
+ADRs will be numbered sequentially and monotonically. Numbers will not be reused.
+
+If a decision is reversed, we will keep the old one around, but mark it as superseded. (It's still relevant to know that it was the decision, but is no longer the decision.)
+
+We will use a format with just a few parts, so each document is easy to digest. The format has just a few parts.
+
+* __Title__: These documents have names that are short noun phrases. For example, "ADR 1: Deployment on Ruby on Rails 3.0.10" or "ADR 9: LDAP for Multitenant Integration"
+* __Context__: This section describes the forces at play, including technological, political, social, and project local. These forces are probably in tension, and should be called out as such. The language in this section is value-neutral. It is simply describing facts.
+* __Decision__: This section describes our response to these forces. It is stated in full sentences, with active voice. "We will ..."
+* __Status__: A decision may be "proposed" if the project stakeholders haven't agreed with it yet, or "accepted" once it is agreed. If a later ADR changes or reverses a decision, it may be marked as "deprecated" or "superseded" with a reference to its replacement.
+* __Consequences__: This section describes the resulting context, after applying the decision. All consequences should be listed here, not just the "positive" ones. A particular decision may have positive, negative, and neutral consequences, but all of them affect the team and project in the future.
+
+The whole document should be one or two pages long. We will write each ADR as if it is a conversation with a future developer. This requires good writing style, with full sentences organized into paragraphs. Bullets are acceptable only for visual style, not as an excuse for writing sentence fragments. (Bullets kill people, even PowerPoint bullets.)
+
+== Status
+
+Accepted.
+
+== Consequences
+
+One ADR describes one significant decision for a specific project. It should be something that has an effect on how the rest of the project will run.
+
+The consequences of one ADR are very likely to become the context for subsequent ADRs. This is also similar to Alexander's idea of a pattern language: the large-scale responses create spaces for the smaller scale to fit into.
+
+Developers and project stakeholders can see the ADRs, even as the team composition changes over time.
+
+The motivation behind previous decisions is visible for everyone, present and future. Nobody is left scratching their heads to understand, "What were they thinking?" and the time to change old decisions will be clear from changes in the project's context.
+
+== References
+
+* http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions[The original article] from Michael Nygard.
diff --git a/doc/adrs/001_support_direct_edit_in diagrams.adoc b/doc/adrs/001_support_direct_edit_in diagrams.adoc
new file mode 100644
index 0000000..b712c44
--- /dev/null
+++ b/doc/adrs/001_support_direct_edit_in diagrams.adoc
@@ -0,0 +1,47 @@
+= ADR-001 - Support direct edit in diagrams
+
+== Context
+
+In General View diagram (and maybe other diagrams existing in the future), we need to perform direct edit (e.g. renaming an element) on some diagram elements (i.e. nodes and edges).
+
+Change the name of a SysML element is the easiest case while performing a direct edit.
+But there are many other direct edit much moe complex than simply change the name of an element.
+
+For example, the General View diagram displays `PartUsage` as container node.
+These container node contains a compartment for its attributes (i.e. `AttributeUsage`).
+An `AttributeUsage` may have a type, may redefine another `AttributeUsage`, may have a value (simple or complex) affected, ...
+Furthermore, an `AttributeUsage` can be represented as a compartment node inside a `Usage`` container node, but can also be represented as a container node.
+Depending on this kind of node, we do not want to display the same level of information, and we do not want to edit the same level of information.
+
+We also want to create elements on the fly.
+For example, on an `AttributeUsage` that only have a name 'attr1', performing a direct edit from `attr1` to `attr1 : MyType` should create a `FeatureTyping` element and reference the type `MyType` in this newly created `FeatureTyping`.
+But it should also create the type `MyType` if it does not exist.
+
+We also want to delete elements on the fly.
+For example, on an `AttributeUsage` 'attr1' that redefines another `AttributeUsage` 'attr2' (meaning a `Redefinition` element exists under `attr1` and references `attr2`), performing a direct edit from `attr1 :>> attr2` to `attr1` should delete the `Redefinition` element existing under `attr1`.
+
+These examples give a small insight of what can be done with the direct edit.
+
+== Decision
+
+For simple cases, the usage of `String.split(...)` or a regular expression may be the technical solution to handle the direct edit.
+For complex cases (like the ones described above), a parser could help to manage this complexity (several elements to update/create/delete, optional parts...).
+
+The decision is to use ANTLR parser to handle these complex cases.
+It will be used to create grammars dedicated to parse these complex cases.
+The first use case will be the direct edit of all `Usage` elements (`AttributeUsage`, `PartUsage`, `PortUsage`, ...) that are represented as compartment nodes inside node containers.
+Other use cases (unknown at the moment) may also use the same grammar or new ones depending on the context.
+
+== Status
+
+To be reviewed.
+
+== Consequences
+
+`syson-diagram-general-view` will depend on `antlr4-runtime` as maven dependency.
+The version used will be the same as Sirius Web, ANTLR 4.10.1.
+SysON will keep its version of ANTLR synchronized with the Sirius Web one.
+
+== References
+
+- https://www.antlr.org/
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..3fde3ba
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,63 @@
+
+
+
+ 4.0.0
+
+ org.eclipse.syson
+ syson
+ 2023.10.8
+
+ syson
+ SysON
+ pom
+
+
+
+ dash-licenses-snapshots
+ https://repo.eclipse.org/content/repositories/dash-licenses-snapshots/
+
+ true
+
+
+
+
+
+ /backend
+
+
+
+
+ verify-iplog
+
+
+
+ org.eclipse.dash
+ license-tool-plugin
+ 0.0.1-SNAPSHOT
+
+
+ license-check
+ compile
+
+ license-check
+
+
+
+
+
+
+
+
+