diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/StringLiteralCopyPasteProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/StringLiteralCopyPasteProcessor.java index 1f6c01625a0d..31ffdc25d1a7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/StringLiteralCopyPasteProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/StringLiteralCopyPasteProcessor.java @@ -168,7 +168,7 @@ public class StringLiteralCopyPasteProcessor implements CopyPastePreProcessor { } @Nullable - private PsiElement findLiteralTokenType(PsiFile file, int selectionStart, int selectionEnd) { + protected PsiElement findLiteralTokenType(PsiFile file, int selectionStart, int selectionEnd) { final PsiElement elementAtSelectionStart = file.findElementAt(selectionStart); if (elementAtSelectionStart == null) { return null; diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java index d47140d2ecd1..7d0de9000100 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java @@ -1,10 +1,11 @@ package org.jetbrains.jps.incremental; import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.ether.dependencyView.ClassRepr; import org.jetbrains.ether.dependencyView.Mappings; -import org.jetbrains.jps.Module; import org.jetbrains.jps.ModuleChunk; +import org.jetbrains.jps.PathUtil; import org.jetbrains.jps.incremental.storage.TimestampStorage; import java.io.File; @@ -101,19 +102,35 @@ public abstract class Builder { return additionalPassRequired; } - private static boolean chunkContainsAffectedFiles(CompileContext context, ModuleChunk chunk, final Set affected) throws Exception { - final Ref result = new Ref(false); - // todo: avoid calling processFiles to implement this logic - context.processFiles(chunk, new FileProcessor() { - public boolean apply(Module module, File file, String sourceRoot) throws Exception { - if (affected.contains(file)) { - result.set(true); - return false; + // delete all class files that according to mappings correspond to given sources + public static void deleteCorrespondingClasses(CompileContext context, Collection sources) { + if (context.isMake() && !sources.isEmpty()) { + final Mappings mappings = context.getMappings(); + for (File file : sources) { + final Set classes = mappings.getClasses(FileUtil.toSystemIndependentName(file.getPath())); + if (classes != null) { + for (ClassRepr aClass : classes) { + final String fileName = aClass.getFileName(); + if (fileName != null) { + FileUtil.delete(new File(fileName)); + } + } } + } + } + } + + private static boolean chunkContainsAffectedFiles(CompileContext context, ModuleChunk chunk, final Set affected) throws Exception { + final Set chunkRoots = new HashSet(); + for (String r : context.isCompilingTests() ? chunk.getTestRoots() : chunk.getSourceRoots()) { + chunkRoots.add(new File(r)); + } + for (File file : affected) { + if (PathUtil.isUnder(chunkRoots, file)) { return true; } - }); - return result.get(); + } + return false; } private static Set getAllAffectedFilesContainer(CompileContext context) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java index e8cc152c952b..23fe31b7fcb0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java @@ -4,14 +4,15 @@ import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.containers.SLRUCache; import org.jetbrains.annotations.NotNull; -import org.jetbrains.ether.dependencyView.ClassRepr; import org.jetbrains.ether.dependencyView.Mappings; import org.jetbrains.jps.*; import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.storage.BuildDataManager; import java.io.File; -import java.util.*; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; /** * @author Eugene Zhuravlev @@ -28,7 +29,6 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler private final BuildDataManager myDataManager; private final Mappings myMappings; private final Set myDirtyModules = new HashSet(); - private final Map> myTempSourceRoots = new HashMap>(); private SLRUCache myFilesCache = new SLRUCache(10, 10) { @NotNull @@ -126,28 +126,14 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler void setCompilingTests(boolean compilingTests) { myCompilingTests = compilingTests; - myFilesCache.clear(); - for (Collection roots : myTempSourceRoots.values()) { - if (roots != null) { - for (File root : roots) { - FileUtil.delete(root); - } - } - } - myTempSourceRoots.clear(); + myFilesCache.clear(); // todo: do we really need this? } void onChunkBuildComplete(@NotNull ModuleChunk chunk) { - myFilesCache.clear(); - myMappings.clearMemoryCaches(); for (Module module : chunk.getModules()) { - final Collection roots = myTempSourceRoots.remove(module); - if (roots != null) { - for (File root : roots) { - FileUtil.delete(root); - } - } + myFilesCache.remove(module); } + myMappings.clearMemoryCaches(); } public CompileScope getScope() { @@ -176,35 +162,6 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler return removed != null && !removed.isEmpty(); } - // delete all class files that according to mappings correspond to given sources - public void deleteCorrespondingClasses(Collection sources) { - if (isMake() && !sources.isEmpty()) { - final Mappings mappings = getMappings(); - for (File file : sources) { - final Set classes = mappings.getClasses(FileUtil.toSystemIndependentName(file.getPath())); - if (classes != null) { - for (ClassRepr aClass : classes) { - final String fileName = aClass.getFileName(); - if (fileName != null) { - FileUtil.delete(new File(fileName)); - } - } - } - } - } - } - - // assuming the root file exists - public void registerTempSourceRoot(Module module, File root) { - Collection roots = myTempSourceRoots.get(module); - if (roots == null) { - roots = new HashSet(); - myTempSourceRoots.put(module, roots); - } - roots.add(root); - } - - /** @noinspection unchecked*/ private FSSnapshot buildSnapshot(Module module) { final Set excludes = new HashSet(); @@ -221,13 +178,6 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler buildStructure(root.getNode(), excludes); } } - final Collection tempRoots = myTempSourceRoots.get(module); - if (tempRoots != null) { - for (File tempRoot : tempRoots) { - final FSSnapshot.Root root = snapshot.addRoot(tempRoot, FileUtil.toSystemIndependentName(tempRoot.getPath())); - buildStructure(root.getNode(), excludes); - } - } return snapshot; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSSnapshot.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSSnapshot.java index ecdbb80de2b3..3a534ef12445 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSSnapshot.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSSnapshot.java @@ -12,8 +12,6 @@ import java.util.List; * Date: 10/8/11 */ public class FSSnapshot { - private static final Node[] EMPTY_NODE_ARRAY = new Node[0]; - private final List myRoots = new ArrayList(); private final Module myModule; diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSSnapshotBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSSnapshotBuilder.java deleted file mode 100644 index b1dd0710fb34..000000000000 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSSnapshotBuilder.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.jetbrains.jps.incremental; - -import org.jetbrains.jps.Module; - -import java.io.File; - -/** - * @author Eugene Zhuravlev - * Date: 10/8/11 - */ -public class FSSnapshotBuilder implements FileProcessor{ - private final FSSnapshot mySnapshot; - - public FSSnapshotBuilder(Module module) { - mySnapshot = new FSSnapshot(module); - } - - public boolean apply(Module module, File file, String sourceRoot) throws Exception { - - return true; - } - - public FSSnapshot getResult() { - return mySnapshot; - } -} diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 8ca6753e584c..f8b9a5e701d3 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -95,7 +95,9 @@ public class IncProjectBuilder { } private void runBuild(CompileContext context) throws ProjectBuildException { - cleanOutputRoots(context); + if (!context.isMake()) { + cleanOutputRoots(context); + } context.processMessage(new ProgressMessage("Running 'before' tasks")); runTasks(context, myBuilderRegistry.getBeforeTasks()); @@ -127,29 +129,18 @@ public class IncProjectBuilder { private static void cleanOutputRoots(CompileContext context) throws ProjectBuildException { final CompileScope scope = context.getScope(); final Collection allProjectModules = scope.getProject().getModules().values(); - final Collection modulesToClean = new HashSet(); + final Collection modulesToClean = new HashSet(scope.getAffectedModules()); - if (context.isMake()) { - for (Module module : scope.getAffectedModules()) { - if (context.isDirty(module)) { - modulesToClean.add(module); - } + final Set allModules = new HashSet(allProjectModules); + allModules.removeAll(modulesToClean); + if (allModules.isEmpty()) { + // whole project is affected + context.getBuildDataManager().clean(); + try { + context.getMappings().clean(); } - } - else { - modulesToClean.addAll(scope.getAffectedModules()); - - final Set allModules = new HashSet(allProjectModules); - allModules.removeAll(scope.getAffectedModules()); - if (allModules.isEmpty()) { - // whole project is affected - context.getBuildDataManager().clean(); - try { - context.getMappings().clean(); - } - catch (IOException e) { - throw new ProjectBuildException(e); - } + catch (IOException e) { + throw new ProjectBuildException(e); } } @@ -227,16 +218,13 @@ public class IncProjectBuilder { if (context.isMake()) { // cleanup outputs - // todo: use dirty and removed paths passed from IDEA instead of collecting all chunk sources - final HashSet allChunkSources = new HashSet(); - context.processFiles(chunk, new FilesCollector(allChunkSources, FilesCollector.ALL_FILES)); - + // todo: use removed paths passed from IDEA? final OutputToSourceMapping storage = context.getBuildDataManager().getOutputToSourceStorage(); final HashSet allChunkRemovedSources = new HashSet(); for (Module module : chunk.getModules()) { final File moduleOutput = context.getProjectPaths().getModuleOutputDir(module, context.isCompilingTests()); if (moduleOutput != null && moduleOutput.exists()) { - deleteOutputsOfRemovedSources(moduleOutput, storage, allChunkSources, allChunkRemovedSources); + deleteOutputsOfRemovedSources(moduleOutput, storage, allChunkRemovedSources); } } @@ -281,12 +269,12 @@ public class IncProjectBuilder { while (nextPassRequired); } - private static void deleteOutputsOfRemovedSources(File file, final OutputToSourceMapping outputToSourceStorage, Set allChunkSources, Set removedSources) throws Exception { + private static void deleteOutputsOfRemovedSources(File file, final OutputToSourceMapping outputToSourceStorage, Set removedSources) throws Exception { if (file.isDirectory()) { final File[] files = file.listFiles(); if (files != null) { for (File child : files) { - deleteOutputsOfRemovedSources(child, outputToSourceStorage, allChunkSources, removedSources); + deleteOutputsOfRemovedSources(child, outputToSourceStorage, removedSources); } } } @@ -295,9 +283,10 @@ public class IncProjectBuilder { final String srcPath = outputToSourceStorage.getState(outPath); if (srcPath != null) { // if we know about the association - final File outputSource = new File(srcPath); - if (!allChunkSources.contains(outputSource)) { - removedSources.add(outputSource); + final File srcFile = new File(srcPath); + // todo: optimize + if (!srcFile.exists()) { + removedSources.add(srcFile); FileUtil.delete(file); outputToSourceStorage.remove(outPath); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java index 6d175accb1e4..8d0bb8ed7222 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java @@ -112,7 +112,7 @@ public class GroovyBuilder extends Builder { Arrays.asList(myForStubs ? "stubs" : "groovyc", tempFile.getPath()) ); - context.deleteCorrespondingClasses(toCompile); + deleteCorrespondingClasses(context, toCompile); List successfullyCompiled = Collections.emptyList(); try { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index fb1dcabfb72d..ba00841a9e41 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -29,7 +29,8 @@ import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.commons.EmptyVisitor; -import javax.tools.*; +import javax.tools.Diagnostic; +import javax.tools.JavaFileObject; import java.io.*; import java.net.MalformedURLException; import java.net.URL; @@ -169,7 +170,7 @@ public class JavaBuilder extends Builder{ } upToDateForms.clear(); - context.deleteCorrespondingClasses(filesToCompile); + deleteCorrespondingClasses(context, filesToCompile); return compile(context, chunk, filesToCompile, formsToCompile); } diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index 07799cbffd2b..e98eb04952c2 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -161,8 +161,6 @@ - - diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties index 8b6b797ae88d..cd7d12081c37 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties @@ -16,47 +16,14 @@ ######################################################################################################################## # Groovy script template ######################################################################################################################## -error.file.already.exists=File with same name already exists - file.template.group.title.groovy=Groovy newclass.dlg.title=New Groovy Class newclass.menu.action.text=Groovy Class newclass.menu.action.description=Creates new Groovy Class -newclass.command.name=Create Groovy Class -newclass.progress.text=Creating Groovy Class ''{0}'' - -newinterface.dlg.prompt=Enter name for new Groovy Interface -newinterface.dlg.title=New Groovy Interface -newinterface.menu.action.text=Groovy Interface -newinterface.menu.action.description=Creates new Groovy Interface -newinterface.command.name=Create Groovy Interface -newinterface.progress.text=Creating Groovy Interface ''{0}'' - -newannot.dlg.prompt=Enter name for new Groovy Annotation -newannot.dlg.title=New Groovy Annotation -newannot.menu.action.text=Groovy Annotation -newannot.menu.action.description=Creates new Groovy Annotation -newannot.command.name=Create Groovy Annotation -newannot.progress.text=Creating Groovy Annotation ''{0}'' - -newenum.dlg.prompt=Enter name for new Groovy Enumeration -newenum.dlg.title=New Groovy Enumeration -newenum.menu.action.text=Groovy Enumeration -newenum.menu.action.description=Creates new Groovy Enumeration -newenum.command.name=Create Groovy Enumeration -newenum.progress.text=Creating Groovy Enumeration ''{0}'' - newscript.dlg.prompt=Enter name for new Groovy Script -newscript.dlg.title=New Groovy Script newscript.menu.action.text=Groovy Script newscript.menu.action.description=Creates new Groovy Script -newscript.command.name=Create Groovy Script -newscript.progress.text=Creating Groovy Script ''{0}'' - -action.group.groovy.title=Groovy -action.group.groovy.description=Groovy - ########################################################################################################################## # GDK & compilation ######################################################################################################################## @@ -83,20 +50,13 @@ import.identifier.expected=package or class name expected identifier.expected=Identifier expected import.not.allowed=Imports are not allowed inside blocks identifier.or.block.expected=Identifier or code block expected -package.keyword.expected='package' expected string.end.expected=String end expected regex.end.expected=Regex ending expected -mult.expression.expected=Multiplicative expression expected -closure.op.expected='->' expected lbrack.expected='[' expected rbrack.expected=']' expected -upper.case.ident.or.builtIn.type.or.qualified.type.name.expected=upper case identifier or built in type or qualified type name expected -balanced.tokens.expected=balanced tokens expected lparen.expected='(' expected lcurly.expected='{' expected comma.expected=',' expected -start.of.string.expected=start of string expected -end.of.string.expected=end of string expected rcurly.expected='}' expected rparen.expected=')' expected semi.expected=';' expected @@ -108,14 +68,10 @@ case.without.switch='case' outside 'switch' block default.without.switch='default' outside 'switch' block catch.or.finally.expected='catch' or 'finally' expected colon.expected=':' expected -lbrack.or.lparen.or.lcurly.or.string_ctor_start.expected='[', '{', '{' or start of the string expected -wrong.declaration=Wrong declaration wrong.statement=Wrong statement variable.definitions.expected=Variable definition expected method.definitions.expected=Method definition expected type.specification.expected=Type specification expected -modifier.expected=Modifier expected -annotation.or.modifier.expected=Annotation or modifier expected type.definition.expected=Type definition expected expression.expected=Expression expected annotation.initializer.expected=Annotation initializer expected @@ -129,7 +85,6 @@ duplicate.modifier=Duplicate modifier ''{0}'' param.expected=Parameter expected for.clause.expected=clause expected at.expected='@' expected -intarface.expected='interface' expected if.expected='if' expected compound.statemenet.expected=Initializer block expected indentifier.or.string.or.left.parenth.literal.expected=Identifier, string literal or '(' expected @@ -169,10 +124,6 @@ import.class=Import Class create.class.family.name=Create Class create.class.text=Create Class ''{0}'' create.interface.text=Create Interface ''{0}'' -dynamize.invalid.interface.text=Dynamize invalid interface instantiation -dynamize.invalid.interface.family.name=Dynamize invalid code -class.to.import.chooser.title=Choose class to import -unused.import.statement=Unused import statement static.declaration.in.inner.class=Inner classes cannot have static declarations constructors.are.not.allowed.in.anonymous.class=Constructors are not allowed in anonymous class no.such.property=Property ''{0}'' does not exist @@ -209,27 +160,17 @@ def.visibility.presentation=def # {0} - colspan, {1} - method name, {2} - class name, {3} - formal myParameters row, {4} - arguments row -argument.mismatch.html.tooltip=\ - \ - {3}\ - {4}\ -
{1}in {2}\\ cannot be applied
to
- ######################################################################################################################## # Compiler ######################################################################################################################## class.already.exists=Class ''{0}'' already exists -selected.block.should.represent.an.expression=Selected code block must represent an expression annotation.definition.qualified.name.expected=annotation definition qualified name expected type.expected=type expected type.parameter.expected=Type parameter expected type.argument.expected=Type argument expected -repetitive.method.name.signature=Repetitive method name/signature -repetitive.method.name.signature.and.return.type=repetitive method name, signature and return type illegal.combination.of.modifiers=illegal combination of modifiers -modifier.is.not.allowed.here.0=modifier ''{0}'' is not allowed here illegal.combination.of.modifiers.abstract.and.final=illegal combination of modifiers 'abstract' and 'final' modifier.volatile.not.allowed.here=modifier 'volatile' not allowed here modifier.transient.not.allowed.here=modifier 'transient' not allowed here @@ -242,7 +183,6 @@ anonymous.class.cannot.have.abstract.method=anonymous class cannot have abstract illegal.combination.of.modifiers.volatile.and.final=illegal combination of modifiers 'volatile' and 'final' variable.cannot.be.native=variable cannot have modifier 'native' variable.cannot.be.abstract=variable cannot have modifier 'abstract' -not.abstract.class.cannot.have.method.without.body=not abstract class cannot have method without body not.abstract.method.should.have.body=not abstract method should have body cannot.create.class.error.text=Cannot Create Class ''{0}'': {1} cannot.create.class.error.title=Cannot Create Class @@ -285,10 +225,8 @@ dynamic.window=Dynamic window dynamic.properties.table.no.arguments=Arguments list is empty. assignment.expected='=' expected tuple.cant.be.placed.in.class=Multiple assignments are not allowed for fields -immutable.class.should.be.final=Class with '@Immutable' annotation should be final singleton.class.should.have.private.constructor=Class with '@Singleton' annotation should have private constructor qualified.new.of.static.class=Qualified new of static class -cannot.have.static.declarations=Inner classes cannot have static declarations unknown.class=unknown class ''{0}'' is.not.enclosing.class=''{0}'' is not an enclosing class package.definition.cannot.have.modifiers=Package definition cannot have modifiers @@ -308,7 +246,6 @@ groovy.like.library.found=Groovy Library Found groovy.like.library.found.text=Do you want to set up Groovy for module ''{0}'' \n\ with found library ''{1}'' (Groovy version {2})? compile.groovy.files=&Compile Groovy files -copy.groovy.files.to.output=Copy Groovy files to output as &resources in.expected='in' expected not.allowed.modifier.in.forin=Modifier ''{0}'' is not allowed here property.name.expected=Property name expected @@ -328,9 +265,7 @@ no.interface.expected.here=No interface expected here no.class.expected.here=No class expected here move.to.extends.list=Move reference to extends list move.to.implements.list=Move reference to implements list -script.file.does.not.exist=Script file does not exist script.file.is.not.groovy.file=Script file is not Groovy file -choose.class.to.execute=Choose class to execute class.does.not.exist=Class does not exist class.can't\ be\ executed=Class cannot be executed invoke.completion.second.time.to.show.skipped.methods=Invoke completion second time to show skipped methods @@ -339,7 +274,6 @@ groovy.file.extension.is.not.mapped.to.groovy.file.type=*.groovy files are mappe class.is.not.annotation=''{0}'' is not an annotation method.call.is.ambiguous=Method call is ambiguous duplicated.named.parameter=Duplicated named parameter ''{0}'' found -cannot.find.method.call=No signature of method: {0}.call() is applicable for {1} no.super.classes.found=No super classes found no.super.method.found=No super methods found wrong.package.name=Package name ''{0}'' does not corresponding to the file path ''{1}'' @@ -359,4 +293,9 @@ triple.is.not.expected.here='...' is not expected here Equals=Equals default.initializers.are.not.allowed.in.abstract.method=Default initializers are not allowed in abstract methods groovy.does.not.support.constructor.type.arguments=Groovy does not support constructor type arguments -illegal.escape.character.in.string.literal=Illegal escape character in string literal \ No newline at end of file +illegal.escape.character.in.string.literal=Illegal escape character in string literal +dollar.slash.end.expected=Dollar slash ending expected +regex.cannot.be.first.argument.of.command.method.call=Regex cannot be first argument of command method call +add.parentheses=Add parentheses +add.parentheses.to.command.method.call=Add parentheses to command method call +dollar.slash.strings.are.not.allowed.in.0=Dollar-slash strings are not allowed in Groovy {0} \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index 26f7775ca063..1f31f6b5780b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -835,6 +835,63 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { checkStringLiteral(literal, text); } + @Override + public void visitRegexExpression(GrRegex regex) { + String text = regex.getText(); + String quote = GrStringUtil.getStartQuote(text); + + final GroovyConfigUtils config = GroovyConfigUtils.getInstance(); + + if ("$/".equals(quote)) { + if (!config.isVersionAtLeast(regex, GroovyConfigUtils.GROOVY1_9)) { + myHolder + .createErrorAnnotation(regex, GroovyBundle.message("dollar.slash.strings.are.not.allowed.in.0", config.getSDKVersion(regex))); + } + if (regex.getParent() instanceof GrCommandArgumentList && + ((GrCommandArgumentList)regex.getParent()).getAllArguments()[0] == regex) { + final Annotation annotation = + myHolder.createErrorAnnotation(regex, GroovyBundle.message("regex.cannot.be.first.argument.of.command.method.call")); + annotation.registerFix(new AddParenthesesFix()); + return; + } + } + + for (String part : regex.getTextParts()) { + if (!GrStringUtil.parseRegexCharacters(part, new StringBuilder(part.length()), null, regex.getText().startsWith("/"))) { + myHolder.createErrorAnnotation(regex, GroovyBundle.message("illegal.escape.character.in.string.literal")); + return; + } + } + + if ("/".equals(quote)) { + if (!config.isVersionAtLeast(regex, GroovyConfigUtils.GROOVY1_8)) { + if (text.contains("\n") || text.contains("\r")) { + myHolder.createErrorAnnotation(regex, GroovyBundle + .message("multiline.slashy.strings.are.not.allowed.in.groovy.0", config.getSDKVersion(regex))); + return; + } + } + } + + if (regex.getInjections().length > 0) { + if (!config.isVersionAtLeast(regex, GroovyConfigUtils.GROOVY1_8)) { + myHolder.createErrorAnnotation(regex, GroovyBundle + .message("slashy.strings.with.injections.are.not.allowed.in.groovy.0", config.getSDKVersion(regex))); + } + } + + } + + @Override + public void visitGStringExpression(GrString gstring) { + for (String part : gstring.getTextParts()) { + if (!GrStringUtil.parseStringCharacters(part, new StringBuilder(part.length()), null)) { + myHolder.createErrorAnnotation(gstring, GroovyBundle.message("illegal.escape.character.in.string.literal")); + return; + } + } + } + private void checkStringLiteral(PsiElement literal, String text) { StringBuilder builder = new StringBuilder(text.length()); @@ -842,63 +899,16 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { if (quote.isEmpty()) return; String substring = text.substring(quote.length()); - - String[] parts; - PsiElement child = literal.getFirstChild(); - if (child == null) child = literal; - IElementType elementType = child.getNode().getElementType(); - boolean isSimpleString = elementType == GroovyTokenTypes.mSTRING_LITERAL || - elementType == GroovyTokenTypes.mGSTRING_LITERAL || - elementType == GroovyTokenTypes.mREGEX_LITERAL; - if (isSimpleString) { - parts = new String[]{substring}; - } - else if (literal instanceof GrString) { - parts = ((GrString)literal).getTextParts(); - } - else { + if (!GrStringUtil.parseStringCharacters(substring, new StringBuilder(text.length()), null)) { + myHolder.createErrorAnnotation(literal, GroovyBundle.message("illegal.escape.character.in.string.literal")); return; } - for (String part : parts) { - if (!GrStringUtil.parseStringCharacters(part, new StringBuilder(text.length()), null, !quote.equals("/"))) { - myHolder.createErrorAnnotation(literal, GroovyBundle.message("illegal.escape.character.in.string.literal")); - return; - } - } - - - if (isSimpleString) { - int[] offsets = new int[substring.length() + 1]; - boolean result = GrStringUtil.parseStringCharacters(substring, builder, offsets, !quote.equals("/")); - LOG.assertTrue(result); - if (!builder.toString().endsWith(quote) || substring.charAt(offsets[builder.length() - quote.length()]) == '\\') { - myHolder.createErrorAnnotation(literal, GroovyBundle.message("string.end.expected")); - return; - } - } - else { - LOG.assertTrue(literal instanceof GrString); - //absence of closing quote is registered by lexer - } - - - if (quote.equals("/")) { - if (!GroovyConfigUtils.getInstance().isVersionAtLeast(literal, GroovyConfigUtils.GROOVY1_8)) { - if (text.contains("\n") || text.contains("\r")) { - myHolder.createErrorAnnotation(literal, GroovyBundle.message("multiline.slashy.strings.are.not.allowed.in.groovy.0", - GroovyConfigUtils.getInstance().getSDKVersion(literal))); - return; - } - } - } - - if (literal instanceof GrRegex) { - if (!GroovyConfigUtils.getInstance().isVersionAtLeast(literal, GroovyConfigUtils.GROOVY1_8)) { - myHolder.createErrorAnnotation(literal, GroovyBundle.message("slashy.strings.with.injections.are.not.allowed.in.groovy.0", - GroovyConfigUtils.getInstance().getSDKVersion(literal))); - return; - } + int[] offsets = new int[substring.length() + 1]; + boolean result = GrStringUtil.parseStringCharacters(substring, builder, offsets); + LOG.assertTrue(result); + if (!builder.toString().endsWith(quote) || substring.charAt(offsets[builder.length() - quote.length()]) == '\\') { + myHolder.createErrorAnnotation(literal, GroovyBundle.message("string.end.expected")); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/AddParenthesesFix.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/AddParenthesesFix.java new file mode 100644 index 000000000000..c5da9bcce990 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/AddParenthesesFix.java @@ -0,0 +1,87 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.annotator.intentions; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.GroovyBundle; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrApplicationStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCommandArgumentList; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; + +/** + * @author Max Medvedev + */ +public class AddParenthesesFix implements IntentionAction { + private static final Logger LOG = Logger.getInstance(AddParenthesesFix.class); + + @NotNull + @Override + public String getText() { + return GroovyBundle.message("add.parentheses"); + } + + @NotNull + @Override + public String getFamilyName() { + return GroovyBundle.message("add.parentheses.to.command.method.call"); + } + + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + final int offset = editor.getCaretModel().getOffset(); + final PsiElement at = file.findElementAt(offset); + final GrCommandArgumentList argList = PsiTreeUtil.getParentOfType(at, GrCommandArgumentList.class); + return argList != null; + } + + @Override + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + final int offset = editor.getCaretModel().getOffset(); + final PsiElement at = file.findElementAt(offset); + final GrCommandArgumentList argList = PsiTreeUtil.getParentOfType(at, GrCommandArgumentList.class); + if (argList == null) return; + + final PsiElement parent = argList.getParent(); + LOG.assertTrue(parent instanceof GrApplicationStatement); + + final GrExpression newExpr; + try { + newExpr = GroovyPsiElementFactory.getInstance(project) + .createExpressionFromText(((GrApplicationStatement)parent).getInvokedExpression().getText() + '(' + argList.getText() + ')'); + } + catch (IncorrectOperationException e) { + LOG.error(e); + return; + } + + parent.replace(newExpr); + editor.getCaretModel().moveToOffset(offset + 1); + } + + @Override + public boolean startInWriteAction() { + return true; + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/config/GroovyConfigUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/config/GroovyConfigUtils.java index 5d5319261683..25faa13a946a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/config/GroovyConfigUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/config/GroovyConfigUtils.java @@ -52,6 +52,7 @@ public abstract class GroovyConfigUtils extends AbstractConfigUtils { public static final String NO_VERSION = ""; public static final String GROOVY1_7 = "1.7"; public static final String GROOVY1_8 = "1.8"; + public static final String GROOVY1_9 = "1.9"; private GroovyConfigUtils() { } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyLiteralCopyPasteProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyLiteralCopyPasteProcessor.java index 99cbe653ce02..015a357c4cdf 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyLiteralCopyPasteProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyLiteralCopyPasteProcessor.java @@ -17,10 +17,13 @@ package org.jetbrains.plugins.groovy.lang.editor; import com.intellij.codeInsight.editorActions.StringLiteralCopyPasteProcessor; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; @@ -38,9 +41,52 @@ public class GroovyLiteralCopyPasteProcessor extends StringLiteralCopyPasteProce @Override protected boolean isStringLiteral(@NotNull PsiElement token) { ASTNode node = token.getNode(); - return node != null ? TokenSets.STRING_LITERALS.contains(node.getElementType()):false; + return node != null && TokenSets.STRING_LITERALS.contains(node.getElementType()); } + @Nullable + protected PsiElement findLiteralTokenType(PsiFile file, int selectionStart, int selectionEnd) { + PsiElement elementAtSelectionStart = file.findElementAt(selectionStart); + if (elementAtSelectionStart == null) { + return null; + } + IElementType elementType = elementAtSelectionStart.getNode().getElementType(); + if ((elementType == mREGEX_END || elementType == mDOLLAR_SLASH_REGEX_END || elementType == mGSTRING_END) && + elementAtSelectionStart.getTextOffset() == selectionStart) { + elementAtSelectionStart = elementAtSelectionStart.getPrevSibling(); + if (elementAtSelectionStart == null) return null; + elementType = elementAtSelectionStart.getNode().getElementType(); + } + + if (!isStringLiteral(elementAtSelectionStart) && !isCharLiteral(elementAtSelectionStart)) { + return null; + } + + if (elementAtSelectionStart.getTextRange().getEndOffset() < selectionEnd) { + final PsiElement elementAtSelectionEnd = file.findElementAt(selectionEnd); + if (elementAtSelectionEnd == null) { + return null; + } + if (elementAtSelectionEnd.getNode().getElementType() == elementType && + elementAtSelectionEnd.getTextRange().getStartOffset() < selectionEnd) { + return elementAtSelectionStart; + } + } + + final TextRange textRange = elementAtSelectionStart.getTextRange(); + + //content elements don't have quotes, so they are shorter than whole string literals + if (elementType == mREGEX_CONTENT || elementType == mGSTRING_CONTENT || elementType == mDOLLAR_SLASH_REGEX_CONTENT) { + selectionStart++; + selectionEnd--; + } + if (selectionStart <= textRange.getStartOffset() || selectionEnd >= textRange.getEndOffset()) { + return null; + } + return elementAtSelectionStart; + } + + @Override protected String getLineBreaker(PsiElement token) { final String text = token.getText(); @@ -65,7 +111,10 @@ public class GroovyLiteralCopyPasteProcessor extends StringLiteralCopyPasteProce protected String escapeCharCharacters(@NotNull String s, @NotNull PsiElement token, boolean escapeSlashes) { IElementType tokenType = token.getNode().getElementType(); - if (tokenType == mREGEX_CONTENT || tokenType == mREGEX_LITERAL) { + if (tokenType == mREGEX_CONTENT || + tokenType == mREGEX_LITERAL || + tokenType == mDOLLAR_SLASH_REGEX_CONTENT || + tokenType == mDOLLAR_SLASH_REGEX_LITERAL) { if (escapeSlashes) { return StringUtil.escapeSlashes(s); } @@ -100,7 +149,10 @@ public class GroovyLiteralCopyPasteProcessor extends StringLiteralCopyPasteProce protected String unescape(String text, PsiElement token) { final IElementType tokenType = token.getNode().getElementType(); - if (tokenType == mREGEX_CONTENT || tokenType == mREGEX_LITERAL) { + if (tokenType == mREGEX_CONTENT || + tokenType == mREGEX_LITERAL || + tokenType == mDOLLAR_SLASH_REGEX_CONTENT || + tokenType == mDOLLAR_SLASH_REGEX_LITERAL) { return StringUtil.unescapeSlashes(text); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyLexer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyLexer.java index 74eeaec421c1..dfb93add4d0f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyLexer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyLexer.java @@ -30,12 +30,11 @@ import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; */ public class GroovyLexer extends LookAheadLexer { private static final TokenSet tokensToMerge = TokenSet.create( - mSL_COMMENT, - mML_COMMENT, - mREGEX_BEGIN, - mREGEX_CONTENT, - mREGEX_END, - WHITE_SPACE + mSL_COMMENT, + mML_COMMENT, + mREGEX_CONTENT, + mDOLLAR_SLASH_REGEX_CONTENT, + WHITE_SPACE ); public GroovyLexer() { @@ -56,41 +55,13 @@ public class GroovyLexer extends LookAheadLexer { if (token == kDEF || token == kAS || token == kIN) { addToken(mIDENT); baseLexer.advance(); - } else { + } + else { addToken(token); baseLexer.advance(); } - } else if (type == mDOLLAR_SLASHY_LITERAL) { - //todo rewrite groovy literal treatment with normal dollar-slashy strings treatment - - String text = baseLexer.getTokenText(); - assert text.startsWith("$/"); - assert text.endsWith("/$"); - if (text.length() == 4) { - addToken(mREGEX_LITERAL); - baseLexer.advance(); - return; - } - - int start = baseLexer.getTokenStart() + 1; - - GroovyLexer regex = new GroovyLexer(); - regex.start("/" + text.substring(2, text.length() - 2).replace('/', 'a') + "/"); - while (true) { - IElementType tokenType = regex.getTokenType(); - int tokenEnd = regex.getTokenEnd(); - regex.advance(); - - boolean last = regex.getTokenType() == null; - if (last) { - addToken(tokenType); - baseLexer.advance(); - return; - } - - addToken(start + tokenEnd, tokenType); - } - } else { + } + else { super.lookAhead(baseLexer); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyTokenTypes.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyTokenTypes.java index 08502bac1eb5..06ab7b56226e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyTokenTypes.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyTokenTypes.java @@ -73,17 +73,20 @@ public interface GroovyTokenTypes extends GroovyDocElementTypes { IElementType mGSTRING_CONTENT = new GroovyElementType("Gstring content"); IElementType mGSTRING_END = new GroovyElementType("Gstring end"); -// IElementType mWRONG_STRING_LITERAL = new GroovyElementType("wrong string"); -// IElementType mWRONG_GSTRING_LITERAL = new GroovyElementType("wrong gstring"); - IElementType mREGEX_LITERAL = new GroovyElementType("regexp"); - IElementType mDOLLAR_SLASHY_LITERAL = new GroovyElementType("dollarSlashy"); + IElementType mDOLLAR_SLASH_REGEX_LITERAL = new GroovyElementType("$/ regexp"); + IElementType mWRONG_DOLLAR_SLASH_LITERAL = new GroovyElementType("wrong dollar slash literal"); IElementType mREGEX_BEGIN = new GroovyElementType("regex begin"); IElementType mREGEX_CONTENT = new GroovyElementType("regex content"); IElementType mREGEX_END = new GroovyElementType("regex end"); + IElementType mDOLLAR_SLASH_REGEX_BEGIN = new GroovyElementType("$/ regex begin"); + IElementType mDOLLAR_SLASH_REGEX_CONTENT = new GroovyElementType("$/ regex content"); + IElementType mDOLLAR_SLASH_REGEX_END = new GroovyElementType("$/ regex end"); + IElementType mWRONG_REGEX_LITERAL = new GroovyElementType("wrong regex"); + IElementType mWRONG_DOLLAR_SLASH_REGEX_LITERAL = new GroovyElementType("wrong $/ regex"); /* ************************************************************************************************** * Common tokens: operators, braces etc. diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java index 76ce926d9ea9..93710d76d299 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java @@ -69,7 +69,8 @@ public abstract class TokenSets { kNULL, mSTRING_LITERAL, mGSTRING_LITERAL, - mREGEX_LITERAL + mREGEX_LITERAL, + mDOLLAR_SLASH_REGEX_LITERAL ); public static final TokenSet BUILT_IN_TYPE = TokenSet.create( @@ -123,6 +124,9 @@ public abstract class TokenSets { public static TokenSet STRING_LITERALS = TokenSet.create( mSTRING_LITERAL, mREGEX_LITERAL, + mREGEX_CONTENT, + mDOLLAR_SLASH_REGEX_CONTENT, + mDOLLAR_SLASH_REGEX_LITERAL, mGSTRING_LITERAL, mGSTRING_CONTENT, mGSTRING_BEGIN, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/_GroovyLexer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/_GroovyLexer.java index 78bd06455588..7debd61611c6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/_GroovyLexer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/_GroovyLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 11/15/11 6:32 PM */ +/* The following code was generated by JFlex 1.4.3 on 12/11/11 11:16 AM */ /* * Copyright 2000-2010 JetBrains s.r.o. @@ -27,7 +27,7 @@ import java.util.Stack; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 11/15/11 6:32 PM from the specification file + * on 12/11/11 11:16 AM from the specification file * C:/Home/IDEA/tools/lexer/../../community/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex */ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { @@ -35,27 +35,27 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ - public static final int KING_STATE = 20; public static final int IN_TRIPLE_DOT = 16; - public static final int KING_STATE_INNER = 22; public static final int IN_TRIPLE_GSTRING = 8; public static final int IN_SINGLE_GSTRING = 6; - public static final int IN_REGEX_DOLLAR = 32; + public static final int IN_REGEX_DOLLAR = 24; public static final int NLS_AFTER_COMMENT = 40; - public static final int KING_STATE_INNER_CONTENT = 26; public static final int IN_TRIPLE_IDENT = 14; public static final int IN_TRIPLE_GSTRING_DOLLAR = 4; + public static final int IN_DOLLAR_SLASH_REGEX = 34; public static final int IN_SINGLE_DOT = 12; - public static final int IN_REGEX_DOT = 38; + public static final int IN_DOLLAR_SLASH_REGEX_DOT = 38; + public static final int IN_REGEX_DOT = 30; public static final int NLS_AFTER_LBRACE = 42; public static final int IN_TRIPLE_NLS = 18; public static final int NLS_AFTER_NLS = 44; - public static final int IN_REGEX_IDENT = 36; + public static final int IN_DOLLAR_SLASH_REGEX_IDENT = 36; + public static final int IN_DOLLAR_SLASH_REGEX_DOLLAR = 32; + public static final int IN_REGEX_IDENT = 28; public static final int IN_SINGLE_IDENT = 10; - public static final int KING_STATE_CONTENT = 24; - public static final int IN_REGEX = 34; - public static final int WAIT_FOR_REGEX = 30; - public static final int IN_INNER_BLOCK = 28; + public static final int IN_REGEX = 26; + public static final int WAIT_FOR_REGEX = 22; + public static final int IN_INNER_BLOCK = 20; public static final int IN_SINGLE_GSTRING_DOLLAR = 2; public static final int BRACE_COUNT = 46; public static final int YYINITIAL = 0; @@ -76,74 +76,70 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = - "\11\0\1\3\1\2\1\0\1\3\1\1\22\0\1\3\1\10\1\46"+ - "\1\7\1\42\1\103\1\106\1\47\1\72\1\73\1\6\1\27\1\77"+ + "\11\0\1\3\1\2\1\0\1\3\1\1\22\0\1\3\1\10\1\45"+ + "\1\7\1\42\1\102\1\105\1\44\1\71\1\72\1\6\1\27\1\76"+ "\1\30\1\40\1\5\1\32\1\35\1\12\1\12\1\12\2\12\1\12"+ - "\2\12\1\76\1\107\1\100\1\71\1\101\1\70\1\110\1\11\1\34"+ + "\2\12\1\75\1\106\1\77\1\70\1\100\1\67\1\107\1\11\1\34"+ "\1\11\1\24\1\26\1\16\1\14\1\41\1\22\2\41\1\20\13\41"+ - "\1\37\2\41\1\74\1\4\1\75\1\104\1\31\1\0\1\52\1\33"+ - "\1\53\1\23\1\25\1\15\1\13\1\62\1\21\1\41\1\54\1\17"+ - "\1\56\1\43\1\57\1\51\1\41\1\44\1\55\1\45\1\50\1\60"+ - "\1\64\1\36\1\61\1\63\1\65\1\105\1\66\1\102\43\0\4\67"+ - "\4\0\1\41\12\0\1\41\4\0\1\41\5\0\27\41\1\0\37\41"+ - "\1\0\u013f\41\31\0\162\41\4\0\14\41\16\0\5\41\11\0\1\41"+ - "\213\0\1\41\13\0\1\41\1\0\3\41\1\0\1\41\1\0\24\41"+ - "\1\0\54\41\1\0\46\41\1\0\5\41\4\0\202\41\10\0\105\41"+ - "\1\0\46\41\2\0\2\41\6\0\20\41\41\0\46\41\2\0\1\41"+ - "\7\0\47\41\110\0\33\41\5\0\3\41\56\0\32\41\5\0\13\41"+ - "\43\0\2\41\1\0\143\41\1\0\1\41\17\0\2\41\7\0\2\41"+ - "\12\0\3\41\2\0\1\41\20\0\1\41\1\0\36\41\35\0\3\41"+ - "\60\0\46\41\13\0\1\41\u0152\0\66\41\3\0\1\41\22\0\1\41"+ - "\7\0\12\41\43\0\10\41\2\0\2\41\2\0\26\41\1\0\7\41"+ - "\1\0\1\41\3\0\4\41\3\0\1\41\36\0\2\41\1\0\3\41"+ - "\16\0\2\41\2\67\21\0\6\41\4\0\2\41\2\0\26\41\1\0"+ - "\7\41\1\0\2\41\1\0\2\41\1\0\2\41\37\0\4\41\1\0"+ - "\1\41\23\0\3\41\20\0\11\41\1\0\3\41\1\0\26\41\1\0"+ - "\7\41\1\0\2\41\1\0\5\41\3\0\1\41\22\0\1\41\17\0"+ - "\2\41\17\0\1\67\23\0\10\41\2\0\2\41\2\0\26\41\1\0"+ - "\7\41\1\0\2\41\1\0\5\41\3\0\1\41\36\0\2\41\1\0"+ - "\3\41\17\0\1\41\21\0\1\41\1\0\6\41\3\0\3\41\1\0"+ - "\4\41\3\0\2\41\1\0\1\41\1\0\2\41\3\0\2\41\3\0"+ - "\3\41\3\0\10\41\1\0\3\41\77\0\1\67\13\0\10\41\1\0"+ - "\3\41\1\0\27\41\1\0\12\41\1\0\5\41\46\0\2\41\43\0"+ - "\10\41\1\0\3\41\1\0\27\41\1\0\12\41\1\0\5\41\3\0"+ - "\1\41\40\0\1\41\1\0\2\41\43\0\10\41\1\0\3\41\1\0"+ - "\27\41\1\0\20\41\46\0\2\41\43\0\22\41\3\0\30\41\1\0"+ - "\11\41\1\0\1\41\2\0\7\41\72\0\60\41\1\0\2\41\13\0"+ - "\1\67\7\41\72\0\2\41\1\0\1\41\2\0\2\41\1\0\1\41"+ - "\2\0\1\41\6\0\4\41\1\0\7\41\1\0\3\41\1\0\1\41"+ - "\1\0\1\41\2\0\2\41\1\0\4\41\1\0\2\41\11\0\1\41"+ - "\2\0\5\41\1\0\1\41\25\0\2\41\42\0\1\41\77\0\10\41"+ - "\1\0\42\41\35\0\4\41\164\0\42\41\1\0\5\41\1\0\2\41"+ - "\45\0\6\41\112\0\46\41\12\0\51\41\7\0\132\41\5\0\104\41"+ - "\5\0\122\41\6\0\7\41\1\0\77\41\1\0\1\41\1\0\4\41"+ - "\2\0\7\41\1\0\1\41\1\0\4\41\2\0\47\41\1\0\1\41"+ - "\1\0\4\41\2\0\37\41\1\0\1\41\1\0\4\41\2\0\7\41"+ - "\1\0\1\41\1\0\4\41\2\0\7\41\1\0\7\41\1\0\27\41"+ - "\1\0\37\41\1\0\1\41\1\0\4\41\2\0\7\41\1\0\47\41"+ - "\1\0\23\41\105\0\125\41\14\0\u026c\41\2\0\10\41\12\0\32\41"+ - "\5\0\113\41\3\0\3\67\17\0\15\41\1\0\4\41\16\0\22\41"+ + "\1\37\2\41\1\73\1\4\1\74\1\103\1\31\1\0\1\47\1\33"+ + "\1\50\1\23\1\25\1\15\1\13\1\62\1\21\1\41\1\51\1\17"+ + "\1\55\1\57\1\56\1\46\1\41\1\54\1\52\1\53\1\43\1\60"+ + "\1\64\1\36\1\61\1\63\1\65\1\104\1\66\1\101\53\0\1\41"+ + "\12\0\1\41\4\0\1\41\5\0\27\41\1\0\37\41\1\0\u013f\41"+ + "\31\0\162\41\4\0\14\41\16\0\5\41\11\0\1\41\213\0\1\41"+ + "\13\0\1\41\1\0\3\41\1\0\1\41\1\0\24\41\1\0\54\41"+ + "\1\0\46\41\1\0\5\41\4\0\202\41\10\0\105\41\1\0\46\41"+ + "\2\0\2\41\6\0\20\41\41\0\46\41\2\0\1\41\7\0\47\41"+ + "\110\0\33\41\5\0\3\41\56\0\32\41\5\0\13\41\43\0\2\41"+ + "\1\0\143\41\1\0\1\41\17\0\2\41\7\0\2\41\12\0\3\41"+ + "\2\0\1\41\20\0\1\41\1\0\36\41\35\0\3\41\60\0\46\41"+ + "\13\0\1\41\u0152\0\66\41\3\0\1\41\22\0\1\41\7\0\12\41"+ + "\43\0\10\41\2\0\2\41\2\0\26\41\1\0\7\41\1\0\1\41"+ + "\3\0\4\41\3\0\1\41\36\0\2\41\1\0\3\41\16\0\2\41"+ + "\23\0\6\41\4\0\2\41\2\0\26\41\1\0\7\41\1\0\2\41"+ + "\1\0\2\41\1\0\2\41\37\0\4\41\1\0\1\41\23\0\3\41"+ + "\20\0\11\41\1\0\3\41\1\0\26\41\1\0\7\41\1\0\2\41"+ + "\1\0\5\41\3\0\1\41\22\0\1\41\17\0\2\41\43\0\10\41"+ + "\2\0\2\41\2\0\26\41\1\0\7\41\1\0\2\41\1\0\5\41"+ + "\3\0\1\41\36\0\2\41\1\0\3\41\17\0\1\41\21\0\1\41"+ + "\1\0\6\41\3\0\3\41\1\0\4\41\3\0\2\41\1\0\1\41"+ + "\1\0\2\41\3\0\2\41\3\0\3\41\3\0\10\41\1\0\3\41"+ + "\113\0\10\41\1\0\3\41\1\0\27\41\1\0\12\41\1\0\5\41"+ + "\46\0\2\41\43\0\10\41\1\0\3\41\1\0\27\41\1\0\12\41"+ + "\1\0\5\41\3\0\1\41\40\0\1\41\1\0\2\41\43\0\10\41"+ + "\1\0\3\41\1\0\27\41\1\0\20\41\46\0\2\41\43\0\22\41"+ + "\3\0\30\41\1\0\11\41\1\0\1\41\2\0\7\41\72\0\60\41"+ + "\1\0\2\41\14\0\7\41\72\0\2\41\1\0\1\41\2\0\2\41"+ + "\1\0\1\41\2\0\1\41\6\0\4\41\1\0\7\41\1\0\3\41"+ + "\1\0\1\41\1\0\1\41\2\0\2\41\1\0\4\41\1\0\2\41"+ + "\11\0\1\41\2\0\5\41\1\0\1\41\25\0\2\41\42\0\1\41"+ + "\77\0\10\41\1\0\42\41\35\0\4\41\164\0\42\41\1\0\5\41"+ + "\1\0\2\41\45\0\6\41\112\0\46\41\12\0\51\41\7\0\132\41"+ + "\5\0\104\41\5\0\122\41\6\0\7\41\1\0\77\41\1\0\1\41"+ + "\1\0\4\41\2\0\7\41\1\0\1\41\1\0\4\41\2\0\47\41"+ + "\1\0\1\41\1\0\4\41\2\0\37\41\1\0\1\41\1\0\4\41"+ + "\2\0\7\41\1\0\1\41\1\0\4\41\2\0\7\41\1\0\7\41"+ + "\1\0\27\41\1\0\37\41\1\0\1\41\1\0\4\41\2\0\7\41"+ + "\1\0\47\41\1\0\23\41\105\0\125\41\14\0\u026c\41\2\0\10\41"+ + "\12\0\32\41\5\0\113\41\25\0\15\41\1\0\4\41\16\0\22\41"+ "\16\0\22\41\16\0\15\41\1\0\3\41\17\0\64\41\43\0\1\41"+ - "\3\0\1\67\1\41\103\0\130\41\10\0\51\41\127\0\35\41\63\0"+ - "\36\41\2\0\5\41\u038b\0\154\41\224\0\234\41\4\0\132\41\6\0"+ - "\26\41\2\0\6\41\2\0\46\41\2\0\6\41\2\0\10\41\1\0"+ - "\1\41\1\0\1\41\1\0\1\41\1\0\37\41\2\0\65\41\1\0"+ - "\7\41\1\0\1\41\3\0\3\41\1\0\7\41\3\0\4\41\2\0"+ - "\6\41\4\0\15\41\5\0\3\41\1\0\7\41\102\0\2\67\23\0"+ - "\1\67\34\0\1\41\15\0\1\41\40\0\22\67\120\0\1\41\4\0"+ - "\1\41\2\0\12\41\1\0\1\41\3\0\5\41\6\0\1\41\1\0"+ - "\1\41\1\0\1\41\1\0\4\41\1\0\3\41\1\0\7\41\3\0"+ - "\3\41\5\0\5\41\26\0\44\67\u0e81\0\2\41\1\67\31\0\11\67"+ - "\7\0\5\41\2\0\3\67\2\41\4\0\126\41\6\0\3\41\1\0"+ - "\132\41\1\67\4\41\5\0\50\41\4\0\136\41\21\0\30\41\70\0"+ - "\20\41\u0200\0\u19b6\41\112\0\u51a6\41\132\0\u048d\41\u0773\0\u2ba4\41\u215c\0"+ - "\u012e\41\2\0\73\41\225\0\7\41\14\0\5\41\5\0\1\41\1\0"+ - "\12\41\1\0\15\41\1\0\5\41\1\0\1\41\1\0\2\41\1\0"+ - "\2\41\1\0\154\41\41\0\u016b\41\22\0\100\41\2\0\66\41\50\0"+ - "\14\41\1\67\66\0\2\67\30\0\3\67\31\0\1\67\6\0\5\41"+ - "\1\0\207\41\7\0\1\67\34\0\32\41\4\0\1\67\1\0\32\41"+ - "\12\0\1\67\131\41\3\0\6\41\2\0\6\41\2\0\6\41\2\0"+ - "\3\41\3\0\2\67\3\0\2\67\31\0"; + "\4\0\1\41\103\0\130\41\10\0\51\41\127\0\35\41\63\0\36\41"+ + "\2\0\5\41\u038b\0\154\41\224\0\234\41\4\0\132\41\6\0\26\41"+ + "\2\0\6\41\2\0\46\41\2\0\6\41\2\0\10\41\1\0\1\41"+ + "\1\0\1\41\1\0\1\41\1\0\37\41\2\0\65\41\1\0\7\41"+ + "\1\0\1\41\3\0\3\41\1\0\7\41\3\0\4\41\2\0\6\41"+ + "\4\0\15\41\5\0\3\41\1\0\7\41\164\0\1\41\15\0\1\41"+ + "\202\0\1\41\4\0\1\41\2\0\12\41\1\0\1\41\3\0\5\41"+ + "\6\0\1\41\1\0\1\41\1\0\1\41\1\0\4\41\1\0\3\41"+ + "\1\0\7\41\3\0\3\41\5\0\5\41\u0ebb\0\2\41\52\0\5\41"+ + "\5\0\2\41\4\0\126\41\6\0\3\41\1\0\132\41\1\0\4\41"+ + "\5\0\50\41\4\0\136\41\21\0\30\41\70\0\20\41\u0200\0\u19b6\41"+ + "\112\0\u51a6\41\132\0\u048d\41\u0773\0\u2ba4\41\u215c\0\u012e\41\2\0\73\41"+ + "\225\0\7\41\14\0\5\41\5\0\1\41\1\0\12\41\1\0\15\41"+ + "\1\0\5\41\1\0\1\41\1\0\2\41\1\0\2\41\1\0\154\41"+ + "\41\0\u016b\41\22\0\100\41\2\0\66\41\50\0\14\41\164\0\5\41"+ + "\1\0\207\41\44\0\32\41\6\0\32\41\13\0\131\41\3\0\6\41"+ + "\2\0\6\41\2\0\6\41\2\0\3\41\43\0"; /** * Translates characters to character classes @@ -156,75 +152,70 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\21\0\1\1\10\0\1\2\1\3\1\4\1\2\1\5"+ - "\1\6\1\2\1\7\1\10\1\11\5\10\1\12\1\13"+ - "\1\11\1\10\1\14\3\10\1\15\1\16\6\10\1\17"+ - "\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27"+ - "\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37"+ - "\1\40\1\41\1\42\20\43\1\44\1\45\20\46\1\47"+ - "\1\50\1\51\1\50\1\52\1\53\1\54\1\50\1\55"+ - "\1\50\1\42\1\45\1\56\1\57\2\60\2\61\3\62"+ - "\1\63\1\64\2\65\3\66\1\67\1\70\1\71\1\72"+ - "\1\73\1\72\1\74\1\72\1\1\1\75\1\76\1\77"+ - "\1\1\1\100\1\67\2\101\1\102\1\4\2\102\2\103"+ - "\2\104\5\0\1\4\1\105\1\106\1\107\1\110\1\111"+ - "\1\112\1\113\1\114\1\115\1\116\1\117\1\11\1\120"+ - "\3\0\5\10\1\121\1\122\2\10\1\123\3\10\1\124"+ - "\1\125\1\126\1\127\1\130\2\0\3\10\1\131\1\132"+ - "\6\10\2\0\1\133\1\16\1\0\1\16\4\10\1\134"+ - "\13\10\1\135\1\136\1\137\1\140\1\141\1\0\1\142"+ - "\1\0\1\143\1\144\1\145\1\146\1\147\1\150\5\43"+ - "\1\121\1\122\2\43\1\123\20\43\1\134\13\43\5\46"+ - "\1\121\1\122\2\46\1\123\20\46\1\134\13\46\1\0"+ - "\4\50\1\151\1\152\5\0\1\73\2\74\1\106\1\64"+ - "\3\0\1\100\1\67\1\153\3\0\1\106\1\154\1\155"+ - "\1\114\1\156\1\0\1\156\3\10\1\157\1\10\1\160"+ - "\2\10\1\161\4\10\2\11\3\10\1\162\1\163\1\164"+ - "\5\10\1\165\2\10\1\133\2\0\1\166\4\16\24\10"+ - "\1\137\1\167\1\170\1\171\1\172\1\0\3\43\1\157"+ - "\1\43\1\160\2\43\1\161\7\43\1\164\5\43\1\165"+ - "\26\43\3\46\1\157\1\46\1\160\2\46\1\161\7\46"+ - "\1\164\5\46\1\165\26\46\1\50\2\0\1\50\1\173"+ - "\2\174\1\64\2\106\1\154\2\0\2\1\1\0\1\106"+ - "\2\154\1\156\1\0\3\10\1\175\6\10\1\176\1\10"+ - "\1\177\2\0\2\10\1\200\1\201\2\10\1\202\1\10"+ - "\1\203\1\10\11\0\1\16\1\0\10\10\1\204\1\10"+ - "\1\205\7\10\1\206\1\10\1\207\3\43\1\175\6\43"+ - "\1\176\1\43\1\177\2\43\1\200\1\201\2\43\1\202"+ - "\1\43\1\203\11\43\1\204\1\43\1\205\7\43\1\206"+ - "\1\43\3\46\1\175\6\46\1\176\1\46\1\177\2\46"+ - "\1\200\1\201\2\46\1\202\1\46\1\203\11\46\1\204"+ - "\1\46\1\205\7\46\1\206\1\46\1\50\1\0\1\54"+ - "\1\106\2\154\1\210\4\0\1\106\1\0\1\154\1\211"+ - "\1\212\1\213\7\10\1\214\4\10\1\215\4\0\1\16"+ - "\1\0\1\16\1\0\6\10\1\216\1\217\3\10\1\220"+ - "\1\10\1\221\2\10\1\222\1\211\1\212\1\213\7\43"+ - "\1\214\4\43\1\215\6\43\1\216\1\217\3\43\1\220"+ - "\1\43\1\221\2\43\1\222\1\211\1\212\1\213\7\46"+ - "\1\214\4\46\1\215\6\46\1\216\1\217\3\46\1\220"+ - "\1\46\1\221\2\46\1\222\1\74\1\154\2\0\1\210"+ - "\1\0\1\1\1\0\4\10\1\223\1\10\1\224\2\10"+ - "\1\225\1\226\1\10\1\227\2\0\2\10\1\230\2\10"+ - "\1\231\2\10\1\232\1\10\1\233\1\10\4\43\1\223"+ - "\1\43\1\224\2\43\1\225\1\226\1\43\1\227\2\43"+ - "\1\230\2\43\1\231\2\43\1\232\1\43\1\233\1\43"+ - "\4\46\1\223\1\46\1\224\2\46\1\225\1\226\1\46"+ - "\1\227\2\46\1\230\2\46\1\231\2\46\1\232\1\46"+ - "\1\233\1\46\1\74\5\0\1\234\3\10\1\235\1\236"+ - "\1\237\1\10\1\16\1\240\1\10\1\241\5\10\1\234"+ - "\3\43\1\235\1\236\1\237\1\43\1\240\1\43\1\241"+ - "\5\43\1\234\3\46\1\235\1\236\1\237\1\46\1\240"+ - "\1\46\1\241\5\46\1\210\5\0\5\10\1\242\1\243"+ - "\1\244\1\10\1\245\5\43\1\242\1\243\1\244\1\43"+ - "\1\245\5\46\1\242\1\243\1\244\1\46\1\245\2\0"+ - "\1\210\4\0\1\246\2\10\1\247\1\250\1\10\1\246"+ - "\2\43\1\247\1\250\1\43\1\246\2\46\1\247\1\250"+ - "\1\46\4\0\1\210\1\0\1\251\1\252\1\10\1\251"+ - "\1\252\1\43\1\251\1\252\1\46\1\210\2\0\1\210"+ - "\1\0\1\10\1\43\1\46\3\253"; + "\32\0\1\1\1\2\1\3\1\1\1\4\1\5\1\1"+ + "\1\6\1\7\1\10\5\7\1\11\1\12\1\10\1\7"+ + "\1\13\1\7\1\14\1\15\11\7\1\16\1\17\1\20"+ + "\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30"+ + "\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40"+ + "\1\41\20\42\1\43\1\44\20\45\1\46\1\47\1\50"+ + "\1\47\1\51\1\52\1\53\1\47\1\54\1\47\1\41"+ + "\1\44\1\55\1\56\1\57\1\60\1\61\1\62\1\61"+ + "\1\63\1\61\1\64\1\65\2\66\1\67\1\70\2\71"+ + "\1\72\1\73\2\74\1\75\2\76\1\77\1\3\2\77"+ + "\2\100\2\101\5\0\1\3\1\102\1\103\1\104\1\105"+ + "\1\106\1\107\1\110\1\111\1\112\1\113\1\114\1\10"+ + "\1\115\3\0\5\7\1\116\1\7\1\117\1\7\1\120"+ + "\3\7\1\121\1\122\1\123\1\124\1\125\2\0\3\7"+ + "\1\126\1\127\1\130\1\14\1\0\1\14\2\0\1\131"+ + "\4\7\1\132\21\7\1\133\1\134\1\135\1\136\1\137"+ + "\1\0\1\140\1\0\1\141\1\142\1\143\1\144\1\145"+ + "\1\146\5\42\1\116\1\42\1\117\1\42\1\120\12\42"+ + "\1\132\21\42\5\45\1\116\1\45\1\117\1\45\1\120"+ + "\12\45\1\132\21\45\1\0\4\47\1\147\1\150\1\0"+ + "\1\62\1\151\1\0\1\66\1\152\1\153\2\0\1\154"+ + "\1\155\1\156\3\0\1\103\1\157\1\160\1\111\1\161"+ + "\1\0\1\161\3\7\1\162\3\7\1\163\1\164\4\7"+ + "\2\10\3\7\1\165\1\166\4\14\1\131\2\0\1\167"+ + "\23\7\1\170\3\7\1\171\5\7\1\135\1\172\1\173"+ + "\1\174\1\175\1\0\3\42\1\162\3\42\1\163\1\164"+ + "\32\42\1\170\3\42\1\171\5\42\3\45\1\162\3\45"+ + "\1\163\1\164\32\45\1\170\3\45\1\171\5\45\1\47"+ + "\2\0\1\47\1\176\3\152\1\0\1\103\2\157\1\161"+ + "\1\0\3\7\1\177\6\7\1\200\1\7\1\201\2\0"+ + "\2\7\1\202\3\0\1\14\7\0\7\7\1\203\2\7"+ + "\1\204\6\7\1\205\1\7\1\206\2\7\1\207\2\7"+ + "\1\210\1\7\1\211\3\42\1\177\6\42\1\200\1\42"+ + "\1\201\2\42\1\202\7\42\1\203\2\42\1\204\6\42"+ + "\1\205\1\42\1\206\2\42\1\207\2\42\1\210\1\42"+ + "\3\45\1\177\6\45\1\200\1\45\1\201\2\45\1\202"+ + "\7\45\1\203\2\45\1\204\6\45\1\205\1\45\1\206"+ + "\2\45\1\207\2\45\1\210\1\45\1\47\1\0\1\53"+ + "\1\103\1\0\1\157\1\212\1\213\1\214\7\7\1\215"+ + "\1\7\1\14\1\0\1\14\5\0\6\7\1\216\1\217"+ + "\1\7\1\220\3\7\1\221\2\7\1\222\3\7\1\223"+ + "\1\212\1\213\1\214\7\42\1\215\7\42\1\216\1\217"+ + "\1\42\1\220\3\42\1\221\2\42\1\222\3\42\1\223"+ + "\1\212\1\213\1\214\7\45\1\215\7\45\1\216\1\217"+ + "\1\45\1\220\3\45\1\221\2\45\1\222\3\45\1\223"+ + "\1\0\2\7\1\224\3\7\1\225\2\7\2\0\1\226"+ + "\4\7\1\227\1\7\1\230\2\7\1\231\1\7\1\232"+ + "\1\233\1\234\1\7\2\42\1\224\3\42\1\225\2\42"+ + "\1\226\4\42\1\227\1\42\1\230\2\42\1\231\1\42"+ + "\1\232\1\233\1\234\1\42\2\45\1\224\3\45\1\225"+ + "\2\45\1\226\4\45\1\227\1\45\1\230\2\45\1\231"+ + "\1\45\1\232\1\233\1\234\1\45\1\235\3\7\1\236"+ + "\1\237\1\240\1\14\1\241\1\242\7\7\1\235\3\42"+ + "\1\236\1\237\1\240\1\241\1\242\7\42\1\235\3\45"+ + "\1\236\1\237\1\240\1\241\1\242\7\45\4\7\1\243"+ + "\1\244\1\245\2\7\1\246\4\42\1\243\1\244\1\245"+ + "\2\42\1\246\4\45\1\243\1\244\1\245\2\45\1\246"+ + "\2\7\1\247\1\250\1\7\1\251\2\42\1\247\1\250"+ + "\1\42\1\251\2\45\1\247\1\250\1\45\1\251\1\252"+ + "\1\253\1\7\1\252\1\253\1\42\1\252\1\253\1\45"+ + "\1\7\1\42\1\45\3\254"; private static int [] zzUnpackAction() { - int [] result = new int[1027]; + int [] result = new int[964]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -249,138 +240,130 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\111\0\222\0\333\0\u0124\0\u016d\0\u01b6\0\u01ff"+ - "\0\u0248\0\u0291\0\u02da\0\u0323\0\u036c\0\u03b5\0\u03fe\0\u0447"+ - "\0\u0490\0\u04d9\0\u0522\0\u056b\0\u05b4\0\u05fd\0\u0646\0\u068f"+ - "\0\u06d8\0\u0721\0\u076a\0\u07b3\0\u076a\0\u07fc\0\u0845\0\u088e"+ - "\0\u08d7\0\u0920\0\u0969\0\u09b2\0\u09fb\0\u0a44\0\u0a8d\0\u0ad6"+ - "\0\u0b1f\0\u0b68\0\u0bb1\0\u0bfa\0\u0c43\0\u0c8c\0\u0cd5\0\u0d1e"+ - "\0\u0d67\0\u0db0\0\u0df9\0\u0e42\0\u0e8b\0\u0ed4\0\u0f1d\0\u0f66"+ - "\0\u0faf\0\u076a\0\u076a\0\u0ff8\0\u1041\0\u076a\0\u076a\0\u076a"+ - "\0\u076a\0\u076a\0\u076a\0\u108a\0\u10d3\0\u076a\0\u111c\0\u1165"+ - "\0\u11ae\0\u11f7\0\u076a\0\u076a\0\u076a\0\u1240\0\u1289\0\u12d2"+ - "\0\u131b\0\u1364\0\u13ad\0\u13f6\0\u143f\0\u1488\0\u14d1\0\u151a"+ - "\0\u1563\0\u15ac\0\u15f5\0\u163e\0\u1687\0\u076a\0\u076a\0\u16d0"+ - "\0\u1719\0\u1762\0\u17ab\0\u17f4\0\u183d\0\u1886\0\u18cf\0\u1918"+ - "\0\u1961\0\u19aa\0\u19f3\0\u1a3c\0\u1a85\0\u1ace\0\u1b17\0\u076a"+ - "\0\u1b60\0\u1ba9\0\u1bf2\0\u076a\0\u076a\0\u1c3b\0\u1c84\0\u076a"+ - "\0\u1ccd\0\u1d16\0\u1d5f\0\u076a\0\u1da8\0\u076a\0\u1df1\0\u1e3a"+ - "\0\u076a\0\u076a\0\u1e83\0\u1ecc\0\u076a\0\u076a\0\u076a\0\u1f15"+ - "\0\u076a\0\u1f5e\0\u1fa7\0\u076a\0\u076a\0\u076a\0\u076a\0\u076a"+ - "\0\u1ff0\0\u2039\0\u2082\0\u20cb\0\u2114\0\u215d\0\u076a\0\u21a6"+ - "\0\u076a\0\u21ef\0\u076a\0\u2238\0\u076a\0\u2281\0\u22ca\0\u2313"+ - "\0\u076a\0\u22ca\0\u076a\0\u22ca\0\u06d8\0\u235c\0\u23a5\0\u23ee"+ - "\0\u2437\0\u2480\0\u24c9\0\u2512\0\u076a\0\u255b\0\u076a\0\u076a"+ - "\0\u25a4\0\u25ed\0\u076a\0\u076a\0\u076a\0\u076a\0\u076a\0\u2636"+ - "\0\u267f\0\u26c8\0\u2711\0\u275a\0\u27a3\0\u27ec\0\u2835\0\u0969"+ - "\0\u287e\0\u28c7\0\u2910\0\u2959\0\u29a2\0\u29eb\0\u2a34\0\u076a"+ - "\0\u076a\0\u076a\0\u076a\0\u076a\0\u2a7d\0\u2ac6\0\u2b0f\0\u2b58"+ - "\0\u2ba1\0\u2bea\0\u076a\0\u2c33\0\u2c7c\0\u2cc5\0\u2d0e\0\u2d57"+ - "\0\u2da0\0\u2de9\0\u2e32\0\u2e7b\0\u2ec4\0\u2f0d\0\u2f56\0\u2f9f"+ - "\0\u2fe8\0\u3031\0\u307a\0\u30c3\0\u310c\0\u3155\0\u319e\0\u31e7"+ - "\0\u3230\0\u3279\0\u32c2\0\u330b\0\u3354\0\u339d\0\u33e6\0\u076a"+ - "\0\u076a\0\u342f\0\u076a\0\u3478\0\u34c1\0\u076a\0\u350a\0\u076a"+ - "\0\u076a\0\u076a\0\u076a\0\u076a\0\u076a\0\u3553\0\u359c\0\u35e5"+ - "\0\u362e\0\u3677\0\u1240\0\u36c0\0\u3709\0\u3752\0\u379b\0\u37e4"+ - "\0\u382d\0\u3876\0\u38bf\0\u3908\0\u3951\0\u399a\0\u39e3\0\u3a2c"+ - "\0\u3a75\0\u3abe\0\u3b07\0\u3b50\0\u3b99\0\u3be2\0\u3c2b\0\u3c74"+ - "\0\u3cbd\0\u3d06\0\u3d4f\0\u3d98\0\u3de1\0\u3e2a\0\u3e73\0\u3ebc"+ - "\0\u3f05\0\u3f4e\0\u3f97\0\u3fe0\0\u4029\0\u4072\0\u40bb\0\u4104"+ - "\0\u16d0\0\u414d\0\u4196\0\u41df\0\u4228\0\u4271\0\u42ba\0\u4303"+ - "\0\u434c\0\u4395\0\u43de\0\u4427\0\u4470\0\u44b9\0\u4502\0\u454b"+ - "\0\u4594\0\u45dd\0\u4626\0\u466f\0\u46b8\0\u4701\0\u474a\0\u4793"+ - "\0\u47dc\0\u4825\0\u486e\0\u48b7\0\u4900\0\u4949\0\u4992\0\u49db"+ - "\0\u4a24\0\u4a6d\0\u4ab6\0\u4aff\0\u4b48\0\u4b91\0\u4bda\0\u4c23"+ - "\0\u4c6c\0\u4cb5\0\u4cfe\0\u4d47\0\u4d90\0\u4dd9\0\u4e22\0\u4e6b"+ - "\0\u4eb4\0\u4efd\0\u4f46\0\u4f8f\0\u4fd8\0\u04d9\0\u04d9\0\u5021"+ - "\0\u22ca\0\u506a\0\u50b3\0\u50fc\0\u5145\0\u076a\0\u076a\0\u518e"+ - "\0\u51d7\0\u5220\0\u5269\0\u52b2\0\u52fb\0\u0969\0\u5344\0\u538d"+ - "\0\u53d6\0\u541f\0\u5468\0\u54b1\0\u54fa\0\u5543\0\u558c\0\u55d5"+ - "\0\u561e\0\u5667\0\u56b0\0\u56f9\0\u076a\0\u076a\0\u0969\0\u5742"+ - "\0\u578b\0\u57d4\0\u581d\0\u5866\0\u0969\0\u58af\0\u58f8\0\u076a"+ - "\0\u5941\0\u598a\0\u59d3\0\u076a\0\u5a1c\0\u5a65\0\u5aae\0\u5af7"+ - "\0\u5b40\0\u5b89\0\u5bd2\0\u5c1b\0\u5c64\0\u5cad\0\u5cf6\0\u5d3f"+ - "\0\u5d88\0\u5dd1\0\u5e1a\0\u5e63\0\u5eac\0\u5ef5\0\u5f3e\0\u5f87"+ - "\0\u5fd0\0\u6019\0\u6062\0\u076a\0\u076a\0\u076a\0\u076a\0\u076a"+ - "\0\u60ab\0\u60f4\0\u613d\0\u6186\0\u1240\0\u61cf\0\u6218\0\u6261"+ - "\0\u62aa\0\u62f3\0\u633c\0\u6385\0\u63ce\0\u6417\0\u6460\0\u64a9"+ - "\0\u64f2\0\u1240\0\u653b\0\u6584\0\u65cd\0\u6616\0\u665f\0\u1240"+ - "\0\u66a8\0\u66f1\0\u673a\0\u6783\0\u67cc\0\u6815\0\u685e\0\u68a7"+ - "\0\u68f0\0\u6939\0\u6982\0\u69cb\0\u6a14\0\u6a5d\0\u6aa6\0\u6aef"+ - "\0\u6b38\0\u6b81\0\u6bca\0\u6c13\0\u6c5c\0\u6ca5\0\u6cee\0\u6d37"+ - "\0\u6d80\0\u16d0\0\u6dc9\0\u6e12\0\u6e5b\0\u6ea4\0\u6eed\0\u6f36"+ - "\0\u6f7f\0\u6fc8\0\u7011\0\u705a\0\u70a3\0\u70ec\0\u16d0\0\u7135"+ - "\0\u717e\0\u71c7\0\u7210\0\u7259\0\u16d0\0\u72a2\0\u72eb\0\u7334"+ - "\0\u737d\0\u73c6\0\u740f\0\u7458\0\u74a1\0\u74ea\0\u7533\0\u757c"+ - "\0\u75c5\0\u760e\0\u7657\0\u76a0\0\u76e9\0\u7732\0\u777b\0\u77c4"+ - "\0\u780d\0\u7856\0\u789f\0\u78e8\0\u7931\0\u797a\0\u79c3\0\u076a"+ - "\0\u076a\0\u4e22\0\u4e22\0\u7a0c\0\u7a55\0\u7a9e\0\u7ae7\0\u7b30"+ - "\0\u7b79\0\u7bc2\0\u076a\0\u7c0b\0\u7c54\0\u076a\0\u076a\0\u7c9d"+ - "\0\u7ce6\0\u7d2f\0\u7d78\0\u0969\0\u7dc1\0\u7e0a\0\u7e53\0\u7e9c"+ - "\0\u7ee5\0\u7f2e\0\u0969\0\u7f77\0\u0969\0\u7fc0\0\u8009\0\u8052"+ - "\0\u809b\0\u0969\0\u0969\0\u80e4\0\u812d\0\u0969\0\u8176\0\u0969"+ - "\0\u81bf\0\u8208\0\u8251\0\u829a\0\u82e3\0\u832c\0\u8375\0\u83be"+ - "\0\u8407\0\u8450\0\u8499\0\u84e2\0\u852b\0\u8574\0\u85bd\0\u8606"+ - "\0\u864f\0\u8698\0\u86e1\0\u872a\0\u0969\0\u8773\0\u0969\0\u87bc"+ - "\0\u8805\0\u884e\0\u8897\0\u88e0\0\u8929\0\u8972\0\u0969\0\u89bb"+ - "\0\u076a\0\u8a04\0\u8a4d\0\u8a96\0\u1240\0\u8adf\0\u8b28\0\u8b71"+ - "\0\u8bba\0\u8c03\0\u8c4c\0\u1240\0\u8c95\0\u1240\0\u8cde\0\u8d27"+ - "\0\u1240\0\u1240\0\u8d70\0\u8db9\0\u1240\0\u8e02\0\u1240\0\u8e4b"+ - "\0\u8e94\0\u8edd\0\u8f26\0\u8f6f\0\u8fb8\0\u9001\0\u904a\0\u9093"+ - "\0\u1240\0\u90dc\0\u1240\0\u9125\0\u916e\0\u91b7\0\u9200\0\u9249"+ - "\0\u9292\0\u92db\0\u1240\0\u9324\0\u936d\0\u93b6\0\u93ff\0\u16d0"+ - "\0\u9448\0\u9491\0\u94da\0\u9523\0\u956c\0\u95b5\0\u16d0\0\u95fe"+ - "\0\u16d0\0\u9647\0\u9690\0\u16d0\0\u16d0\0\u96d9\0\u9722\0\u16d0"+ - "\0\u976b\0\u16d0\0\u97b4\0\u97fd\0\u9846\0\u988f\0\u98d8\0\u9921"+ - "\0\u996a\0\u99b3\0\u99fc\0\u16d0\0\u9a45\0\u16d0\0\u9a8e\0\u9ad7"+ - "\0\u9b20\0\u9b69\0\u9bb2\0\u9bfb\0\u9c44\0\u16d0\0\u9c8d\0\u9cd6"+ - "\0\u9d1f\0\u076a\0\u9d68\0\u9db1\0\u9dfa\0\u076a\0\u9e43\0\u9e8c"+ - "\0\u9ed5\0\u9f1e\0\u076a\0\u7c0b\0\u9f67\0\u0969\0\u9fb0\0\u0969"+ - "\0\u9ff9\0\ua042\0\ua08b\0\ua0d4\0\ua11d\0\ua166\0\ua1af\0\u0969"+ - "\0\ua1f8\0\ua241\0\ua28a\0\ua2d3\0\ua31c\0\ua365\0\ua3ae\0\ua3f7"+ - "\0\ua440\0\ua489\0\ua4d2\0\ua51b\0\ua564\0\ua5ad\0\ua5f6\0\ua63f"+ - "\0\ua688\0\ua6d1\0\ua71a\0\u0969\0\u0969\0\ua763\0\ua7ac\0\ua7f5"+ - "\0\u0969\0\ua83e\0\u0969\0\ua887\0\ua8d0\0\u0969\0\u1240\0\ua919"+ - "\0\u1240\0\ua962\0\ua9ab\0\ua9f4\0\uaa3d\0\uaa86\0\uaacf\0\uab18"+ - "\0\u1240\0\uab61\0\uabaa\0\uabf3\0\uac3c\0\uac85\0\uacce\0\uad17"+ - "\0\uad60\0\uada9\0\uadf2\0\uae3b\0\u1240\0\u1240\0\uae84\0\uaecd"+ - "\0\uaf16\0\u1240\0\uaf5f\0\u1240\0\uafa8\0\uaff1\0\u1240\0\u16d0"+ - "\0\ub03a\0\u16d0\0\ub083\0\ub0cc\0\ub115\0\ub15e\0\ub1a7\0\ub1f0"+ - "\0\ub239\0\u16d0\0\ub282\0\ub2cb\0\ub314\0\ub35d\0\ub3a6\0\ub3ef"+ - "\0\ub438\0\ub481\0\ub4ca\0\ub513\0\ub55c\0\u16d0\0\u16d0\0\ub5a5"+ - "\0\ub5ee\0\ub637\0\u16d0\0\ub680\0\u16d0\0\ub6c9\0\ub712\0\u16d0"+ - "\0\u9d68\0\ub75b\0\ub7a4\0\ub7ed\0\ub836\0\ub87f\0\ub8c8\0\u9f67"+ - "\0\ub911\0\ub95a\0\ub9a3\0\ub9ec\0\u0969\0\uba35\0\u0969\0\uba7e"+ - "\0\ubac7\0\u0969\0\u0969\0\ubb10\0\u0969\0\ubb59\0\ubba2\0\ubbeb"+ - "\0\ubc34\0\u0969\0\ubc7d\0\ubcc6\0\u0969\0\ubd0f\0\ubd58\0\u0969"+ - "\0\ubda1\0\u0969\0\ubdea\0\ube33\0\ube7c\0\ubec5\0\ubf0e\0\u1240"+ - "\0\ubf57\0\u1240\0\ubfa0\0\ubfe9\0\u1240\0\u1240\0\uc032\0\u1240"+ - "\0\uc07b\0\uc0c4\0\u1240\0\uc10d\0\uc156\0\u1240\0\uc19f\0\uc1e8"+ - "\0\u1240\0\uc231\0\u1240\0\uc27a\0\uc2c3\0\uc30c\0\uc355\0\uc39e"+ - "\0\u16d0\0\uc3e7\0\u16d0\0\uc430\0\uc479\0\u16d0\0\u16d0\0\uc4c2"+ - "\0\u16d0\0\uc50b\0\uc554\0\u16d0\0\uc59d\0\uc5e6\0\u16d0\0\uc62f"+ - "\0\uc678\0\u16d0\0\uc6c1\0\u16d0\0\uc70a\0\ub75b\0\uc753\0\uc79c"+ - "\0\uc7e5\0\uc82e\0\ub836\0\u0969\0\uc877\0\uc8c0\0\uc909\0\u0969"+ - "\0\u0969\0\u0969\0\uc952\0\ua564\0\u0969\0\uc99b\0\u0969\0\uc9e4"+ - "\0\uca2d\0\uca76\0\ucabf\0\ucb08\0\u1240\0\ucb51\0\ucb9a\0\ucbe3"+ - "\0\u1240\0\u1240\0\u1240\0\ucc2c\0\u1240\0\ucc75\0\u1240\0\uccbe"+ - "\0\ucd07\0\ucd50\0\ucd99\0\ucde2\0\u16d0\0\uce2b\0\uce74\0\ucebd"+ - "\0\u16d0\0\u16d0\0\u16d0\0\ucf06\0\u16d0\0\ucf4f\0\u16d0\0\ucf98"+ - "\0\ucfe1\0\ud02a\0\ud073\0\ud0bc\0\u4f46\0\ud105\0\ud14e\0\ud197"+ - "\0\ud1e0\0\ud229\0\ud272\0\ud2bb\0\ud304\0\ud34d\0\ud396\0\u0969"+ - "\0\u0969\0\u0969\0\ud3df\0\u0969\0\ud428\0\ud471\0\ud4ba\0\ud503"+ - "\0\ud54c\0\u1240\0\u1240\0\u1240\0\ud595\0\u1240\0\ud5de\0\ud627"+ - "\0\ud670\0\ud6b9\0\ud702\0\u16d0\0\u16d0\0\u16d0\0\ud74b\0\u16d0"+ - "\0\ud794\0\ud7dd\0\ud826\0\ud86f\0\ud8b8\0\ud901\0\ud94a\0\u0969"+ - "\0\ud993\0\ud9dc\0\u0969\0\u0969\0\uda25\0\u1240\0\uda6e\0\udab7"+ - "\0\u1240\0\u1240\0\udb00\0\u16d0\0\udb49\0\udb92\0\u16d0\0\u16d0"+ - "\0\udbdb\0\udc24\0\udc6d\0\udcb6\0\udcff\0\uc7e5\0\udd48\0\u0969"+ - "\0\u0969\0\udd91\0\u1240\0\u1240\0\uddda\0\u16d0\0\u16d0\0\ude23"+ - "\0\ub7a4\0\ude6c\0\ud826\0\ud794\0\udeb5\0\udefe\0\udf47\0\udf90"+ - "\0\u0969\0\u1240\0\u16d0"; + "\0\0\0\110\0\220\0\330\0\u0120\0\u0168\0\u01b0\0\u01f8"+ + "\0\u0240\0\u0288\0\u02d0\0\u0318\0\u0360\0\u03a8\0\u03f0\0\u0438"+ + "\0\u0480\0\u04c8\0\u0510\0\u0558\0\u05a0\0\u05e8\0\u0630\0\u0678"+ + "\0\u06c0\0\u0708\0\u0750\0\u0798\0\u0750\0\u07e0\0\u0828\0\u0870"+ + "\0\u08b8\0\u0900\0\u0948\0\u0990\0\u09d8\0\u0a20\0\u0a68\0\u0ab0"+ + "\0\u0af8\0\u0b40\0\u0b88\0\u0bd0\0\u0c18\0\u0c60\0\u0ca8\0\u0cf0"+ + "\0\u0d38\0\u0d80\0\u0dc8\0\u0e10\0\u0e58\0\u0ea0\0\u0ee8\0\u0f30"+ + "\0\u0f78\0\u0fc0\0\u0750\0\u0750\0\u1008\0\u1050\0\u0750\0\u0750"+ + "\0\u0750\0\u0750\0\u0750\0\u0750\0\u1098\0\u10e0\0\u0750\0\u1128"+ + "\0\u1170\0\u11b8\0\u1200\0\u0750\0\u0750\0\u0750\0\u1248\0\u1290"+ + "\0\u12d8\0\u1320\0\u1368\0\u13b0\0\u13f8\0\u1440\0\u1488\0\u14d0"+ + "\0\u1518\0\u1560\0\u15a8\0\u15f0\0\u1638\0\u1680\0\u0750\0\u0750"+ + "\0\u16c8\0\u1710\0\u1758\0\u17a0\0\u17e8\0\u1830\0\u1878\0\u18c0"+ + "\0\u1908\0\u1950\0\u1998\0\u19e0\0\u1a28\0\u1a70\0\u1ab8\0\u1b00"+ + "\0\u0750\0\u1b48\0\u1b90\0\u1bd8\0\u0750\0\u0750\0\u1c20\0\u1c68"+ + "\0\u0750\0\u1cb0\0\u1cf8\0\u1d40\0\u0750\0\u1d88\0\u0750\0\u0750"+ + "\0\u0750\0\u0750\0\u1dd0\0\u1e18\0\u1e60\0\u1ea8\0\u0750\0\u1ef0"+ + "\0\u1f38\0\u0750\0\u1f80\0\u0750\0\u1fc8\0\u2010\0\u0750\0\u2058"+ + "\0\u20a0\0\u20e8\0\u0750\0\u2130\0\u0750\0\u2178\0\u21c0\0\u1e18"+ + "\0\u0750\0\u21c0\0\u0750\0\u21c0\0\u06c0\0\u2208\0\u2250\0\u2298"+ + "\0\u22e0\0\u2328\0\u2370\0\u23b8\0\u0750\0\u2400\0\u0750\0\u0750"+ + "\0\u2448\0\u2490\0\u0750\0\u0750\0\u0750\0\u0750\0\u0750\0\u24d8"+ + "\0\u2520\0\u2568\0\u25b0\0\u25f8\0\u2640\0\u2688\0\u26d0\0\u0948"+ + "\0\u2718\0\u2760\0\u27a8\0\u27f0\0\u2838\0\u2880\0\u28c8\0\u0750"+ + "\0\u0750\0\u0750\0\u0750\0\u0750\0\u2910\0\u2958\0\u29a0\0\u29e8"+ + "\0\u2a30\0\u2a78\0\u0750\0\u0750\0\u2ac0\0\u2b08\0\u2b50\0\u2b98"+ + "\0\u2be0\0\u2c28\0\u2c70\0\u2cb8\0\u2d00\0\u2d48\0\u2d90\0\u2dd8"+ + "\0\u2e20\0\u2e68\0\u2eb0\0\u2ef8\0\u2f40\0\u2f88\0\u2fd0\0\u3018"+ + "\0\u3060\0\u30a8\0\u30f0\0\u3138\0\u3180\0\u31c8\0\u3210\0\u3258"+ + "\0\u0750\0\u0750\0\u32a0\0\u0750\0\u32e8\0\u3330\0\u0750\0\u3378"+ + "\0\u0750\0\u0750\0\u0750\0\u0750\0\u0750\0\u0750\0\u33c0\0\u3408"+ + "\0\u3450\0\u3498\0\u34e0\0\u1248\0\u3528\0\u3570\0\u35b8\0\u3600"+ + "\0\u3648\0\u3690\0\u36d8\0\u3720\0\u3768\0\u37b0\0\u37f8\0\u3840"+ + "\0\u3888\0\u38d0\0\u3918\0\u3960\0\u39a8\0\u39f0\0\u3a38\0\u3a80"+ + "\0\u3ac8\0\u3b10\0\u3b58\0\u3ba0\0\u3be8\0\u3c30\0\u3c78\0\u3cc0"+ + "\0\u3d08\0\u3d50\0\u3d98\0\u3de0\0\u3e28\0\u3e70\0\u3eb8\0\u3f00"+ + "\0\u3f48\0\u16c8\0\u3f90\0\u3fd8\0\u4020\0\u4068\0\u40b0\0\u40f8"+ + "\0\u4140\0\u4188\0\u41d0\0\u4218\0\u4260\0\u42a8\0\u42f0\0\u4338"+ + "\0\u4380\0\u43c8\0\u4410\0\u4458\0\u44a0\0\u44e8\0\u4530\0\u4578"+ + "\0\u45c0\0\u4608\0\u4650\0\u4698\0\u46e0\0\u4728\0\u4770\0\u47b8"+ + "\0\u4800\0\u4848\0\u4890\0\u48d8\0\u4920\0\u4968\0\u49b0\0\u49f8"+ + "\0\u4a40\0\u4a88\0\u4ad0\0\u0750\0\u1f80\0\u4b18\0\u0750\0\u4b60"+ + "\0\u4ba8\0\u20e8\0\u0750\0\u0750\0\u4bf0\0\u21c0\0\u4c38\0\u4c80"+ + "\0\u4cc8\0\u4d10\0\u0750\0\u0750\0\u4d58\0\u4da0\0\u4de8\0\u4e30"+ + "\0\u4e78\0\u4ec0\0\u0948\0\u4f08\0\u4f50\0\u4f98\0\u4fe0\0\u5028"+ + "\0\u5070\0\u50b8\0\u5100\0\u5148\0\u5190\0\u51d8\0\u5220\0\u5268"+ + "\0\u52b0\0\u0750\0\u0750\0\u0750\0\u52f8\0\u5340\0\u5388\0\u0750"+ + "\0\u53d0\0\u5418\0\u5460\0\u54a8\0\u54f0\0\u5538\0\u5580\0\u55c8"+ + "\0\u5610\0\u5658\0\u56a0\0\u56e8\0\u5730\0\u5778\0\u57c0\0\u5808"+ + "\0\u5850\0\u5898\0\u58e0\0\u5928\0\u5970\0\u59b8\0\u0948\0\u5a00"+ + "\0\u5a48\0\u5a90\0\u0948\0\u5ad8\0\u5b20\0\u5b68\0\u5bb0\0\u5bf8"+ + "\0\u0750\0\u0750\0\u0750\0\u0750\0\u0750\0\u5c40\0\u5c88\0\u5cd0"+ + "\0\u5d18\0\u1248\0\u5d60\0\u5da8\0\u5df0\0\u5e38\0\u5e80\0\u5ec8"+ + "\0\u5f10\0\u5f58\0\u5fa0\0\u5fe8\0\u6030\0\u6078\0\u60c0\0\u6108"+ + "\0\u6150\0\u6198\0\u61e0\0\u6228\0\u6270\0\u62b8\0\u6300\0\u6348"+ + "\0\u6390\0\u63d8\0\u6420\0\u6468\0\u64b0\0\u64f8\0\u6540\0\u6588"+ + "\0\u65d0\0\u1248\0\u6618\0\u6660\0\u66a8\0\u1248\0\u66f0\0\u6738"+ + "\0\u6780\0\u67c8\0\u6810\0\u6858\0\u68a0\0\u68e8\0\u16c8\0\u6930"+ + "\0\u6978\0\u69c0\0\u6a08\0\u6a50\0\u6a98\0\u6ae0\0\u6b28\0\u6b70"+ + "\0\u6bb8\0\u6c00\0\u6c48\0\u6c90\0\u6cd8\0\u6d20\0\u6d68\0\u6db0"+ + "\0\u6df8\0\u6e40\0\u6e88\0\u6ed0\0\u6f18\0\u6f60\0\u6fa8\0\u6ff0"+ + "\0\u7038\0\u7080\0\u70c8\0\u7110\0\u7158\0\u71a0\0\u16c8\0\u71e8"+ + "\0\u7230\0\u7278\0\u16c8\0\u72c0\0\u7308\0\u7350\0\u7398\0\u73e0"+ + "\0\u7428\0\u7470\0\u74b8\0\u7500\0\u0750\0\u1ef0\0\u1f38\0\u1f80"+ + "\0\u0750\0\u7548\0\u7590\0\u0750\0\u0750\0\u75d8\0\u7620\0\u7668"+ + "\0\u76b0\0\u0948\0\u76f8\0\u7740\0\u7788\0\u77d0\0\u7818\0\u7860"+ + "\0\u0948\0\u78a8\0\u0948\0\u78f0\0\u7938\0\u7980\0\u79c8\0\u0948"+ + "\0\u7a10\0\u7a58\0\u7aa0\0\u7ae8\0\u7b30\0\u7b78\0\u7bc0\0\u7c08"+ + "\0\u7c50\0\u7c98\0\u7ce0\0\u7d28\0\u7d70\0\u7db8\0\u7e00\0\u7e48"+ + "\0\u7e90\0\u7ed8\0\u0948\0\u7f20\0\u7f68\0\u0948\0\u7fb0\0\u7ff8"+ + "\0\u8040\0\u8088\0\u80d0\0\u8118\0\u0948\0\u8160\0\u0948\0\u81a8"+ + "\0\u81f0\0\u0948\0\u8238\0\u8280\0\u0948\0\u82c8\0\u0750\0\u8310"+ + "\0\u8358\0\u83a0\0\u1248\0\u83e8\0\u8430\0\u8478\0\u84c0\0\u8508"+ + "\0\u8550\0\u1248\0\u8598\0\u1248\0\u85e0\0\u8628\0\u1248\0\u8670"+ + "\0\u86b8\0\u8700\0\u8748\0\u8790\0\u87d8\0\u8820\0\u1248\0\u8868"+ + "\0\u88b0\0\u1248\0\u88f8\0\u8940\0\u8988\0\u89d0\0\u8a18\0\u8a60"+ + "\0\u1248\0\u8aa8\0\u1248\0\u8af0\0\u8b38\0\u1248\0\u8b80\0\u8bc8"+ + "\0\u1248\0\u8c10\0\u8c58\0\u8ca0\0\u8ce8\0\u16c8\0\u8d30\0\u8d78"+ + "\0\u8dc0\0\u8e08\0\u8e50\0\u8e98\0\u16c8\0\u8ee0\0\u16c8\0\u8f28"+ + "\0\u8f70\0\u16c8\0\u8fb8\0\u9000\0\u9048\0\u9090\0\u90d8\0\u9120"+ + "\0\u9168\0\u16c8\0\u91b0\0\u91f8\0\u16c8\0\u9240\0\u9288\0\u92d0"+ + "\0\u9318\0\u9360\0\u93a8\0\u16c8\0\u93f0\0\u16c8\0\u9438\0\u9480"+ + "\0\u16c8\0\u94c8\0\u9510\0\u16c8\0\u9558\0\u95a0\0\u95e8\0\u0750"+ + "\0\u0750\0\u7548\0\u9630\0\u0948\0\u9678\0\u0948\0\u96c0\0\u9708"+ + "\0\u9750\0\u9798\0\u97e0\0\u9828\0\u9870\0\u0948\0\u98b8\0\u9900"+ + "\0\u9948\0\u9990\0\u99d8\0\u9a20\0\u9a68\0\u9ab0\0\u9af8\0\u9b40"+ + "\0\u9b88\0\u9bd0\0\u9c18\0\u9c60\0\u9ca8\0\u0948\0\u0948\0\u9cf0"+ + "\0\u0948\0\u9d38\0\u9d80\0\u9dc8\0\u0948\0\u9e10\0\u9e58\0\u9ea0"+ + "\0\u9ee8\0\u9f30\0\u9f78\0\u0948\0\u1248\0\u9fc0\0\u1248\0\ua008"+ + "\0\ua050\0\ua098\0\ua0e0\0\ua128\0\ua170\0\ua1b8\0\u1248\0\ua200"+ + "\0\ua248\0\ua290\0\ua2d8\0\ua320\0\ua368\0\ua3b0\0\u1248\0\u1248"+ + "\0\ua3f8\0\u1248\0\ua440\0\ua488\0\ua4d0\0\u1248\0\ua518\0\ua560"+ + "\0\ua5a8\0\ua5f0\0\ua638\0\ua680\0\u1248\0\u16c8\0\ua6c8\0\u16c8"+ + "\0\ua710\0\ua758\0\ua7a0\0\ua7e8\0\ua830\0\ua878\0\ua8c0\0\u16c8"+ + "\0\ua908\0\ua950\0\ua998\0\ua9e0\0\uaa28\0\uaa70\0\uaab8\0\u16c8"+ + "\0\u16c8\0\uab00\0\u16c8\0\uab48\0\uab90\0\uabd8\0\u16c8\0\uac20"+ + "\0\uac68\0\uacb0\0\uacf8\0\uad40\0\uad88\0\u16c8\0\u9630\0\uadd0"+ + "\0\uae18\0\u0948\0\uae60\0\uaea8\0\uaef0\0\u0948\0\uaf38\0\uaf80"+ + "\0\uafc8\0\ub010\0\u0948\0\ub058\0\ub0a0\0\ub0e8\0\ub130\0\u0948"+ + "\0\ub178\0\u0948\0\ub1c0\0\ub208\0\u0948\0\ub250\0\u0948\0\u0948"+ + "\0\u0948\0\ub298\0\ub2e0\0\ub328\0\u1248\0\ub370\0\ub3b8\0\ub400"+ + "\0\u1248\0\ub448\0\ub490\0\u1248\0\ub4d8\0\ub520\0\ub568\0\ub5b0"+ + "\0\u1248\0\ub5f8\0\u1248\0\ub640\0\ub688\0\u1248\0\ub6d0\0\u1248"+ + "\0\u1248\0\u1248\0\ub718\0\ub760\0\ub7a8\0\u16c8\0\ub7f0\0\ub838"+ + "\0\ub880\0\u16c8\0\ub8c8\0\ub910\0\u16c8\0\ub958\0\ub9a0\0\ub9e8"+ + "\0\uba30\0\u16c8\0\uba78\0\u16c8\0\ubac0\0\ubb08\0\u16c8\0\ubb50"+ + "\0\u16c8\0\u16c8\0\u16c8\0\ubb98\0\u0948\0\ubbe0\0\ubc28\0\ubc70"+ + "\0\u0948\0\u0948\0\u0948\0\u99d8\0\u0948\0\u0948\0\ubcb8\0\ubd00"+ + "\0\ubd48\0\ubd90\0\ubdd8\0\ube20\0\ube68\0\u1248\0\ubeb0\0\ubef8"+ + "\0\ubf40\0\u1248\0\u1248\0\u1248\0\u1248\0\u1248\0\ubf88\0\ubfd0"+ + "\0\uc018\0\uc060\0\uc0a8\0\uc0f0\0\uc138\0\u16c8\0\uc180\0\uc1c8"+ + "\0\uc210\0\u16c8\0\u16c8\0\u16c8\0\u16c8\0\u16c8\0\uc258\0\uc2a0"+ + "\0\uc2e8\0\uc330\0\uc378\0\uc3c0\0\uc408\0\uc450\0\uc498\0\uc4e0"+ + "\0\uc528\0\u0948\0\u0948\0\u0948\0\uc570\0\uc5b8\0\u0948\0\uc600"+ + "\0\uc648\0\uc690\0\uc6d8\0\u1248\0\u1248\0\u1248\0\uc720\0\uc768"+ + "\0\u1248\0\uc7b0\0\uc7f8\0\uc840\0\uc888\0\u16c8\0\u16c8\0\u16c8"+ + "\0\uc8d0\0\uc918\0\u16c8\0\uc960\0\uc9a8\0\u0948\0\u0948\0\uc9f0"+ + "\0\u0948\0\uca38\0\uca80\0\u1248\0\u1248\0\ucac8\0\u1248\0\ucb10"+ + "\0\ucb58\0\u16c8\0\u16c8\0\ucba0\0\u16c8\0\u0948\0\u0948\0\ucbe8"+ + "\0\u1248\0\u1248\0\ucc30\0\u16c8\0\u16c8\0\ucc78\0\uccc0\0\ucd08"+ + "\0\ucd50\0\u0948\0\u1248\0\u16c8"; private static int [] zzUnpackRowMap() { - int [] result = new int[1027]; + int [] result = new int[964]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -406,999 +389,985 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { "\1\33\2\34\1\35\1\36\1\37\1\40\1\41\1\42"+ "\1\43\1\44\2\43\1\45\1\43\1\46\1\43\1\47"+ "\1\43\1\50\1\43\1\51\1\43\1\52\1\53\1\43"+ - "\1\54\1\55\1\43\1\44\2\43\1\56\2\43\1\57"+ - "\1\60\1\61\1\62\1\63\1\43\1\64\1\65\1\66"+ - "\1\43\1\67\2\43\1\70\3\43\1\71\1\72\1\73"+ - "\1\33\1\74\1\75\1\76\1\77\1\100\1\101\1\102"+ - "\1\103\1\104\1\105\1\106\1\107\1\110\1\111\1\112"+ - "\1\113\1\114\11\115\1\116\1\115\2\116\1\117\1\116"+ - "\1\120\1\116\1\121\1\116\1\122\1\116\1\123\1\116"+ - "\2\115\1\116\1\115\1\124\1\116\1\115\2\116\1\115"+ - "\1\116\1\115\1\125\1\126\1\127\2\115\1\116\1\130"+ - "\1\131\1\132\1\116\1\133\2\116\1\134\3\116\1\135"+ - "\1\136\23\115\11\137\1\140\1\137\2\140\1\141\1\140"+ - "\1\142\1\140\1\143\1\140\1\144\1\140\1\145\1\140"+ - "\2\137\1\140\1\137\1\146\1\140\1\137\2\140\1\137"+ - "\1\140\1\137\1\147\1\150\1\151\2\137\1\140\1\152"+ - "\1\153\1\154\1\140\1\155\2\140\1\156\3\140\1\157"+ - "\1\160\23\137\1\161\2\162\1\161\1\163\35\161\1\164"+ - "\3\161\1\165\42\161\4\166\1\167\35\166\1\170\3\166"+ - "\1\171\42\166\11\115\1\116\1\115\14\116\2\115\1\116"+ - "\1\115\2\116\1\115\2\116\1\115\1\116\1\115\3\116"+ - "\2\115\15\116\64\115\1\172\50\115\11\137\1\140\1\137"+ - "\14\140\2\137\1\140\1\137\2\140\1\137\2\140\1\137"+ - "\1\140\1\137\3\140\2\137\15\140\64\137\1\173\50\137"+ - "\1\174\2\175\106\174\1\176\2\177\6\176\1\200\1\176"+ - "\14\200\2\176\1\200\1\176\2\200\1\176\2\200\1\176"+ - "\1\200\1\176\3\200\2\176\15\200\1\201\23\176\1\202"+ - "\2\203\1\202\1\204\1\205\34\202\1\206\46\202\1\207"+ - "\2\210\6\207\1\200\1\207\14\200\2\207\1\200\1\207"+ - "\2\200\1\207\2\200\1\207\1\200\1\207\3\200\2\207"+ - "\15\200\1\201\23\207\1\211\2\212\1\211\1\213\1\205"+ - "\34\211\1\214\46\211\1\33\2\34\1\35\1\36\1\37"+ + "\1\54\1\55\1\43\1\44\2\43\1\56\1\43\1\57"+ + "\1\43\1\60\1\61\1\62\1\63\1\64\1\43\1\65"+ + "\1\66\1\67\2\43\1\70\1\71\3\43\1\72\1\73"+ + "\1\74\1\75\1\76\1\77\1\100\1\101\1\102\1\103"+ + "\1\104\1\105\1\106\1\107\1\110\1\111\1\112\1\113"+ + "\1\114\1\115\11\116\1\117\1\116\2\117\1\120\1\117"+ + "\1\121\1\117\1\122\1\117\1\123\1\117\1\124\1\117"+ + "\2\116\1\117\1\116\1\125\1\117\1\116\2\117\1\116"+ + "\1\117\1\116\1\117\2\116\1\126\1\127\1\130\1\117"+ + "\1\131\1\132\1\133\2\117\1\134\1\135\3\117\1\136"+ + "\1\137\22\116\11\140\1\141\1\140\2\141\1\142\1\141"+ + "\1\143\1\141\1\144\1\141\1\145\1\141\1\146\1\141"+ + "\2\140\1\141\1\140\1\147\1\141\1\140\2\141\1\140"+ + "\1\141\1\140\1\141\2\140\1\150\1\151\1\152\1\141"+ + "\1\153\1\154\1\155\2\141\1\156\1\157\3\141\1\160"+ + "\1\161\22\140\1\162\2\163\1\162\1\164\35\162\1\165"+ + "\2\162\1\166\42\162\4\167\1\170\35\167\1\171\2\167"+ + "\1\172\42\167\11\116\1\117\1\116\14\117\2\116\1\117"+ + "\1\116\2\117\1\116\2\117\1\116\1\117\1\116\1\117"+ + "\2\116\17\117\63\116\1\173\47\116\11\140\1\141\1\140"+ + "\14\141\2\140\1\141\1\140\2\141\1\140\2\141\1\140"+ + "\1\141\1\140\1\141\2\140\17\141\63\140\1\174\47\140"+ + "\1\175\2\176\105\175\1\33\2\34\1\35\1\36\1\37"+ "\1\40\1\41\1\42\1\43\1\44\2\43\1\45\1\43"+ "\1\46\1\43\1\47\1\43\1\50\1\43\1\51\1\43"+ "\1\52\1\53\1\43\1\54\1\55\1\43\1\44\2\43"+ - "\1\56\2\43\1\57\1\60\1\61\1\62\1\63\1\43"+ - "\1\64\1\65\1\66\1\43\1\67\2\43\1\70\3\43"+ - "\1\71\1\215\1\216\1\33\1\74\1\75\1\76\1\77"+ - "\1\100\1\101\1\102\1\103\1\104\1\105\1\106\1\107"+ - "\1\110\1\111\1\112\1\113\1\114\3\217\1\220\1\221"+ - "\1\222\34\217\1\223\46\217\1\224\2\225\6\224\1\226"+ - "\1\224\14\226\2\224\1\226\1\224\2\226\1\224\2\226"+ - "\1\224\1\226\1\224\3\226\2\224\15\226\1\227\1\224"+ - "\1\0\21\224\4\22\1\230\1\231\34\22\1\232\46\22"+ - "\11\233\1\226\1\233\14\226\2\233\1\226\1\233\2\226"+ - "\1\233\2\226\1\233\1\226\1\233\3\226\2\233\15\226"+ - "\64\233\1\234\50\233\1\235\3\236\1\237\1\240\103\235"+ - "\1\241\3\236\1\242\104\241\1\243\3\236\1\244\104\243"+ - "\1\33\2\34\1\35\1\36\1\37\1\40\1\41\1\42"+ - "\1\43\1\44\2\43\1\45\1\43\1\46\1\43\1\47"+ - "\1\43\1\50\1\43\1\51\1\43\1\52\1\53\1\43"+ - "\1\54\1\55\1\43\1\44\2\43\1\56\2\43\1\57"+ - "\1\60\1\61\1\62\1\63\1\43\1\64\1\65\1\66"+ - "\1\43\1\67\2\43\1\70\3\43\1\71\1\72\2\33"+ - "\1\74\1\75\1\76\1\77\1\100\1\101\1\102\1\103"+ - "\1\104\1\105\1\106\1\107\1\110\1\111\1\112\1\113"+ - "\1\114\4\245\1\246\35\245\1\0\3\245\1\247\42\245"+ - "\46\0\1\250\154\0\3\34\1\251\105\0\1\252\1\35"+ - "\113\0\1\253\1\254\62\0\1\255\25\0\1\256\31\0"+ - "\1\257\30\0\1\260\27\0\1\261\171\0\1\262\30\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\15\43\36\0"+ - "\1\44\2\263\2\264\2\265\2\266\2\267\2\270\2\0"+ - "\1\271\1\44\2\0\1\44\2\0\1\272\61\0\6\43"+ - "\1\273\1\43\1\274\5\43\2\0\7\43\1\0\5\43"+ - "\2\0\2\43\1\275\4\43\1\276\5\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\7\43\1\277\5\43"+ - "\35\0\4\43\1\300\11\43\2\0\7\43\1\0\2\43"+ - "\1\301\2\43\2\0\6\43\1\302\6\43\35\0\14\43"+ - "\1\303\1\43\2\0\7\43\1\0\5\43\2\0\7\43"+ - "\1\304\5\43\35\0\6\43\1\305\7\43\2\0\5\43"+ - "\1\306\1\43\1\0\2\43\1\307\2\43\2\0\15\43"+ - "\53\0\1\310\41\0\1\311\47\0\1\312\40\0\1\313"+ - "\7\0\1\314\21\0\1\44\2\263\2\264\2\265\2\266"+ - "\2\267\2\270\2\0\1\271\1\44\2\315\1\44\2\316"+ - "\1\272\61\0\16\43\2\0\7\43\1\0\3\43\1\317"+ - "\1\43\2\0\7\43\1\320\1\43\1\321\3\43\64\0"+ - "\1\322\45\0\1\323\13\0\14\43\1\324\1\43\2\0"+ - "\7\43\1\0\5\43\2\0\1\325\1\43\1\326\12\43"+ - "\35\0\14\43\1\327\1\43\2\0\7\43\1\0\5\43"+ - "\2\0\15\43\35\0\16\43\2\0\7\43\1\0\3\43"+ - "\1\330\1\43\2\0\12\43\1\331\2\43\24\0\1\332"+ - "\2\0\1\332\1\333\35\332\1\0\3\332\1\334\42\332"+ - "\1\335\2\0\1\335\1\336\42\335\1\337\41\335\11\0"+ - "\16\43\2\0\7\43\1\0\3\43\1\340\1\43\2\0"+ - "\1\341\1\43\1\342\12\43\35\0\16\43\2\0\2\43"+ - "\1\343\4\43\1\0\5\43\2\0\5\43\1\344\7\43"+ - "\35\0\6\43\1\345\7\43\2\0\7\43\1\0\5\43"+ - "\2\0\2\43\1\346\4\43\1\347\2\43\1\350\2\43"+ - "\35\0\16\43\2\0\7\43\1\0\4\43\1\351\2\0"+ - "\1\352\10\43\1\353\1\354\1\43\1\355\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\7\43\1\356\5\43"+ - "\35\0\16\43\2\0\7\43\1\0\5\43\2\0\12\43"+ - "\1\357\2\43\64\0\1\360\35\0\1\361\103\0\1\362"+ - "\10\0\1\363\77\0\1\364\6\0\1\365\101\0\1\366"+ - "\7\0\1\367\100\0\1\370\110\0\1\371\110\0\1\372"+ - "\13\0\1\373\74\0\1\374\14\0\1\375\13\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\15\116"+ - "\35\0\6\116\1\376\1\116\1\377\5\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\2\116\1\u0100\4\116"+ - "\1\u0101\5\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\7\116\1\u0102\5\116\35\0\4\116"+ - "\1\u0103\11\116\2\0\7\116\1\0\1\116\1\0\1\u0104"+ - "\2\116\2\0\6\116\1\u0105\6\116\35\0\14\116\1\u0106"+ - "\1\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\7\116\1\u0107\5\116\35\0\6\116\1\u0108\7\116\2\0"+ - "\5\116\1\u0109\1\116\1\0\1\116\1\0\1\u010a\2\116"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\1\116\1\u010b\1\116\2\0\7\116\1\u010c\1\116"+ - "\1\u010d\3\116\35\0\14\116\1\u010e\1\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\1\u010f\1\116\1\u0110"+ - "\12\116\35\0\14\116\1\u0111\1\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\1\116\1\u0112\1\116\2\0"+ - "\12\116\1\u0113\2\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\1\116\1\u0114\1\116\2\0\1\u0115\1\116"+ - "\1\u0116\12\116\35\0\16\116\2\0\2\116\1\u0117\4\116"+ - "\1\0\1\116\1\0\3\116\2\0\5\116\1\u0118\7\116"+ - "\35\0\6\116\1\u0119\7\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\2\116\1\u011a\4\116\1\u011b\2\116"+ - "\1\u011c\2\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\2\116\1\u011d\2\0\1\u011e\10\116\1\u011f\1\u0120"+ - "\1\116\1\u0121\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\7\116\1\u0122\5\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\12\116"+ - "\1\u0123\2\116\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\15\140\35\0\6\140\1\u0124\1\140"+ - "\1\u0125\5\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\2\140\1\u0126\4\140\1\u0127\5\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\7\140"+ - "\1\u0128\5\140\35\0\4\140\1\u0129\11\140\2\0\7\140"+ - "\1\0\1\140\1\0\1\u012a\2\140\2\0\6\140\1\u012b"+ - "\6\140\35\0\14\140\1\u012c\1\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\7\140\1\u012d\5\140\35\0"+ - "\6\140\1\u012e\7\140\2\0\5\140\1\u012f\1\140\1\0"+ - "\1\140\1\0\1\u0130\2\140\2\0\15\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\1\140\1\u0131\1\140"+ - "\2\0\7\140\1\u0132\1\140\1\u0133\3\140\35\0\14\140"+ - "\1\u0134\1\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\1\u0135\1\140\1\u0136\12\140\35\0\14\140\1\u0137"+ - "\1\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\1\140\1\u0138\1\140\2\0\12\140\1\u0139\2\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\1\140\1\u013a"+ - "\1\140\2\0\1\u013b\1\140\1\u013c\12\140\35\0\16\140"+ - "\2\0\2\140\1\u013d\4\140\1\0\1\140\1\0\3\140"+ - "\2\0\5\140\1\u013e\7\140\35\0\6\140\1\u013f\7\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\2\140"+ - "\1\u0140\4\140\1\u0141\2\140\1\u0142\2\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\2\140\1\u0143\2\0"+ - "\1\u0144\10\140\1\u0145\1\u0146\1\140\1\u0147\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\7\140"+ - "\1\u0148\5\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\12\140\1\u0149\2\140\24\0\1\161"+ - "\2\0\1\161\1\163\35\161\1\0\3\161\1\0\42\161"+ - "\1\0\3\162\1\u014a\104\0\3\161\1\u014b\1\u014c\104\161"+ - "\4\166\1\167\35\166\1\0\3\166\1\u014d\157\166\1\0"+ - "\35\166\1\0\3\166\1\u014e\42\166\11\0\1\u014f\1\0"+ - "\14\u014f\2\0\1\u014f\1\0\2\u014f\1\0\2\u014f\1\0"+ - "\1\u014f\1\0\3\u014f\2\0\15\u014f\35\0\1\u0150\1\0"+ - "\14\u0150\2\0\1\u0150\1\0\2\u0150\1\0\2\u0150\1\0"+ - "\1\u0150\1\0\3\u0150\2\0\15\u0150\25\0\3\175\1\u0151"+ - "\105\0\3\177\1\u0152\115\0\16\200\2\0\7\200\1\0"+ - "\1\200\1\0\3\200\2\0\15\200\25\0\3\203\1\u0153"+ - "\111\0\1\202\104\0\3\210\1\u0154\105\0\3\212\1\u0155"+ - "\111\0\1\211\104\0\1\u0156\1\220\106\0\4\u0157\1\u0158"+ - "\1\253\1\u0159\33\u0157\1\u015a\46\u0157\5\0\1\u015b\107\0"+ - "\1\u015c\105\0\3\225\1\u015d\115\0\16\226\2\0\7\226"+ - "\1\0\1\226\1\0\3\226\2\0\15\226\24\0\4\22"+ - "\1\230\1\u015e\34\22\1\u015f\46\22\5\0\1\231\114\0"+ - "\1\u0160\1\0\14\u0160\2\0\1\u0160\1\0\2\u0160\1\0"+ - "\2\u0160\1\0\1\u0160\1\0\3\u0160\2\0\15\u0160\25\0"+ - "\3\236\1\u0161\105\0\2\236\113\0\1\253\1\254\102\0"+ - "\115\245\1\0\35\245\1\0\3\245\1\u0162\42\245\46\0"+ - "\1\u0163\43\0\2\34\110\0\1\35\106\0\1\253\2\0"+ - "\106\253\6\u0164\1\u0165\102\u0164\71\0\1\u0166\17\0\1\261"+ - "\2\0\106\261\71\0\1\u0167\31\0\1\u0168\14\0\2\u0169"+ - "\1\0\1\u0168\2\0\1\u0168\65\0\1\44\16\0\1\271"+ - "\1\44\2\0\1\44\65\0\1\u016a\17\0\1\u016a\2\0"+ - "\1\u016a\64\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\7\43\1\u016b\5\43\35\0\16\43\2\0\7\43\1\0"+ - "\2\43\1\u016c\2\43\2\0\15\43\35\0\6\43\1\u016d"+ - "\7\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\16\43\2\0\7\43\1\0\3\43\1\u016e\1\43\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\2\43\1\u016f"+ - "\2\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\4\43\1\u0170\2\0\5\43\1\u0171\7\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\1\43\1\u0172\13\43"+ - "\35\0\4\43\1\u0173\11\43\2\0\7\43\1\0\5\43"+ - "\2\0\15\43\35\0\16\43\2\0\7\43\1\0\5\43"+ - "\2\0\1\u0174\14\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\5\43\1\u0175\7\43\35\0\16\43\2\0"+ - "\7\43\1\0\4\43\1\u0176\2\0\15\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\1\u0177\14\43\56\0"+ - "\1\u0178\2\0\1\u0178\64\0\2\u0179\2\0\2\u0179\4\0"+ - "\4\u0179\3\0\4\u0179\14\0\2\u0179\46\0\14\43\1\u017a"+ - "\1\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\7\43\1\u017b"+ - "\5\43\35\0\16\43\2\0\7\43\1\0\4\43\1\u017c"+ - "\2\0\15\43\64\0\1\u017d\37\0\1\u017e\21\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\14\43\1\u017f\35\0"+ - "\6\43\1\u0180\7\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\4\43\1\u0181"+ - "\2\0\15\43\35\0\16\43\2\0\7\43\1\0\4\43"+ - "\1\u0182\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\1\u0183\1\43\1\u0184\6\43\1\u0185\3\43"+ - "\35\0\10\43\1\u0186\5\43\2\0\7\43\1\0\3\43"+ - "\1\u0187\1\43\2\0\15\43\24\0\1\332\2\0\1\332"+ - "\1\333\35\332\1\0\3\332\1\u0188\45\332\1\u0189\1\u018a"+ - "\104\332\46\0\1\u018b\42\0\1\335\2\0\1\335\1\336"+ - "\42\335\1\u018c\44\335\1\u018d\1\u018e\104\335\47\0\1\u018f"+ - "\52\0\10\43\1\u0190\5\43\2\0\7\43\1\0\5\43"+ - "\2\0\7\43\1\u0191\5\43\35\0\16\43\2\0\2\43"+ - "\1\u0192\4\43\1\0\5\43\2\0\15\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\3\43\1\u0193\11\43"+ - "\35\0\16\43\2\0\7\43\1\0\5\43\2\0\5\43"+ - "\1\u0194\7\43\35\0\16\43\2\0\7\43\1\0\5\43"+ - "\2\0\5\43\1\u0195\7\43\35\0\16\43\2\0\7\43"+ - "\1\0\5\43\2\0\2\43\1\u0196\12\43\35\0\16\43"+ - "\2\0\7\43\1\0\4\43\1\u0197\2\0\5\43\1\u0198"+ - "\7\43\35\0\16\43\2\0\7\43\1\0\2\43\1\u0199"+ - "\2\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\2\43\1\u019a\12\43\35\0\16\43\2\0"+ - "\7\43\1\0\3\43\1\u019b\1\43\2\0\2\43\1\u019c"+ - "\12\43\35\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\1\43\1\u019d\13\43\35\0\16\43\2\0\7\43\1\0"+ - "\2\43\1\u019e\2\43\2\0\15\43\35\0\16\43\2\0"+ - "\7\43\1\0\5\43\2\0\7\43\1\u019f\5\43\35\0"+ - "\10\43\1\u01a0\5\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\6\43\1\u01a1\1\43\1\u01a2\5\43\2\0"+ - "\7\43\1\0\5\43\2\0\15\43\35\0\10\43\1\u01a3"+ - "\5\43\2\0\7\43\1\0\5\43\2\0\15\43\115\0"+ - "\1\u01a4\10\0\1\u01a5\107\0\1\u01a6\100\0\1\u01a7\110\0"+ - "\1\u01a8\7\0\1\u01a9\20\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\7\116\1\u01aa\5\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\1\u01ab\2\116"+ - "\2\0\15\116\35\0\6\116\1\u01ac\7\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\15\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\1\116\1\u01ad\1\116"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\1\u01ae\2\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\2\116\1\u01af\2\0\5\116"+ - "\1\u01b0\7\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\1\116\1\u01b1\13\116\35\0\4\116"+ - "\1\u01b2\11\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\1\u01b3\14\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\5\116\1\u01b4"+ - "\7\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\2\116\1\u01b5\2\0\15\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\1\u01b6\14\116\35\0"+ - "\14\116\1\u01b7\1\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\15\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\7\116\1\u01b8\5\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\2\116\1\u01b9"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\14\116\1\u01ba\35\0\6\116\1\u01bb"+ - "\7\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\2\116\1\u01bc\2\0\15\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\2\116\1\u01bd\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\1\u01be\1\116\1\u01bf\6\116\1\u01c0\3\116\35\0\10\116"+ - "\1\u01c1\5\116\2\0\7\116\1\0\1\116\1\0\1\116"+ - "\1\u01c2\1\116\2\0\15\116\35\0\10\116\1\u01c3\5\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\7\116"+ - "\1\u01c4\5\116\35\0\16\116\2\0\2\116\1\u01c5\4\116"+ - "\1\0\1\116\1\0\3\116\2\0\15\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\3\116"+ - "\1\u01c6\11\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\5\116\1\u01c7\7\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\5\116"+ - "\1\u01c8\7\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\2\116\1\u01c9\12\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\2\116\1\u01ca\2\0"+ - "\5\116\1\u01cb\7\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\1\u01cc\2\116\2\0\15\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\2\116"+ - "\1\u01cd\12\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\1\116\1\u01ce\1\116\2\0\2\116\1\u01cf\12\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\1\116\1\u01d0\13\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\1\u01d1\2\116\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\7\116\1\u01d2\5\116\35\0\10\116\1\u01d3\5\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\15\116\35\0"+ - "\6\116\1\u01d4\1\116\1\u01d5\5\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\10\116\1\u01d6"+ - "\5\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\7\140\1\u01d7\5\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\1\u01d8\2\140\2\0\15\140"+ - "\35\0\6\140\1\u01d9\7\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\15\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\1\140\1\u01da\1\140\2\0\15\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\1\u01db"+ - "\2\140\2\0\15\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\2\140\1\u01dc\2\0\5\140\1\u01dd\7\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\1\140\1\u01de\13\140\35\0\4\140\1\u01df\11\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\15\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\1\u01e0\14\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\5\140\1\u01e1\7\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\2\140\1\u01e2"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\1\u01e3\14\140\35\0\14\140\1\u01e4"+ - "\1\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\7\140\1\u01e5\5\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\2\140\1\u01e6\2\0\15\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\14\140\1\u01e7\35\0\6\140\1\u01e8\7\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\2\140\1\u01e9"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\2\140\1\u01ea\2\0\15\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\1\u01eb\1\140"+ - "\1\u01ec\6\140\1\u01ed\3\140\35\0\10\140\1\u01ee\5\140"+ - "\2\0\7\140\1\0\1\140\1\0\1\140\1\u01ef\1\140"+ - "\2\0\15\140\35\0\10\140\1\u01f0\5\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\7\140\1\u01f1\5\140"+ - "\35\0\16\140\2\0\2\140\1\u01f2\4\140\1\0\1\140"+ - "\1\0\3\140\2\0\15\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\3\140\1\u01f3\11\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\5\140\1\u01f4\7\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\5\140\1\u01f5\7\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\2\140\1\u01f6\12\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\2\140\1\u01f7\2\0\5\140\1\u01f8"+ - "\7\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\1\u01f9\2\140\2\0\15\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\2\140\1\u01fa\12\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\1\140"+ - "\1\u01fb\1\140\2\0\2\140\1\u01fc\12\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\1\140"+ - "\1\u01fd\13\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\1\u01fe\2\140\2\0\15\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\7\140\1\u01ff"+ - "\5\140\35\0\10\140\1\u0200\5\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\15\140\35\0\6\140\1\u0201"+ - "\1\140\1\u0202\5\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\10\140\1\u0203\5\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\25\0"+ - "\2\162\106\0\3\161\1\u014b\1\u0204\35\161\1\0\3\161"+ - "\1\0\43\161\1\u0205\1\u0206\1\161\1\163\35\161\1\0"+ - "\3\161\1\0\42\161\4\166\1\0\35\166\1\0\3\166"+ - "\1\u0207\46\166\1\0\35\166\1\0\3\166\1\u0208\42\166"+ - "\11\0\16\u014f\2\0\7\u014f\1\0\1\u014f\1\0\3\u014f"+ - "\2\0\15\u014f\35\0\16\u0150\2\0\7\u0150\1\0\1\u0150"+ - "\1\0\3\u0150\2\0\15\u0150\25\0\2\175\107\0\2\177"+ - "\107\0\2\203\107\0\2\210\107\0\2\212\110\0\1\220"+ - "\106\0\4\u0157\1\u0158\1\u0209\34\u0157\1\u015a\52\u0157\1\u0158"+ - "\1\u020a\34\u0157\1\u020b\46\u0157\4\u020c\1\u020d\1\u0164\1\u020e"+ - "\33\u020c\1\u0164\46\u020c\5\0\1\u0209\103\0\5\u015b\1\u020f"+ - "\34\u015b\1\u0210\46\u015b\3\224\1\u0211\1\u0212\104\224\1\0"+ - "\2\225\117\0\16\u0160\2\0\7\u0160\1\0\1\u0160\1\0"+ - "\3\u0160\2\0\15\u0160\24\0\4\245\1\0\35\245\1\0"+ - "\3\245\1\0\42\245\46\0\1\u0213\42\0\6\u0164\1\u0214"+ - "\102\u0164\5\u0215\1\u0216\1\u0165\102\u0215\12\0\1\u0168\2\u0217"+ - "\2\264\4\0\2\267\4\0\1\u0169\1\u0168\2\0\1\u0168"+ - "\65\0\1\u0168\17\0\1\u0168\2\0\1\u0168\65\0\1\u016a"+ - "\2\u0217\2\264\4\0\2\267\2\270\2\0\1\u0218\1\u016a"+ - "\2\0\1\u016a\64\0\16\43\2\0\7\43\1\0\5\43"+ - "\2\0\2\43\1\u0219\12\43\35\0\16\43\2\0\7\43"+ - "\1\0\5\43\2\0\2\43\1\u021a\12\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\5\43\1\u021b\7\43"+ - "\35\0\2\43\1\u021c\13\43\2\0\7\43\1\0\5\43"+ - "\2\0\15\43\35\0\14\43\1\u021d\1\43\2\0\7\43"+ - "\1\0\5\43\2\0\15\43\35\0\16\43\2\0\7\43"+ - "\1\0\4\43\1\u021e\2\0\15\43\35\0\6\43\1\u021f"+ - "\7\43\2\0\7\43\1\0\5\43\2\0\7\43\1\u0220"+ - "\5\43\35\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\2\43\1\u0221\12\43\35\0\16\43\2\0\2\43\1\u0222"+ - "\4\43\1\0\5\43\2\0\15\43\35\0\14\43\1\u0223"+ - "\1\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\14\43\1\u0224\1\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\6\43\1\u0225\6\43\37\0\2\263\2\0\2\265\2\266"+ - "\6\0\1\u0226\1\u0178\2\0\1\u0178\64\0\2\u0179\2\263"+ - "\2\u0179\2\265\2\266\4\u0179\2\0\1\u0227\4\u0179\14\0"+ - "\2\u0179\46\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\2\43\1\u0228\12\43\35\0\6\43\1\u0229\7\43\2\0"+ - "\7\43\1\0\5\43\2\0\15\43\35\0\14\43\1\u022a"+ - "\1\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\6\43\1\u022b\7\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\10\43\1\u022c\5\43\2\0\7\43\1\0"+ - "\5\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\1\u022d\14\43\35\0\14\43\1\u022e\1\43"+ - "\2\0\7\43\1\0\5\43\2\0\15\43\35\0\16\43"+ - "\2\0\7\43\1\0\2\43\1\u022f\2\43\2\0\15\43"+ - "\35\0\16\43\2\0\7\43\1\0\5\43\2\0\5\43"+ - "\1\u0230\7\43\35\0\16\43\2\0\7\43\1\0\5\43"+ - "\2\0\7\43\1\u0231\5\43\24\0\3\332\1\u0189\1\u0232"+ - "\35\332\1\0\3\332\1\u0188\43\332\1\u0233\1\u0234\1\332"+ - "\1\333\35\332\1\0\3\332\1\u0188\42\332\4\u0235\1\u0236"+ - "\35\u0235\1\0\3\u0235\1\u0237\42\u0235\3\335\1\u018d\1\u0238"+ - "\42\335\1\u018c\42\335\1\u0239\1\u023a\1\335\1\336\42\335"+ - "\1\u018c\41\335\4\u018f\1\u023b\42\u018f\1\u023c\41\u018f\11\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\10\43\1\u023d"+ - "\4\43\35\0\16\43\2\0\7\43\1\0\4\43\1\u023e"+ - "\2\0\15\43\35\0\6\43\1\u023f\7\43\2\0\7\43"+ - "\1\0\5\43\2\0\15\43\35\0\16\43\2\0\7\43"+ - "\1\0\5\43\2\0\4\43\1\u0240\10\43\35\0\16\43"+ - "\2\0\7\43\1\0\4\43\1\u0241\2\0\15\43\35\0"+ - "\14\43\1\u0242\1\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\5\43\1\u0243\7\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\3\43\1\u0244\11\43\35\0\14\43\1\u0245"+ - "\1\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\16\43\2\0\7\43\1\0\4\43\1\u0246\2\0\15\43"+ - "\35\0\16\43\2\0\7\43\1\0\3\43\1\u0247\1\43"+ - "\2\0\15\43\35\0\10\43\1\u0248\5\43\2\0\7\43"+ - "\1\0\5\43\2\0\15\43\35\0\16\43\2\0\7\43"+ - "\1\0\4\43\1\u0249\2\0\15\43\35\0\14\43\1\u024a"+ - "\1\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\3\43\1\u024b"+ - "\11\43\35\0\16\43\2\0\7\43\1\0\3\43\1\u024c"+ - "\1\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\4\43\1\u024d\2\0\15\43\35\0\16\43\2\0\7\43"+ - "\1\0\5\43\2\0\2\43\1\u024e\12\43\35\0\12\43"+ - "\1\u024f\3\43\2\0\7\43\1\0\5\43\2\0\15\43"+ - "\35\0\6\43\1\u0250\7\43\2\0\7\43\1\0\5\43"+ - "\2\0\15\43\115\0\1\u0251\30\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\2\116\1\u0252\12\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\2\116\1\u0253\12\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\5\116\1\u0254\7\116"+ - "\35\0\2\116\1\u0255\13\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\15\116\35\0\14\116\1\u0256\1\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\2\116"+ - "\1\u0257\2\0\15\116\35\0\6\116\1\u0258\7\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\7\116\1\u0259"+ - "\5\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\2\116\1\u025a\12\116\35\0\16\116\2\0"+ - "\2\116\1\u025b\4\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\14\116\1\u025c\1\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\14\116\1\u025d"+ - "\1\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\6\116\1\u025e\6\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\2\116\1\u025f"+ - "\12\116\35\0\6\116\1\u0260\7\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\14\116\1\u0261"+ - "\1\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\6\116\1\u0262\7\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\10\116\1\u0263"+ - "\5\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\1\u0264\14\116\35\0\14\116\1\u0265\1\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\1\u0266"+ - "\2\116\2\0\15\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\5\116\1\u0267\7\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\7\116\1\u0268\5\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\10\116\1\u0269\4\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\2\116\1\u026a"+ - "\2\0\15\116\35\0\6\116\1\u026b\7\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\15\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\4\116"+ - "\1\u026c\10\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\2\116\1\u026d\2\0\15\116\35\0\14\116\1\u026e"+ - "\1\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\5\116\1\u026f\7\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\3\116\1\u0270"+ - "\11\116\35\0\14\116\1\u0271\1\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\2\116\1\u0272\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\1\116"+ - "\1\u0273\1\116\2\0\15\116\35\0\10\116\1\u0274\5\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\2\116"+ - "\1\u0275\2\0\15\116\35\0\14\116\1\u0276\1\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\3\116\1\u0277\11\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\1\116\1\u0278\1\116\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\2\116\1\u0279"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\2\116\1\u027a\12\116\35\0\12\116"+ - "\1\u027b\3\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\15\116\35\0\6\116\1\u027c\7\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\15\116\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\2\140"+ - "\1\u027d\12\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\2\140\1\u027e\12\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\5\140"+ - "\1\u027f\7\140\35\0\2\140\1\u0280\13\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\15\140\35\0\14\140"+ - "\1\u0281\1\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\2\140\1\u0282\2\0\15\140\35\0\6\140\1\u0283"+ - "\7\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\7\140\1\u0284\5\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\2\140\1\u0285\12\140\35\0"+ - "\16\140\2\0\2\140\1\u0286\4\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\14\140\1\u0287\1\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\35\0"+ - "\14\140\1\u0288\1\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\6\140\1\u0289\6\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\2\140\1\u028a\12\140\35\0\6\140\1\u028b\7\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\35\0"+ - "\14\140\1\u028c\1\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\6\140\1\u028d\7\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\35\0"+ - "\10\140\1\u028e\5\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\1\u028f\14\140\35\0\14\140"+ - "\1\u0290\1\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\1\u0291\2\140\2\0\15\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\5\140\1\u0292"+ - "\7\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\7\140\1\u0293\5\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\10\140\1\u0294"+ - "\4\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\2\140\1\u0295\2\0\15\140\35\0\6\140\1\u0296\7\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\15\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\4\140\1\u0297\10\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\2\140\1\u0298\2\0\15\140\35\0"+ - "\14\140\1\u0299\1\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\5\140\1\u029a\7\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\3\140\1\u029b\11\140\35\0\14\140\1\u029c\1\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\2\140\1\u029d"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\1\140\1\u029e\1\140\2\0\15\140\35\0\10\140"+ - "\1\u029f\5\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\2\140\1\u02a0\2\0\15\140\35\0\14\140\1\u02a1"+ - "\1\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\3\140\1\u02a2\11\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\1\140\1\u02a3\1\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\2\140\1\u02a4\2\0\15\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\2\140\1\u02a5\12\140"+ - "\35\0\12\140\1\u02a6\3\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\15\140\35\0\6\140\1\u02a7\7\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\15\140"+ - "\24\0\1\161\1\u02a8\2\u014b\1\u014c\104\161\1\0\1\161"+ - "\1\u014b\1\u0206\1\u02a9\105\0\2\161\1\u0206\1\u02a9\104\0"+ - "\4\166\1\0\35\166\1\0\3\166\1\u02aa\42\166\4\u020c"+ - "\1\u020d\1\u0164\1\u02ab\33\u020c\1\u0164\52\u020c\1\u020d\1\u020c"+ - "\1\u02ab\102\u020c\4\u02ac\1\u02ad\1\u0216\1\u020e\33\u02ac\1\u0215"+ - "\46\u02ac\42\u015b\1\u02ae\53\u015b\1\u02af\34\u015b\1\u0210\46\u015b"+ - "\1\0\2\224\1\u02b0\1\u02b1\105\0\1\u02b2\1\u02b0\1\0"+ - "\1\u015c\104\0\5\u0164\1\u02b3\1\u02b4\102\u0164\6\u0215\1\u02b5"+ - "\102\u0215\12\0\1\u016a\16\0\1\u0218\1\u016a\2\0\1\u016a"+ - "\64\0\16\43\2\0\7\43\1\0\4\43\1\u02b6\2\0"+ - "\15\43\35\0\6\43\1\u02b7\7\43\2\0\7\43\1\0"+ - "\5\43\2\0\15\43\35\0\14\43\1\u02b8\1\43\2\0"+ - "\7\43\1\0\5\43\2\0\15\43\35\0\16\43\2\0"+ - "\7\43\1\0\3\43\1\u02b9\1\43\2\0\15\43\35\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\2\43\1\u02ba"+ - "\12\43\35\0\14\43\1\u02bb\1\43\2\0\7\43\1\0"+ - "\5\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\3\43\1\u02bc\1\43\2\0\15\43\35\0\16\43\2\0"+ - "\7\43\1\0\5\43\2\0\1\u02bd\14\43\35\0\6\43"+ - "\1\u02be\7\43\2\0\7\43\1\0\5\43\2\0\15\43"+ - "\35\0\16\43\2\0\7\43\1\0\2\43\1\u02bf\2\43"+ - "\2\0\15\43\55\0\1\u0226\1\u0178\2\0\1\u0178\64\0"+ - "\2\u0179\2\0\2\u0179\4\0\4\u0179\2\0\1\u0227\4\u0179"+ - "\14\0\2\u0179\46\0\16\43\2\0\7\43\1\0\5\43"+ - "\2\0\4\43\1\u02c0\10\43\35\0\14\43\1\u02c1\1\43"+ - "\2\0\7\43\1\0\5\43\2\0\15\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\10\43\1\u02c2\4\43"+ - "\35\0\16\43\2\0\7\43\1\0\3\43\1\u02c3\1\43"+ - "\2\0\15\43\35\0\16\43\2\0\7\43\1\0\5\43"+ - "\2\0\5\43\1\u02c4\7\43\35\0\16\43\2\0\7\43"+ - "\1\0\5\43\2\0\14\43\1\u02c5\24\0\1\332\1\u02c6"+ - "\2\u0189\1\u018a\104\332\1\0\1\332\1\u0189\1\u0234\1\u02c7"+ - "\105\0\2\332\1\u0234\1\u02c7\104\0\4\u0235\1\u0236\35\u0235"+ - "\1\0\3\u0235\1\u02c8\157\u0235\1\0\35\u0235\1\0\3\u0235"+ - "\1\u02c9\42\u0235\1\335\1\u02ca\2\u018d\1\u018e\104\335\1\0"+ - "\1\335\1\u018d\1\u023a\1\u02cb\105\0\2\335\1\u023a\1\u02cb"+ - "\104\0\4\u018f\1\u023b\42\u018f\1\u02cc\110\u018f\1\u02cd\41\u018f"+ - "\11\0\16\43\2\0\7\43\1\0\5\43\2\0\2\43"+ - "\1\u02ce\12\43\35\0\14\43\1\u02cf\1\43\2\0\7\43"+ - "\1\0\5\43\2\0\15\43\35\0\10\43\1\u02d0\5\43"+ - "\2\0\7\43\1\0\5\43\2\0\15\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\2\43\1\u02d1\12\43"+ - "\35\0\16\43\2\0\7\43\1\0\3\43\1\u02d2\1\43"+ - "\2\0\15\43\35\0\16\43\2\0\7\43\1\0\3\43"+ - "\1\u02d3\1\43\2\0\15\43\35\0\16\43\2\0\7\43"+ - "\1\0\5\43\2\0\5\43\1\u02d4\7\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\12\43\1\u02d5\2\43"+ - "\35\0\10\43\1\u02d6\5\43\2\0\7\43\1\0\5\43"+ - "\2\0\15\43\35\0\16\43\2\0\7\43\1\0\5\43"+ - "\2\0\3\43\1\u02d7\11\43\35\0\10\43\1\u02d8\5\43"+ - "\2\0\7\43\1\0\5\43\2\0\15\43\35\0\16\43"+ - "\2\0\7\43\1\0\3\43\1\u02d9\1\43\2\0\15\43"+ - "\35\0\16\43\2\0\7\43\1\0\5\43\2\0\12\43"+ - "\1\u02da\2\43\35\0\16\43\2\0\7\43\1\0\4\43"+ - "\1\u02db\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\3\43\1\u02dc\11\43\35\0\16\43\2\0"+ - "\7\43\1\0\4\43\1\u02dd\2\0\15\43\35\0\14\43"+ - "\1\u02de\1\43\2\0\7\43\1\0\5\43\2\0\15\43"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\2\116"+ - "\1\u02df\2\0\15\116\35\0\6\116\1\u02e0\7\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\15\116\35\0"+ - "\14\116\1\u02e1\1\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\15\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\1\116\1\u02e2\1\116\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\2\116\1\u02e3\12\116\35\0\14\116\1\u02e4\1\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\1\116\1\u02e5"+ - "\1\116\2\0\15\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\1\u02e6\14\116\35\0\6\116"+ - "\1\u02e7\7\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\1\u02e8\2\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\4\116\1\u02e9"+ - "\10\116\35\0\14\116\1\u02ea\1\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\10\116\1\u02eb"+ - "\4\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\1\116\1\u02ec\1\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\5\116\1\u02ed"+ - "\7\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\14\116\1\u02ee\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\2\116\1\u02ef\12\116"+ - "\35\0\14\116\1\u02f0\1\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\15\116\35\0\10\116\1\u02f1\5\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\2\116\1\u02f2\12\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\1\116\1\u02f3\1\116\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\1\116"+ - "\1\u02f4\1\116\2\0\15\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\5\116\1\u02f5\7\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\12\116\1\u02f6\2\116\35\0\10\116\1\u02f7\5\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\3\116\1\u02f8\11\116\35\0\10\116\1\u02f9\5\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\1\116"+ - "\1\u02fa\1\116\2\0\15\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\12\116\1\u02fb\2\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\2\116"+ - "\1\u02fc\2\0\15\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\3\116\1\u02fd\11\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\2\116\1\u02fe"+ - "\2\0\15\116\35\0\14\116\1\u02ff\1\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\15\116\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\2\140\1\u0300\2\0"+ - "\15\140\35\0\6\140\1\u0301\7\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\15\140\35\0\14\140\1\u0302"+ - "\1\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\1\140\1\u0303\1\140\2\0\15\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\2\140\1\u0304"+ - "\12\140\35\0\14\140\1\u0305\1\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\15\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\1\140\1\u0306\1\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\1\u0307\14\140\35\0\6\140\1\u0308\7\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\15\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\1\u0309"+ - "\2\140\2\0\15\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\4\140\1\u030a\10\140\35\0"+ - "\14\140\1\u030b\1\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\10\140\1\u030c\4\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\1\140\1\u030d"+ - "\1\140\2\0\15\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\5\140\1\u030e\7\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\14\140\1\u030f\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\2\140\1\u0310\12\140\35\0\14\140"+ - "\1\u0311\1\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\15\140\35\0\10\140\1\u0312\5\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\15\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\2\140"+ - "\1\u0313\12\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\1\140\1\u0314\1\140\2\0\15\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\1\140\1\u0315\1\140"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\5\140\1\u0316\7\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\12\140"+ - "\1\u0317\2\140\35\0\10\140\1\u0318\5\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\15\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\3\140"+ - "\1\u0319\11\140\35\0\10\140\1\u031a\5\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\15\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\1\140\1\u031b\1\140"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\12\140\1\u031c\2\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\2\140\1\u031d\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\3\140\1\u031e\11\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\2\140\1\u031f\2\0\15\140"+ - "\35\0\14\140\1\u0320\1\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\15\140\24\0\2\161\2\u014b\1\u0204"+ - "\35\161\1\0\3\161\1\0\42\161\1\0\1\u0205\1\u0206"+ - "\106\0\4\u020c\1\u020d\1\u02b3\1\u0321\33\u020c\1\u0164\46\u020c"+ - "\4\u02ac\1\u02ad\1\u0215\1\u0322\33\u02ac\1\u0215\52\u02ac\1\u02ad"+ - "\1\u02ac\1\u0322\102\u02ac\5\u0323\1\u0324\34\u0323\1\u0325\46\u0323"+ - "\1\0\2\224\1\u02b0\1\u0326\104\0\1\224\1\u0327\2\u0211"+ - "\1\u0212\104\224\1\0\1\224\1\u0211\1\u02b0\1\u0326\104\0"+ - "\5\u0215\1\u0216\1\u0328\102\u0215\11\0\6\43\1\u0329\7\43"+ - "\2\0\7\43\1\0\5\43\2\0\15\43\35\0\4\43"+ - "\1\u032a\11\43\2\0\7\43\1\0\5\43\2\0\15\43"+ - "\35\0\16\43\2\0\7\43\1\0\2\43\1\u032b\2\43"+ - "\2\0\15\43\35\0\16\43\2\0\7\43\1\0\5\43"+ - "\2\0\6\43\1\u032c\6\43\35\0\16\43\2\0\7\43"+ - "\1\0\4\43\1\u032d\2\0\15\43\35\0\6\43\1\u032e"+ - "\7\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\14\43\1\u032f\1\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\12\43\1\u0330\3\43\2\0\7\43\1\0"+ - "\5\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\2\43\1\u0331\12\43\35\0\14\43\1\u0332"+ - "\1\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\16\43\2\0\7\43\1\0\2\43\1\u0333\2\43\2\0"+ - "\15\43\35\0\10\43\1\u0334\5\43\2\0\7\43\1\0"+ - "\5\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\5\43\1\u0335\7\43\24\0\2\332\2\u0189"+ - "\1\u0232\35\332\1\0\3\332\1\u0188\42\332\1\0\1\u0233"+ - "\1\u0234\106\0\4\u0235\1\0\35\u0235\1\0\3\u0235\1\u0336"+ - "\46\u0235\1\0\35\u0235\1\0\3\u0235\1\0\42\u0235\2\335"+ - "\2\u018d\1\u0238\42\335\1\u018c\41\335\1\0\1\u0239\1\u023a"+ - "\106\0\4\u018f\1\u023b\42\u018f\1\u0337\110\u018f\1\u018c\41\u018f"+ - "\11\0\16\43\2\0\7\43\1\0\4\43\1\u0338\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\3\43\1\u0339\11\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\3\43\1\u033a\11\43\35\0\2\43\1\u033b"+ - "\13\43\2\0\7\43\1\0\5\43\2\0\15\43\35\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\2\43\1\u033c"+ - "\12\43\35\0\16\43\2\0\7\43\1\0\4\43\1\u033d"+ - "\2\0\15\43\35\0\16\43\2\0\7\43\1\0\2\43"+ - "\1\u033e\2\43\2\0\15\43\35\0\16\43\2\0\7\43"+ - "\1\0\4\43\1\u033f\2\0\15\43\35\0\16\43\2\0"+ - "\7\43\1\0\5\43\2\0\3\43\1\u0340\11\43\35\0"+ - "\16\43\2\0\7\43\1\0\3\43\1\u0341\1\43\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\12\43\1\u0342\2\43\35\0\10\43\1\u0343\5\43\2\0"+ - "\7\43\1\0\5\43\2\0\15\43\35\0\6\116\1\u0344"+ - "\7\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\4\116\1\u0345\11\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\1\u0346\2\116\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\6\116\1\u0347\6\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\2\116\1\u0348\2\0\15\116\35\0"+ - "\6\116\1\u0349\7\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\15\116\35\0\14\116\1\u034a\1\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\15\116\35\0"+ - "\12\116\1\u034b\3\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\15\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\2\116\1\u034c\12\116\35\0"+ - "\14\116\1\u034d\1\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\15\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\1\u034e\2\116\2\0\15\116\35\0\10\116"+ - "\1\u034f\5\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\5\116\1\u0350\7\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\2\116\1\u0351\2\0"+ - "\15\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\3\116\1\u0352\11\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\3\116\1\u0353"+ - "\11\116\35\0\2\116\1\u0354\13\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\2\116\1\u0355"+ - "\12\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\2\116\1\u0356\2\0\15\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\1\u0357\2\116\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\2\116\1\u0358"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\3\116\1\u0359\11\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\1\116\1\u035a\1\116"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\12\116\1\u035b\2\116\35\0\10\116"+ - "\1\u035c\5\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\15\116\35\0\6\140\1\u035d\7\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\15\140\35\0\4\140"+ - "\1\u035e\11\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\1\u035f\2\140\2\0\15\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\6\140\1\u0360"+ - "\6\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\2\140\1\u0361\2\0\15\140\35\0\6\140\1\u0362\7\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\15\140"+ - "\35\0\14\140\1\u0363\1\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\15\140\35\0\12\140\1\u0364\3\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\15\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\2\140\1\u0365\12\140\35\0\14\140\1\u0366\1\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\15\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\1\u0367"+ - "\2\140\2\0\15\140\35\0\10\140\1\u0368\5\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\5\140\1\u0369\7\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\2\140\1\u036a\2\0\15\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\3\140"+ - "\1\u036b\11\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\3\140\1\u036c\11\140\35\0\2\140"+ - "\1\u036d\13\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\2\140\1\u036e\12\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\2\140\1\u036f\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\1\u0370\2\140\2\0\15\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\2\140\1\u0371\2\0\15\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\3\140\1\u0372\11\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\1\140\1\u0373\1\140\2\0\15\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\12\140\1\u0374\2\140\35\0\10\140\1\u0375\5\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\24\0"+ - "\4\u02ac\1\u02ad\1\u0216\1\u0376\33\u02ac\1\u0215\46\u02ac\5\u0323"+ - "\1\u0377\34\u0323\1\u0378\53\u0323\1\u02af\34\u0323\1\u0210\46\u0323"+ - "\5\u0379\1\u037a\34\u0379\1\u037b\46\u0379\1\0\1\u02b2\1\u02b0"+ - "\107\0\1\224\1\u0211\1\u02b0\1\u02b1\115\0\16\43\2\0"+ - "\7\43\1\0\5\43\2\0\11\43\1\u037c\3\43\35\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\2\43\1\u037d"+ - "\12\43\35\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\3\43\1\u037e\11\43\35\0\14\43\1\u037f\1\43\2\0"+ - "\7\43\1\0\5\43\2\0\15\43\35\0\16\43\2\0"+ - "\7\43\1\0\4\43\1\u0380\2\0\15\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\5\43\1\u0381\7\43"+ - "\35\0\16\43\2\0\7\43\1\0\2\43\1\u0382\2\43"+ - "\2\0\15\43\35\0\14\43\1\u0383\1\43\2\0\7\43"+ - "\1\0\5\43\2\0\15\43\24\0\4\u0235\1\0\35\u0235"+ - "\1\0\3\u0235\1\u0188\42\u0235\47\u018f\1\u0384\41\u018f\11\0"+ - "\14\43\1\u0385\1\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\4\43\1\u0386"+ - "\2\0\15\43\35\0\14\43\1\u0387\1\43\2\0\7\43"+ - "\1\0\5\43\2\0\15\43\35\0\16\43\2\0\7\43"+ - "\1\0\5\43\2\0\3\43\1\u0388\11\43\35\0\16\43"+ - "\2\0\7\43\1\0\5\43\2\0\1\u0389\14\43\35\0"+ - "\4\43\1\u038a\11\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\5\43\2\0"+ - "\7\43\1\u038b\5\43\35\0\6\43\1\u038c\7\43\2\0"+ - "\7\43\1\0\5\43\2\0\15\43\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\11\116\1\u038d"+ - "\3\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\2\116\1\u038e\12\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\3\116\1\u038f"+ - "\11\116\35\0\14\116\1\u0390\1\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\2\116\1\u0391\2\0\15\116"+ - "\35\0\16\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\5\116\1\u0392\7\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\1\u0393\2\116\2\0\15\116\35\0"+ - "\14\116\1\u0394\1\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\15\116\35\0\14\116\1\u0395\1\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\2\116\1\u0396"+ - "\2\0\15\116\35\0\14\116\1\u0397\1\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\15\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\3\116\2\0\3\116"+ - "\1\u0398\11\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\1\u0399\14\116\35\0\4\116\1\u039a"+ - "\11\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\7\116\1\u039b\5\116\35\0\6\116\1\u039c"+ - "\7\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\11\140\1\u039d\3\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\2\140\1\u039e"+ - "\12\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\3\140\1\u039f\11\140\35\0\14\140\1\u03a0"+ - "\1\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\2\140\1\u03a1\2\0\15\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\5\140\1\u03a2\7\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\1\u03a3"+ - "\2\140\2\0\15\140\35\0\14\140\1\u03a4\1\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\35\0"+ - "\14\140\1\u03a5\1\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\2\140\1\u03a6\2\0\15\140\35\0\14\140"+ - "\1\u03a7\1\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\15\140\35\0\16\140\2\0\7\140\1\0\1\140"+ - "\1\0\3\140\2\0\3\140\1\u03a8\11\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\1\u03a9"+ - "\14\140\35\0\4\140\1\u03aa\11\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\15\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\7\140\1\u03ab"+ - "\5\140\35\0\6\140\1\u03ac\7\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\15\140\24\0\42\u0323\1\u03ad"+ - "\53\u0323\1\u03ae\34\u0323\1\u0378\46\u0323\5\u0379\1\u03af\34\u0379"+ - "\1\u037b\46\u0379\5\u03b0\1\u03b1\34\u03b0\1\u03b2\46\u03b0\11\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\3\43\1\u03b3"+ - "\11\43\35\0\14\43\1\u03b4\1\43\2\0\7\43\1\0"+ - "\5\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\2\43\1\u03b5\2\43\2\0\15\43\35\0\16\43\2\0"+ - "\7\43\1\0\2\43\1\u03b6\2\43\2\0\15\43\35\0"+ - "\14\43\1\u03b7\1\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\16\43\2\0\7\43\1\0\4\43\1\u03b8"+ - "\2\0\15\43\35\0\14\43\1\u03b9\1\43\2\0\7\43"+ - "\1\0\5\43\2\0\15\43\35\0\16\43\2\0\7\43"+ - "\1\0\5\43\2\0\1\43\1\u03ba\13\43\35\0\16\43"+ - "\2\0\7\43\1\0\2\43\1\u03bb\2\43\2\0\15\43"+ - "\35\0\14\43\1\u03bc\1\43\2\0\7\43\1\0\5\43"+ - "\2\0\15\43\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\3\116\1\u03bd\11\116\35\0\14\116"+ - "\1\u03be\1\116\2\0\7\116\1\0\1\116\1\0\3\116"+ - "\2\0\15\116\35\0\16\116\2\0\7\116\1\0\1\116"+ - "\1\0\1\u03bf\2\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\1\u03c0\2\116\2\0\15\116"+ - "\35\0\14\116\1\u03c1\1\116\2\0\7\116\1\0\1\116"+ - "\1\0\3\116\2\0\15\116\35\0\16\116\2\0\7\116"+ - "\1\0\1\116\1\0\2\116\1\u03c2\2\0\15\116\35\0"+ - "\14\116\1\u03c3\1\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\15\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\1\116\1\u03c4\13\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\1\u03c5\2\116"+ - "\2\0\15\116\35\0\14\116\1\u03c6\1\116\2\0\7\116"+ - "\1\0\1\116\1\0\3\116\2\0\15\116\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\3\140"+ - "\1\u03c7\11\140\35\0\14\140\1\u03c8\1\140\2\0\7\140"+ - "\1\0\1\140\1\0\3\140\2\0\15\140\35\0\16\140"+ - "\2\0\7\140\1\0\1\140\1\0\1\u03c9\2\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\1\u03ca\2\140\2\0\15\140\35\0\14\140\1\u03cb\1\140"+ - "\2\0\7\140\1\0\1\140\1\0\3\140\2\0\15\140"+ - "\35\0\16\140\2\0\7\140\1\0\1\140\1\0\2\140"+ - "\1\u03cc\2\0\15\140\35\0\14\140\1\u03cd\1\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\35\0"+ - "\16\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\1\140\1\u03ce\13\140\35\0\16\140\2\0\7\140\1\0"+ - "\1\140\1\0\1\u03cf\2\140\2\0\15\140\35\0\14\140"+ - "\1\u03d0\1\140\2\0\7\140\1\0\1\140\1\0\3\140"+ - "\2\0\15\140\24\0\5\u03d1\1\u03d2\34\u03d1\1\u03d3\46\u03d1"+ - "\42\u0379\1\u015b\46\u0379\5\u03b0\1\u03d4\34\u03b0\1\u03d5\53\u03b0"+ - "\1\u037a\34\u03b0\1\u037b\46\u03b0\5\u03b2\1\u03d6\34\u03b2\1\u03d7"+ - "\46\u03b2\11\0\14\43\1\u03d8\1\43\2\0\7\43\1\0"+ - "\5\43\2\0\15\43\35\0\16\43\2\0\7\43\1\0"+ - "\5\43\2\0\7\43\1\u03d9\5\43\35\0\16\43\2\0"+ - "\7\43\1\0\4\43\1\u03da\2\0\15\43\35\0\16\43"+ - "\2\0\7\43\1\0\4\43\1\u03db\2\0\15\43\35\0"+ - "\12\43\1\u03dc\3\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\10\43\1\u03dd\5\43\2\0\7\43\1\0"+ - "\5\43\2\0\15\43\35\0\14\116\1\u03de\1\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\15\116\35\0"+ - "\16\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\7\116\1\u03df\5\116\35\0\16\116\2\0\7\116\1\0"+ - "\1\116\1\0\2\116\1\u03e0\2\0\15\116\35\0\16\116"+ - "\2\0\7\116\1\0\1\116\1\0\2\116\1\u03e1\2\0"+ - "\15\116\35\0\12\116\1\u03e2\3\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\10\116\1\u03e3"+ - "\5\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\14\140\1\u03e4\1\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\15\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\7\140\1\u03e5"+ - "\5\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\2\140\1\u03e6\2\0\15\140\35\0\16\140\2\0\7\140"+ - "\1\0\1\140\1\0\2\140\1\u03e7\2\0\15\140\35\0"+ - "\12\140\1\u03e8\3\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\15\140\35\0\10\140\1\u03e9\5\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\15\140\24\0"+ - "\5\u03d1\1\u03ea\34\u03d1\1\u03eb\53\u03d1\1\u03ae\34\u03d1\1\u0378"+ - "\53\u03d1\1\u03ec\34\u03d1\1\u03eb\46\u03d1\42\u03b0\1\u0323\53\u03b0"+ - "\1\u03ed\34\u03b0\1\u03d5\46\u03b0\42\u03b2\1\u03ee\53\u03b2\1\u03ef"+ - "\34\u03b2\1\u03d7\46\u03b2\11\0\4\43\1\u03f0\11\43\2\0"+ - "\7\43\1\0\5\43\2\0\15\43\35\0\16\43\2\0"+ - "\7\43\1\0\5\43\2\0\5\43\1\u03f1\7\43\35\0"+ - "\16\43\2\0\7\43\1\0\5\43\2\0\13\43\1\u03f2"+ - "\1\43\35\0\4\116\1\u03f3\11\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\16\116\2\0"+ - "\7\116\1\0\1\116\1\0\3\116\2\0\5\116\1\u03f4"+ - "\7\116\35\0\16\116\2\0\7\116\1\0\1\116\1\0"+ - "\3\116\2\0\13\116\1\u03f5\1\116\35\0\4\140\1\u03f6"+ - "\11\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\15\140\35\0\16\140\2\0\7\140\1\0\1\140\1\0"+ - "\3\140\2\0\5\140\1\u03f7\7\140\35\0\16\140\2\0"+ - "\7\140\1\0\1\140\1\0\3\140\2\0\13\140\1\u03f8"+ - "\1\140\24\0\42\u03d1\1\u03f9\53\u03d1\1\u03fa\34\u03d1\1\u03eb"+ - "\53\u03d1\1\u03fb\34\u03d1\1\u03fc\46\u03d1\5\u03b0\1\u03d5\34\u03b0"+ - "\1\u03d1\46\u03b0\5\u03d1\1\u03fd\34\u03d1\1\u0325\46\u03d1\11\0"+ - "\14\43\1\u03fe\1\43\2\0\7\43\1\0\5\43\2\0"+ - "\15\43\35\0\14\116\1\u03ff\1\116\2\0\7\116\1\0"+ - "\1\116\1\0\3\116\2\0\15\116\35\0\14\140\1\u0400"+ - "\1\140\2\0\7\140\1\0\1\140\1\0\3\140\2\0"+ - "\15\140\24\0\5\u03d1\1\u03eb\34\u03d1\1\u03d3\53\u03d1\1\u03ef"+ - "\34\u03d1\1\u03d7\46\u03d1\11\0\12\43\1\u0401\3\43\2\0"+ - "\7\43\1\0\5\43\2\0\15\43\35\0\12\116\1\u0402"+ - "\3\116\2\0\7\116\1\0\1\116\1\0\3\116\2\0"+ - "\15\116\35\0\12\140\1\u0403\3\140\2\0\7\140\1\0"+ - "\1\140\1\0\3\140\2\0\15\140\24\0"; + "\1\56\1\43\1\57\1\43\1\60\1\61\1\62\1\63"+ + "\1\64\1\43\1\65\1\66\1\67\2\43\1\70\1\71"+ + "\3\43\1\72\1\177\1\200\1\75\1\76\1\77\1\100"+ + "\1\101\1\102\1\103\1\104\1\105\1\106\1\107\1\110"+ + "\1\111\1\112\1\113\1\114\1\115\3\201\1\202\1\203"+ + "\1\204\34\201\1\205\45\201\11\0\1\206\1\0\14\206"+ + "\2\0\1\206\1\0\2\206\1\0\2\206\1\0\1\206"+ + "\1\0\1\206\2\0\17\206\1\207\22\0\4\210\1\211"+ + "\1\212\34\210\1\213\45\210\11\214\1\206\1\214\14\206"+ + "\2\214\1\206\1\214\2\206\1\214\2\206\1\214\1\206"+ + "\1\214\1\206\2\214\17\206\63\214\1\215\47\214\11\0"+ + "\1\216\1\0\14\216\2\0\1\216\1\0\2\216\1\0"+ + "\2\216\1\0\1\216\1\0\1\216\2\0\17\216\1\217"+ + "\22\0\5\220\1\221\34\220\1\222\45\220\11\223\1\216"+ + "\1\223\14\216\2\223\1\216\1\223\2\216\1\223\2\216"+ + "\1\223\1\216\1\223\1\216\2\223\17\216\63\223\1\224"+ + "\47\223\1\225\3\226\1\227\1\230\102\225\1\231\3\226"+ + "\1\232\103\231\1\233\3\226\1\234\103\233\1\33\2\34"+ + "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+ + "\2\43\1\45\1\43\1\46\1\43\1\47\1\43\1\50"+ + "\1\43\1\51\1\43\1\52\1\53\1\43\1\54\1\55"+ + "\1\43\1\44\2\43\1\56\1\43\1\57\1\43\1\60"+ + "\1\61\1\62\1\63\1\64\1\43\1\65\1\66\1\67"+ + "\2\43\1\70\1\71\3\43\1\72\1\73\1\33\1\75"+ + "\1\76\1\77\1\100\1\101\1\102\1\103\1\104\1\105"+ + "\1\106\1\107\1\110\1\111\1\112\1\113\1\114\1\115"+ + "\4\235\1\236\35\235\1\0\2\235\1\237\42\235\45\0"+ + "\1\240\153\0\3\34\1\241\104\0\1\242\1\35\112\0"+ + "\1\243\1\244\61\0\1\245\25\0\1\246\31\0\1\247"+ + "\27\0\1\250\27\0\1\251\167\0\1\252\30\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\35\0\1\44"+ + "\2\253\2\254\2\255\2\256\2\257\2\260\2\0\1\261"+ + "\1\44\2\0\1\44\2\0\1\262\60\0\6\43\1\263"+ + "\1\43\1\264\5\43\2\0\7\43\1\0\3\43\2\0"+ + "\1\43\1\265\6\43\1\266\6\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\10\43\1\267\6\43\34\0"+ + "\4\43\1\270\11\43\2\0\7\43\1\0\3\43\2\0"+ + "\7\43\1\271\1\43\1\272\5\43\34\0\14\43\1\273"+ + "\1\43\2\0\7\43\1\0\3\43\2\0\10\43\1\274"+ + "\6\43\34\0\6\43\1\275\7\43\2\0\5\43\1\276"+ + "\1\43\1\0\3\43\2\0\11\43\1\277\5\43\52\0"+ + "\1\300\40\0\1\301\47\0\1\302\37\0\1\303\7\0"+ + "\1\304\21\0\1\44\2\253\2\254\2\255\2\256\2\257"+ + "\2\260\2\0\1\261\1\44\2\305\1\44\2\306\1\262"+ + "\60\0\16\43\2\0\7\43\1\0\3\43\2\0\6\43"+ + "\1\307\1\43\1\310\2\43\1\311\3\43\63\0\1\312"+ + "\44\0\1\313\7\0\1\314\3\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\17\43\23\0\1\315\2\0\1\315"+ + "\1\316\37\315\1\317\43\315\1\320\2\0\1\320\1\321"+ + "\35\320\1\0\2\320\1\322\42\320\11\0\16\43\2\0"+ + "\7\43\1\0\2\43\1\323\2\0\1\43\1\324\4\43"+ + "\1\325\10\43\34\0\16\43\2\0\2\43\1\326\4\43"+ + "\1\0\3\43\2\0\4\43\1\327\12\43\34\0\6\43"+ + "\1\330\7\43\2\0\7\43\1\0\3\43\2\0\1\43"+ + "\1\331\6\43\1\332\3\43\1\333\2\43\34\0\16\43"+ + "\2\0\7\43\1\0\2\43\1\334\2\0\5\43\1\335"+ + "\5\43\1\336\1\337\1\43\1\340\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\6\43\1\341\5\43\1\342"+ + "\2\43\34\0\14\43\1\343\1\43\2\0\7\43\1\0"+ + "\3\43\2\0\17\43\34\0\14\43\1\344\1\43\2\0"+ + "\7\43\1\0\2\43\1\345\2\0\1\43\1\346\15\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\10\43"+ + "\1\347\6\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\14\43\1\350\2\43\63\0\1\351\34\0\1\352"+ + "\102\0\1\353\10\0\1\354\76\0\1\355\6\0\1\356"+ + "\100\0\1\357\7\0\1\360\77\0\1\361\107\0\1\362"+ + "\107\0\1\363\13\0\1\364\73\0\1\365\14\0\1\366"+ + "\13\0\16\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\17\117\34\0\6\117\1\367\1\117\1\370\5\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\1\117"+ + "\1\371\6\117\1\372\6\117\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\10\117\1\373\6\117"+ + "\34\0\4\117\1\374\11\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\7\117\1\375\1\117\1\376\5\117"+ + "\34\0\14\117\1\377\1\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\10\117\1\u0100\6\117\34\0\6\117"+ + "\1\u0101\7\117\2\0\5\117\1\u0102\1\117\1\0\1\117"+ + "\1\0\1\117\2\0\11\117\1\u0103\5\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\6\117"+ + "\1\u0104\1\117\1\u0105\2\117\1\u0106\3\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\u0107\2\0\1\117"+ + "\1\u0108\4\117\1\u0109\10\117\34\0\16\117\2\0\2\117"+ + "\1\u010a\4\117\1\0\1\117\1\0\1\117\2\0\4\117"+ + "\1\u010b\12\117\34\0\6\117\1\u010c\7\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\1\117\1\u010d\6\117"+ + "\1\u010e\3\117\1\u010f\2\117\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\u0110\2\0\5\117\1\u0111\5\117"+ + "\1\u0112\1\u0113\1\117\1\u0114\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\6\117\1\u0115\5\117"+ + "\1\u0116\2\117\34\0\14\117\1\u0117\1\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\14\117"+ + "\1\u0118\1\117\2\0\7\117\1\0\1\117\1\0\1\u0119"+ + "\2\0\1\117\1\u011a\15\117\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\10\117\1\u011b\6\117"+ + "\34\0\16\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\14\117\1\u011c\2\117\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\17\141\34\0\6\141"+ + "\1\u011d\1\141\1\u011e\5\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\1\141\1\u011f\6\141\1\u0120\6\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\10\141\1\u0121\6\141\34\0\4\141\1\u0122\11\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\7\141"+ + "\1\u0123\1\141\1\u0124\5\141\34\0\14\141\1\u0125\1\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\10\141"+ + "\1\u0126\6\141\34\0\6\141\1\u0127\7\141\2\0\5\141"+ + "\1\u0128\1\141\1\0\1\141\1\0\1\141\2\0\11\141"+ + "\1\u0129\5\141\34\0\16\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\6\141\1\u012a\1\141\1\u012b\2\141"+ + "\1\u012c\3\141\34\0\16\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\u012d\2\0\1\141\1\u012e\4\141\1\u012f\10\141"+ + "\34\0\16\141\2\0\2\141\1\u0130\4\141\1\0\1\141"+ + "\1\0\1\141\2\0\4\141\1\u0131\12\141\34\0\6\141"+ + "\1\u0132\7\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\1\141\1\u0133\6\141\1\u0134\3\141\1\u0135\2\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\u0136"+ + "\2\0\5\141\1\u0137\5\141\1\u0138\1\u0139\1\141\1\u013a"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\6\141\1\u013b\5\141\1\u013c\2\141\34\0\14\141"+ + "\1\u013d\1\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\17\141\34\0\14\141\1\u013e\1\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\u013f\2\0\1\141\1\u0140\15\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\10\141\1\u0141\6\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\14\141\1\u0142\2\141"+ + "\23\0\1\162\2\0\1\162\1\164\35\162\1\0\2\162"+ + "\1\0\42\162\1\0\3\163\1\u0143\103\0\3\162\1\u0144"+ + "\1\u0145\103\162\4\167\1\170\35\167\1\0\2\167\1\u0146"+ + "\156\167\1\0\35\167\1\0\2\167\1\u0147\42\167\11\0"+ + "\1\u0148\1\0\14\u0148\2\0\1\u0148\1\0\2\u0148\1\0"+ + "\2\u0148\1\0\1\u0148\1\0\1\u0148\2\0\17\u0148\34\0"+ + "\1\u0149\1\0\14\u0149\2\0\1\u0149\1\0\2\u0149\1\0"+ + "\2\u0149\1\0\1\u0149\1\0\1\u0149\2\0\17\u0149\24\0"+ + "\3\176\1\u014a\104\0\1\u014b\1\202\112\0\1\243\1\244"+ + "\106\0\1\u014c\113\0\16\206\2\0\7\206\1\0\1\206"+ + "\1\0\1\206\2\0\17\206\23\0\4\210\1\211\1\0"+ + "\34\210\1\u014d\51\210\1\211\35\210\1\u014e\45\210\11\u014f"+ + "\1\0\1\u014f\14\0\2\u014f\1\0\1\u014f\2\0\1\u014f"+ + "\2\0\1\u014f\1\0\1\u014f\1\0\2\u014f\20\0\22\u014f"+ + "\11\0\1\u0150\1\0\14\u0150\2\0\1\u0150\1\0\2\u0150"+ + "\1\0\2\u0150\1\0\1\u0150\1\0\1\u0150\2\0\17\u0150"+ + "\34\0\16\216\2\0\7\216\1\0\1\216\1\0\1\216"+ + "\2\0\17\216\23\0\5\220\1\u0151\34\220\1\u0152\107\220"+ + "\1\u0153\45\220\11\u0154\1\0\1\u0154\14\0\2\u0154\1\0"+ + "\1\u0154\2\0\1\u0154\2\0\1\u0154\1\0\1\u0154\1\0"+ + "\2\u0154\20\0\22\u0154\11\0\1\u0155\1\0\14\u0155\2\0"+ + "\1\u0155\1\0\2\u0155\1\0\2\u0155\1\0\1\u0155\1\0"+ + "\1\u0155\2\0\17\u0155\24\0\3\226\1\u0156\104\0\2\226"+ + "\105\0\114\235\1\0\35\235\1\0\2\235\1\u0157\42\235"+ + "\45\0\1\u0158\43\0\2\34\107\0\1\35\105\0\1\243"+ + "\2\0\105\243\6\u0159\1\u015a\101\u0159\70\0\1\u015b\17\0"+ + "\1\251\2\0\105\251\70\0\1\u015c\31\0\1\u015d\14\0"+ + "\2\u015e\1\0\1\u015d\2\0\1\u015d\64\0\1\44\16\0"+ + "\1\261\1\44\2\0\1\44\64\0\1\u015f\17\0\1\u015f"+ + "\2\0\1\u015f\63\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\10\43\1\u0160\6\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\11\43\1\u0161\5\43\34\0\6\43"+ + "\1\u0162\7\43\2\0\7\43\1\0\3\43\2\0\17\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\6\43"+ + "\1\u0163\10\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\11\43\1\u0164\5\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\1\u0165\16\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\4\43\1\u0166\1\u0167\11\43"+ + "\34\0\4\43\1\u0168\11\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\2\43"+ + "\1\u0169\2\0\17\43\34\0\16\43\2\0\7\43\1\0"+ + "\3\43\2\0\4\43\1\u016a\12\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\5\43\1\u016b\11\43\34\0"+ + "\16\43\2\0\7\43\1\0\2\43\1\u016c\2\0\17\43"+ + "\55\0\1\u016d\2\0\1\u016d\63\0\2\u016e\2\0\2\u016e"+ + "\4\0\4\u016e\3\0\4\u016e\11\0\2\u016e\50\0\14\43"+ + "\1\u016f\1\43\2\0\7\43\1\0\3\43\2\0\17\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\10\43"+ + "\1\u0170\6\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\5\43\1\u0171\11\43\63\0\1\u0172\36\0\1\u0173"+ + "\10\0\1\315\2\0\1\315\1\316\37\315\1\u0174\46\315"+ + "\1\u0175\1\u0176\103\315\44\0\1\u0177\43\0\1\320\2\0"+ + "\1\320\1\321\35\320\1\0\2\320\1\u0178\45\320\1\u0179"+ + "\1\u017a\103\320\45\0\1\u017b\53\0\16\43\2\0\2\43"+ + "\1\u017c\4\43\1\0\3\43\2\0\17\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\2\43\1\u017d\14\43"+ + "\34\0\10\43\1\u017e\5\43\2\0\7\43\1\0\3\43"+ + "\2\0\10\43\1\u017f\6\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\4\43\1\u0180\12\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\4\43\1\u0181\12\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\1\43"+ + "\1\u0182\15\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\4\43\1\u0183\1\u0184\11\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\11\43\1\u0185\5\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\1\43\1\u0186"+ + "\15\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\1\u0187\16\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\1\43\1\u0188\4\43\1\u0189\10\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\11\43\1\u018a\5\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\10\43"+ + "\1\u018b\6\43\34\0\10\43\1\u018c\5\43\2\0\7\43"+ + "\1\0\3\43\2\0\17\43\34\0\16\43\2\0\7\43"+ + "\1\0\2\43\1\u018d\2\0\1\43\1\u018e\11\43\1\u018f"+ + "\3\43\34\0\10\43\1\u0190\5\43\2\0\7\43\1\0"+ + "\3\43\2\0\6\43\1\u0191\10\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\5\43\1\u0192\11\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\16\43\1\u0193"+ + "\34\0\6\43\1\u0194\7\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\5\43\1\u0195\11\43\34\0\6\43\1\u0196\1\43"+ + "\1\u0197\5\43\2\0\7\43\1\0\3\43\2\0\17\43"+ + "\34\0\10\43\1\u0198\5\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\113\0\1\u0199\10\0\1\u019a\106\0\1\u019b"+ + "\77\0\1\u019c\107\0\1\u019d\7\0\1\u019e\20\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\10\117"+ + "\1\u019f\6\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\11\117\1\u01a0\5\117\34\0\6\117"+ + "\1\u01a1\7\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\17\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\6\117\1\u01a2\10\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\11\117"+ + "\1\u01a3\5\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\1\u01a4\16\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\4\117\1\u01a5"+ + "\1\u01a6\11\117\34\0\4\117\1\u01a7\11\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\u01a8\2\0\17\117"+ + "\34\0\16\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\4\117\1\u01a9\12\117\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\5\117\1\u01aa\11\117"+ + "\34\0\16\117\2\0\7\117\1\0\1\117\1\0\1\u01ab"+ + "\2\0\17\117\34\0\14\117\1\u01ac\1\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\10\117"+ + "\1\u01ad\6\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\5\117\1\u01ae\11\117\34\0\16\117"+ + "\2\0\2\117\1\u01af\4\117\1\0\1\117\1\0\1\117"+ + "\2\0\17\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\2\117\1\u01b0\14\117\34\0\10\117"+ + "\1\u01b1\5\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\10\117\1\u01b2\6\117\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\4\117\1\u01b3\12\117"+ + "\34\0\16\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\4\117\1\u01b4\12\117\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\1\117\1\u01b5\15\117"+ + "\34\0\16\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\4\117\1\u01b6\1\u01b7\11\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\11\117\1\u01b8"+ + "\5\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\1\117\1\u01b9\15\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\1\u01ba\16\117"+ + "\34\0\16\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\1\117\1\u01bb\4\117\1\u01bc\10\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\11\117"+ + "\1\u01bd\5\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\10\117\1\u01be\6\117\34\0\10\117"+ + "\1\u01bf\5\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\17\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\u01c0\2\0\1\117\1\u01c1\11\117\1\u01c2\3\117"+ + "\34\0\10\117\1\u01c3\5\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\6\117\1\u01c4\10\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\5\117"+ + "\1\u01c5\11\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\16\117\1\u01c6\34\0\6\117\1\u01c7"+ + "\7\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\5\117\1\u01c8\11\117\34\0\6\117\1\u01c9"+ + "\1\117\1\u01ca\5\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\10\117\1\u01cb\5\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\10\141\1\u01cc\6\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\11\141\1\u01cd\5\141\34\0"+ + "\6\141\1\u01ce\7\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\6\141\1\u01cf\10\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\11\141\1\u01d0\5\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\1\u01d1\16\141\34\0\16\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\4\141"+ + "\1\u01d2\1\u01d3\11\141\34\0\4\141\1\u01d4\11\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\17\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\u01d5\2\0"+ + "\17\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\4\141\1\u01d6\12\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\5\141\1\u01d7"+ + "\11\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\u01d8\2\0\17\141\34\0\14\141\1\u01d9\1\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\17\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\10\141\1\u01da\6\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\5\141\1\u01db\11\141\34\0"+ + "\16\141\2\0\2\141\1\u01dc\4\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\2\141\1\u01dd\14\141\34\0"+ + "\10\141\1\u01de\5\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\10\141\1\u01df\6\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\4\141\1\u01e0"+ + "\12\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\4\141\1\u01e1\12\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\1\141\1\u01e2"+ + "\15\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\4\141\1\u01e3\1\u01e4\11\141\34\0\16\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\11\141"+ + "\1\u01e5\5\141\34\0\16\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\1\141\1\u01e6\15\141\34\0\16\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\1\u01e7"+ + "\16\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\1\141\1\u01e8\4\141\1\u01e9\10\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\11\141\1\u01ea\5\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\10\141\1\u01eb\6\141\34\0"+ + "\10\141\1\u01ec\5\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\u01ed\2\0\1\141\1\u01ee\11\141\1\u01ef"+ + "\3\141\34\0\10\141\1\u01f0\5\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\6\141\1\u01f1\10\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\5\141\1\u01f2\11\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\16\141\1\u01f3\34\0\6\141"+ + "\1\u01f4\7\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\17\141\34\0\16\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\5\141\1\u01f5\11\141\34\0\6\141"+ + "\1\u01f6\1\141\1\u01f7\5\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\17\141\34\0\10\141\1\u01f8\5\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\17\141"+ + "\24\0\2\163\105\0\3\162\1\u0144\1\u01f9\35\162\1\0"+ + "\2\162\1\0\43\162\1\u01fa\1\u01fb\1\162\1\164\35\162"+ + "\1\0\2\162\1\0\42\162\4\167\1\0\35\167\1\0"+ + "\2\167\1\u01fc\46\167\1\0\35\167\1\0\2\167\1\u01fd"+ + "\42\167\11\0\16\u0148\2\0\7\u0148\1\0\1\u0148\1\0"+ + "\1\u0148\2\0\17\u0148\34\0\16\u0149\2\0\7\u0149\1\0"+ + "\1\u0149\1\0\1\u0149\2\0\17\u0149\24\0\2\176\107\0"+ + "\1\202\105\0\4\u01fe\1\u01ff\1\u014f\3\u01fe\1\210\1\u01fe"+ + "\14\210\2\u01fe\1\210\1\u01fe\2\210\1\u01fe\2\210\1\u01fe"+ + "\1\210\1\u0200\1\210\2\u01fe\20\210\22\u01fe\11\0\16\u0150"+ + "\2\0\7\u0150\1\0\1\u0150\1\0\1\u0150\2\0\17\u0150"+ + "\23\0\42\220\1\0\45\220\11\0\16\u0155\2\0\7\u0155"+ + "\1\0\1\u0155\1\0\1\u0155\2\0\17\u0155\23\0\4\235"+ + "\1\0\35\235\1\0\2\235\1\0\42\235\45\0\1\u0201"+ + "\42\0\6\u0159\1\u0202\101\u0159\5\u0203\1\u0204\1\u015a\101\u0203"+ + "\12\0\1\u015d\2\u0205\2\254\4\0\2\257\4\0\1\u015e"+ + "\1\u015d\2\0\1\u015d\64\0\1\u015d\17\0\1\u015d\2\0"+ + "\1\u015d\64\0\1\u015f\2\u0205\2\254\4\0\2\257\2\260"+ + "\2\0\1\u0206\1\u015f\2\0\1\u015f\63\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\1\43\1\u0207\15\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\1\43\1\u0208"+ + "\15\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\4\43\1\u0209\12\43\34\0\2\43\1\u020a\13\43\2\0"+ + "\7\43\1\0\3\43\2\0\17\43\34\0\6\43\1\u020b"+ + "\7\43\2\0\7\43\1\0\3\43\2\0\10\43\1\u020c"+ + "\6\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\5\43\1\u020d\11\43\34\0\14\43\1\u020e\1\43\2\0"+ + "\7\43\1\0\3\43\2\0\17\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\1\43\1\u020f\15\43\34\0"+ + "\16\43\2\0\2\43\1\u0210\4\43\1\0\3\43\2\0"+ + "\17\43\34\0\14\43\1\u0211\1\43\2\0\7\43\1\0"+ + "\3\43\2\0\17\43\34\0\14\43\1\u0212\1\43\2\0"+ + "\7\43\1\0\3\43\2\0\17\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\7\43\1\u0213\7\43\36\0"+ + "\2\253\2\0\2\255\2\256\6\0\1\u0214\1\u016d\2\0"+ + "\1\u016d\63\0\2\u016e\2\253\2\u016e\2\255\2\256\4\u016e"+ + "\2\0\1\u0215\4\u016e\11\0\2\u016e\50\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\1\43\1\u0216\15\43\34\0"+ + "\6\43\1\u0217\7\43\2\0\7\43\1\0\3\43\2\0"+ + "\17\43\34\0\14\43\1\u0218\1\43\2\0\7\43\1\0"+ + "\3\43\2\0\17\43\23\0\3\315\1\u0175\1\u0219\37\315"+ + "\1\u0174\44\315\1\u021a\1\u021b\1\315\1\316\37\315\1\u0174"+ + "\43\315\4\u0177\1\u021c\37\u0177\1\u021d\43\u0177\3\320\1\u0179"+ + "\1\u021e\35\320\1\0\2\320\1\u0178\43\320\1\u021f\1\u0220"+ + "\1\320\1\321\35\320\1\0\2\320\1\u0178\42\320\4\u0221"+ + "\1\u0222\35\u0221\1\0\2\u0221\1\u0223\42\u0221\11\0\6\43"+ + "\1\u0224\7\43\2\0\7\43\1\0\3\43\2\0\17\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\3\43"+ + "\1\u0225\13\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\12\43\1\u0226\4\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\5\43\1\u0227\11\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\5\43\1\u0228\11\43"+ + "\34\0\14\43\1\u0229\1\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\4\43\1\u022a\12\43\34\0\14\43\1\u022b\1\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\2\43\1\u022c\14\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\5\43"+ + "\1\u022d\11\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\6\43\1\u022e\10\43\34\0\14\43\1\u022f\1\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\5\43\1\u0230\11\43"+ + "\34\0\10\43\1\u0231\5\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\2\43\1\u0232\14\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\6\43\1\u0233\10\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\5\43\1\u0234\11\43"+ + "\34\0\14\43\1\u0235\1\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\11\43\1\u0236\5\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\4\43\1\u0237\12\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\10\43\1\u0238\6\43"+ + "\34\0\16\43\2\0\7\43\1\0\2\43\1\u0239\2\0"+ + "\17\43\34\0\6\43\1\u023a\7\43\2\0\7\43\1\0"+ + "\3\43\2\0\17\43\34\0\10\43\1\u023b\5\43\2\0"+ + "\7\43\1\0\3\43\2\0\17\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\1\43\1\u023c\15\43\34\0"+ + "\12\43\1\u023d\3\43\2\0\7\43\1\0\3\43\2\0"+ + "\17\43\34\0\6\43\1\u023e\7\43\2\0\7\43\1\0"+ + "\3\43\2\0\17\43\113\0\1\u023f\30\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\1\117\1\u0240"+ + "\15\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\1\117\1\u0241\15\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\4\117\1\u0242"+ + "\12\117\34\0\2\117\1\u0243\13\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\6\117\1\u0244"+ + "\7\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\10\117\1\u0245\6\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\5\117\1\u0246\11\117\34\0"+ + "\14\117\1\u0247\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\1\117\1\u0248\15\117\34\0"+ + "\16\117\2\0\2\117\1\u0249\4\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\14\117\1\u024a\1\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\14\117\1\u024b\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\7\117\1\u024c\7\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\1\117\1\u024d\15\117\34\0\6\117\1\u024e\7\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\14\117\1\u024f\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\6\117\1\u0250\7\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\3\117\1\u0251\13\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\12\117\1\u0252\4\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\5\117\1\u0253\11\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\5\117\1\u0254\11\117\34\0"+ + "\14\117\1\u0255\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\4\117\1\u0256\12\117\34\0"+ + "\14\117\1\u0257\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\2\117\1\u0258\14\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\5\117\1\u0259\11\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\6\117\1\u025a\10\117\34\0"+ + "\14\117\1\u025b\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\5\117\1\u025c\11\117\34\0"+ + "\10\117\1\u025d\5\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\2\117\1\u025e\14\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\6\117\1\u025f\10\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\5\117\1\u0260\11\117\34\0"+ + "\14\117\1\u0261\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\11\117\1\u0262\5\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\4\117\1\u0263\12\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\10\117\1\u0264\6\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\u0265\2\0"+ + "\17\117\34\0\6\117\1\u0266\7\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\10\117\1\u0267"+ + "\5\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\1\117\1\u0268\15\117\34\0\12\117\1\u0269"+ + "\3\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\6\117\1\u026a\7\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\1\141\1\u026b"+ + "\15\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\1\141\1\u026c\15\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\4\141\1\u026d"+ + "\12\141\34\0\2\141\1\u026e\13\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\6\141\1\u026f"+ + "\7\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\10\141\1\u0270\6\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\5\141\1\u0271\11\141\34\0"+ + "\14\141\1\u0272\1\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\1\141\1\u0273\15\141\34\0"+ + "\16\141\2\0\2\141\1\u0274\4\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\14\141\1\u0275\1\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\17\141\34\0"+ + "\14\141\1\u0276\1\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\7\141\1\u0277\7\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\1\141\1\u0278\15\141\34\0\6\141\1\u0279\7\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\17\141\34\0"+ + "\14\141\1\u027a\1\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\6\141\1\u027b\7\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\17\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\3\141\1\u027c\13\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\12\141\1\u027d\4\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\5\141\1\u027e\11\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\5\141\1\u027f\11\141\34\0"+ + "\14\141\1\u0280\1\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\4\141\1\u0281\12\141\34\0"+ + "\14\141\1\u0282\1\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\2\141\1\u0283\14\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\5\141\1\u0284\11\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\6\141\1\u0285\10\141\34\0"+ + "\14\141\1\u0286\1\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\5\141\1\u0287\11\141\34\0"+ + "\10\141\1\u0288\5\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\2\141\1\u0289\14\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\6\141\1\u028a\10\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\5\141\1\u028b\11\141\34\0"+ + "\14\141\1\u028c\1\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\11\141\1\u028d\5\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\4\141\1\u028e\12\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\10\141\1\u028f\6\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\u0290\2\0"+ + "\17\141\34\0\6\141\1\u0291\7\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\10\141\1\u0292"+ + "\5\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\17\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\1\141\1\u0293\15\141\34\0\12\141\1\u0294"+ + "\3\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\17\141\34\0\6\141\1\u0295\7\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\23\0\1\162\1\u0296"+ + "\2\u0144\1\u0145\103\162\1\0\1\162\1\u0144\1\u01fb\1\u0297"+ + "\104\0\2\162\1\u01fb\1\u0297\103\0\4\167\1\0\35\167"+ + "\1\0\2\167\1\u0298\42\167\5\u0159\1\u0299\1\u029a\101\u0159"+ + "\6\u0203\1\u029b\101\u0203\12\0\1\u015f\16\0\1\u0206\1\u015f"+ + "\2\0\1\u015f\63\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\5\43\1\u029c\11\43\34\0\6\43\1\u029d\7\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\34\0\14\43"+ + "\1\u029e\1\43\2\0\7\43\1\0\3\43\2\0\17\43"+ + "\34\0\14\43\1\u029f\1\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\6\43\1\u02a0\10\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\1\43\1\u02a1\15\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\6\43\1\u02a2\10\43"+ + "\34\0\16\43\2\0\7\43\1\0\2\43\1\u02a3\2\0"+ + "\17\43\34\0\6\43\1\u02a4\7\43\2\0\7\43\1\0"+ + "\3\43\2\0\17\43\34\0\16\43\2\0\7\43\1\0"+ + "\3\43\2\0\11\43\1\u02a5\5\43\54\0\1\u0214\1\u016d"+ + "\2\0\1\u016d\63\0\2\u016e\2\0\2\u016e\4\0\4\u016e"+ + "\2\0\1\u0215\4\u016e\11\0\2\u016e\50\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\3\43\1\u02a6\13\43\34\0"+ + "\14\43\1\u02a7\1\43\2\0\7\43\1\0\3\43\2\0"+ + "\17\43\23\0\1\315\1\u02a8\2\u0175\1\u0176\103\315\1\0"+ + "\1\315\1\u0175\1\u021b\1\u02a9\104\0\2\315\1\u021b\1\u02a9"+ + "\103\0\4\u0177\1\u021c\37\u0177\1\u02aa\107\u0177\1\u02ab\43\u0177"+ + "\1\320\1\u02ac\2\u0179\1\u017a\103\320\1\0\1\320\1\u0179"+ + "\1\u0220\1\u02ad\104\0\2\320\1\u0220\1\u02ad\103\0\4\u0221"+ + "\1\u0222\35\u0221\1\0\2\u0221\1\u02ae\156\u0221\1\0\35\u0221"+ + "\1\0\2\u0221\1\u02af\42\u0221\11\0\10\43\1\u02b0\5\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\1\43\1\u02b1\15\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\1\43"+ + "\1\u02b2\15\43\34\0\14\43\1\u02b3\1\43\2\0\7\43"+ + "\1\0\3\43\2\0\17\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\6\43\1\u02b4\10\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\6\43\1\u02b5\10\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\4\43"+ + "\1\u02b6\12\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\14\43\1\u02b7\2\43\34\0\10\43\1\u02b8\5\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\6\43\1\u02b9\10\43"+ + "\34\0\10\43\1\u02ba\5\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\2\43\1\u02bb\14\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\14\43\1\u02bc\2\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\5\43\1\u02bd\11\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\2\43"+ + "\1\u02be\14\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\4\43\1\u02bf\12\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\16\43\1\u02c0\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\6\43\1\u02c1\10\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\12\43\1\u02c2"+ + "\4\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\5\43\1\u02c3\11\43\34\0\14\43\1\u02c4\1\43\2\0"+ + "\7\43\1\0\3\43\2\0\17\43\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\5\117\1\u02c5"+ + "\11\117\34\0\6\117\1\u02c6\7\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\14\117\1\u02c7"+ + "\1\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\14\117\1\u02c8\1\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\6\117\1\u02c9"+ + "\10\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\1\117\1\u02ca\15\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\6\117\1\u02cb"+ + "\10\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\u02cc\2\0\17\117\34\0\6\117\1\u02cd\7\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\11\117\1\u02ce\5\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\3\117\1\u02cf\13\117\34\0"+ + "\14\117\1\u02d0\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\10\117\1\u02d1\5\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\1\117\1\u02d2\15\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\1\117\1\u02d3\15\117\34\0"+ + "\14\117\1\u02d4\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\6\117\1\u02d5\10\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\6\117\1\u02d6\10\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\4\117\1\u02d7\12\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\14\117\1\u02d8\2\117\34\0\10\117\1\u02d9\5\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\6\117\1\u02da\10\117\34\0\10\117\1\u02db\5\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\2\117\1\u02dc\14\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\14\117\1\u02dd\2\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\5\117\1\u02de\11\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\2\117\1\u02df\14\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\4\117\1\u02e0\12\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\16\117\1\u02e1\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\6\117"+ + "\1\u02e2\10\117\34\0\16\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\12\117\1\u02e3\4\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\5\117"+ + "\1\u02e4\11\117\34\0\14\117\1\u02e5\1\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\16\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\5\141"+ + "\1\u02e6\11\141\34\0\6\141\1\u02e7\7\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\17\141\34\0\14\141"+ + "\1\u02e8\1\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\17\141\34\0\14\141\1\u02e9\1\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\17\141\34\0\16\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\6\141"+ + "\1\u02ea\10\141\34\0\16\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\1\141\1\u02eb\15\141\34\0\16\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\6\141"+ + "\1\u02ec\10\141\34\0\16\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\u02ed\2\0\17\141\34\0\6\141\1\u02ee\7\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\17\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\11\141\1\u02ef\5\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\3\141\1\u02f0\13\141"+ + "\34\0\14\141\1\u02f1\1\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\17\141\34\0\10\141\1\u02f2\5\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\17\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\1\141\1\u02f3\15\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\1\141\1\u02f4\15\141"+ + "\34\0\14\141\1\u02f5\1\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\17\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\6\141\1\u02f6\10\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\6\141\1\u02f7\10\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\4\141\1\u02f8\12\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\14\141\1\u02f9\2\141\34\0\10\141\1\u02fa\5\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\17\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\6\141\1\u02fb\10\141\34\0\10\141\1\u02fc\5\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\17\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\2\141\1\u02fd\14\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\14\141\1\u02fe\2\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\5\141\1\u02ff\11\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\2\141\1\u0300\14\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\4\141\1\u0301\12\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\16\141\1\u0302\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\6\141\1\u0303\10\141\34\0\16\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\12\141\1\u0304\4\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\5\141\1\u0305\11\141\34\0\14\141\1\u0306\1\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\17\141\23\0"+ + "\2\162\2\u0144\1\u01f9\35\162\1\0\2\162\1\0\42\162"+ + "\1\0\1\u01fa\1\u01fb\105\0\5\u0203\1\u0204\1\u0307\101\u0203"+ + "\11\0\6\43\1\u0308\7\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\7\43\1\u0309\7\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\5\43\1\u030a\11\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\11\43\1\u030b\5\43"+ + "\34\0\4\43\1\u030c\11\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\6\43\1\u030d\7\43\2\0\7\43"+ + "\1\0\3\43\2\0\17\43\34\0\14\43\1\u030e\1\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\34\0\12\43"+ + "\1\u030f\3\43\2\0\7\43\1\0\3\43\2\0\17\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\1\43"+ + "\1\u0310\15\43\23\0\2\315\2\u0175\1\u0219\37\315\1\u0174"+ + "\43\315\1\0\1\u021a\1\u021b\105\0\4\u0177\1\u021c\37\u0177"+ + "\1\u0311\107\u0177\1\u0174\43\u0177\2\320\2\u0179\1\u021e\35\320"+ + "\1\0\2\320\1\u0178\42\320\1\0\1\u021f\1\u0220\105\0"+ + "\4\u0221\1\0\35\u0221\1\0\2\u0221\1\u0312\46\u0221\1\0"+ + "\35\u0221\1\0\2\u0221\1\0\42\u0221\11\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\2\43\1\u0313\14\43\34\0"+ + "\2\43\1\u0314\13\43\2\0\7\43\1\0\3\43\2\0"+ + "\17\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\5\43\1\u0315\11\43\34\0\16\43\2\0\7\43\1\0"+ + "\3\43\2\0\2\43\1\u0316\14\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\1\43\1\u0317\15\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\5\43\1\u0318"+ + "\11\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\11\43\1\u0319\5\43\34\0\16\43\2\0\7\43\1\0"+ + "\3\43\2\0\2\43\1\u031a\14\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\5\43\1\u031b\11\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\6\43\1\u031c"+ + "\10\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\14\43\1\u031d\2\43\34\0\10\43\1\u031e\5\43\2\0"+ + "\7\43\1\0\3\43\2\0\17\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\4\43\1\u031f\12\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\11\43\1\u0320"+ + "\5\43\34\0\14\43\1\u0321\1\43\2\0\7\43\1\0"+ + "\3\43\2\0\17\43\34\0\10\43\1\u0322\5\43\2\0"+ + "\7\43\1\0\3\43\2\0\17\43\34\0\6\117\1\u0323"+ + "\7\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\7\117\1\u0324\7\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\5\117\1\u0325"+ + "\11\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\11\117\1\u0326\5\117\34\0\4\117\1\u0327"+ + "\11\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\6\117\1\u0328\7\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\14\117\1\u0329"+ + "\1\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\12\117\1\u032a\3\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\1\117\1\u032b"+ + "\15\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\2\117\1\u032c\14\117\34\0\2\117\1\u032d"+ + "\13\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\5\117\1\u032e\11\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\2\117\1\u032f"+ + "\14\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\1\117\1\u0330\15\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\5\117\1\u0331"+ + "\11\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\11\117\1\u0332\5\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\2\117\1\u0333"+ + "\14\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\5\117\1\u0334\11\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\6\117\1\u0335"+ + "\10\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\14\117\1\u0336\2\117\34\0\10\117\1\u0337"+ + "\5\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\4\117\1\u0338\12\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\11\117\1\u0339"+ + "\5\117\34\0\14\117\1\u033a\1\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\10\117\1\u033b"+ + "\5\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\6\141\1\u033c\7\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\7\141\1\u033d"+ + "\7\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\5\141\1\u033e\11\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\11\141\1\u033f"+ + "\5\141\34\0\4\141\1\u0340\11\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\6\141\1\u0341"+ + "\7\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\17\141\34\0\14\141\1\u0342\1\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\12\141\1\u0343"+ + "\3\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\17\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\1\141\1\u0344\15\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\2\141\1\u0345"+ + "\14\141\34\0\2\141\1\u0346\13\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\5\141\1\u0347"+ + "\11\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\2\141\1\u0348\14\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\1\141\1\u0349"+ + "\15\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\5\141\1\u034a\11\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\11\141\1\u034b"+ + "\5\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\2\141\1\u034c\14\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\5\141\1\u034d"+ + "\11\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\6\141\1\u034e\10\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\14\141\1\u034f"+ + "\2\141\34\0\10\141\1\u0350\5\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\4\141\1\u0351"+ + "\12\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\11\141\1\u0352\5\141\34\0\14\141\1\u0353"+ + "\1\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\17\141\34\0\10\141\1\u0354\5\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\13\43\1\u0355\3\43\34\0"+ + "\14\43\1\u0356\1\43\2\0\7\43\1\0\3\43\2\0"+ + "\17\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\2\43\1\u0357\14\43\34\0\16\43\2\0\7\43\1\0"+ + "\3\43\2\0\1\43\1\u0358\15\43\34\0\16\43\2\0"+ + "\7\43\1\0\3\43\2\0\5\43\1\u0359\11\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\4\43\1\u035a"+ + "\12\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\11\43\1\u035b\5\43\23\0\44\u0177\1\u035c\43\u0177\4\u0221"+ + "\1\0\35\u0221\1\0\2\u0221\1\u0178\42\u0221\11\0\14\43"+ + "\1\u035d\1\43\2\0\7\43\1\0\3\43\2\0\17\43"+ + "\34\0\14\43\1\u035e\1\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\5\43\1\u035f\11\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\2\43\1\u0360\14\43\34\0\16\43"+ + "\2\0\7\43\1\0\2\43\1\u0361\2\0\17\43\34\0"+ + "\4\43\1\u0362\11\43\2\0\7\43\1\0\3\43\2\0"+ + "\17\43\34\0\16\43\2\0\7\43\1\0\3\43\2\0"+ + "\10\43\1\u0363\6\43\34\0\14\43\1\u0364\1\43\2\0"+ + "\7\43\1\0\3\43\2\0\17\43\34\0\6\43\1\u0365"+ + "\7\43\2\0\7\43\1\0\3\43\2\0\17\43\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\13\117\1\u0366\3\117\34\0\14\117\1\u0367\1\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\2\117\1\u0368\14\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\1\117\1\u0369\15\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\5\117\1\u036a\11\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\4\117\1\u036b\12\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\11\117\1\u036c\5\117\34\0\14\117\1\u036d\1\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\17\117\34\0"+ + "\14\117\1\u036e\1\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\17\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\5\117\1\u036f\11\117\34\0"+ + "\16\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\2\117\1\u0370\14\117\34\0\16\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\u0371\2\0\17\117\34\0\4\117\1\u0372"+ + "\11\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\10\117\1\u0373\6\117\34\0\14\117\1\u0374"+ + "\1\117\2\0\7\117\1\0\1\117\1\0\1\117\2\0"+ + "\17\117\34\0\6\117\1\u0375\7\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\13\141\1\u0376"+ + "\3\141\34\0\14\141\1\u0377\1\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\2\141\1\u0378"+ + "\14\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\1\141\1\u0379\15\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\5\141\1\u037a"+ + "\11\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\4\141\1\u037b\12\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\11\141\1\u037c"+ + "\5\141\34\0\14\141\1\u037d\1\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\14\141\1\u037e"+ + "\1\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\17\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\5\141\1\u037f\11\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\2\141\1\u0380"+ + "\14\141\34\0\16\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\u0381\2\0\17\141\34\0\4\141\1\u0382\11\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\17\141\34\0"+ + "\16\141\2\0\7\141\1\0\1\141\1\0\1\141\2\0"+ + "\10\141\1\u0383\6\141\34\0\14\141\1\u0384\1\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\17\141\34\0"+ + "\6\141\1\u0385\7\141\2\0\7\141\1\0\1\141\1\0"+ + "\1\141\2\0\17\141\34\0\16\43\2\0\7\43\1\0"+ + "\3\43\2\0\11\43\1\u0386\5\43\34\0\14\43\1\u0387"+ + "\1\43\2\0\7\43\1\0\3\43\2\0\17\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\2\43\1\u0388"+ + "\14\43\34\0\14\43\1\u0389\1\43\2\0\7\43\1\0"+ + "\3\43\2\0\17\43\34\0\16\43\2\0\7\43\1\0"+ + "\3\43\2\0\5\43\1\u038a\11\43\34\0\14\43\1\u038b"+ + "\1\43\2\0\7\43\1\0\3\43\2\0\17\43\34\0"+ + "\16\43\2\0\7\43\1\0\3\43\2\0\1\u038c\16\43"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\11\43"+ + "\1\u038d\5\43\34\0\16\43\2\0\7\43\1\0\3\43"+ + "\2\0\11\43\1\u038e\5\43\34\0\14\43\1\u038f\1\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\11\117"+ + "\1\u0390\5\117\34\0\14\117\1\u0391\1\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\2\117"+ + "\1\u0392\14\117\34\0\14\117\1\u0393\1\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\5\117"+ + "\1\u0394\11\117\34\0\14\117\1\u0395\1\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\1\u0396"+ + "\16\117\34\0\16\117\2\0\7\117\1\0\1\117\1\0"+ + "\1\117\2\0\11\117\1\u0397\5\117\34\0\16\117\2\0"+ + "\7\117\1\0\1\117\1\0\1\117\2\0\11\117\1\u0398"+ + "\5\117\34\0\14\117\1\u0399\1\117\2\0\7\117\1\0"+ + "\1\117\1\0\1\117\2\0\17\117\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\11\141\1\u039a"+ + "\5\141\34\0\14\141\1\u039b\1\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\2\141\1\u039c"+ + "\14\141\34\0\14\141\1\u039d\1\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\5\141\1\u039e"+ + "\11\141\34\0\14\141\1\u039f\1\141\2\0\7\141\1\0"+ + "\1\141\1\0\1\141\2\0\17\141\34\0\16\141\2\0"+ + "\7\141\1\0\1\141\1\0\1\141\2\0\1\u03a0\16\141"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\11\141\1\u03a1\5\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\11\141\1\u03a2\5\141"+ + "\34\0\14\141\1\u03a3\1\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\17\141\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\5\43\1\u03a4\11\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\10\43\1\u03a5\6\43"+ + "\34\0\14\43\1\u03a6\1\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\12\43\1\u03a7\3\43\2\0\7\43"+ + "\1\0\3\43\2\0\17\43\34\0\10\43\1\u03a8\5\43"+ + "\2\0\7\43\1\0\3\43\2\0\17\43\34\0\16\43"+ + "\2\0\7\43\1\0\3\43\2\0\5\43\1\u03a9\11\43"+ + "\34\0\16\117\2\0\7\117\1\0\1\117\1\0\1\117"+ + "\2\0\5\117\1\u03aa\11\117\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\10\117\1\u03ab\6\117"+ + "\34\0\14\117\1\u03ac\1\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\17\117\34\0\12\117\1\u03ad\3\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\17\117"+ + "\34\0\10\117\1\u03ae\5\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\17\117\34\0\16\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\5\117\1\u03af\11\117"+ + "\34\0\16\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\5\141\1\u03b0\11\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\10\141\1\u03b1\6\141"+ + "\34\0\14\141\1\u03b2\1\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\17\141\34\0\12\141\1\u03b3\3\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\17\141"+ + "\34\0\10\141\1\u03b4\5\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\17\141\34\0\16\141\2\0\7\141"+ + "\1\0\1\141\1\0\1\141\2\0\5\141\1\u03b5\11\141"+ + "\34\0\16\43\2\0\7\43\1\0\3\43\2\0\4\43"+ + "\1\u03b6\12\43\34\0\4\43\1\u03b7\11\43\2\0\7\43"+ + "\1\0\3\43\2\0\17\43\34\0\16\43\2\0\7\43"+ + "\1\0\3\43\2\0\15\43\1\u03b8\1\43\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\4\117"+ + "\1\u03b9\12\117\34\0\4\117\1\u03ba\11\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\16\117"+ + "\2\0\7\117\1\0\1\117\1\0\1\117\2\0\15\117"+ + "\1\u03bb\1\117\34\0\16\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\4\141\1\u03bc\12\141\34\0\4\141"+ + "\1\u03bd\11\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\17\141\34\0\16\141\2\0\7\141\1\0\1\141"+ + "\1\0\1\141\2\0\15\141\1\u03be\1\141\34\0\14\43"+ + "\1\u03bf\1\43\2\0\7\43\1\0\3\43\2\0\17\43"+ + "\34\0\14\117\1\u03c0\1\117\2\0\7\117\1\0\1\117"+ + "\1\0\1\117\2\0\17\117\34\0\14\141\1\u03c1\1\141"+ + "\2\0\7\141\1\0\1\141\1\0\1\141\2\0\17\141"+ + "\34\0\12\43\1\u03c2\3\43\2\0\7\43\1\0\3\43"+ + "\2\0\17\43\34\0\12\117\1\u03c3\3\117\2\0\7\117"+ + "\1\0\1\117\1\0\1\117\2\0\17\117\34\0\12\141"+ + "\1\u03c4\3\141\2\0\7\141\1\0\1\141\1\0\1\141"+ + "\2\0\17\141\23\0"; private static int [] zzUnpackTrans() { - int [] result = new int[57305]; + int [] result = new int[52632]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -1439,29 +1408,25 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\21\0\1\1\7\0\1\1\1\11\1\1\1\11\34\1"+ - "\2\11\2\1\6\11\2\1\1\11\4\1\3\11\20\1"+ - "\2\11\20\1\1\11\3\1\2\11\2\1\1\11\3\1"+ - "\1\11\1\1\1\11\2\1\2\11\2\1\3\11\1\1"+ - "\1\11\2\1\5\11\6\1\1\11\1\1\1\11\1\1"+ - "\1\11\1\1\1\11\3\1\1\11\1\1\1\11\2\1"+ - "\4\0\3\1\1\11\1\1\2\11\2\1\5\11\3\0"+ - "\15\1\5\11\2\0\4\1\1\11\6\1\2\0\2\1"+ - "\1\0\21\1\2\11\1\1\1\11\1\1\1\0\1\11"+ - "\1\0\6\11\114\1\1\0\6\1\5\0\5\1\3\0"+ - "\3\1\3\0\2\1\2\11\1\1\1\0\23\1\2\11"+ - "\11\1\1\11\2\0\1\1\1\11\27\1\5\11\1\0"+ - "\133\1\2\0\1\1\2\11\5\1\2\0\2\1\1\11"+ - "\2\1\2\11\1\0\15\1\2\0\12\1\11\0\1\1"+ - "\1\0\24\1\1\11\127\1\1\0\1\11\3\1\1\11"+ - "\4\0\1\11\1\0\21\1\4\0\1\1\1\0\1\1"+ - "\1\0\125\1\2\0\1\1\1\0\1\1\1\0\15\1"+ - "\2\0\77\1\5\0\62\1\5\0\36\1\2\0\1\1"+ - "\4\0\22\1\4\0\1\1\1\0\12\1\2\0\1\1"+ - "\1\0\6\1"; + "\31\0\1\1\1\11\1\1\1\11\35\1\2\11\2\1"+ + "\6\11\2\1\1\11\4\1\3\11\20\1\2\11\20\1"+ + "\1\11\3\1\2\11\2\1\1\11\3\1\1\11\1\1"+ + "\4\11\4\1\1\11\2\1\1\11\1\1\1\11\2\1"+ + "\1\11\3\1\1\11\1\1\1\11\3\1\1\11\1\1"+ + "\1\11\2\1\4\0\3\1\1\11\1\1\2\11\2\1"+ + "\5\11\3\0\15\1\5\11\2\0\4\1\2\11\1\1"+ + "\1\0\1\1\2\0\27\1\2\11\1\1\1\11\1\1"+ + "\1\0\1\11\1\0\6\11\114\1\1\0\6\1\1\0"+ + "\1\1\1\11\1\0\1\1\1\11\1\1\2\0\2\11"+ + "\1\1\3\0\2\1\2\11\1\1\1\0\23\1\3\11"+ + "\3\1\1\11\2\0\36\1\5\11\1\0\133\1\2\0"+ + "\1\1\1\11\3\1\1\11\2\1\2\11\1\0\15\1"+ + "\2\0\3\1\3\0\1\1\7\0\33\1\1\11\127\1"+ + "\1\0\2\11\1\0\16\1\1\0\1\1\5\0\127\1"+ + "\1\0\11\1\2\0\262\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[1027]; + int [] result = new int[964]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -1562,7 +1527,7 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { char [] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 1352) { + while (i < 1274) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); @@ -1790,73 +1755,439 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 6: + case 70: { yybegin(WAIT_FOR_REGEX); - return(mSTAR); + return(mSPREAD_DOT); } - case 172: break; - case 76: + case 173: break; + case 27: + { yybegin(WAIT_FOR_REGEX); + return(mMOD); + } + case 174: break; + case 46: + { yybegin(NLS_AFTER_NLS); + afterComment = IN_TRIPLE_IDENT; + return mNLS; + } + case 175: break; + case 112: + { yybegin(WAIT_FOR_REGEX); + return(mSTAR_STAR_ASSIGN); + } + case 176: break; + case 133: + { return( kTRUE ); + } + case 177: break; + case 122: + { yybegin(WAIT_FOR_REGEX); + return(mREGEX_MATCH); + } + case 178: break; + case 69: + { yybegin(WAIT_FOR_REGEX); + return(mSTAR_STAR); + } + case 179: break; + case 135: + { return( kNULL ); + } + case 180: break; + case 129: + { return( kENUM ); + } + case 181: break; + case 53: + { blockStack.push(mDIV); + braceCount.push(mLCURLY); + yybegin(NLS_AFTER_LBRACE); + return mLCURLY; + } + case 182: break; + case 55: + { if (!gStringStack.isEmpty()) { + gStringStack.pop(); + } + if (blockStack.isEmpty()){ + yybegin(YYINITIAL); + } else { + yybegin(IN_INNER_BLOCK); + } + return mREGEX_END; + } + case 183: break; + case 62: + { yypushback(1); + yybegin(IN_DOLLAR_SLASH_REGEX); + } + case 184: break; + case 80: + { return( kDO ); + } + case 185: break; + case 65: + { yypushback(1); + yybegin(NLS_AFTER_COMMENT); + } + case 186: break; + case 72: + { return mSH_COMMENT; + } + case 187: break; + case 42: + { if (!gStringStack.isEmpty()) { + gStringStack.pop(); + } + if (blockStack.isEmpty()){ + yybegin(YYINITIAL); + } else { + yybegin(IN_INNER_BLOCK); + } + return mGSTRING_END; + } + case 188: break; + case 7: + { return mIDENT; + } + case 189: break; + case 144: + { return( kSUPER ); + } + case 190: break; + case 94: + { yybegin(WAIT_FOR_REGEX); + return(mREGEX_FIND); + } + case 191: break; + case 99: + { yybegin(WAIT_FOR_REGEX); + return(mBOR_ASSIGN); + } + case 192: break; + case 171: + { return( kINSTANCEOF ); + } + case 193: break; + case 35: + { blockStack.push(mLPAREN); + braceCount.push(mLCURLY); + yybegin(NLS_AFTER_LBRACE); + return mLCURLY; + } + case 194: break; + case 108: + { if (!gStringStack.isEmpty()) { + gStringStack.pop(); + } + if (blockStack.isEmpty()){ + yybegin(YYINITIAL); + } else { + yybegin(IN_INNER_BLOCK); + } + return mDOLLAR_SLASH_REGEX_END; + } + case 195: break; + case 73: { yybegin(WAIT_FOR_REGEX); return(mNOT_EQUAL); } - case 173: break; - case 56: - { blockStack.push(mLCURLY); - braceCount.push(mLCURLY); - yybegin(NLS_AFTER_LBRACE); - return(mLCURLY); + case 196: break; + case 103: + // lookahead expression with fixed base length + zzMarkedPos = zzStartRead + 1; + { yybegin(IN_SINGLE_IDENT); + return mDOT; } - case 174: break; - case 130: - { return( kTRUE ); + case 197: break; + case 152: + { return( kSTATIC ); } - case 175: break; - case 129: - { return( kNULL ); - } - case 176: break; - case 24: + case 198: break; + case 100: { yybegin(WAIT_FOR_REGEX); - return(mCOMMA); + return(mLOR); } - case 177: break; - case 127: - { return( kENUM ); + case 199: break; + case 57: + { yypushback(1); + yybegin(IN_REGEX); } - case 178: break; + case 200: break; + case 143: + { return( kCATCH ); + } + case 201: break; + case 54: + { return mREGEX_CONTENT; + } + case 202: break; + case 106: + // lookahead expression with fixed lookahead length + yypushback(1); + { return mREGEX_CONTENT; + } + case 203: break; + case 97: + { yybegin(WAIT_FOR_REGEX); + return(mMOD_ASSIGN); + } + case 204: break; + case 168: + { return( kPROTECTED ); + } + case 205: break; case 86: - { yybegin(WAIT_FOR_REGEX); - return(mDEC); - } - case 179: break; - case 83: - { return( kDO ); - } - case 180: break; - case 89: { yybegin(WAIT_FOR_REGEX); return(mRANGE_INCLUSIVE); } - case 181: break; - case 75: - { return mSH_COMMENT; + case 206: break; + case 113: + { return mNUM_BIG_DECIMAL; } - case 182: break; - case 60: - { return mWRONG_REGEX_LITERAL; + case 207: break; + case 58: + { yybegin(IN_DOLLAR_SLASH_REGEX_DOT); + return mIDENT; } - case 183: break; - case 122: + case 208: break; + case 25: + { yybegin(WAIT_FOR_REGEX); + return(mGT); + } + case 209: break; + case 33: + { yypushback(1); + yybegin(IN_SINGLE_GSTRING); + } + case 210: break; + case 125: { yybegin(WAIT_FOR_REGEX); return(mSR_ASSIGN); } - case 184: break; - case 62: + case 211: break; + case 149: + { return( kDOUBLE ); + } + case 212: break; + case 119: + { yybegin(IN_TRIPLE_GSTRING); + gStringStack.push(mLBRACK); + return mGSTRING_BEGIN; + } + case 213: break; + case 121: + { return( kNEW ); + } + case 214: break; + case 36: + { yypushback(1); + yybegin(IN_TRIPLE_GSTRING); + } + case 215: break; + case 17: + { yybegin(WAIT_FOR_REGEX); + return(mASSIGN); + } + case 216: break; + case 50: + { afterComment = YYINITIAL; + return(WHITE_SPACE); + } + case 217: break; + case 156: + { return( kNATIVE ); + } + case 218: break; + case 114: + { return( kFOR ); + } + case 219: break; + case 98: + { yybegin(WAIT_FOR_REGEX); + return(mBXOR_ASSIGN); + } + case 220: break; + case 132: + { return( kCHAR ); + } + case 221: break; + case 91: + { yybegin(WAIT_FOR_REGEX); + return(mOPTIONAL_DOT); + } + case 222: break; + case 24: + { yybegin(WAIT_FOR_REGEX); + return(mLT); + } + case 223: break; + case 148: + { return( kIMPORT ); + } + case 224: break; + case 159: + { return( kEXTENDS ); + } + case 225: break; + case 2: + { yybegin(NLS_AFTER_NLS); + afterComment = WAIT_FOR_REGEX; + return !braceCount.isEmpty() && + mLPAREN == braceCount.peek() ? WHITE_SPACE : mNLS; + } + case 226: break; + case 60: + { return mDOLLAR_SLASH_REGEX_CONTENT; + } + case 227: break; + case 109: + // lookahead expression with fixed lookahead length + yypushback(1); + { return mDOLLAR_SLASH_REGEX_CONTENT; + } + case 228: break; + case 63: + { yypushback(1); + yybegin(afterComment); + } + case 229: break; + case 157: + { return( kFINALLY ); + } + case 230: break; + case 82: + { yybegin(WAIT_FOR_REGEX); + return(mPLUS_ASSIGN); + } + case 231: break; + case 136: + { return( kVOID ); + } + case 232: break; + case 150: + { return( kPUBLIC ); + } + case 233: break; + case 128: + { return( kELSE ); + } + case 234: break; + case 12: + { return mSTRING_LITERAL; + } + case 235: break; + case 6: + { yybegin(WAIT_FOR_REGEX); + return(mLNOT); + } + case 236: break; + case 10: + { yybegin(WAIT_FOR_REGEX); + return(mMINUS); + } + case 237: break; + case 64: + { yypushback(1); + yybegin(WAIT_FOR_REGEX); + } + case 238: break; + case 59: + { blockStack.push(mDOLLAR); + braceCount.push(mLCURLY); + yybegin(NLS_AFTER_LBRACE); + return mLCURLY; + } + case 239: break; + case 30: + { yybegin(WAIT_FOR_REGEX); + return(mBAND); + } + case 240: break; + case 170: + { return( kIMPLEMENTS ); + } + case 241: break; + case 5: + { yybegin(WAIT_FOR_REGEX); + return(mSTAR); + } + case 242: break; + case 11: + { yybegin(WAIT_FOR_REGEX); + return(mDOT); + } + case 243: break; + case 8: + { return mNUM_INT; + } + case 244: break; + case 167: + { return( kINTERFACE ); + } + case 245: break; + case 81: + { yybegin(WAIT_FOR_REGEX); + return(mINC); + } + case 246: break; + case 161: + { return( kPACKAGE ); + } + case 247: break; + case 146: + { return( kTHROW ); + } + case 248: break; + case 92: + { yybegin(WAIT_FOR_REGEX); + return(mELVIS); + } + case 249: break; + case 79: + { return( kIN ); + } + case 250: break; + case 84: + { yybegin(WAIT_FOR_REGEX); + return(mMINUS_ASSIGN); + } + case 251: break; + case 66: + { return mSL_COMMENT; + } + case 252: break; + case 37: + { yybegin(IN_TRIPLE_DOT); + return mIDENT; + } + case 253: break; + case 20: + { yybegin(WAIT_FOR_REGEX); + braceCount.push(mLPAREN); + return(mLBRACK); + } + case 254: break; + case 130: + { return( kBYTE ); + } + case 255: break; + case 137: + { yybegin(WAIT_FOR_REGEX); + return(mBSR_ASSIGN); + } + case 256: break; + case 52: { yybegin(IN_REGEX_DOT); return mIDENT; } - case 185: break; - case 58: + case 257: break; + case 44: + { yybegin(IN_TRIPLE_GSTRING_DOLLAR); + return mDOLLAR; + } + case 258: break; + case 49: { yypushback(1); if (blockStack.isEmpty()){ yybegin(YYINITIAL); @@ -1864,122 +2195,67 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { yybegin(IN_INNER_BLOCK); } } - case 186: break; - case 8: - { return mIDENT; + case 259: break; + case 172: + { return( kSYNCHRONIZED ); } - case 187: break; - case 26: + case 260: break; + case 117: { yybegin(WAIT_FOR_REGEX); - return(mGT); + return(mTRIPLE_DOT); } - case 188: break; - case 144: - { return( kSUPER ); - } - case 189: break; - case 118: - { yybegin(IN_TRIPLE_GSTRING); - gStringStack.push(mLBRACK); - return mGSTRING_BEGIN; - } - case 190: break; - case 71: + case 261: break; + case 85: { yybegin(WAIT_FOR_REGEX); - return(mDIV_ASSIGN); + return(mCLOSABLE_BLOCK_OP); } - case 191: break; - case 169: - { return( kINSTANCEOF ); - } - case 192: break; - case 95: + case 262: break; + case 87: { yybegin(WAIT_FOR_REGEX); - return(mEQUAL); + return(mMEMBER_POINTER); } - case 193: break; - case 19: - { yybegin(WAIT_FOR_REGEX); - braceCount.push(mLPAREN); - return(mLPAREN); + case 263: break; + case 120: + { return( kTRY ); } - case 194: break; - case 23: - { yybegin(WAIT_FOR_REGEX); - return(mCOLON); - } - case 195: break; - case 154: - { return( kSTATIC ); - } - case 196: break; - case 51: - { if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); + case 264: break; + case 21: + { if (!braceCount.isEmpty() && mLPAREN == braceCount.peek()) { + braceCount.pop(); } - return mREGEX_END; + return(mRBRACK); } - case 197: break; - case 143: - { return( kCATCH ); + case 265: break; + case 48: + { if (!blockStack.isEmpty()) { + IElementType br = blockStack.pop(); + if (br.equals(mLPAREN)) yybegin(IN_SINGLE_GSTRING); + if (br.equals(mLBRACK)) yybegin(IN_TRIPLE_GSTRING); + if (br.equals(mDIV)) yybegin(IN_REGEX); + if (br.equals(mDOLLAR)) yybegin(IN_DOLLAR_SLASH_REGEX); + } + while (!braceCount.isEmpty() && mLCURLY != braceCount.peek()) { + braceCount.pop(); + } + if (!braceCount.isEmpty() && mLCURLY == braceCount.peek()) { + braceCount.pop(); + } + return mRCURLY; } - case 198: break; - case 30: - { yybegin(WAIT_FOR_REGEX); - return(mBOR); + case 266: break; + case 131: + { return( kCASE ); } - case 199: break; - case 54: - { return mREGEX_CONTENT; + case 267: break; + case 77: + { return mNUM_DOUBLE; } - case 200: break; - case 28: - { yybegin(WAIT_FOR_REGEX); - return(mMOD); + case 268: break; + case 158: + { return( kDEFAULT ); } - case 201: break; - case 25: - { yybegin(WAIT_FOR_REGEX); - return(mLT); - } - case 202: break; - case 168: - { return( kPROTECTED ); - } - case 203: break; - case 110: - { return mNUM_BIG_DECIMAL; - } - case 204: break; - case 73: - { yybegin(WAIT_FOR_REGEX); - return(mSPREAD_DOT); - } - case 205: break; - case 148: - { return( kDOUBLE ); - } - case 206: break; - case 38: - { yybegin(IN_TRIPLE_DOT); - return mIDENT; - } - case 207: break; - case 36: - { blockStack.push(mLPAREN); - braceCount.push(mLCURLY); - yybegin(NLS_AFTER_LBRACE); - return mLCURLY; - } - case 208: break; - case 53: - { yypushback(yytext().length()); - yybegin(KING_STATE_INNER_CONTENT); - } - case 209: break; - case 123: + case 269: break; + case 126: { if (!gStringStack.isEmpty()){ gStringStack.pop(); } @@ -1990,244 +2266,25 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { } return mGSTRING_END; } - case 210: break; - case 116: - { return( kNEW ); + case 270: break; + case 169: + { return( kTRANSIENT ); } - case 211: break; - case 48: - { yypushback(yytext().length()); - yybegin(KING_STATE_INNER); - } - case 212: break; - case 149: - { return( kNATIVE ); - } - case 213: break; - case 90: - { yybegin(WAIT_FOR_REGEX); - return(mMEMBER_POINTER); - } - case 214: break; - case 20: - { if (!braceCount.isEmpty() && mLPAREN == braceCount.peek()) { - braceCount.pop(); - } - return(mRPAREN); - } - case 215: break; - case 67: - { yypushback(1); - yybegin(WAIT_FOR_REGEX); - } - case 216: break; + case 271: break; case 111: - { return( kFOR ); + { return GROOVY_DOC_COMMENT; } - case 217: break; - case 133: - { return( kCHAR ); - } - case 218: break; - case 147: - { return( kIMPORT ); - } - case 219: break; - case 93: - { yybegin(WAIT_FOR_REGEX); - return(mOPTIONAL_DOT); - } - case 220: break; - case 103: - { yybegin(WAIT_FOR_REGEX); - return(mBAND_ASSIGN); - } - case 221: break; - case 158: - { return( kEXTENDS ); - } - case 222: break; - case 10: - { yybegin(WAIT_FOR_REGEX); - return(mPLUS); - } - case 223: break; - case 96: - { yybegin(WAIT_FOR_REGEX); - return(mREGEX_FIND); - } - case 224: break; - case 27: - { yybegin(WAIT_FOR_REGEX); - return(mBNOT); - } - case 225: break; - case 101: - { yybegin(WAIT_FOR_REGEX); - return(mBOR_ASSIGN); - } - case 226: break; - case 156: - { return( kFINALLY ); - } - case 227: break; - case 102: - { yybegin(WAIT_FOR_REGEX); - return(mLOR); - } - case 228: break; - case 74: - { yybegin(WAIT_FOR_REGEX); - return(mSTAR_ASSIGN); - } - case 229: break; - case 134: - { return( kVOID ); - } - case 230: break; - case 152: - { return( kPUBLIC ); - } - case 231: break; - case 126: - { return( kELSE ); - } - case 232: break; - case 39: - { blockStack.push(mLBRACK); - braceCount.push(mLCURLY); - yybegin(NLS_AFTER_LBRACE); - return mLCURLY; - } - case 233: break; - case 14: - { return mSTRING_LITERAL; - } - case 234: break; - case 87: - { yybegin(WAIT_FOR_REGEX); - return(mMINUS_ASSIGN); - } - case 235: break; - case 88: - { yybegin(WAIT_FOR_REGEX); - return(mCLOSABLE_BLOCK_OP); - } - case 236: break; - case 170: - { return( kIMPLEMENTS ); - } - case 237: break; - case 43: - { if (!gStringStack.isEmpty()) { - gStringStack.pop(); - } - if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); - } - return mGSTRING_END; - } - case 238: break; - case 99: - { yybegin(WAIT_FOR_REGEX); - return(mMOD_ASSIGN); - } - case 239: break; - case 17: + case 272: break; + case 16: { yybegin(WAIT_FOR_REGEX); return(mQUESTION); } - case 240: break; - case 9: - { return mNUM_INT; + case 273: break; + case 153: + { return( kSWITCH ); } - case 241: break; - case 166: - { return( kINTERFACE ); - } - case 242: break; - case 32: - { yybegin(WAIT_FOR_REGEX); - return(mSEMI); - } - case 243: break; - case 161: - { return( kPACKAGE ); - } - case 244: break; - case 141: - { return( kTHROW ); - } - case 245: break; - case 136: - { if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); - } - return(mDOLLAR_SLASHY_LITERAL); - } - case 246: break; - case 18: - { yybegin(WAIT_FOR_REGEX); - return(mASSIGN); - } - case 247: break; - case 82: - { return( kIN ); - } - case 248: break; - case 69: - { return mSL_COMMENT; - } - case 249: break; - case 13: - { yybegin(IN_SINGLE_GSTRING); - gStringStack.push(mLPAREN); - return mGSTRING_BEGIN; - } - case 250: break; - case 128: - { return( kBYTE ); - } - case 251: break; - case 104: - { yybegin(WAIT_FOR_REGEX); - return(mLAND); - } - case 252: break; - case 124: - { if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); - } - return(mREGEX_LITERAL); - } - case 253: break; - case 34: - { yypushback(1); - yybegin(IN_SINGLE_GSTRING); - } - case 254: break; - case 29: - { yybegin(WAIT_FOR_REGEX); - return(mBXOR); - } - case 255: break; - case 65: - { yypushback(1); - yybegin(IN_REGEX); - } - case 256: break; - case 66: - { yypushback(1); - yybegin(afterComment); - } - case 257: break; - case 5: + case 274: break; + case 4: { if (zzStartRead == 0 || zzBuffer.subSequence(0, zzStartRead).toString().trim().length() == 0) { yypushback(1); @@ -2236,384 +2293,297 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { return(mDIV); } } - case 258: break; - case 171: - { return( kSYNCHRONIZED ); + case 275: break; + case 110: + // lookahead expression with fixed base length + zzMarkedPos = zzStartRead + 1; + { yybegin(IN_DOLLAR_SLASH_REGEX_IDENT); + return mDOT; } - case 259: break; - case 121: + case 276: break; + case 89: + { return mGSTRING_LITERAL; + } + case 277: break; + case 124: { yybegin(WAIT_FOR_REGEX); return(mSL_ASSIGN); } - case 260: break; - case 52: - { yybegin(KING_STATE); - return mREGEX_BEGIN; - } - case 261: break; - case 37: - { yypushback(1); - yybegin(IN_TRIPLE_GSTRING); - } - case 262: break; - case 117: - { return( kTRY ); - } - case 263: break; - case 11: - { yybegin(WAIT_FOR_REGEX); - return(mMINUS); - } - case 264: break; - case 12: - { yybegin(WAIT_FOR_REGEX); - return(mDOT); - } - case 265: break; - case 132: - { return( kCASE ); - } - case 266: break; - case 105: - // lookahead expression with fixed base length - zzMarkedPos = zzStartRead + 1; - { yybegin(IN_SINGLE_IDENT); - return mDOT; - } - case 267: break; - case 80: - { return mNUM_DOUBLE; - } - case 268: break; - case 157: - { return( kDEFAULT ); - } - case 269: break; - case 119: - { yybegin(WAIT_FOR_REGEX); - return(mREGEX_MATCH); - } - case 270: break; - case 1: - { gStringStack.clear(); - yybegin(YYINITIAL); - return mWRONG_REGEX_LITERAL; - } - case 271: break; - case 167: - { return( kTRANSIENT ); - } - case 272: break; - case 55: - { yybegin(KING_STATE_CONTENT); - return mREGEX_CONTENT; - } - case 273: break; - case 84: - { yybegin(WAIT_FOR_REGEX); - return(mINC); - } - case 274: break; - case 108: - { return GROOVY_DOC_COMMENT; - } - case 275: break; - case 3: - { yybegin(NLS_AFTER_NLS); - afterComment = WAIT_FOR_REGEX; - return !braceCount.isEmpty() && - mLPAREN == braceCount.peek() ? WHITE_SPACE : mNLS; - } - case 276: break; - case 61: - { yybegin(NLS_AFTER_NLS); - afterComment = YYINITIAL; - clearStacks(); - return mNLS; - } - case 277: break; - case 155: - { return( kSWITCH ); - } case 278: break; - case 59: - { afterComment = YYINITIAL; - return(WHITE_SPACE); + case 138: + { return( kFLOAT ); } case 279: break; - case 91: - { return mGSTRING_LITERAL; + case 105: + { yybegin(IN_DOLLAR_SLASH_REGEX); + gStringStack.push(mDOLLAR); + return mDOLLAR_SLASH_REGEX_BEGIN; } case 280: break; - case 21: - { yybegin(WAIT_FOR_REGEX); - braceCount.push(mLPAREN); - return(mLBRACK); - } - case 281: break; - case 46: + case 45: { yypushback(1); yybegin(IN_TRIPLE_IDENT); } - case 282: break; - case 137: - { return( kFLOAT ); - } - case 283: break; - case 57: - { if (!blockStack.isEmpty()) { - IElementType br = blockStack.pop(); - if (br.equals(mLPAREN)) yybegin(IN_SINGLE_GSTRING); - if (br.equals(mLBRACK)) yybegin(IN_TRIPLE_GSTRING); - if (br.equals(mDIV)) yybegin(IN_REGEX); - } - while (!braceCount.isEmpty() && mLCURLY != braceCount.peek()) { - braceCount.pop(); - } - if (!braceCount.isEmpty() && mLCURLY == braceCount.peek()) { - braceCount.pop(); - } - return mRCURLY; - } - case 284: break; - case 135: - { yybegin(WAIT_FOR_REGEX); - return(mBSR_ASSIGN); - } - case 285: break; - case 81: - { return( kIF ); - } - case 286: break; - case 94: - { yybegin(WAIT_FOR_REGEX); - return(mELVIS); - } - case 287: break; - case 138: - { return( kFINAL ); - } - case 288: break; - case 35: + case 281: break; + case 34: { yybegin(IN_SINGLE_DOT); return mIDENT; } - case 289: break; - case 98: + case 282: break; + case 123: { yybegin(WAIT_FOR_REGEX); - return(mGE); + return(mCOMPARE_TO); } - case 290: break; - case 151: + case 283: break; + case 88: + { yypushback(2); + yybegin(WAIT_FOR_REGEX); + } + case 284: break; + case 78: + { return( kIF ); + } + case 285: break; + case 139: + { return( kFINAL ); + } + case 286: break; + case 101: + { yybegin(WAIT_FOR_REGEX); + return(mBAND_ASSIGN); + } + case 287: break; + case 154: { return( kTHROWS ); } - case 291: break; - case 78: + case 288: break; + case 75: { return mNUM_FLOAT; } - case 292: break; - case 114: - { yybegin(WAIT_FOR_REGEX); - return(mTRIPLE_DOT); + case 289: break; + case 38: + { blockStack.push(mLBRACK); + braceCount.push(mLCURLY); + yybegin(NLS_AFTER_LBRACE); + return mLCURLY; } - case 293: break; - case 49: - { yypushback(yytext().length()); - gStringStack.push(mDIV); // For regexes - yybegin(IN_REGEX_DOLLAR); + case 290: break; + case 47: + { blockStack.push(mLCURLY); + braceCount.push(mLCURLY); + yybegin(NLS_AFTER_LBRACE); + return(mLCURLY); } - case 294: break; - case 112: + case 291: break; + case 115: { return( kINT ); } - case 295: break; - case 164: + case 292: break; + case 165: { return( kSTRICTFP ); } - case 296: break; - case 68: - { yypushback(1); - yybegin(NLS_AFTER_COMMENT); + case 293: break; + case 9: + { yybegin(WAIT_FOR_REGEX); + return(mPLUS); } - case 297: break; - case 162: + case 294: break; + case 163: { return( kABSTRACT ); } - case 298: break; - case 139: + case 295: break; + case 140: { return( kFALSE ); } + case 296: break; + case 41: + { yybegin(IN_SINGLE_GSTRING_DOLLAR); + return mDOLLAR; + } + case 297: break; + case 26: + { yybegin(WAIT_FOR_REGEX); + return(mBNOT); + } + case 298: break; + case 13: + { yybegin(IN_SINGLE_GSTRING); + gStringStack.push(mLPAREN); + return mGSTRING_BEGIN; + } case 299: break; - case 92: + case 90: { return( kAS ); } case 300: break; - case 47: - { yybegin(NLS_AFTER_NLS); - afterComment = IN_TRIPLE_IDENT; - return mNLS; + case 71: + { yybegin(WAIT_FOR_REGEX); + return(mSTAR_ASSIGN); } case 301: break; - case 115: - { yybegin(WAIT_FOR_REGEX); - return(mRANGE_EXCLUSIVE); - } - case 302: break; - case 163: + case 164: { return( kCONTINUE ); } + case 302: break; + case 40: + { clearStacks(); + yybegin(NLS_AFTER_NLS); + afterComment = YYINITIAL; + return mNLS; + } case 303: break; - case 33: + case 127: + { return( kLONG ); + } + case 304: break; + case 76: + { return mNUM_LONG; + } + case 305: break; + case 141: + { return( kBREAK ); + } + case 306: break; + case 160: + { return( kBOOLEAN ); + } + case 307: break; + case 151: + { return( kASSERT ); + } + case 308: break; + case 96: + { yybegin(WAIT_FOR_REGEX); + return(mGE); + } + case 309: break; + case 23: + { yybegin(WAIT_FOR_REGEX); + return(mCOMMA); + } + case 310: break; + case 93: + { yybegin(WAIT_FOR_REGEX); + return(mEQUAL); + } + case 311: break; + case 3: + { return WHITE_SPACE; + } + case 312: break; + case 134: + { return( kTHIS ); + } + case 313: break; + case 162: + { return( kPRIVATE ); + } + case 314: break; + case 18: + { yybegin(WAIT_FOR_REGEX); + braceCount.push(mLPAREN); + return(mLPAREN); + } + case 315: break; + case 104: + // lookahead expression with fixed base length + zzMarkedPos = zzStartRead + 1; + { yybegin(IN_TRIPLE_NLS); + return mDOT; + } + case 316: break; + case 51: + { yybegin(IN_REGEX); + gStringStack.push(mDIV); + return mREGEX_BEGIN; + } + case 317: break; + case 145: + { return( kSHORT ); + } + case 318: break; + case 83: + { yybegin(WAIT_FOR_REGEX); + return(mDEC); + } + case 319: break; + case 31: + { yybegin(WAIT_FOR_REGEX); + return(mSEMI); + } + case 320: break; + case 61: + { yybegin(IN_DOLLAR_SLASH_REGEX_DOLLAR); + return mDOLLAR; + } + case 321: break; + case 166: + { return( kVOLATILE ); + } + case 322: break; + case 14: + { yybegin(NLS_AFTER_LBRACE); + braceCount.push(mLCURLY); + return(mLCURLY); + } + case 323: break; + case 32: { yybegin(WAIT_FOR_REGEX); return(mAT); } - case 304: break; - case 125: - { return( kLONG ); + case 324: break; + case 74: + { return mNUM_BIG_INT; } - case 305: break; - case 79: - { return mNUM_LONG; + case 325: break; + case 118: + { yybegin(WAIT_FOR_REGEX); + return(mRANGE_EXCLUSIVE); } - case 306: break; - case 140: - { return( kBREAK ); + case 326: break; + case 142: + { return( kCLASS ); } - case 307: break; - case 97: + case 327: break; + case 68: + { yybegin(WAIT_FOR_REGEX); + return(mDIV_ASSIGN); + } + case 328: break; + case 95: { yybegin(WAIT_FOR_REGEX); return(mLE); } - case 308: break; - case 159: - { return( kBOOLEAN ); + case 329: break; + case 155: + { return( kRETURN ); } - case 309: break; - case 153: - { return( kASSERT ); + case 330: break; + case 22: + { yybegin(WAIT_FOR_REGEX); + return(mCOLON); } - case 310: break; + case 331: break; case 107: // lookahead expression with fixed base length zzMarkedPos = zzStartRead + 1; { yybegin(IN_REGEX_IDENT); return mDOT; } - case 311: break; - case 4: - { return WHITE_SPACE; - } - case 312: break; - case 131: - { return( kTHIS ); - } - case 313: break; - case 160: - { return( kPRIVATE ); - } - case 314: break; - case 45: - { yybegin(IN_TRIPLE_GSTRING_DOLLAR); + case 332: break; + case 56: + { yybegin(IN_REGEX_DOLLAR); return mDOLLAR; } - case 315: break; - case 145: - { return( kSHORT ); - } - case 316: break; - case 22: + case 333: break; + case 19: { if (!braceCount.isEmpty() && mLPAREN == braceCount.peek()) { braceCount.pop(); } - return(mRBRACK); + return(mRPAREN); } - case 317: break; - case 15: - { yybegin(NLS_AFTER_LBRACE); - braceCount.push(mLCURLY); - return(mLCURLY); - } - case 318: break; - case 165: - { return( kVOLATILE ); - } - case 319: break; - case 106: - // lookahead expression with fixed base length - zzMarkedPos = zzStartRead + 1; - { yybegin(IN_TRIPLE_NLS); - return mDOT; - } - case 320: break; - case 16: - { while (!braceCount.isEmpty() && mLCURLY != braceCount.peek()) { - braceCount.pop(); - } - if (!braceCount.isEmpty() && mLCURLY == braceCount.peek()) { - braceCount.pop(); - } - return(mRCURLY); - } - case 321: break; - case 7: - { yybegin(WAIT_FOR_REGEX); - return(mLNOT); - } - case 322: break; - case 72: - { yybegin(WAIT_FOR_REGEX); - return(mSTAR_STAR); - } - case 323: break; - case 77: - { return mNUM_BIG_INT; - } - case 324: break; - case 64: - { if (!gStringStack.isEmpty()) { - gStringStack.pop(); - } - if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); - } - return mREGEX_END; - } - case 325: break; - case 142: - { return( kCLASS ); - } - case 326: break; - case 85: - { yybegin(WAIT_FOR_REGEX); - return(mPLUS_ASSIGN); - } - case 327: break; - case 31: - { yybegin(WAIT_FOR_REGEX); - return(mBAND); - } - case 328: break; - case 120: - { yybegin(WAIT_FOR_REGEX); - return(mCOMPARE_TO); - } - case 329: break; - case 100: - { yybegin(WAIT_FOR_REGEX); - return(mBXOR_ASSIGN); - } - case 330: break; - case 150: - { return( kRETURN ); - } - case 331: break; - case 50: - { return mREGEX_BEGIN; - } - case 332: break; - case 44: + case 334: break; + case 43: // general lookahead, find correct zzMarkedPos { int zzFState = 24; int zzFPos = zzStartRead; @@ -2636,51 +2606,52 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes, TokenType { } { return mGSTRING_CONTENT; } - case 333: break; - case 40: + case 335: break; + case 39: { return mGSTRING_CONTENT; } - case 334: break; - case 109: - { yybegin(WAIT_FOR_REGEX); - return(mSTAR_STAR_ASSIGN); - } - case 335: break; - case 113: - { return( kDEF ); - } case 336: break; - case 42: - { yybegin(IN_SINGLE_GSTRING_DOLLAR); - return mDOLLAR; + case 102: + { yybegin(WAIT_FOR_REGEX); + return(mLAND); } case 337: break; - case 41: - { clearStacks(); - yybegin(NLS_AFTER_NLS); - afterComment = YYINITIAL; - return mNLS; + case 29: + { yybegin(WAIT_FOR_REGEX); + return(mBOR); } case 338: break; - case 63: - { blockStack.push(mDIV); - braceCount.push(mLCURLY); - yybegin(NLS_AFTER_LBRACE); - return mLCURLY; + case 116: + { return( kDEF ); } case 339: break; - case 146: - { return( kWHILE ); + case 28: + { yybegin(WAIT_FOR_REGEX); + return(mBXOR); } case 340: break; - case 2: - { return mWRONG; + case 15: + { while (!braceCount.isEmpty() && mLCURLY != braceCount.peek()) { + braceCount.pop(); + } + if (!braceCount.isEmpty() && mLCURLY == braceCount.peek()) { + braceCount.pop(); + } + return mRCURLY; } case 341: break; - case 70: - { return mML_COMMENT; + case 147: + { return( kWHILE ); } case 342: break; + case 1: + { return mWRONG; + } + case 343: break; + case 67: + { return mML_COMMENT; + } + case 344: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex index 84ac62aa82c3..3ce2f0c8edbb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex @@ -134,7 +134,7 @@ mIDENT_NOBUCKS = {mLETTER} ({mLETTER} | {mDIGIT})* mSTRING_NL = {mONE_NL} mSTRING_ESC = \\ [^] | \\ ({WHITE_SPACE})+ (\n|\r) -mREGEX_ESC = \\ n | \\ r | \\ t | \\ b | \\ f | "\\" "\\" | \\ "$" | \\ \" | \\ \' +mREGEX_ESC = \\ "$" | "\\""u"{mHEX_DIGIT}{4} | "\\" [0..3] ([0..7] ([0..7])?)? | "\\" [4..7] ([0..7])? @@ -142,18 +142,10 @@ mREGEX_ESC = \\ n | \\ r | \\ t | \\ b | \\ f | "\\" "\\" | \\ "$" | \\ \" | \\ /// Regexes //////////////////////////////////////////////////////////////// -ESCAPPED_REGEX_SEP = \\ "/" -mREGEX_BEGIN = "/""$" - | "/" ([^"/""$"] | {mREGEX_ESC} | {ESCAPPED_REGEX_SEP})? {mREGEX_CONTENT}"$" -mREGEX_CONTENT = ({mREGEX_ESC} - | {ESCAPPED_REGEX_SEP} - | [^"/""$"])* +ESCAPED_REGEX_SEP = \\ "/" +mREGEX_CONTENT = ({mREGEX_ESC} | {ESCAPED_REGEX_SEP} | [^"/""$"])+ -mREGEX_LITERAL = "/" ([^"/"\n\r"$"] | {mREGEX_ESC} | {ESCAPPED_REGEX_SEP})? {mREGEX_CONTENT} ("$""/" | "/") -mDOLLAR_SLASHY_LITERAL_1 = \$\/ ([^\/] | \/[^\$] )* \/\$ -mDOLLAR_SLASHY_LITERAL_2 = \$\/ ([^\/] | \/[^\$] | {mDOLLAR_SLASHY_LITERAL_1} )* \/\$ -mDOLLAR_SLASHY_LITERAL_3 = \$\/ ([^\/] | \/[^\$] | {mDOLLAR_SLASHY_LITERAL_2} )* \/\$ -mDOLLAR_SLASHY_LITERAL = {mDOLLAR_SLASHY_LITERAL_3} +mDOLLAR_SLASH_REGEX_CONTENT = ([^\/\$] | \/[^\$] )+ //////////////////////////////////////////////////////////////////////////// @@ -208,10 +200,6 @@ mGSTRING_LITERAL = \"\" %xstate IN_TRIPLE_IDENT %xstate IN_TRIPLE_DOT %xstate IN_TRIPLE_NLS -%xstate KING_STATE -%xstate KING_STATE_INNER -%xstate KING_STATE_CONTENT -%xstate KING_STATE_INNER_CONTENT %state IN_INNER_BLOCK @@ -220,6 +208,10 @@ mGSTRING_LITERAL = \"\" %xstate IN_REGEX %xstate IN_REGEX_IDENT %xstate IN_REGEX_DOT +%xstate IN_DOLLAR_SLASH_REGEX_DOLLAR +%xstate IN_DOLLAR_SLASH_REGEX +%xstate IN_DOLLAR_SLASH_REGEX_IDENT +%xstate IN_DOLLAR_SLASH_REGEX_DOT // Not to separate NewLine sequence by comments %xstate NLS_AFTER_COMMENT @@ -371,6 +363,7 @@ mGSTRING_LITERAL = \"\" if (br.equals(mLPAREN)) yybegin(IN_SINGLE_GSTRING); if (br.equals(mLBRACK)) yybegin(IN_TRIPLE_GSTRING); if (br.equals(mDIV)) yybegin(IN_REGEX); + if (br.equals(mDOLLAR)) yybegin(IN_DOLLAR_SLASH_REGEX); } while (!braceCount.isEmpty() && mLCURLY != braceCount.peek()) { braceCount.pop(); @@ -490,93 +483,25 @@ mGSTRING_LITERAL = \"\" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// regexes ////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - { // Processing nasty $ signs - ("{" | {mIDENT_NOBUCKS}) { yypushback(yytext().length()); - gStringStack.push(mDIV); // For regexes - yybegin(IN_REGEX_DOLLAR); } - - . | {mNLS} { yypushback(yytext().length()); - yybegin(KING_STATE_INNER); - } -} - - { // Processing nasty $ signs - ("{" | {mIDENT_NOBUCKS}) { yypushback(yytext().length()); - gStringStack.push(mDIV); // For regexes - yybegin(IN_REGEX_DOLLAR); } - - . | {mNLS} { yypushback(yytext().length()); - yybegin(KING_STATE_INNER_CONTENT); - } -} - - { - "$" { yybegin(KING_STATE); - return mREGEX_BEGIN; } - - {ESCAPPED_REGEX_SEP} { return mREGEX_BEGIN; } - - "/" { if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); - } - return mREGEX_END; } - - . | {mNLS} { return mREGEX_BEGIN; } - -} - - { - "$" { yybegin(KING_STATE_CONTENT); - return mREGEX_CONTENT; } - - {ESCAPPED_REGEX_SEP} { return mREGEX_CONTENT; } - - "/" { if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); - } - return mREGEX_END; } - - . | {mNLS} { return mREGEX_CONTENT; } - - -} - - - { -{WHITE_SPACE} { afterComment = YYINITIAL; - return(WHITE_SPACE); } + {WHITE_SPACE} { afterComment = YYINITIAL; + return(WHITE_SPACE); } -{mSL_COMMENT} { return mSL_COMMENT; } -{mML_COMMENT} { return mML_COMMENT; } -{mDOC_COMMENT} { return GROOVY_DOC_COMMENT; } + {mSL_COMMENT} { return mSL_COMMENT; } + {mML_COMMENT} { return mML_COMMENT; } + {mDOC_COMMENT} { return GROOVY_DOC_COMMENT; } -{mDOLLAR_SLASHY_LITERAL} { if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); - } - return(mDOLLAR_SLASHY_LITERAL); } - -{mREGEX_LITERAL} { if (blockStack.isEmpty()){ - yybegin(YYINITIAL); - } else { - yybegin(IN_INNER_BLOCK); - } - return(mREGEX_LITERAL); } - -{mREGEX_BEGIN} { yybegin(KING_STATE); + "/" { yybegin(IN_REGEX); + gStringStack.push(mDIV); return mREGEX_BEGIN; } -"/" ([^\"\$\/] | {mREGEX_ESC} | {ESCAPPED_REGEX_SEP})? {mREGEX_CONTENT} { return mWRONG_REGEX_LITERAL; } + "$""/" { yybegin(IN_DOLLAR_SLASH_REGEX); + gStringStack.push(mDOLLAR); + return mDOLLAR_SLASH_REGEX_BEGIN; } -[^] { yypushback(1); + [^] { yypushback(1); if (blockStack.isEmpty()){ yybegin(YYINITIAL); } else { @@ -585,17 +510,24 @@ mGSTRING_LITERAL = \"\" } } -{ - {mIDENT_NOBUCKS} { yybegin(IN_REGEX_DOT); - return mIDENT; } - [^] { yypushback(1); - yybegin(IN_REGEX); } -} -{ - "." /{mIDENT_NOBUCKS} { yybegin(IN_REGEX_IDENT); - return mDOT; } - [^] { yypushback(1); - yybegin(IN_REGEX); } + { + "/" { if (!gStringStack.isEmpty()) { + gStringStack.pop(); + } + if (blockStack.isEmpty()){ + yybegin(YYINITIAL); + } else { + yybegin(IN_INNER_BLOCK); + } + return mREGEX_END; } + + {mREGEX_CONTENT}? "$" + /[^"{"[:letter:]"_"] { return mREGEX_CONTENT; } + + {mREGEX_CONTENT} { return mREGEX_CONTENT; } + + "$" { yybegin(IN_REGEX_DOLLAR); + return mDOLLAR;} } { @@ -606,20 +538,24 @@ mGSTRING_LITERAL = \"\" braceCount.push(mLCURLY); yybegin(NLS_AFTER_LBRACE); return mLCURLY; } - ([^{[:jletter:]\n\r] | "$") - {mSTRING_ESC}* { gStringStack.clear(); - yybegin(YYINITIAL); - return mWRONG_REGEX_LITERAL; } - {mNLS} { yybegin(NLS_AFTER_NLS); - afterComment = YYINITIAL; - clearStacks(); - return mNLS;} } - { - {mREGEX_CONTENT}"$" { yybegin(KING_STATE_CONTENT); - return mREGEX_CONTENT; } - {mREGEX_CONTENT} ("$" "/" | "/") { if (!gStringStack.isEmpty()) { +{ + "." /{mIDENT_NOBUCKS} { yybegin(IN_REGEX_IDENT); + return mDOT; } + [^] { yypushback(1); + yybegin(IN_REGEX); } +} + +{ + {mIDENT_NOBUCKS} { yybegin(IN_REGEX_DOT); + return mIDENT; } + [^] { yypushback(1); + yybegin(IN_REGEX); } +} + + { + "/""$" { if (!gStringStack.isEmpty()) { gStringStack.pop(); } if (blockStack.isEmpty()){ @@ -627,16 +563,45 @@ mGSTRING_LITERAL = \"\" } else { yybegin(IN_INNER_BLOCK); } - return mREGEX_END; } - {mREGEX_CONTENT} { gStringStack.clear(); - yybegin(YYINITIAL); - return mWRONG_REGEX_LITERAL; } - {mNLS} { clearStacks(); - yybegin(NLS_AFTER_NLS); - afterComment = YYINITIAL; - return mNLS; } + return mDOLLAR_SLASH_REGEX_END; } + + {mDOLLAR_SLASH_REGEX_CONTENT}? "$" + /[^"{"[:letter:]"_"] { return mDOLLAR_SLASH_REGEX_CONTENT; } + + "/" { return mDOLLAR_SLASH_REGEX_CONTENT; } + + {mDOLLAR_SLASH_REGEX_CONTENT} { return mDOLLAR_SLASH_REGEX_CONTENT; } + + "$" { yybegin(IN_DOLLAR_SLASH_REGEX_DOLLAR); + return mDOLLAR;} } + { + + {mIDENT_NOBUCKS} { yybegin(IN_DOLLAR_SLASH_REGEX_DOT); + return mIDENT; } + "{" { blockStack.push(mDOLLAR); + braceCount.push(mLCURLY); + yybegin(NLS_AFTER_LBRACE); + return mLCURLY; } +} + +{ + "." /{mIDENT_NOBUCKS} { yybegin(IN_DOLLAR_SLASH_REGEX_IDENT); + return mDOT; } + [^] { yypushback(1); + yybegin(IN_DOLLAR_SLASH_REGEX); } +} + +{ + {mIDENT_NOBUCKS} { yybegin(IN_DOLLAR_SLASH_REGEX_DOT); + return mIDENT; } + [^] { yypushback(1); + yybegin(IN_DOLLAR_SLASH_REGEX); } +} + + + { "}" { @@ -646,7 +611,7 @@ mGSTRING_LITERAL = \"\" if (!braceCount.isEmpty() && mLCURLY == braceCount.peek()) { braceCount.pop(); } - return(mRCURLY); } + return mRCURLY; } } @@ -699,6 +664,9 @@ mGSTRING_LITERAL = \"\" {mGSTRING_LITERAL} { return mGSTRING_LITERAL; } +"$""/" { yypushback(2); + yybegin(WAIT_FOR_REGEX); } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////// keywords ///////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/DollarSlashRegexConstructorExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/DollarSlashRegexConstructorExpression.java new file mode 100644 index 000000000000..d719090cca4e --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/DollarSlashRegexConstructorExpression.java @@ -0,0 +1,93 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.parser.parsing.statements.expressions.primary; + +import com.intellij.lang.PsiBuilder; +import org.jetbrains.plugins.groovy.GroovyBundle; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyElementType; +import org.jetbrains.plugins.groovy.lang.parser.GroovyParser; +import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.blocks.OpenOrClosableBlock; +import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.expressions.arithmetic.PathExpression; +import org.jetbrains.plugins.groovy.lang.parser.parsing.util.ParserUtils; + +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR_SLASH_REGEX_BEGIN; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR_SLASH_REGEX_CONTENT; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR_SLASH_REGEX_END; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mIDENT; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mLCURLY; +import static org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes.*; + +/** + * @author Max Medvedev + */ +public class DollarSlashRegexConstructorExpression { + public static GroovyElementType parse(PsiBuilder builder, GroovyParser parser) { + + PsiBuilder.Marker sMarker = builder.mark(); + if (ParserUtils.getToken(builder, mDOLLAR_SLASH_REGEX_BEGIN)) { + ParserUtils.getToken(builder, mDOLLAR_SLASH_REGEX_CONTENT); + if (!parseInjection(builder, parser)) { + if (!ParserUtils.getToken(builder, mDOLLAR_SLASH_REGEX_END)) { + builder.error(GroovyBundle.message("dollar.slash.end.expected")); + } + sMarker.done(REGEX); + return REGEX; + } + else { + while (ParserUtils.getToken(builder, mDOLLAR_SLASH_REGEX_CONTENT)) { + if (!parseInjection(builder, parser)) break; + } + if (!ParserUtils.getToken(builder, mDOLLAR_SLASH_REGEX_END)) { + builder.error(GroovyBundle.message("dollar.slash.end.expected")); + } + sMarker.done(REGEX); + return REGEX; + } + } + else { + sMarker.drop(); + return WRONGWAY; + } + } + + /** + * Parses heredoc's content in GString + * + * @param builder given builder + * @return nothing + */ + private static boolean parseInjection(PsiBuilder builder, GroovyParser parser) { + if (builder.getTokenType() != mDOLLAR) return false; + + final PsiBuilder.Marker injection = builder.mark(); + ParserUtils.getToken(builder, mDOLLAR); + + if (mIDENT.equals(builder.getTokenType())) { + PathExpression.parse(builder, parser); + } + else if (mLCURLY.equals(builder.getTokenType())) { + OpenOrClosableBlock.parseClosableBlock(builder, parser); + } + else { + injection.drop(); + return false; + } + + injection.done(GSTRING_INJECTION); + return true; + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/PrimaryExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/PrimaryExpression.java index 08746f8de978..49a5ebaa0b44 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/PrimaryExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/PrimaryExpression.java @@ -71,6 +71,9 @@ public class PrimaryExpression implements GroovyElementTypes { if (mREGEX_BEGIN == tokenType) { return RegexConstructorExpression.parse(builder, parser); } + if (mDOLLAR_SLASH_REGEX_BEGIN == tokenType) { + return DollarSlashRegexConstructorExpression.parse(builder, parser); + } if (mLBRACK == tokenType) { return ListOrMapConstructorExpression.parse(builder, parser); } @@ -82,7 +85,8 @@ public class PrimaryExpression implements GroovyElementTypes { } if (tokenType == mSTRING_LITERAL || tokenType == mGSTRING_LITERAL || - tokenType == mREGEX_LITERAL) { + tokenType == mREGEX_LITERAL || + tokenType == mDOLLAR_SLASH_REGEX_LITERAL) { return ParserUtils.eatElement(builder, literalsAsRefExprs ? REFERENCE_EXPRESSION : LITERAL); } if (TokenSets.CONSTANTS.contains(tokenType)) { @@ -91,7 +95,14 @@ public class PrimaryExpression implements GroovyElementTypes { if (mWRONG_REGEX_LITERAL == tokenType) { PsiBuilder.Marker marker = builder.mark(); builder.advanceLexer(); - builder.error(GroovyBundle.message("wrong.string")); + builder.error(GroovyBundle.message("regex.end.expected")); + marker.done(LITERAL); + return LITERAL; + } + if (mWRONG_DOLLAR_SLASH_LITERAL == tokenType) { + final PsiBuilder.Marker marker = builder.mark(); + builder.advanceLexer(); + builder.error(GroovyBundle.message("dollar.slash.end.expected")); marker.done(LITERAL); return LITERAL; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/RegexConstructorExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/RegexConstructorExpression.java index 3180aa527f4d..d453fa433af0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/RegexConstructorExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/primary/RegexConstructorExpression.java @@ -34,23 +34,26 @@ public class RegexConstructorExpression implements GroovyElementTypes { PsiBuilder.Marker sMarker = builder.mark(); if (ParserUtils.getToken(builder, mREGEX_BEGIN)) { - if (!regexConstructorValuePart(builder, parser)) { + ParserUtils.getToken(builder, mREGEX_CONTENT); + if (!parseInjection(builder, parser)) { if (!ParserUtils.getToken(builder, mREGEX_END)) { - builder.error(GroovyBundle.message("identifier.or.block.expected")); - } - sMarker.done(REGEX); - return REGEX; - } else { - while (ParserUtils.getToken(builder, mREGEX_CONTENT)) { - if (!regexConstructorValuePart(builder, parser)) break; - } - if (!ParserUtils.getToken(builder, mREGEX_END)) { - builder.error(GroovyBundle.message("identifier.or.block.expected")); + builder.error(GroovyBundle.message("regex.end.expected")); } sMarker.done(REGEX); return REGEX; } - } else { + else { + while (ParserUtils.getToken(builder, mREGEX_CONTENT)) { + if (!parseInjection(builder, parser)) break; + } + if (!ParserUtils.getToken(builder, mREGEX_END)) { + builder.error(GroovyBundle.message("regex.end.expected")); + } + sMarker.done(REGEX); + return REGEX; + } + } + else { sMarker.drop(); return WRONGWAY; } @@ -62,16 +65,24 @@ public class RegexConstructorExpression implements GroovyElementTypes { * @param builder given builder * @return nothing */ - private static boolean regexConstructorValuePart(PsiBuilder builder, GroovyParser parser) { - //ParserUtils.getToken(builder, mSTAR); + private static boolean parseInjection(PsiBuilder builder, GroovyParser parser) { + if (builder.getTokenType() != mDOLLAR) return false; + + final PsiBuilder.Marker injection = builder.mark(); + ParserUtils.getToken(builder, mDOLLAR); + if (mIDENT.equals(builder.getTokenType())) { PathExpression.parse(builder, parser); - return true; - } else if (mLCURLY.equals(builder.getTokenType())) { - OpenOrClosableBlock.parseClosableBlock(builder, parser); - return true; } - return false; - } + else if (mLCURLY.equals(builder.getTokenType())) { + OpenOrClosableBlock.parseClosableBlock(builder, parser); + } + else { + injection.drop(); + return false; + } + injection.done(GSTRING_INJECTION); + return true; + } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java index 733a8c7ac585..a0288e997c3e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java @@ -110,7 +110,6 @@ public class TypesUtil { static { ourPrimitiveTypesToClassNames.put(mSTRING_LITERAL, JAVA_LANG_STRING); ourPrimitiveTypesToClassNames.put(mGSTRING_LITERAL, JAVA_LANG_STRING); - ourPrimitiveTypesToClassNames.put(mREGEX_LITERAL, JAVA_LANG_STRING); ourPrimitiveTypesToClassNames.put(mNUM_INT, JAVA_LANG_INTEGER); ourPrimitiveTypesToClassNames.put(mNUM_LONG, JAVA_LANG_LONG); ourPrimitiveTypesToClassNames.put(mNUM_FLOAT, JAVA_LANG_FLOAT); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralEscaper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralEscaper.java index fde2e7039376..a7ff995ccf46 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralEscaper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralEscaper.java @@ -19,9 +19,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.litera import com.intellij.openapi.util.ProperTextRange; import com.intellij.openapi.util.TextRange; import com.intellij.psi.LiteralTextEscaper; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; public class GrLiteralEscaper extends LiteralTextEscaper { @@ -36,7 +34,7 @@ public class GrLiteralEscaper extends LiteralTextEscaper { ProperTextRange.assertProperRange(rangeInsideHost); String subText = rangeInsideHost.substring(myHost.getText()); outSourceOffsets = new int[subText.length() + 1]; - return GrStringUtil.parseStringCharacters(subText, outChars, outSourceOffsets, isStrictBackSlash()); + return GrStringUtil.parseStringCharacters(subText, outChars, outSourceOffsets); } @Override @@ -46,11 +44,6 @@ public class GrLiteralEscaper extends LiteralTextEscaper { return (result <= rangeInsideHost.getLength() ? result : rangeInsideHost.getLength()) + rangeInsideHost.getStartOffset(); } - protected boolean isStrictBackSlash() { - PsiElement child = myHost.getFirstChild(); - return child == null || child.getNode().getElementType() != GroovyTokenTypes.mREGEX_LITERAL; - } - public boolean isOneLine() { final Object value = myHost.getValue(); return value instanceof String && ((String)value).indexOf('\n') < 0; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralImpl.java index d97758a4f99d..a51a480e5255 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralImpl.java @@ -17,7 +17,6 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.literals; import com.intellij.lang.ASTNode; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry; import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference; @@ -31,7 +30,6 @@ import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiManager; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.GrExpressionImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; @@ -112,30 +110,16 @@ public class GrLiteralImpl extends GrAbstractLiteral implements GrLiteral, PsiLa } else if (elemType == mSTRING_LITERAL) { if (!text.startsWith("'")) return null; - text = text.substring(1); - if (text.endsWith("'")) { - text = text.substring(0, text.length() - 1); - } + text = GrStringUtil.removeQuotes(text); StringBuilder chars = new StringBuilder(text.length()); - boolean result = GrStringUtil.parseStringCharacters(text, chars, null, true); + boolean result = GrStringUtil.parseStringCharacters(text, chars, null); return result ? chars.toString() : null; } else if (elemType == mGSTRING_LITERAL) { if (!text.startsWith("\"")) return null; - if (text.startsWith("\"\"\"")) { - text = StringUtil.trimEnd(text.substring(3), "\"\"\""); - } - else { - text = StringUtil.trimEnd(text.substring(1), "\""); - } + text = GrStringUtil.removeQuotes(text); StringBuilder chars = new StringBuilder(text.length()); - boolean result = GrStringUtil.parseStringCharacters(text, chars, null, true); - return result ? chars.toString() : null; - } - else if (elemType == mREGEX_LITERAL) { - text = StringUtil.trimStart(StringUtil.trimEnd(text, "/"), "/"); - StringBuilder chars = new StringBuilder(text.length()); - boolean result = GrStringUtil.parseStringCharacters(text, chars, null, false); + boolean result = GrStringUtil.parseStringCharacters(text, chars, null); return result ? chars.toString() : null; } return null; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrRegexImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrRegexImpl.java index 5def238cb3f0..fcda166b8272 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrRegexImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrRegexImpl.java @@ -17,9 +17,14 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.literals; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrRegex; +import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; + +import java.util.List; /** * @author ilyas @@ -42,5 +47,36 @@ public class GrRegexImpl extends GrStringImpl implements GrRegex { visitor.visitRegexExpression(this); } + @Override + public Object getValue() { + if (getInjections().length > 0) return null; + + PsiElement child = getFirstChild(); + if (child == null) return null; + + child = child.getNextSibling(); + if (child == null || + child.getNode().getElementType() != GroovyTokenTypes.mREGEX_CONTENT && + child.getNode().getElementType() != GroovyTokenTypes.mDOLLAR_SLASH_REGEX_CONTENT) { + return null; + } + + final StringBuilder chars = new StringBuilder(); + final boolean isDollarSlash = child.getNode().getElementType() == GroovyTokenTypes.mREGEX_CONTENT; + GrStringUtil.parseRegexCharacters(child.getText(), chars, null, isDollarSlash); + return chars.toString(); + } + + @Override + public String[] getTextParts() { + List parts = findChildrenByType(GroovyTokenTypes.mREGEX_CONTENT); + + String[] result = new String[parts.size()]; + int i = 0; + for (PsiElement part : parts) { + result[i++] = part.getText(); + } + return result; + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrStringImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrStringImpl.java index 161f3a5bded8..828f69368921 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrStringImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrStringImpl.java @@ -27,7 +27,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrString; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiManager; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.GrExpressionImpl; +import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames; import java.util.List; @@ -86,6 +86,17 @@ public class GrStringImpl extends GrAbstractLiteral implements GrString { } public Object getValue() { - return null; + if (findChildByClass(GrStringInjection.class) != null) return null; + + final PsiElement fchild = getFirstChild(); + if (fchild == null) return null; + + final PsiElement content = fchild.getNextSibling(); + if (content == null || content.getNode().getElementType() != GroovyTokenTypes.mGSTRING_CONTENT) return null; + + final String text = content.getText(); + StringBuilder chars = new StringBuilder(text.length()); + boolean result = GrStringUtil.parseStringCharacters(text, chars, null); + return result ? chars.toString() : null; } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java index a610c0ab2be5..f7bee66d167d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java @@ -29,6 +29,8 @@ public class GrStringUtil { private static final String DOUBLE_QUOTES = "\""; private static final String TRIPLE_DOUBLE_QUOTES = "\"\"\""; private static final String SLASH = "/"; + private static final String DOLLAR_SLASH = "$/"; + private static final String SLASH_DOLLAR = "/$"; private GrStringUtil() { } @@ -179,10 +181,21 @@ public class GrStringUtil { String quote = getStartQuote(s); int sL = s.length(); int qL = quote.length(); + if (sL >= qL * 2 && DOLLAR_SLASH.equals(quote)) { + if (s.endsWith(SLASH_DOLLAR)) { + return s.substring(qL, sL - qL); + } + else { + return s.substring(qL); + } + } + if (sL >= qL * 2 && s.endsWith(quote)) { return s.substring(qL, sL - qL); } - return s; + else { + return s.substring(qL); + } } public static String addQuotes(String s, boolean forGString) { @@ -335,16 +348,99 @@ public class GrStringUtil { if (text.startsWith(TRIPLE_DOUBLE_QUOTES)) return TRIPLE_DOUBLE_QUOTES; if (text.startsWith(DOUBLE_QUOTES)) return DOUBLE_QUOTES; if (text.startsWith(SLASH)) return SLASH; + if (text.startsWith(DOLLAR_SLASH)) return DOLLAR_SLASH; return ""; } + public static boolean parseRegexCharacters(@NotNull String chars, + @NotNull StringBuilder outChars, + @Nullable int[] sourceOffsets, + boolean escapeSlash) { + assert sourceOffsets == null || sourceOffsets.length == chars.length() + 1; + if (chars.indexOf('\\') < 0) { + outChars.append(chars); + if (sourceOffsets != null) { + for (int i = 0; i < sourceOffsets.length; i++) { + sourceOffsets[i] = i; + } + } + return true; + } + + int index = 0; + final int outOffset = outChars.length(); + while (index < chars.length()) { + char c = chars.charAt(index++); + if (sourceOffsets != null) { + sourceOffsets[outChars.length() - outOffset] = index - 1; + sourceOffsets[outChars.length() + 1 - outOffset] = index; + } + if (c != '\\') { + outChars.append(c); + continue; + } + if (index == chars.length()) { + outChars.append('\\'); + return true; + } + c = chars.charAt(index++); + switch (c) { + case '/': + if (escapeSlash) { + outChars.append(c); + if (sourceOffsets != null) { + sourceOffsets[outChars.length() - outOffset] = index; + } + } + else { + outChars.append('\\').append('/'); + } + + break; + case '\n': + //do nothing + if (sourceOffsets != null) { + sourceOffsets[outChars.length() - outOffset] = index; + } + break; + case 'u': + // uuuuu1234 is valid too + while (index != chars.length() && chars.charAt(index) == 'u') { + index++; + } + if (index + 4 <= chars.length()) { + try { + int code = Integer.parseInt(chars.substring(index, index + 4), 16); + //line separators are invalid here + if (code == 0x000a || code == 0x000d) return false; + c = chars.charAt(index); + if (c == '+' || c == '-') return false; + outChars.append((char)code); + index += 4; + + if (sourceOffsets != null) { + sourceOffsets[outChars.length() - outOffset] = index; + } + } + catch (Exception e) { + return false; + } + } + else { + return false; + } + break; + default: + outChars.append('\\').append(c); + } + } + return true; + } + /** * @see com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl#parseStringCharacters(String, StringBuilder, int[]) */ - public static boolean parseStringCharacters(@NotNull String chars, - @NotNull StringBuilder outChars, - @Nullable int[] sourceOffsets, - final boolean strictBackSlash) { + public static boolean parseStringCharacters(@NotNull String chars, @NotNull StringBuilder outChars, @Nullable int[] sourceOffsets) { assert sourceOffsets == null || sourceOffsets.length == chars.length()+1; if (chars.indexOf('\\') < 0) { outChars.append(chars); @@ -371,15 +467,31 @@ public class GrStringUtil { c = chars.charAt(index++); switch (c) { case'b': + outChars.append('\b'); + break; case't': + outChars.append('\t'); + break; case'n': + outChars.append('\n'); + break; case'f': + outChars.append('\f'); + break; case'r': + outChars.append('\r'); + break; case'"': + outChars.append('\"'); + break; case'\'': + outChars.append('\''); + break; case'$': + outChars.append('$'); + break; case'\\': - outChars.append(c); + outChars.append('\\'); break; case '\n': //do nothing @@ -442,9 +554,6 @@ public class GrStringUtil { } break; default: - if (!strictBackSlash) { - break; - } return false; } if (sourceOffsets != null) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyCopyPasteTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyCopyPasteTest.groovy index 068f9efe47d3..f03bbc966f1b 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyCopyPasteTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyCopyPasteTest.groovy @@ -54,7 +54,7 @@ class GroovyCopyPasteTest extends LightCodeInsightFixtureTestCase { } public void testEscapeSlashesInRegexFromRegex() { - doTest 'a.groovy', 'def x = /a\\/b/', 'def x = /smth/', 'def x = /smtha\\/b/' + doTest 'a.groovy', 'def x = / a\\/b/', 'def x = /smth/', 'def x = /smtha\\/b/' } void testDontEscapeSymbolsInRegex(){ @@ -100,4 +100,8 @@ second """''' } + void testPasteInGStringContent() { + doTest 'a.groovy', 'def a = 5\\6', 'def x = " "', 'def x = "5\\\\6 "' + } + } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/StringValueTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/StringValueTest.groovy new file mode 100644 index 000000000000..c6a6fda6911a --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/StringValueTest.groovy @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang + +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import org.jetbrains.annotations.Nullable +import org.jetbrains.plugins.groovy.lang.psi.GroovyFile +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral +import org.jetbrains.plugins.groovy.util.TestUtils + +/** + * @author Max Medvedev + */ +class StringValueTest extends LightCodeInsightFixtureTestCase { + @Override + protected String getBasePath() { + "${TestUtils.testDataPath}stringValues/" + } + + private void doTest(@Nullable String expected) { + def file = myFixture.configureByFile("${getTestName(false)}.groovy") as GroovyFile + def literal = file.statements[0] as GrLiteral + assertEquals expected, literal.value + } + + void testString0() { + doTest("fo\nabc \r \u1234 \" \' \" ") + } + + void testString1() { + doTest(null) + } + + void testString2() { + doTest(null) + } + + void testString3() { + doTest("fooabc") + } + + void testGString() { + doTest("abc \' \" ") + } + + void testSlashString() { + doTest("abc \\a \\n / abc \u1234 \$ \\\$ ") + } + + void _testDollarSlashString() { + doTest("/abc \\n \\o \u1234 abc \$ / \\\$ /") + } +} diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy index 4c690a76221a..7a3d0255e208 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy @@ -151,7 +151,14 @@ public class ExpressionsParsingTest extends GroovyParsingTestCase { public void testregex$regex12() throws Throwable { doTest(); } public void testregex$regex13() throws Throwable { doTest(); } public void testregex$regex14() throws Throwable { doTest(); } + public void testregex$regex15() throws Throwable { doTest(); } + public void testregex$regex16() throws Throwable { doTest(); } + public void testregex$regex17() throws Throwable { doTest(); } + public void testregex$regex18() throws Throwable { doTest(); } + public void testregex$regex19() throws Throwable { doTest(); } public void testregex$regex2() throws Throwable { doTest(); } + public void testregex$regex20() throws Throwable { doTest(); } + public void testregex$regex21() throws Throwable { doTest(); } public void testregex$regex3() throws Throwable { doTest(); } public void testregex$regex33() throws Throwable { doTest(); } public void testregex$regex4() throws Throwable { doTest(); } diff --git a/plugins/groovy/testdata/highlighting/IncorrectEscaping.groovy b/plugins/groovy/testdata/highlighting/IncorrectEscaping.groovy index 98534f3b05c0..e31518de0622 100644 --- a/plugins/groovy/testdata/highlighting/IncorrectEscaping.groovy +++ b/plugins/groovy/testdata/highlighting/IncorrectEscaping.groovy @@ -1,15 +1,18 @@ print '\n' print '\y' ptint "\n\a\t" -print "\n\a${x}\t" +print "\n\a${x}\t" print "\n${x}\t" print "\n${x}\" print "\n\" print '''\n''' print '''\y''' -print """\n\a${x}\t""" -ptint """""\n\a\t""" +print """\n\a${x}\t""" +ptint """""\n\a\t""" print """\n${x}\t""" print "dfg\$fg" print 'fg\$fg' -print """\n${x}\""" \ No newline at end of file +print (/abc\n\r\y\o \u12 /) +print (/abc\n\r\y\o \u1234 /) +print """\n${x}\""" + \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/gstring/gravy-1653-2.test b/plugins/groovy/testdata/parsing/groovy/expressions/gstring/gravy-1653-2.test index b727888b23e8..85e7c6f483ee 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/gstring/gravy-1653-2.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/gstring/gravy-1653-2.test @@ -2,7 +2,11 @@ ----- Groovy script Compound regular expression - PsiElement(regex begin)('/aaaa $') - Reference expression - PsiElement(identifier)('str') - PsiElement(regex end)('... bbb/') \ No newline at end of file + PsiElement(regex begin)('/') + PsiElement(regex content)('aaaa ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('str') + PsiElement(regex content)('... bbb') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509err.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509err.test index 5f8b1ddaebe7..7b874d92e5c0 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509err.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509err.test @@ -2,6 +2,7 @@ ----- Groovy script Compound regular expression - PsiElement(regex begin)('/$1\/') - PsiErrorElement:Identifier or code block expected + PsiElement(regex begin)('/') + PsiElement(regex content)('$1\/') + PsiErrorElement:Regex ending expected \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509norm.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509norm.test index cb63af846253..d6b54d6c0608 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509norm.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509norm.test @@ -2,5 +2,6 @@ ----- Groovy script Compound regular expression - PsiElement(regex begin)('/$1\/') + PsiElement(regex begin)('/') + PsiElement(regex content)('$1\/') PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509test.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509test.test index 915a432fc23b..3a0ad173a4ed 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509test.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/GRVY-1509test.test @@ -1,5 +1,7 @@ /\// ----- Groovy script - Literal - PsiElement(regexp)('/\//') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('\/') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/chen.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/chen.test index 3cef703064a7..3cc5730c0b8c 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/chen.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/chen.test @@ -17,8 +17,10 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=~)('=~') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/[;\/\?:@&=\+\$,%-\.]/') + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('[;\/\?:@&=\+\$,%-\.]') + PsiElement(regex end)('/') PsiElement())(')') PsiElement(.)('.') PsiElement(identifier)('replaceAll') @@ -26,7 +28,4 @@ Groovy script PsiElement(()('(') Literal PsiElement(string)('''') - PsiElement())(')') - - - + PsiElement())(')') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy.test index fecd75d9b87e..39d6d43627e7 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy.test @@ -19,18 +19,21 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('$/\n Hello $') - Reference expression - PsiElement(identifier)('name') - PsiElement(regex content)(',\n today we're $') - Closable block - PsiElement({)('{') - Parameter list - + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('\n Hello ') + GString injection + PsiElement($)('$') Reference expression - PsiElement(identifier)('date') - PsiElement(})('}') - PsiElement(regex content)('\n $ dollar-sign\n $$ dollar-sign\n \ backslash\n / slash\n $') - Reference expression - PsiElement(identifier)('/') - PsiElement(regex end)(' slash\n/$') \ No newline at end of file + PsiElement(identifier)('name') + PsiElement($/ regex content)(',\n today we're ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Reference expression + PsiElement(identifier)('date') + PsiElement(})('}') + PsiElement($/ regex content)('\n $ dollar-sign\n $$ dollar-sign\n \ backslash\n / slash\n $/ slash\n') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy2.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy2.test index a6011f827370..0817ef573032 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy2.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy2.test @@ -18,18 +18,21 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('$/\n Hello $') - Reference expression - PsiElement(identifier)('name') - PsiElement(regex content)(',\n today we're $') - Closable block - PsiElement({)('{') - Parameter list - + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('\n Hello ') + GString injection + PsiElement($)('$') Reference expression - PsiElement(identifier)('date') - PsiElement(})('}') - PsiElement(regex content)('\n $ dollar-sign\n $$ dollar-sign\n \ backslash\n / slash\n $') - Reference expression - PsiElement(identifier)('/') - PsiElement(regex end)(' slash/$') \ No newline at end of file + PsiElement(identifier)('name') + PsiElement($/ regex content)(',\n today we're ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Reference expression + PsiElement(identifier)('date') + PsiElement(})('}') + PsiElement($/ regex content)('\n $ dollar-sign\n $$ dollar-sign\n \ backslash\n / slash\n $/ slash') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy3.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy3.test index db2da4311545..12a6ccd595cf 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy3.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy3.test @@ -10,5 +10,6 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('$//$') \ No newline at end of file + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy4.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy4.test index e97bae1b9c09..f7cb6fac643e 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy4.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashy4.test @@ -10,5 +10,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('$/$/$') \ No newline at end of file + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('$') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyCode.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyCode.test index 2a70e35f0318..444051f22054 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyCode.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyCode.test @@ -17,7 +17,11 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('$/\n def normal = '\b\t\n\r'\n def slashy = /\b\t\n\r/\n assert '$') - Reference expression - PsiElement(identifier)('alphabet') - PsiElement(regex end)(''.size() == 26\n assert normal.size() == 4\n assert slashy.size() == 8\n/$') \ No newline at end of file + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('\n def normal = '\b\t\n\r'\n def slashy = /\b\t\n\r/\n assert '') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('alphabet') + PsiElement($/ regex content)(''.size() == 26\n assert normal.size() == 4\n assert slashy.size() == 8\n') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyCodeUnfinished.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyCodeUnfinished.test index fd44ee124f6f..5ad34de115f5 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyCodeUnfinished.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyCodeUnfinished.test @@ -15,87 +15,13 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Multiplicative expression - Reference expression - PsiElement(identifier)('$') - PsiElement(/)('/') - PsiElement(new line)('\n ') - PsiErrorElement:Expression expected - - PsiErrorElement:';' or new line expected - PsiElement(def)('def') - PsiWhiteSpace(' ') - PsiElement(identifier)('normal') - PsiWhiteSpace(' ') - PsiElement(=)('=') - PsiWhiteSpace(' ') - PsiElement(string)(''\b\t\n\r'') - PsiElement(new line)('\n ') - Variable definitions - Modifiers - PsiElement(def)('def') - PsiWhiteSpace(' ') - Variable - PsiElement(identifier)('slashy') - PsiWhiteSpace(' ') - PsiElement(=)('=') - PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/\b\t\n\r/') - PsiElement(new line)('\n ') - ASSERT statement - PsiElement(assert)('assert') - PsiWhiteSpace(' ') - Relational expression - Method call - Reference expression - Literal - PsiElement(string)(''$alphabet'') - PsiElement(.)('.') - PsiElement(identifier)('size') - Arguments - PsiElement(()('(') - PsiElement())(')') - PsiWhiteSpace(' ') - PsiElement(==)('==') - PsiWhiteSpace(' ') - Literal - PsiElement(Integer)('26') - PsiElement(new line)('\n ') - ASSERT statement - PsiElement(assert)('assert') - PsiWhiteSpace(' ') - Relational expression - Method call - Reference expression + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('\n def normal = '\b\t\n\r'\n def slashy = /\b\t\n\r/\n assert '') + GString injection + PsiElement($)('$') Reference expression - PsiElement(identifier)('normal') - PsiElement(.)('.') - PsiElement(identifier)('size') - Arguments - PsiElement(()('(') - PsiElement())(')') - PsiWhiteSpace(' ') - PsiElement(==)('==') - PsiWhiteSpace(' ') - Literal - PsiElement(Integer)('4') - PsiElement(new line)('\n ') - ASSERT statement - PsiElement(assert)('assert') - PsiWhiteSpace(' ') - Relational expression - Method call - Reference expression - Reference expression - PsiElement(identifier)('slashy') - PsiElement(.)('.') - PsiElement(identifier)('size') - Arguments - PsiElement(()('(') - PsiElement())(')') - PsiWhiteSpace(' ') - PsiElement(==)('==') - PsiWhiteSpace(' ') - Literal - PsiElement(Integer)('8') \ No newline at end of file + PsiElement(identifier)('alphabet') + PsiElement($/ regex content)(''.size() == 26\n assert normal.size() == 4\n assert slashy.size() == 8') + PsiErrorElement:Dollar slash ending expected + \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyDouble.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyDouble.test index 674e51e546c4..80f108554eae 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyDouble.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyDouble.test @@ -11,20 +11,30 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('$/ $') - Closable block - PsiElement({)('{') - Parameter list - - Literal - PsiElement(regexp)('$/ a /$') - PsiElement(})('}') - PsiElement(regex content)(' $') - Closable block - PsiElement({)('{') - Parameter list - - Literal - PsiElement(regexp)('$/ b /$') - PsiElement(})('}') - PsiElement(regex end)(' /$') \ No newline at end of file + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)(' ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)(' a ') + PsiElement($/ regex end)('/$') + PsiElement(})('}') + PsiElement($/ regex content)(' ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)(' b ') + PsiElement($/ regex end)('/$') + PsiElement(})('}') + PsiElement($/ regex content)(' ') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyEof.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyEof.test index 1c1f0deaec25..7072ddd6d88f 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyEof.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyEof.test @@ -10,9 +10,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Multiplicative expression - Reference expression - PsiElement(identifier)('$') - PsiElement(/)('/') - PsiErrorElement:Expression expected + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiErrorElement:Dollar slash ending expected \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegex.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegex.test index 23e0617e5392..5a834f89e701 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegex.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegex.test @@ -16,5 +16,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('$/(?x) # enable whitespace and comments\n((?:19|20)\d\d) # year (group 1) (non-capture alternation for century)\n[- /.] # seperator\n(0[1-9]|1[012]) # month (group 2)\n[- /.] # seperator\n(0[1-9]|[12][0-9]|3[01]) # day (group 3)\n/$') \ No newline at end of file + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('(?x) # enable whitespace and comments\n((?:19|20)\d\d) # year (group 1) (non-capture alternation for century)\n[- /.] # seperator\n(0[1-9]|1[012]) # month (group 2)\n[- /.] # seperator\n(0[1-9]|[12][0-9]|3[01]) # day (group 3)\n') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegexFinishedTwice.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegexFinishedTwice.test index 1878936bcffc..6a8f88ba3bf5 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegexFinishedTwice.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegexFinishedTwice.test @@ -17,8 +17,10 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Multiplicative expression - Literal - PsiElement(regexp)('$/(?x) # enable whitespace and comments\n((?:19|20)\d\d) # year (group 1) (non-capture alternation for century)\n[- /.] # seperator\n(0[1-9]|1[012]) # month (group 2)\n[- /.] # seperator\n(0[1-9]|[12][0-9]|3[01]) # day (group 3)\n/$') + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('(?x) # enable whitespace and comments\n((?:19|20)\d\d) # year (group 1) (non-capture alternation for century)\n[- /.] # seperator\n(0[1-9]|1[012]) # month (group 2)\n[- /.] # seperator\n(0[1-9]|[12][0-9]|3[01]) # day (group 3)\n') + PsiElement($/ regex end)('/$') PsiElement(/)('/') Reference expression PsiElement(identifier)('$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegexUnfinished.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegexUnfinished.test index 0a519ac56937..8d2d8bf42086 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegexUnfinished.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyRegexUnfinished.test @@ -15,144 +15,8 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Conditional expression - Multiplicative expression - Reference expression - PsiElement(identifier)('$') - PsiElement(/)('/') - Parenthesized expression - PsiElement(()('(') - PsiErrorElement:Expression expected - - PsiElement(?)('?') - Reference expression - PsiElement(identifier)('x') - PsiErrorElement:':' expected - - PsiErrorElement:';' or new line expected - PsiElement())(')') - PsiWhiteSpace(' ') - PsiElement(wrong token)('#') - PsiWhiteSpace(' ') - PsiElement(identifier)('enable') - PsiWhiteSpace(' ') - PsiElement(identifier)('whitespace') - PsiWhiteSpace(' ') - PsiElement(identifier)('and') - PsiWhiteSpace(' ') - PsiElement(identifier)('comments') - PsiElement(new line)('\n') - Parenthesized expression - PsiElement(()('(') - Elvis expression - Parenthesized expression - PsiElement(()('(') - PsiErrorElement:Expression expected - - PsiElement(?:)('?:') - Bitwise expression - Literal - PsiElement(Integer)('19') - PsiElement(|)('|') - Literal - PsiElement(Integer)('20') - PsiElement())(')') - PsiErrorElement:';' or new line expected - PsiElement(wrong token)('\') - PsiElement(identifier)('d') - PsiElement(wrong token)('\') - PsiElement(identifier)('d') - PsiElement())(')') - PsiWhiteSpace(' ') - PsiElement(wrong token)('#') - PsiWhiteSpace(' ') - PsiElement(identifier)('year') - PsiWhiteSpace(' ') - PsiElement(()('(') - PsiElement(identifier)('group') - PsiWhiteSpace(' ') - PsiElement(Integer)('1') - PsiElement())(')') - PsiWhiteSpace(' ') - PsiElement(()('(') - PsiElement(identifier)('non') - PsiElement(-)('-') - PsiElement(identifier)('capture') - PsiWhiteSpace(' ') - PsiElement(identifier)('alternation') - PsiWhiteSpace(' ') - PsiElement(for)('for') - PsiWhiteSpace(' ') - PsiElement(identifier)('century') - PsiElement())(')') - PsiElement(new line)('\n') - Generalized list - PsiElement([)('[') - Unary expression - PsiElement(-)('-') - PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/.] # seperator\n(0[1-9]|1[012]) # month (group 2)\n[- /') - PsiElement(.)('.') - PsiErrorElement:Property selector expected - - PsiElement(])(']') - PsiWhiteSpace(' ') - PsiErrorElement:';' or new line expected - PsiElement(wrong token)('#') - PsiWhiteSpace(' ') - PsiElement(identifier)('seperator') - PsiElement(new line)('\n') - Parenthesized expression - PsiElement(()('(') - Bitwise expression - Bitwise expression - Property by index - Literal - PsiElement(Integer)('0') - Arguments - PsiElement([)('[') - Additive expression - Literal - PsiElement(Integer)('1') - PsiElement(-)('-') - Literal - PsiElement(Integer)('9') - PsiElement(])(']') - PsiElement(|)('|') - Property by index - Generalized list - PsiElement([)('[') - Literal - PsiElement(Integer)('12') - PsiElement(])(']') - Arguments - PsiElement([)('[') - Additive expression - Literal - PsiElement(Integer)('0') - PsiElement(-)('-') - Literal - PsiElement(Integer)('9') - PsiElement(])(']') - PsiElement(|)('|') - Property by index - Literal - PsiElement(Integer)('3') - Arguments - PsiElement([)('[') - Literal - PsiElement(Integer)('01') - PsiElement(])(']') - PsiElement())(')') - PsiWhiteSpace(' ') - PsiErrorElement:';' or new line expected - PsiElement(wrong token)('#') - PsiWhiteSpace(' ') - PsiElement(identifier)('day') - PsiWhiteSpace(' ') - PsiElement(()('(') - PsiElement(identifier)('group') - PsiWhiteSpace(' ') - PsiElement(Integer)('3') - PsiElement())(')') \ No newline at end of file + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('(?x) # enable whitespace and comments\n((?:19|20)\d\d) # year (group 1) (non-capture alternation for century)\n[- /.] # seperator\n(0[1-9]|1[012]) # month (group 2)\n[- /.] # seperator\n(0[1-9]|[12][0-9]|3[01]) # day (group 3)') + PsiErrorElement:Dollar slash ending expected + \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyTriple.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyTriple.test index acdd12279afe..fe1987b08030 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyTriple.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyTriple.test @@ -11,31 +11,47 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('$/ $') - Closable block - PsiElement({)('{') - Parameter list - - Literal - PsiElement(regexp)('$/ a /$') - PsiElement(})('}') - PsiElement(regex content)(' $') - Closable block - PsiElement({)('{') - Parameter list - - Compound regular expression - PsiElement(regex begin)('$/ $') - Reference expression - PsiElement(identifier)('b') - PsiElement(regex content)(' $') - Closable block - PsiElement({)('{') - Parameter list - - Literal - PsiElement(regexp)('$/ c /$') - PsiElement(})('}') - PsiElement(regex end)(' /$') - PsiElement(})('}') - PsiElement(regex end)(' /$') \ No newline at end of file + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)(' ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)(' a ') + PsiElement($/ regex end)('/$') + PsiElement(})('}') + PsiElement($/ regex content)(' ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)(' ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('b') + PsiElement($/ regex content)(' ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)(' c ') + PsiElement($/ regex end)('/$') + PsiElement(})('}') + PsiElement($/ regex content)(' ') + PsiElement($/ regex end)('/$') + PsiElement(})('}') + PsiElement($/ regex content)(' ') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyUnfinished.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyUnfinished.test index dcd5eb9aa36e..c31a966bd066 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyUnfinished.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyUnfinished.test @@ -18,66 +18,23 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Multiplicative expression - Reference expression - PsiElement(identifier)('$') - PsiElement(/)('/') - PsiElement(new line)('\n ') - Reference expression - PsiElement(identifier)('Hello') - PsiWhiteSpace(' ') - PsiErrorElement:';' or new line expected - PsiElement(identifier)('$name') - PsiElement(,)(',') - PsiElement(new line)('\n ') - Reference expression - Call expression - Reference expression - PsiElement(identifier)('today') - PsiWhiteSpace(' ') - Command arguments - Reference expression - PsiElement(identifier)('we') - PsiElement(string)(''re ${date}') - PsiElement(new line)('\n ') - Call expression - Reference expression - PsiElement(identifier)('$') - PsiWhiteSpace(' ') - Command arguments - Additive expression - Reference expression - PsiElement(identifier)('dollar') - PsiElement(-)('-') - Reference expression - PsiElement(identifier)('sign') - PsiElement(new line)('\n ') - Call expression - Reference expression - PsiElement(identifier)('$$') - PsiWhiteSpace(' ') - Command arguments - Additive expression - Reference expression - PsiElement(identifier)('dollar') - PsiElement(-)('-') - Reference expression - PsiElement(identifier)('sign') - PsiElement(new line)('\n ') - PsiErrorElement:';' or new line expected - PsiElement(wrong token)('\') - PsiWhiteSpace(' ') - PsiElement(identifier)('backslash') - PsiElement(new line)('\n ') - Call expression - Reference expression - PsiElement(regexp)('/ slash\n $/') - PsiWhiteSpace(' ') - Command arguments - Reference expression - PsiElement(identifier)('slash') - PsiElement(new line)('\n') - Literal - PsiElement(wrong regex)('/') - PsiErrorElement:Wrong string literal - \ No newline at end of file + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('\n Hello ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('name') + PsiElement($/ regex content)(',\n today we're ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Reference expression + PsiElement(identifier)('date') + PsiElement(})('}') + PsiElement($/ regex content)('\n $ dollar-sign\n $$ dollar-sign\n \ backslash\n / slash\n $/ slash\n/') + PsiErrorElement:Dollar slash ending expected + \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyWindowsPaths.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyWindowsPaths.test index 7fbfb78d5038..ab217d4f1895 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyWindowsPaths.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyWindowsPaths.test @@ -10,5 +10,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('$/C:\temp\/$') \ No newline at end of file + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('C:\temp\') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyXml.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyXml.test index dfcbf94ac9c9..5d058c24d103 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyXml.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/dollarSlashyXml.test @@ -15,7 +15,11 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('$/\n \n $') - Reference expression - PsiElement(identifier)('tic') - PsiElement(regex end)('\tac\n \n/$') \ No newline at end of file + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('\n \n ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('tic') + PsiElement($/ regex content)('\tac\n \n') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/multiLineSlashy.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/multiLineSlashy.test index ee6b2583ba11..334e67225f59 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/multiLineSlashy.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/multiLineSlashy.test @@ -14,5 +14,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/\nto be\nor\nnot to be\n/') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('\nto be\nor\nnot to be\n') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex1.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex1.test index 7d8d23d3940c..116f56020dd5 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex1.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex1.test @@ -7,5 +7,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/abc/') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('abc') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex10.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex10.test index 8a7d6c61c3fb..f0989133fb9d 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex10.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex10.test @@ -8,37 +8,47 @@ Groovy script PsiElement(==~)('==~') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('/abc \${do "def $') - Closable block - PsiElement({)('{') - Parameter list - - Additive expression - Reference expression - PsiElement(identifier)('a') - PsiElement(+)('+') - Reference expression - PsiElement(identifier)('b') - PsiElement(})('}') - PsiElement(regex content)('} fgh$') - Reference expression - PsiElement(identifier)('st') - PsiElement(regex content)(' $') - Closable block - PsiElement({)('{') - Parameter list - - Method call - Property selection + PsiElement(regex begin)('/') + PsiElement(regex content)('abc \${do "def ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Additive expression Reference expression - PsiElement(identifier)('frg') - PsiElement(.)('.') - Compound regular expression - PsiElement(regexp)('/sdf/') - Arguments - PsiElement(()('(') - Literal - PsiElement(Integer)('5') - PsiElement())(')') - PsiElement(})('}') - PsiElement(regex end)(' /') \ No newline at end of file + PsiElement(identifier)('a') + PsiElement(+)('+') + Reference expression + PsiElement(identifier)('b') + PsiElement(})('}') + PsiElement(regex content)('} fgh') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('st') + PsiElement(regex content)(' ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Method call + Property selection + Reference expression + PsiElement(identifier)('frg') + PsiElement(.)('.') + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('sdf') + PsiElement(regex end)('/') + Arguments + PsiElement(()('(') + Literal + PsiElement(Integer)('5') + PsiElement())(')') + PsiElement(})('}') + PsiElement(regex content)(' ') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex11.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex11.test index d2c8c995ff13..f6ea6556eb3a 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex11.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex11.test @@ -7,8 +7,10 @@ Groovy script Reference expression PsiElement(identifier)('i') PsiElement(=)('=') - Literal - PsiElement(regexp)('/ab \\ncd/') + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('ab \\ncd') + PsiElement(regex end)('/') PsiElement(new line)('\n') Assignment expression Reference expression diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex12.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex12.test index bc178a37ca73..205264d123e2 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex12.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex12.test @@ -2,5 +2,7 @@ ----- Groovy script PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/abc/') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('abc') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex14.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex14.test index 0fdcd32e44ff..46b67f7a2f37 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex14.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex14.test @@ -11,13 +11,19 @@ Groovy script PsiElement(()('(') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('/asd $') - Closable block - PsiElement({)('{') - Parameter list - - Literal - PsiElement(regexp)('/bugaga/') - PsiElement(})('}') - PsiElement(regex end)(' asd/') + PsiElement(regex begin)('/') + PsiElement(regex content)('asd ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('bugaga') + PsiElement(regex end)('/') + PsiElement(})('}') + PsiElement(regex content)(' asd') + PsiElement(regex end)('/') PsiElement())(')') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex15.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex15.test new file mode 100644 index 000000000000..8ff76918f76d --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex15.test @@ -0,0 +1,7 @@ +/$/ +----- +Groovy script + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('$') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex16.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex16.test new file mode 100644 index 000000000000..1437c0ef8bb3 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex16.test @@ -0,0 +1,8 @@ +/$ +----- +Groovy script + Compound regular expression + PsiElement(regex begin)('/') + PsiElement($)('$') + PsiErrorElement:Regex ending expected + \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex17.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex17.test new file mode 100644 index 000000000000..fc5d4d5cb3cf --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex17.test @@ -0,0 +1,7 @@ +/sgfdhj$5dhfg/ +----- +Groovy script + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('sgfdhj$5dhfg') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex18.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex18.test new file mode 100644 index 000000000000..0eac54134bb3 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex18.test @@ -0,0 +1,7 @@ +/gsdfjk$ gsdkf$ $/ +----- +Groovy script + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('gsdfjk$ gsdkf$ $') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex19.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex19.test new file mode 100644 index 000000000000..a26b41d37354 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex19.test @@ -0,0 +1,22 @@ +/$${5}$$$$ref$$$/ +----- +Groovy script + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('$') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Literal + PsiElement(Integer)('5') + PsiElement(})('}') + PsiElement(regex content)('$$$') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('ref') + PsiElement(regex content)('$$$') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex2.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex2.test index 8d5f796d96bb..3a49c08f1b8c 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex2.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex2.test @@ -30,5 +30,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/abc/') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('abc') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex20.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex20.test new file mode 100644 index 000000000000..8a3cb97f8480 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex20.test @@ -0,0 +1,14 @@ +print (/a\${2}/) +----- +Groovy script + Method call + Reference expression + PsiElement(identifier)('print') + PsiWhiteSpace(' ') + Arguments + PsiElement(()('(') + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('a\${2}') + PsiElement(regex end)('/') + PsiElement())(')') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex21.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex21.test new file mode 100644 index 000000000000..5dd23aee9910 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex21.test @@ -0,0 +1,7 @@ +$/abc/$ +----- +Groovy script + Compound regular expression + PsiElement($/ regex begin)('$/') + PsiElement($/ regex content)('abc') + PsiElement($/ regex end)('/$') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex3.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex3.test index add0dc2f648d..3bc0a6154976 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex3.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex3.test @@ -1,5 +1,7 @@ /abc/ ----- Groovy script - Literal - PsiElement(regexp)('/abc/') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('abc') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex33.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex33.test index 44d9dad068e2..cc69a5399931 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex33.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex33.test @@ -8,5 +8,6 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('/abs$$$') + PsiElement(regex begin)('/') + PsiElement(regex content)('abs$$$') PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex4.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex4.test index 3983827f38cc..d78e463629cf 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex4.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex4.test @@ -3,8 +3,10 @@ ----- Groovy script Call expression - Reference expression - PsiElement(regexp)('/asd\n/') + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('asd\n') + PsiElement(regex end)('/') Command arguments Reference expression PsiElement(identifier)('abcdef') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex5.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex5.test index 3cfbdac23d14..de6bbd6bf311 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex5.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex5.test @@ -13,5 +13,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=~)('=~') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/o(b.*r)f/') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('o(b.*r)f') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex6.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex6.test index 7bad40ffa5f6..b25028ce0a1f 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex6.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex6.test @@ -13,5 +13,7 @@ Groovy script PsiWhiteSpace(' ') PsiElement(=~)('=~') PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/\$(.*)\./') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('\$(.*)\.') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex7.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex7.test index 23e738821dcb..9141d84e29d2 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex7.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex7.test @@ -7,15 +7,19 @@ Groovy script PsiElement(identifier)('a') PsiElement(.)('.') Compound regular expression - PsiElement(regex begin)('/foo$') - Closable block - PsiElement({)('{') - Parameter list - - Reference expression - PsiElement(identifier)('st') - PsiElement(})('}') - PsiElement(regex end)('d/') + PsiElement(regex begin)('/') + PsiElement(regex content)('foo') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Reference expression + PsiElement(identifier)('st') + PsiElement(})('}') + PsiElement(regex content)('d') + PsiElement(regex end)('/') Arguments PsiElement(()('(') Literal diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex8.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex8.test index f0bb6a5112b8..2f289315bb04 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex8.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex8.test @@ -8,53 +8,63 @@ Groovy script PsiElement(==~)('==~') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('/abc $') - Closable block - PsiElement({)('{') - Parameter list - - Call expression - Reference expression - PsiElement(identifier)('doo') - PsiWhiteSpace(' ') - Command arguments - Compound Gstring - PsiElement(Gstring begin)('"') - PsiElement(Gstring content)('def ') - GString injection - PsiElement($)('$') - Closable block - PsiElement({)('{') - Parameter list - - Additive expression - Reference expression - PsiElement(identifier)('a') - PsiElement(+)('+') - Reference expression - PsiElement(identifier)('b') - PsiElement(})('}') - PsiElement(Gstring end)('"') - PsiElement(})('}') - PsiElement(regex content)(' fgh$') - Reference expression - PsiElement(identifier)('st') - PsiElement(regex content)(' $') - Closable block - PsiElement({)('{') - Parameter list - - Method call - Property selection + PsiElement(regex begin)('/') + PsiElement(regex content)('abc ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Call expression Reference expression - PsiElement(identifier)('frg') - PsiElement(.)('.') - Compound regular expression - PsiElement(regexp)('/sdf/') - Arguments - PsiElement(()('(') - Literal - PsiElement(Integer)('5') - PsiElement())(')') - PsiElement(})('}') - PsiElement(regex end)(' /') \ No newline at end of file + PsiElement(identifier)('doo') + PsiWhiteSpace(' ') + Command arguments + Compound Gstring + PsiElement(Gstring begin)('"') + PsiElement(Gstring content)('def ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Additive expression + Reference expression + PsiElement(identifier)('a') + PsiElement(+)('+') + Reference expression + PsiElement(identifier)('b') + PsiElement(})('}') + PsiElement(Gstring end)('"') + PsiElement(})('}') + PsiElement(regex content)(' fgh') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('st') + PsiElement(regex content)(' ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Method call + Property selection + Reference expression + PsiElement(identifier)('frg') + PsiElement(.)('.') + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('sdf') + PsiElement(regex end)('/') + Arguments + PsiElement(()('(') + Literal + PsiElement(Integer)('5') + PsiElement())(')') + PsiElement(})('}') + PsiElement(regex content)(' ') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex9.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex9.test index 2129437e591e..8a222ba86109 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex9.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex9.test @@ -9,56 +9,64 @@ Groovy script PsiElement(==~)('==~') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('/abc $') - Closable block - PsiElement({)('{') - Parameter list - - Call expression - Reference expression - PsiElement(identifier)('doo') - PsiWhiteSpace(' ') - Command arguments - Compound Gstring - PsiElement(Gstring begin)('"') - PsiElement(Gstring content)('def ') - GString injection - PsiElement($)('$') - Closable block - PsiElement({)('{') - Parameter list - - Additive expression - Reference expression - PsiElement(identifier)('a') - PsiElement(+)('+') - Reference expression - PsiElement(identifier)('b') - PsiElement(})('}') - PsiElement(Gstring end)('"') - PsiElement(})('}') - PsiElement(regex content)(' fgh$') - Reference expression - PsiElement(identifier)('st') - PsiElement(regex content)(' $') - Closable block - PsiElement({)('{') - Parameter list - - Method call - Property selection + PsiElement(regex begin)('/') + PsiElement(regex content)('abc ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Call expression Reference expression - PsiElement(identifier)('frg') - PsiElement(.)('.') - Compound regular expression - PsiElement(regexp)('/sdf/') - Arguments - PsiElement(()('(') - Literal - PsiElement(Integer)('5') - PsiElement())(')') - PsiElement(})('}') - PsiErrorElement:Identifier or code block expected - - PsiErrorElement:';' or new line expected - PsiElement(wrong regex)('\ni = 5') \ No newline at end of file + PsiElement(identifier)('doo') + PsiWhiteSpace(' ') + Command arguments + Compound Gstring + PsiElement(Gstring begin)('"') + PsiElement(Gstring content)('def ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Additive expression + Reference expression + PsiElement(identifier)('a') + PsiElement(+)('+') + Reference expression + PsiElement(identifier)('b') + PsiElement(})('}') + PsiElement(Gstring end)('"') + PsiElement(})('}') + PsiElement(regex content)(' fgh') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('st') + PsiElement(regex content)(' ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Method call + Property selection + Reference expression + PsiElement(identifier)('frg') + PsiElement(.)('.') + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('sdf') + PsiElement(regex end)('/') + Arguments + PsiElement(()('(') + Literal + PsiElement(Integer)('5') + PsiElement())(')') + PsiElement(})('}') + PsiElement(regex content)('\ni = 5') + PsiErrorElement:Regex ending expected + \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex_begin.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex_begin.test index 15b277728714..9d41ab359bff 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex_begin.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex_begin.test @@ -1,5 +1,7 @@ /temp_regex/ ----- Groovy script - Literal - PsiElement(regexp)('/temp_regex/') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('temp_regex') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex_begin2.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex_begin2.test index 5d5dccf660c1..73ca75cffe71 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex_begin2.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/regex_begin2.test @@ -2,5 +2,7 @@ ----- Groovy script PsiWhiteSpace(' ') - Literal - PsiElement(regexp)('/temp_regex/') \ No newline at end of file + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('temp_regex') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king1.test b/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king1.test index 22544d21a0d3..91974aa1c956 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king1.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king1.test @@ -11,5 +11,6 @@ Groovy script PsiElement(=)('=') PsiWhiteSpace(' ') Compound regular expression - PsiElement(regex begin)('/I cost $$@$@$$') + PsiElement(regex begin)('/') + PsiElement(regex content)('I cost $$@$@$$') PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king2.test b/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king2.test index 4ecf1801ede2..daef5ab34b29 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king2.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king2.test @@ -2,7 +2,11 @@ ----- Groovy script Compound regular expression - PsiElement(regex begin)('/abcde $2 $') - Reference expression - PsiElement(identifier)('ident') - PsiElement(regex end)(' asd/') \ No newline at end of file + PsiElement(regex begin)('/') + PsiElement(regex content)('abcde $2 ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('ident') + PsiElement(regex content)(' asd') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king3.test b/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king3.test index 157f33f7d45d..221f8347bd03 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king3.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king3.test @@ -2,10 +2,16 @@ ----- Groovy script Compound regular expression - PsiElement(regex begin)('/abcde $2$$ $') - Reference expression - PsiElement(identifier)('ident') - PsiElement(regex content)(' $$ $') - Reference expression - PsiElement(identifier)('ident2') - PsiElement(regex end)(' asd/') \ No newline at end of file + PsiElement(regex begin)('/') + PsiElement(regex content)('abcde $2$$ ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('ident') + PsiElement(regex content)(' $$ ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('ident2') + PsiElement(regex content)(' asd') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king4.test b/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king4.test index af124baf92d5..bc8bad4dea76 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king4.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/king_regex/king4.test @@ -2,18 +2,28 @@ ----- Groovy script Compound regular expression - PsiElement(regex begin)('/abcde $2$$ $') - Closable block - PsiElement({)('{') - Parameter list - - Compound regular expression - PsiElement(regex begin)('/asdc $$ asdd $') - Reference expression - PsiElement(identifier)('ident3') - PsiElement(regex end)(' 123/') - PsiElement(})('}') - PsiElement(regex content)(' $$ $') - Reference expression - PsiElement(identifier)('ident2') - PsiElement(regex end)(' asd/') \ No newline at end of file + PsiElement(regex begin)('/') + PsiElement(regex content)('abcde $2$$ ') + GString injection + PsiElement($)('$') + Closable block + PsiElement({)('{') + Parameter list + + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('asdc $$ asdd ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('ident3') + PsiElement(regex content)(' 123') + PsiElement(regex end)('/') + PsiElement(})('}') + PsiElement(regex content)(' $$ ') + GString injection + PsiElement($)('$') + Reference expression + PsiElement(identifier)('ident2') + PsiElement(regex content)(' asd') + PsiElement(regex end)('/') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/switch/swit2.test b/plugins/groovy/testdata/parsing/groovy/statements/switch/swit2.test index 268ee9a9141f..e286f04dc183 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/switch/swit2.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/switch/swit2.test @@ -18,8 +18,10 @@ Groovy script PsiWhiteSpace(' ') Unary expression PsiElement(~)('~') - Literal - PsiElement(regexp)('/..../') + Compound regular expression + PsiElement(regex begin)('/') + PsiElement(regex content)('....') + PsiElement(regex end)('/') PsiWhiteSpace(' ') PsiElement(:)(':') PsiElement(new line)('\n') diff --git a/plugins/groovy/testdata/stringValues/DollarSlashString.groovy b/plugins/groovy/testdata/stringValues/DollarSlashString.groovy new file mode 100644 index 000000000000..59f4d9e0ae0d --- /dev/null +++ b/plugins/groovy/testdata/stringValues/DollarSlashString.groovy @@ -0,0 +1,2 @@ +$/abc \n \o \u1234 \ +abc $ / \$ /$ \ No newline at end of file diff --git a/plugins/groovy/testdata/stringValues/GString.groovy b/plugins/groovy/testdata/stringValues/GString.groovy new file mode 100644 index 000000000000..a00520ffb675 --- /dev/null +++ b/plugins/groovy/testdata/stringValues/GString.groovy @@ -0,0 +1 @@ +"abc ' \" " \ No newline at end of file diff --git a/plugins/groovy/testdata/stringValues/SlashString.groovy b/plugins/groovy/testdata/stringValues/SlashString.groovy new file mode 100644 index 000000000000..133f17257d29 --- /dev/null +++ b/plugins/groovy/testdata/stringValues/SlashString.groovy @@ -0,0 +1,2 @@ +/abc \a \n \/ \ + abc \u1234 $ \$ / \ No newline at end of file diff --git a/plugins/groovy/testdata/stringValues/String0.groovy b/plugins/groovy/testdata/stringValues/String0.groovy new file mode 100644 index 000000000000..c25aab16e7f5 --- /dev/null +++ b/plugins/groovy/testdata/stringValues/String0.groovy @@ -0,0 +1 @@ +'fo\nabc \r \u1234 \" \' \" ' \ No newline at end of file diff --git a/plugins/groovy/testdata/stringValues/String1.groovy b/plugins/groovy/testdata/stringValues/String1.groovy new file mode 100644 index 000000000000..5d18a9efb522 --- /dev/null +++ b/plugins/groovy/testdata/stringValues/String1.groovy @@ -0,0 +1 @@ +'fo\nabc \r \u123' \ No newline at end of file diff --git a/plugins/groovy/testdata/stringValues/String2.groovy b/plugins/groovy/testdata/stringValues/String2.groovy new file mode 100644 index 000000000000..5f9985642b89 --- /dev/null +++ b/plugins/groovy/testdata/stringValues/String2.groovy @@ -0,0 +1 @@ +'fo\nabc \i' \ No newline at end of file diff --git a/plugins/groovy/testdata/stringValues/String3.groovy b/plugins/groovy/testdata/stringValues/String3.groovy new file mode 100644 index 000000000000..e9fbbe87e144 --- /dev/null +++ b/plugins/groovy/testdata/stringValues/String3.groovy @@ -0,0 +1,2 @@ +'''foo\ +abc''' \ No newline at end of file