diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessGenerator.java b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessGenerator.java index 85ec85104787..452ff3392c05 100644 --- a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessGenerator.java +++ b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessGenerator.java @@ -86,6 +86,7 @@ public class ProcessGenerator { private static final String WPI = "wpi"; private static final String FACTORY = "factory"; private static final String CORRELATIONS = "correlations"; + private static final String PROCESS_METHOD_NAME = "process"; private final String packageName; private final KogitoWorkflowProcess process; @@ -289,13 +290,20 @@ private MethodDeclaration createReadOnlyInstanceGenericWithWorkflowInstanceMetho return methodDeclaration; } - private MethodDeclaration process(ProcessMetaData processMetaData) { - return processMetaData.getGeneratedClassModel() - .findFirst(MethodDeclaration.class) - .orElseThrow(() -> new NoSuchElementException("Compilation unit doesn't contain a method declaration!")) - .setModifiers(Modifier.Keyword.PROTECTED) + private void addProcessMethods(ClassOrInterfaceDeclaration cls, ProcessMetaData processMetaData) { + ClassOrInterfaceDeclaration generatedClazz = processMetaData.getGeneratedClassModel() + .findFirst(ClassOrInterfaceDeclaration.class) + .orElseThrow(() -> new NoSuchElementException("Compilation unit doesn't contain a class declaration!")); + + MethodDeclaration processMethod = generatedClazz.getMethods().stream() + .filter(m -> m.getNameAsString().equals(PROCESS_METHOD_NAME)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException("Compilation unit doesn't contain a method declaration!")); + processMethod.setModifiers(Modifier.Keyword.PROTECTED) .setType(Process.class.getCanonicalName()) - .setName("process"); + .setName(PROCESS_METHOD_NAME); + + generatedClazz.getMethods().forEach(cls::addMember); } private MethodCallExpr createProcessRuntime() { @@ -480,8 +488,8 @@ public ClassOrInterfaceDeclaration classDeclaration() { .addMember(createInstanceGenericMethod(processInstanceFQCN)) .addMember(createInstanceGenericWithBusinessKeyMethod(processInstanceFQCN)) .addMember(createInstanceGenericWithWorkflowInstanceMethod(processInstanceFQCN)) - .addMember(createReadOnlyInstanceGenericWithWorkflowInstanceMethod(processInstanceFQCN)) - .addMember(process(processMetaData)); + .addMember(createReadOnlyInstanceGenericWithWorkflowInstanceMethod(processInstanceFQCN)); + addProcessMethods(cls, processMetaData); internalConfigure(processMetaData).ifPresent(cls::addMember); internalRegisterListeners(processMetaData).ifPresent(cls::addMember); diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessCodeTooLargeReproducerTest.java b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessCodeTooLargeReproducerTest.java new file mode 100644 index 000000000000..b1605a53b53d --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessCodeTooLargeReproducerTest.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.kie.kogito.codegen.process; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Collection; + +import org.drools.io.FileSystemResource; +import org.jbpm.compiler.canonical.ProcessMetaData; +import org.jbpm.compiler.canonical.ProcessToExecModelGenerator; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.kie.api.definition.process.Process; +import org.kie.api.definition.process.WorkflowProcess; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Regression test for apache/incubator-kie-issues#2229, driving the two BPMN files from the minimal + * reproducer through the real {@link ProcessCodegen#parseProcessFile(org.drools.io.Resource)} entry point. + */ +public class ProcessCodeTooLargeReproducerTest { + + private static final String REPRO_FAILS_BPMN = "/codetoolarge/repro-fails.bpmn"; + private static final String REPRO_CONTROL_PASSES_BPMN = "/codetoolarge/repro-control-passes.bpmn"; + + @Test + void reproducerAt754TasksCompilesWithoutCodeTooLarge(@TempDir Path tempDir) throws IOException, InterruptedException { + assertCompilesWithoutCodeTooLarge(REPRO_FAILS_BPMN, tempDir); + } + + @Test + void negativeControlAt753TasksStillCompiles(@TempDir Path tempDir) throws IOException, InterruptedException { + assertCompilesWithoutCodeTooLarge(REPRO_CONTROL_PASSES_BPMN, tempDir); + } + + private void assertCompilesWithoutCodeTooLarge(String resourcePath, Path tempDir) throws IOException, InterruptedException { + WorkflowProcess process = parseProcess(resourcePath); + + ProcessMetaData metadata = ProcessToExecModelGenerator.INSTANCE.generate(process); + CompilationUnit generatedClassModel = metadata.getGeneratedClassModel(); + ClassOrInterfaceDeclaration clazz = generatedClassModel.findFirst(ClassOrInterfaceDeclaration.class).orElseThrow(); + String className = clazz.getNameAsString(); + + assertThat(clazz.getMethodsByName("initNodes_0")) + .as("both reproducer files are large enough that initNodes() chunking must have fired") + .isNotEmpty(); + + File sourceFile = writeToDefaultPackageSourceFile(tempDir, className, generatedClassModel.toString()); + String javacOutput = compileWithJavac(sourceFile, tempDir); + + assertThat(javacOutput).doesNotContain("code too large"); + } + + private WorkflowProcess parseProcess(String resourcePath) throws IOException { + File file = new File(getClass().getResource(resourcePath).getFile()); + Collection processes = ProcessCodegen.parseProcessFile(new FileSystemResource(file)); + assertThat(processes).hasSize(1); + return (WorkflowProcess) processes.iterator().next(); + } + + private File writeToDefaultPackageSourceFile(Path tempDir, String className, String source) throws IOException { + String withoutPackageDeclaration = source.replaceFirst("(?m)^package .*;\\n", ""); + File sourceFile = tempDir.resolve(className + ".java").toFile(); + try (FileWriter writer = new FileWriter(sourceFile)) { + writer.write(withoutPackageDeclaration); + } + return sourceFile; + } + + private String compileWithJavac(File sourceFile, Path tempDir) throws IOException, InterruptedException { + String classpath = System.getProperty("java.class.path"); + ProcessBuilder processBuilder = new ProcessBuilder( + "javac", "-d", tempDir.toString(), "-cp", classpath, sourceFile.getAbsolutePath()); + processBuilder.redirectErrorStream(true); + java.lang.Process javac = processBuilder.start(); + String output = new String(javac.getInputStream().readAllBytes()); + javac.waitFor(); + return output; + } +} diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessGeneratorCodeSizeTest.java b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessGeneratorCodeSizeTest.java new file mode 100644 index 000000000000..0de4b349119e --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessGeneratorCodeSizeTest.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.kie.kogito.codegen.process; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; + +import org.jbpm.compiler.canonical.ProcessMetaData; +import org.jbpm.compiler.canonical.ProcessToExecModelGenerator; +import org.jbpm.ruleflow.core.RuleFlowProcessFactory; +import org.jbpm.ruleflow.core.WorkflowElementIdentifierFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.kie.api.definition.process.WorkflowElementIdentifier; +import org.kie.api.definition.process.WorkflowProcess; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Regression test for apache/incubator-kie-issues#2229: a process with enough sequential nodes must not + * generate a {@code process()} method whose bytecode exceeds the JVM's 64KB per-method limit. + */ +public class ProcessGeneratorCodeSizeTest { + + private static final int TASK_COUNT_KNOWN_TO_OVERFLOW_SINGLE_METHOD = 754; + + @Test + void largeFlatProcessCompilesWithoutCodeTooLarge(@TempDir Path tempDir) throws IOException, InterruptedException { + WorkflowProcess process = buildSequentialScriptTaskProcess(TASK_COUNT_KNOWN_TO_OVERFLOW_SINGLE_METHOD); + + ProcessMetaData metadata = ProcessToExecModelGenerator.INSTANCE.generate(process); + CompilationUnit generatedClassModel = metadata.getGeneratedClassModel(); + String className = generatedClassModel.findFirst(ClassOrInterfaceDeclaration.class) + .orElseThrow() + .getNameAsString(); + + File sourceFile = writeToDefaultPackageSourceFile(tempDir, className, generatedClassModel.toString()); + String javacOutput = compileWithJavac(sourceFile, tempDir); + + assertThat(javacOutput).doesNotContain("code too large"); + } + + private WorkflowProcess buildSequentialScriptTaskProcess(int taskCount) { + RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("codesize.big"); + factory.name("big").packageName("codesize").dynamic(false).version("1.0"); + + WorkflowElementIdentifier start = WorkflowElementIdentifierFactory.fromExternalFormat("start"); + factory.startNode(start).name("start").done(); + + WorkflowElementIdentifier previous = start; + for (int i = 0; i < taskCount; i++) { + WorkflowElementIdentifier taskId = WorkflowElementIdentifierFactory.fromExternalFormat("task" + i); + factory.actionNode(taskId).name("task" + i).action("java", "System.out.println(\"step " + i + "\");").done(); + factory.connection(previous, taskId); + previous = taskId; + } + + WorkflowElementIdentifier end = WorkflowElementIdentifierFactory.fromExternalFormat("end"); + factory.endNode(end).name("end").terminate(false).done(); + factory.connection(previous, end); + + return factory.validate().getProcess(); + } + + private File writeToDefaultPackageSourceFile(Path tempDir, String className, String source) throws IOException { + String withoutPackageDeclaration = source.replaceFirst("(?m)^package .*;\\n", ""); + File sourceFile = tempDir.resolve(className + ".java").toFile(); + try (FileWriter writer = new FileWriter(sourceFile)) { + writer.write(withoutPackageDeclaration); + } + return sourceFile; + } + + private String compileWithJavac(File sourceFile, Path tempDir) throws IOException, InterruptedException { + String classpath = System.getProperty("java.class.path"); + ProcessBuilder processBuilder = new ProcessBuilder( + "javac", "-d", tempDir.toString(), "-cp", classpath, sourceFile.getAbsolutePath()); + processBuilder.redirectErrorStream(true); + java.lang.Process javac = processBuilder.start(); + String output = new String(javac.getInputStream().readAllBytes()); + javac.waitFor(); + return output; + } +} diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessGeneratorTest.java b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessGeneratorTest.java new file mode 100644 index 000000000000..6c9e11e8772e --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessGeneratorTest.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.kie.kogito.codegen.process; + +import java.io.File; +import java.util.Collection; + +import org.drools.io.FileSystemResource; +import org.jbpm.compiler.canonical.ProcessToExecModelGenerator; +import org.junit.jupiter.api.Test; +import org.kie.api.definition.process.Process; +import org.kie.kogito.codegen.api.AddonsConfig; +import org.kie.kogito.codegen.api.context.KogitoBuildContext; +import org.kie.kogito.codegen.api.context.impl.JavaKogitoBuildContext; +import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcess; + +import com.github.javaparser.ast.Modifier; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ProcessGeneratorTest { + + private static final String TEST_PROCESS_FILE = "src/test/resources/startsignal/StartSignalEventNoPayload.bpmn2"; + + @Test + void classDeclarationExposesProcessEntryPoint() { + ClassOrInterfaceDeclaration cls = generateClassDeclaration(buildExecModelGenerator()); + + assertThat(cls.getMethodsByName("process")).hasSize(1); + MethodDeclaration processMethod = cls.getMethodsByName("process").get(0); + assertThat(processMethod.getModifiers()).containsExactly(Modifier.protectedModifier()); + assertThat(processMethod.getType().asString()).isEqualTo(Process.class.getCanonicalName()); + } + + @Test + void classDeclarationTransplantsEveryGeneratedMethodNotJustTheFirst() { + ClassOrInterfaceDeclaration cls = generateClassDeclaration(buildExecModelGenerator()); + + assertThat(cls.getMethodsByName("process")).hasSize(1); + assertThat(cls.getMethodsByName("initVariables")).hasSize(1); + assertThat(cls.getMethodsByName("initMetadata")).hasSize(1); + assertThat(cls.getMethodsByName("initNodes")).hasSize(1); + assertThat(cls.getMethodsByName("initConnections")).hasSize(1); + } + + @Test + void classDeclarationDoesNotChunkNodesForASmallProcess() { + ClassOrInterfaceDeclaration cls = generateClassDeclaration(buildExecModelGenerator()); + + assertThat(cls.getMethodsByName("initNodes")).hasSize(1); + assertThat(cls.getMethodsByName("initNodes_0")).isEmpty(); + } + + private ClassOrInterfaceDeclaration generateClassDeclaration(ProcessExecutableModelGenerator execModelGen) { + KogitoBuildContext context = buildContext(); + KogitoWorkflowProcess process = execModelGen.process(); + ProcessGenerator generator = new ProcessGenerator( + context, + process, + execModelGen, + execModelGen.className(), + new ModelClassGenerator(context, process).className(), + context.getPackageName() + ".Application"); + return generator.classDeclaration(); + } + + private ProcessExecutableModelGenerator buildExecModelGenerator() { + KogitoBuildContext context = buildContext(); + KogitoWorkflowProcess process = parseProcess(TEST_PROCESS_FILE); + return new ProcessExecutableModelGenerator(process, new ProcessToExecModelGenerator(context.getClassLoader())); + } + + private KogitoWorkflowProcess parseProcess(String fileName) { + Collection processes = ProcessCodegen.parseProcessFile(new FileSystemResource(new File(fileName))); + assertThat(processes).hasSize(1); + Process process = processes.stream().findAny().orElseThrow(); + assertThat(process).isInstanceOf(KogitoWorkflowProcess.class); + return (KogitoWorkflowProcess) process; + } + + private KogitoBuildContext buildContext() { + AddonsConfig addonsConfig = AddonsConfig.builder() + .withMonitoring(false) + .withPrometheusMonitoring(false) + .build(); + return JavaKogitoBuildContext.builder().withAddonsConfig(addonsConfig).build(); + } +} diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/codetoolarge/repro-control-passes.bpmn b/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/codetoolarge/repro-control-passes.bpmn new file mode 100644 index 000000000000..0727ae59cca2 --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/codetoolarge/repro-control-passes.bpmn @@ -0,0 +1,9820 @@ + + + + + flow_0 + + + flow_0 + flow_1 + System.out.println("step 0"); + + + flow_1 + flow_2 + System.out.println("step 1"); + + + flow_2 + flow_3 + System.out.println("step 2"); + + + flow_3 + flow_4 + System.out.println("step 3"); + + + flow_4 + flow_5 + System.out.println("step 4"); + + + flow_5 + flow_6 + System.out.println("step 5"); + + + flow_6 + flow_7 + System.out.println("step 6"); + + + flow_7 + flow_8 + System.out.println("step 7"); + + + flow_8 + flow_9 + System.out.println("step 8"); + + + flow_9 + flow_10 + System.out.println("step 9"); + + + flow_10 + flow_11 + System.out.println("step 10"); + + + flow_11 + flow_12 + System.out.println("step 11"); + + + flow_12 + flow_13 + System.out.println("step 12"); + + + flow_13 + flow_14 + System.out.println("step 13"); + + + flow_14 + flow_15 + System.out.println("step 14"); + + + flow_15 + flow_16 + System.out.println("step 15"); + + + flow_16 + flow_17 + System.out.println("step 16"); + + + flow_17 + flow_18 + System.out.println("step 17"); + + + flow_18 + flow_19 + System.out.println("step 18"); + + + flow_19 + flow_20 + System.out.println("step 19"); + + + flow_20 + flow_21 + System.out.println("step 20"); + + + flow_21 + flow_22 + System.out.println("step 21"); + + + flow_22 + flow_23 + System.out.println("step 22"); + + + flow_23 + flow_24 + System.out.println("step 23"); + + + flow_24 + flow_25 + System.out.println("step 24"); + + + flow_25 + flow_26 + System.out.println("step 25"); + + + flow_26 + flow_27 + System.out.println("step 26"); + + + flow_27 + flow_28 + System.out.println("step 27"); + + + flow_28 + flow_29 + System.out.println("step 28"); + + + flow_29 + flow_30 + System.out.println("step 29"); + + + flow_30 + flow_31 + System.out.println("step 30"); + + + flow_31 + flow_32 + System.out.println("step 31"); + + + flow_32 + flow_33 + System.out.println("step 32"); + + + flow_33 + flow_34 + System.out.println("step 33"); + + + flow_34 + flow_35 + System.out.println("step 34"); + + + flow_35 + flow_36 + System.out.println("step 35"); + + + flow_36 + flow_37 + System.out.println("step 36"); + + + flow_37 + flow_38 + System.out.println("step 37"); + + + flow_38 + flow_39 + System.out.println("step 38"); + + + flow_39 + flow_40 + System.out.println("step 39"); + + + flow_40 + flow_41 + System.out.println("step 40"); + + + flow_41 + flow_42 + System.out.println("step 41"); + + + flow_42 + flow_43 + System.out.println("step 42"); + + + flow_43 + flow_44 + System.out.println("step 43"); + + + flow_44 + flow_45 + System.out.println("step 44"); + + + flow_45 + flow_46 + System.out.println("step 45"); + + + flow_46 + flow_47 + System.out.println("step 46"); + + + flow_47 + flow_48 + System.out.println("step 47"); + + + flow_48 + flow_49 + System.out.println("step 48"); + + + flow_49 + flow_50 + System.out.println("step 49"); + + + flow_50 + flow_51 + System.out.println("step 50"); + + + flow_51 + flow_52 + System.out.println("step 51"); + + + flow_52 + flow_53 + System.out.println("step 52"); + + + flow_53 + flow_54 + System.out.println("step 53"); + + + flow_54 + flow_55 + System.out.println("step 54"); + + + flow_55 + flow_56 + System.out.println("step 55"); + + + flow_56 + flow_57 + System.out.println("step 56"); + + + flow_57 + flow_58 + System.out.println("step 57"); + + + flow_58 + flow_59 + System.out.println("step 58"); + + + flow_59 + flow_60 + System.out.println("step 59"); + + + flow_60 + flow_61 + System.out.println("step 60"); + + + flow_61 + flow_62 + System.out.println("step 61"); + + + flow_62 + flow_63 + System.out.println("step 62"); + + + flow_63 + flow_64 + System.out.println("step 63"); + + + flow_64 + flow_65 + System.out.println("step 64"); + + + flow_65 + flow_66 + System.out.println("step 65"); + + + flow_66 + flow_67 + System.out.println("step 66"); + + + flow_67 + flow_68 + System.out.println("step 67"); + + + flow_68 + flow_69 + System.out.println("step 68"); + + + flow_69 + flow_70 + System.out.println("step 69"); + + + flow_70 + flow_71 + System.out.println("step 70"); + + + flow_71 + flow_72 + System.out.println("step 71"); + + + flow_72 + flow_73 + System.out.println("step 72"); + + + flow_73 + flow_74 + System.out.println("step 73"); + + + flow_74 + flow_75 + System.out.println("step 74"); + + + flow_75 + flow_76 + System.out.println("step 75"); + + + flow_76 + flow_77 + System.out.println("step 76"); + + + flow_77 + flow_78 + System.out.println("step 77"); + + + flow_78 + flow_79 + System.out.println("step 78"); + + + flow_79 + flow_80 + System.out.println("step 79"); + + + flow_80 + flow_81 + System.out.println("step 80"); + + + flow_81 + flow_82 + System.out.println("step 81"); + + + flow_82 + flow_83 + System.out.println("step 82"); + + + flow_83 + flow_84 + System.out.println("step 83"); + + + flow_84 + flow_85 + System.out.println("step 84"); + + + flow_85 + flow_86 + System.out.println("step 85"); + + + flow_86 + flow_87 + System.out.println("step 86"); + + + flow_87 + flow_88 + System.out.println("step 87"); + + + flow_88 + flow_89 + System.out.println("step 88"); + + + flow_89 + flow_90 + System.out.println("step 89"); + + + flow_90 + flow_91 + System.out.println("step 90"); + + + flow_91 + flow_92 + System.out.println("step 91"); + + + flow_92 + flow_93 + System.out.println("step 92"); + + + flow_93 + flow_94 + System.out.println("step 93"); + + + flow_94 + flow_95 + System.out.println("step 94"); + + + flow_95 + flow_96 + System.out.println("step 95"); + + + flow_96 + flow_97 + System.out.println("step 96"); + + + flow_97 + flow_98 + System.out.println("step 97"); + + + flow_98 + flow_99 + System.out.println("step 98"); + + + flow_99 + flow_100 + System.out.println("step 99"); + + + flow_100 + flow_101 + System.out.println("step 100"); + + + flow_101 + flow_102 + System.out.println("step 101"); + + + flow_102 + flow_103 + System.out.println("step 102"); + + + flow_103 + flow_104 + System.out.println("step 103"); + + + flow_104 + flow_105 + System.out.println("step 104"); + + + flow_105 + flow_106 + System.out.println("step 105"); + + + flow_106 + flow_107 + System.out.println("step 106"); + + + flow_107 + flow_108 + System.out.println("step 107"); + + + flow_108 + flow_109 + System.out.println("step 108"); + + + flow_109 + flow_110 + System.out.println("step 109"); + + + flow_110 + flow_111 + System.out.println("step 110"); + + + flow_111 + flow_112 + System.out.println("step 111"); + + + flow_112 + flow_113 + System.out.println("step 112"); + + + flow_113 + flow_114 + System.out.println("step 113"); + + + flow_114 + flow_115 + System.out.println("step 114"); + + + flow_115 + flow_116 + System.out.println("step 115"); + + + flow_116 + flow_117 + System.out.println("step 116"); + + + flow_117 + flow_118 + System.out.println("step 117"); + + + flow_118 + flow_119 + System.out.println("step 118"); + + + flow_119 + flow_120 + System.out.println("step 119"); + + + flow_120 + flow_121 + System.out.println("step 120"); + + + flow_121 + flow_122 + System.out.println("step 121"); + + + flow_122 + flow_123 + System.out.println("step 122"); + + + flow_123 + flow_124 + System.out.println("step 123"); + + + flow_124 + flow_125 + System.out.println("step 124"); + + + flow_125 + flow_126 + System.out.println("step 125"); + + + flow_126 + flow_127 + System.out.println("step 126"); + + + flow_127 + flow_128 + System.out.println("step 127"); + + + flow_128 + flow_129 + System.out.println("step 128"); + + + flow_129 + flow_130 + System.out.println("step 129"); + + + flow_130 + flow_131 + System.out.println("step 130"); + + + flow_131 + flow_132 + System.out.println("step 131"); + + + flow_132 + flow_133 + System.out.println("step 132"); + + + flow_133 + flow_134 + System.out.println("step 133"); + + + flow_134 + flow_135 + System.out.println("step 134"); + + + flow_135 + flow_136 + System.out.println("step 135"); + + + flow_136 + flow_137 + System.out.println("step 136"); + + + flow_137 + flow_138 + System.out.println("step 137"); + + + flow_138 + flow_139 + System.out.println("step 138"); + + + flow_139 + flow_140 + System.out.println("step 139"); + + + flow_140 + flow_141 + System.out.println("step 140"); + + + flow_141 + flow_142 + System.out.println("step 141"); + + + flow_142 + flow_143 + System.out.println("step 142"); + + + flow_143 + flow_144 + System.out.println("step 143"); + + + flow_144 + flow_145 + System.out.println("step 144"); + + + flow_145 + flow_146 + System.out.println("step 145"); + + + flow_146 + flow_147 + System.out.println("step 146"); + + + flow_147 + flow_148 + System.out.println("step 147"); + + + flow_148 + flow_149 + System.out.println("step 148"); + + + flow_149 + flow_150 + System.out.println("step 149"); + + + flow_150 + flow_151 + System.out.println("step 150"); + + + flow_151 + flow_152 + System.out.println("step 151"); + + + flow_152 + flow_153 + System.out.println("step 152"); + + + flow_153 + flow_154 + System.out.println("step 153"); + + + flow_154 + flow_155 + System.out.println("step 154"); + + + flow_155 + flow_156 + System.out.println("step 155"); + + + flow_156 + flow_157 + System.out.println("step 156"); + + + flow_157 + flow_158 + System.out.println("step 157"); + + + flow_158 + flow_159 + System.out.println("step 158"); + + + flow_159 + flow_160 + System.out.println("step 159"); + + + flow_160 + flow_161 + System.out.println("step 160"); + + + flow_161 + flow_162 + System.out.println("step 161"); + + + flow_162 + flow_163 + System.out.println("step 162"); + + + flow_163 + flow_164 + System.out.println("step 163"); + + + flow_164 + flow_165 + System.out.println("step 164"); + + + flow_165 + flow_166 + System.out.println("step 165"); + + + flow_166 + flow_167 + System.out.println("step 166"); + + + flow_167 + flow_168 + System.out.println("step 167"); + + + flow_168 + flow_169 + System.out.println("step 168"); + + + flow_169 + flow_170 + System.out.println("step 169"); + + + flow_170 + flow_171 + System.out.println("step 170"); + + + flow_171 + flow_172 + System.out.println("step 171"); + + + flow_172 + flow_173 + System.out.println("step 172"); + + + flow_173 + flow_174 + System.out.println("step 173"); + + + flow_174 + flow_175 + System.out.println("step 174"); + + + flow_175 + flow_176 + System.out.println("step 175"); + + + flow_176 + flow_177 + System.out.println("step 176"); + + + flow_177 + flow_178 + System.out.println("step 177"); + + + flow_178 + flow_179 + System.out.println("step 178"); + + + flow_179 + flow_180 + System.out.println("step 179"); + + + flow_180 + flow_181 + System.out.println("step 180"); + + + flow_181 + flow_182 + System.out.println("step 181"); + + + flow_182 + flow_183 + System.out.println("step 182"); + + + flow_183 + flow_184 + System.out.println("step 183"); + + + flow_184 + flow_185 + System.out.println("step 184"); + + + flow_185 + flow_186 + System.out.println("step 185"); + + + flow_186 + flow_187 + System.out.println("step 186"); + + + flow_187 + flow_188 + System.out.println("step 187"); + + + flow_188 + flow_189 + System.out.println("step 188"); + + + flow_189 + flow_190 + System.out.println("step 189"); + + + flow_190 + flow_191 + System.out.println("step 190"); + + + flow_191 + flow_192 + System.out.println("step 191"); + + + flow_192 + flow_193 + System.out.println("step 192"); + + + flow_193 + flow_194 + System.out.println("step 193"); + + + flow_194 + flow_195 + System.out.println("step 194"); + + + flow_195 + flow_196 + System.out.println("step 195"); + + + flow_196 + flow_197 + System.out.println("step 196"); + + + flow_197 + flow_198 + System.out.println("step 197"); + + + flow_198 + flow_199 + System.out.println("step 198"); + + + flow_199 + flow_200 + System.out.println("step 199"); + + + flow_200 + flow_201 + System.out.println("step 200"); + + + flow_201 + flow_202 + System.out.println("step 201"); + + + flow_202 + flow_203 + System.out.println("step 202"); + + + flow_203 + flow_204 + System.out.println("step 203"); + + + flow_204 + flow_205 + System.out.println("step 204"); + + + flow_205 + flow_206 + System.out.println("step 205"); + + + flow_206 + flow_207 + System.out.println("step 206"); + + + flow_207 + flow_208 + System.out.println("step 207"); + + + flow_208 + flow_209 + System.out.println("step 208"); + + + flow_209 + flow_210 + System.out.println("step 209"); + + + flow_210 + flow_211 + System.out.println("step 210"); + + + flow_211 + flow_212 + System.out.println("step 211"); + + + flow_212 + flow_213 + System.out.println("step 212"); + + + flow_213 + flow_214 + System.out.println("step 213"); + + + flow_214 + flow_215 + System.out.println("step 214"); + + + flow_215 + flow_216 + System.out.println("step 215"); + + + flow_216 + flow_217 + System.out.println("step 216"); + + + flow_217 + flow_218 + System.out.println("step 217"); + + + flow_218 + flow_219 + System.out.println("step 218"); + + + flow_219 + flow_220 + System.out.println("step 219"); + + + flow_220 + flow_221 + System.out.println("step 220"); + + + flow_221 + flow_222 + System.out.println("step 221"); + + + flow_222 + flow_223 + System.out.println("step 222"); + + + flow_223 + flow_224 + System.out.println("step 223"); + + + flow_224 + flow_225 + System.out.println("step 224"); + + + flow_225 + flow_226 + System.out.println("step 225"); + + + flow_226 + flow_227 + System.out.println("step 226"); + + + flow_227 + flow_228 + System.out.println("step 227"); + + + flow_228 + flow_229 + System.out.println("step 228"); + + + flow_229 + flow_230 + System.out.println("step 229"); + + + flow_230 + flow_231 + System.out.println("step 230"); + + + flow_231 + flow_232 + System.out.println("step 231"); + + + flow_232 + flow_233 + System.out.println("step 232"); + + + flow_233 + flow_234 + System.out.println("step 233"); + + + flow_234 + flow_235 + System.out.println("step 234"); + + + flow_235 + flow_236 + System.out.println("step 235"); + + + flow_236 + flow_237 + System.out.println("step 236"); + + + flow_237 + flow_238 + System.out.println("step 237"); + + + flow_238 + flow_239 + System.out.println("step 238"); + + + flow_239 + flow_240 + System.out.println("step 239"); + + + flow_240 + flow_241 + System.out.println("step 240"); + + + flow_241 + flow_242 + System.out.println("step 241"); + + + flow_242 + flow_243 + System.out.println("step 242"); + + + flow_243 + flow_244 + System.out.println("step 243"); + + + flow_244 + flow_245 + System.out.println("step 244"); + + + flow_245 + flow_246 + System.out.println("step 245"); + + + flow_246 + flow_247 + System.out.println("step 246"); + + + flow_247 + flow_248 + System.out.println("step 247"); + + + flow_248 + flow_249 + System.out.println("step 248"); + + + flow_249 + flow_250 + System.out.println("step 249"); + + + flow_250 + flow_251 + System.out.println("step 250"); + + + flow_251 + flow_252 + System.out.println("step 251"); + + + flow_252 + flow_253 + System.out.println("step 252"); + + + flow_253 + flow_254 + System.out.println("step 253"); + + + flow_254 + flow_255 + System.out.println("step 254"); + + + flow_255 + flow_256 + System.out.println("step 255"); + + + flow_256 + flow_257 + System.out.println("step 256"); + + + flow_257 + flow_258 + System.out.println("step 257"); + + + flow_258 + flow_259 + System.out.println("step 258"); + + + flow_259 + flow_260 + System.out.println("step 259"); + + + flow_260 + flow_261 + System.out.println("step 260"); + + + flow_261 + flow_262 + System.out.println("step 261"); + + + flow_262 + flow_263 + System.out.println("step 262"); + + + flow_263 + flow_264 + System.out.println("step 263"); + + + flow_264 + flow_265 + System.out.println("step 264"); + + + flow_265 + flow_266 + System.out.println("step 265"); + + + flow_266 + flow_267 + System.out.println("step 266"); + + + flow_267 + flow_268 + System.out.println("step 267"); + + + flow_268 + flow_269 + System.out.println("step 268"); + + + flow_269 + flow_270 + System.out.println("step 269"); + + + flow_270 + flow_271 + System.out.println("step 270"); + + + flow_271 + flow_272 + System.out.println("step 271"); + + + flow_272 + flow_273 + System.out.println("step 272"); + + + flow_273 + flow_274 + System.out.println("step 273"); + + + flow_274 + flow_275 + System.out.println("step 274"); + + + flow_275 + flow_276 + System.out.println("step 275"); + + + flow_276 + flow_277 + System.out.println("step 276"); + + + flow_277 + flow_278 + System.out.println("step 277"); + + + flow_278 + flow_279 + System.out.println("step 278"); + + + flow_279 + flow_280 + System.out.println("step 279"); + + + flow_280 + flow_281 + System.out.println("step 280"); + + + flow_281 + flow_282 + System.out.println("step 281"); + + + flow_282 + flow_283 + System.out.println("step 282"); + + + flow_283 + flow_284 + System.out.println("step 283"); + + + flow_284 + flow_285 + System.out.println("step 284"); + + + flow_285 + flow_286 + System.out.println("step 285"); + + + flow_286 + flow_287 + System.out.println("step 286"); + + + flow_287 + flow_288 + System.out.println("step 287"); + + + flow_288 + flow_289 + System.out.println("step 288"); + + + flow_289 + flow_290 + System.out.println("step 289"); + + + flow_290 + flow_291 + System.out.println("step 290"); + + + flow_291 + flow_292 + System.out.println("step 291"); + + + flow_292 + flow_293 + System.out.println("step 292"); + + + flow_293 + flow_294 + System.out.println("step 293"); + + + flow_294 + flow_295 + System.out.println("step 294"); + + + flow_295 + flow_296 + System.out.println("step 295"); + + + flow_296 + flow_297 + System.out.println("step 296"); + + + flow_297 + flow_298 + System.out.println("step 297"); + + + flow_298 + flow_299 + System.out.println("step 298"); + + + flow_299 + flow_300 + System.out.println("step 299"); + + + flow_300 + flow_301 + System.out.println("step 300"); + + + flow_301 + flow_302 + System.out.println("step 301"); + + + flow_302 + flow_303 + System.out.println("step 302"); + + + flow_303 + flow_304 + System.out.println("step 303"); + + + flow_304 + flow_305 + System.out.println("step 304"); + + + flow_305 + flow_306 + System.out.println("step 305"); + + + flow_306 + flow_307 + System.out.println("step 306"); + + + flow_307 + flow_308 + System.out.println("step 307"); + + + flow_308 + flow_309 + System.out.println("step 308"); + + + flow_309 + flow_310 + System.out.println("step 309"); + + + flow_310 + flow_311 + System.out.println("step 310"); + + + flow_311 + flow_312 + System.out.println("step 311"); + + + flow_312 + flow_313 + System.out.println("step 312"); + + + flow_313 + flow_314 + System.out.println("step 313"); + + + flow_314 + flow_315 + System.out.println("step 314"); + + + flow_315 + flow_316 + System.out.println("step 315"); + + + flow_316 + flow_317 + System.out.println("step 316"); + + + flow_317 + flow_318 + System.out.println("step 317"); + + + flow_318 + flow_319 + System.out.println("step 318"); + + + flow_319 + flow_320 + System.out.println("step 319"); + + + flow_320 + flow_321 + System.out.println("step 320"); + + + flow_321 + flow_322 + System.out.println("step 321"); + + + flow_322 + flow_323 + System.out.println("step 322"); + + + flow_323 + flow_324 + System.out.println("step 323"); + + + flow_324 + flow_325 + System.out.println("step 324"); + + + flow_325 + flow_326 + System.out.println("step 325"); + + + flow_326 + flow_327 + System.out.println("step 326"); + + + flow_327 + flow_328 + System.out.println("step 327"); + + + flow_328 + flow_329 + System.out.println("step 328"); + + + flow_329 + flow_330 + System.out.println("step 329"); + + + flow_330 + flow_331 + System.out.println("step 330"); + + + flow_331 + flow_332 + System.out.println("step 331"); + + + flow_332 + flow_333 + System.out.println("step 332"); + + + flow_333 + flow_334 + System.out.println("step 333"); + + + flow_334 + flow_335 + System.out.println("step 334"); + + + flow_335 + flow_336 + System.out.println("step 335"); + + + flow_336 + flow_337 + System.out.println("step 336"); + + + flow_337 + flow_338 + System.out.println("step 337"); + + + flow_338 + flow_339 + System.out.println("step 338"); + + + flow_339 + flow_340 + System.out.println("step 339"); + + + flow_340 + flow_341 + System.out.println("step 340"); + + + flow_341 + flow_342 + System.out.println("step 341"); + + + flow_342 + flow_343 + System.out.println("step 342"); + + + flow_343 + flow_344 + System.out.println("step 343"); + + + flow_344 + flow_345 + System.out.println("step 344"); + + + flow_345 + flow_346 + System.out.println("step 345"); + + + flow_346 + flow_347 + System.out.println("step 346"); + + + flow_347 + flow_348 + System.out.println("step 347"); + + + flow_348 + flow_349 + System.out.println("step 348"); + + + flow_349 + flow_350 + System.out.println("step 349"); + + + flow_350 + flow_351 + System.out.println("step 350"); + + + flow_351 + flow_352 + System.out.println("step 351"); + + + flow_352 + flow_353 + System.out.println("step 352"); + + + flow_353 + flow_354 + System.out.println("step 353"); + + + flow_354 + flow_355 + System.out.println("step 354"); + + + flow_355 + flow_356 + System.out.println("step 355"); + + + flow_356 + flow_357 + System.out.println("step 356"); + + + flow_357 + flow_358 + System.out.println("step 357"); + + + flow_358 + flow_359 + System.out.println("step 358"); + + + flow_359 + flow_360 + System.out.println("step 359"); + + + flow_360 + flow_361 + System.out.println("step 360"); + + + flow_361 + flow_362 + System.out.println("step 361"); + + + flow_362 + flow_363 + System.out.println("step 362"); + + + flow_363 + flow_364 + System.out.println("step 363"); + + + flow_364 + flow_365 + System.out.println("step 364"); + + + flow_365 + flow_366 + System.out.println("step 365"); + + + flow_366 + flow_367 + System.out.println("step 366"); + + + flow_367 + flow_368 + System.out.println("step 367"); + + + flow_368 + flow_369 + System.out.println("step 368"); + + + flow_369 + flow_370 + System.out.println("step 369"); + + + flow_370 + flow_371 + System.out.println("step 370"); + + + flow_371 + flow_372 + System.out.println("step 371"); + + + flow_372 + flow_373 + System.out.println("step 372"); + + + flow_373 + flow_374 + System.out.println("step 373"); + + + flow_374 + flow_375 + System.out.println("step 374"); + + + flow_375 + flow_376 + System.out.println("step 375"); + + + flow_376 + flow_377 + System.out.println("step 376"); + + + flow_377 + flow_378 + System.out.println("step 377"); + + + flow_378 + flow_379 + System.out.println("step 378"); + + + flow_379 + flow_380 + System.out.println("step 379"); + + + flow_380 + flow_381 + System.out.println("step 380"); + + + flow_381 + flow_382 + System.out.println("step 381"); + + + flow_382 + flow_383 + System.out.println("step 382"); + + + flow_383 + flow_384 + System.out.println("step 383"); + + + flow_384 + flow_385 + System.out.println("step 384"); + + + flow_385 + flow_386 + System.out.println("step 385"); + + + flow_386 + flow_387 + System.out.println("step 386"); + + + flow_387 + flow_388 + System.out.println("step 387"); + + + flow_388 + flow_389 + System.out.println("step 388"); + + + flow_389 + flow_390 + System.out.println("step 389"); + + + flow_390 + flow_391 + System.out.println("step 390"); + + + flow_391 + flow_392 + System.out.println("step 391"); + + + flow_392 + flow_393 + System.out.println("step 392"); + + + flow_393 + flow_394 + System.out.println("step 393"); + + + flow_394 + flow_395 + System.out.println("step 394"); + + + flow_395 + flow_396 + System.out.println("step 395"); + + + flow_396 + flow_397 + System.out.println("step 396"); + + + flow_397 + flow_398 + System.out.println("step 397"); + + + flow_398 + flow_399 + System.out.println("step 398"); + + + flow_399 + flow_400 + System.out.println("step 399"); + + + flow_400 + flow_401 + System.out.println("step 400"); + + + flow_401 + flow_402 + System.out.println("step 401"); + + + flow_402 + flow_403 + System.out.println("step 402"); + + + flow_403 + flow_404 + System.out.println("step 403"); + + + flow_404 + flow_405 + System.out.println("step 404"); + + + flow_405 + flow_406 + System.out.println("step 405"); + + + flow_406 + flow_407 + System.out.println("step 406"); + + + flow_407 + flow_408 + System.out.println("step 407"); + + + flow_408 + flow_409 + System.out.println("step 408"); + + + flow_409 + flow_410 + System.out.println("step 409"); + + + flow_410 + flow_411 + System.out.println("step 410"); + + + flow_411 + flow_412 + System.out.println("step 411"); + + + flow_412 + flow_413 + System.out.println("step 412"); + + + flow_413 + flow_414 + System.out.println("step 413"); + + + flow_414 + flow_415 + System.out.println("step 414"); + + + flow_415 + flow_416 + System.out.println("step 415"); + + + flow_416 + flow_417 + System.out.println("step 416"); + + + flow_417 + flow_418 + System.out.println("step 417"); + + + flow_418 + flow_419 + System.out.println("step 418"); + + + flow_419 + flow_420 + System.out.println("step 419"); + + + flow_420 + flow_421 + System.out.println("step 420"); + + + flow_421 + flow_422 + System.out.println("step 421"); + + + flow_422 + flow_423 + System.out.println("step 422"); + + + flow_423 + flow_424 + System.out.println("step 423"); + + + flow_424 + flow_425 + System.out.println("step 424"); + + + flow_425 + flow_426 + System.out.println("step 425"); + + + flow_426 + flow_427 + System.out.println("step 426"); + + + flow_427 + flow_428 + System.out.println("step 427"); + + + flow_428 + flow_429 + System.out.println("step 428"); + + + flow_429 + flow_430 + System.out.println("step 429"); + + + flow_430 + flow_431 + System.out.println("step 430"); + + + flow_431 + flow_432 + System.out.println("step 431"); + + + flow_432 + flow_433 + System.out.println("step 432"); + + + flow_433 + flow_434 + System.out.println("step 433"); + + + flow_434 + flow_435 + System.out.println("step 434"); + + + flow_435 + flow_436 + System.out.println("step 435"); + + + flow_436 + flow_437 + System.out.println("step 436"); + + + flow_437 + flow_438 + System.out.println("step 437"); + + + flow_438 + flow_439 + System.out.println("step 438"); + + + flow_439 + flow_440 + System.out.println("step 439"); + + + flow_440 + flow_441 + System.out.println("step 440"); + + + flow_441 + flow_442 + System.out.println("step 441"); + + + flow_442 + flow_443 + System.out.println("step 442"); + + + flow_443 + flow_444 + System.out.println("step 443"); + + + flow_444 + flow_445 + System.out.println("step 444"); + + + flow_445 + flow_446 + System.out.println("step 445"); + + + flow_446 + flow_447 + System.out.println("step 446"); + + + flow_447 + flow_448 + System.out.println("step 447"); + + + flow_448 + flow_449 + System.out.println("step 448"); + + + flow_449 + flow_450 + System.out.println("step 449"); + + + flow_450 + flow_451 + System.out.println("step 450"); + + + flow_451 + flow_452 + System.out.println("step 451"); + + + flow_452 + flow_453 + System.out.println("step 452"); + + + flow_453 + flow_454 + System.out.println("step 453"); + + + flow_454 + flow_455 + System.out.println("step 454"); + + + flow_455 + flow_456 + System.out.println("step 455"); + + + flow_456 + flow_457 + System.out.println("step 456"); + + + flow_457 + flow_458 + System.out.println("step 457"); + + + flow_458 + flow_459 + System.out.println("step 458"); + + + flow_459 + flow_460 + System.out.println("step 459"); + + + flow_460 + flow_461 + System.out.println("step 460"); + + + flow_461 + flow_462 + System.out.println("step 461"); + + + flow_462 + flow_463 + System.out.println("step 462"); + + + flow_463 + flow_464 + System.out.println("step 463"); + + + flow_464 + flow_465 + System.out.println("step 464"); + + + flow_465 + flow_466 + System.out.println("step 465"); + + + flow_466 + flow_467 + System.out.println("step 466"); + + + flow_467 + flow_468 + System.out.println("step 467"); + + + flow_468 + flow_469 + System.out.println("step 468"); + + + flow_469 + flow_470 + System.out.println("step 469"); + + + flow_470 + flow_471 + System.out.println("step 470"); + + + flow_471 + flow_472 + System.out.println("step 471"); + + + flow_472 + flow_473 + System.out.println("step 472"); + + + flow_473 + flow_474 + System.out.println("step 473"); + + + flow_474 + flow_475 + System.out.println("step 474"); + + + flow_475 + flow_476 + System.out.println("step 475"); + + + flow_476 + flow_477 + System.out.println("step 476"); + + + flow_477 + flow_478 + System.out.println("step 477"); + + + flow_478 + flow_479 + System.out.println("step 478"); + + + flow_479 + flow_480 + System.out.println("step 479"); + + + flow_480 + flow_481 + System.out.println("step 480"); + + + flow_481 + flow_482 + System.out.println("step 481"); + + + flow_482 + flow_483 + System.out.println("step 482"); + + + flow_483 + flow_484 + System.out.println("step 483"); + + + flow_484 + flow_485 + System.out.println("step 484"); + + + flow_485 + flow_486 + System.out.println("step 485"); + + + flow_486 + flow_487 + System.out.println("step 486"); + + + flow_487 + flow_488 + System.out.println("step 487"); + + + flow_488 + flow_489 + System.out.println("step 488"); + + + flow_489 + flow_490 + System.out.println("step 489"); + + + flow_490 + flow_491 + System.out.println("step 490"); + + + flow_491 + flow_492 + System.out.println("step 491"); + + + flow_492 + flow_493 + System.out.println("step 492"); + + + flow_493 + flow_494 + System.out.println("step 493"); + + + flow_494 + flow_495 + System.out.println("step 494"); + + + flow_495 + flow_496 + System.out.println("step 495"); + + + flow_496 + flow_497 + System.out.println("step 496"); + + + flow_497 + flow_498 + System.out.println("step 497"); + + + flow_498 + flow_499 + System.out.println("step 498"); + + + flow_499 + flow_500 + System.out.println("step 499"); + + + flow_500 + flow_501 + System.out.println("step 500"); + + + flow_501 + flow_502 + System.out.println("step 501"); + + + flow_502 + flow_503 + System.out.println("step 502"); + + + flow_503 + flow_504 + System.out.println("step 503"); + + + flow_504 + flow_505 + System.out.println("step 504"); + + + flow_505 + flow_506 + System.out.println("step 505"); + + + flow_506 + flow_507 + System.out.println("step 506"); + + + flow_507 + flow_508 + System.out.println("step 507"); + + + flow_508 + flow_509 + System.out.println("step 508"); + + + flow_509 + flow_510 + System.out.println("step 509"); + + + flow_510 + flow_511 + System.out.println("step 510"); + + + flow_511 + flow_512 + System.out.println("step 511"); + + + flow_512 + flow_513 + System.out.println("step 512"); + + + flow_513 + flow_514 + System.out.println("step 513"); + + + flow_514 + flow_515 + System.out.println("step 514"); + + + flow_515 + flow_516 + System.out.println("step 515"); + + + flow_516 + flow_517 + System.out.println("step 516"); + + + flow_517 + flow_518 + System.out.println("step 517"); + + + flow_518 + flow_519 + System.out.println("step 518"); + + + flow_519 + flow_520 + System.out.println("step 519"); + + + flow_520 + flow_521 + System.out.println("step 520"); + + + flow_521 + flow_522 + System.out.println("step 521"); + + + flow_522 + flow_523 + System.out.println("step 522"); + + + flow_523 + flow_524 + System.out.println("step 523"); + + + flow_524 + flow_525 + System.out.println("step 524"); + + + flow_525 + flow_526 + System.out.println("step 525"); + + + flow_526 + flow_527 + System.out.println("step 526"); + + + flow_527 + flow_528 + System.out.println("step 527"); + + + flow_528 + flow_529 + System.out.println("step 528"); + + + flow_529 + flow_530 + System.out.println("step 529"); + + + flow_530 + flow_531 + System.out.println("step 530"); + + + flow_531 + flow_532 + System.out.println("step 531"); + + + flow_532 + flow_533 + System.out.println("step 532"); + + + flow_533 + flow_534 + System.out.println("step 533"); + + + flow_534 + flow_535 + System.out.println("step 534"); + + + flow_535 + flow_536 + System.out.println("step 535"); + + + flow_536 + flow_537 + System.out.println("step 536"); + + + flow_537 + flow_538 + System.out.println("step 537"); + + + flow_538 + flow_539 + System.out.println("step 538"); + + + flow_539 + flow_540 + System.out.println("step 539"); + + + flow_540 + flow_541 + System.out.println("step 540"); + + + flow_541 + flow_542 + System.out.println("step 541"); + + + flow_542 + flow_543 + System.out.println("step 542"); + + + flow_543 + flow_544 + System.out.println("step 543"); + + + flow_544 + flow_545 + System.out.println("step 544"); + + + flow_545 + flow_546 + System.out.println("step 545"); + + + flow_546 + flow_547 + System.out.println("step 546"); + + + flow_547 + flow_548 + System.out.println("step 547"); + + + flow_548 + flow_549 + System.out.println("step 548"); + + + flow_549 + flow_550 + System.out.println("step 549"); + + + flow_550 + flow_551 + System.out.println("step 550"); + + + flow_551 + flow_552 + System.out.println("step 551"); + + + flow_552 + flow_553 + System.out.println("step 552"); + + + flow_553 + flow_554 + System.out.println("step 553"); + + + flow_554 + flow_555 + System.out.println("step 554"); + + + flow_555 + flow_556 + System.out.println("step 555"); + + + flow_556 + flow_557 + System.out.println("step 556"); + + + flow_557 + flow_558 + System.out.println("step 557"); + + + flow_558 + flow_559 + System.out.println("step 558"); + + + flow_559 + flow_560 + System.out.println("step 559"); + + + flow_560 + flow_561 + System.out.println("step 560"); + + + flow_561 + flow_562 + System.out.println("step 561"); + + + flow_562 + flow_563 + System.out.println("step 562"); + + + flow_563 + flow_564 + System.out.println("step 563"); + + + flow_564 + flow_565 + System.out.println("step 564"); + + + flow_565 + flow_566 + System.out.println("step 565"); + + + flow_566 + flow_567 + System.out.println("step 566"); + + + flow_567 + flow_568 + System.out.println("step 567"); + + + flow_568 + flow_569 + System.out.println("step 568"); + + + flow_569 + flow_570 + System.out.println("step 569"); + + + flow_570 + flow_571 + System.out.println("step 570"); + + + flow_571 + flow_572 + System.out.println("step 571"); + + + flow_572 + flow_573 + System.out.println("step 572"); + + + flow_573 + flow_574 + System.out.println("step 573"); + + + flow_574 + flow_575 + System.out.println("step 574"); + + + flow_575 + flow_576 + System.out.println("step 575"); + + + flow_576 + flow_577 + System.out.println("step 576"); + + + flow_577 + flow_578 + System.out.println("step 577"); + + + flow_578 + flow_579 + System.out.println("step 578"); + + + flow_579 + flow_580 + System.out.println("step 579"); + + + flow_580 + flow_581 + System.out.println("step 580"); + + + flow_581 + flow_582 + System.out.println("step 581"); + + + flow_582 + flow_583 + System.out.println("step 582"); + + + flow_583 + flow_584 + System.out.println("step 583"); + + + flow_584 + flow_585 + System.out.println("step 584"); + + + flow_585 + flow_586 + System.out.println("step 585"); + + + flow_586 + flow_587 + System.out.println("step 586"); + + + flow_587 + flow_588 + System.out.println("step 587"); + + + flow_588 + flow_589 + System.out.println("step 588"); + + + flow_589 + flow_590 + System.out.println("step 589"); + + + flow_590 + flow_591 + System.out.println("step 590"); + + + flow_591 + flow_592 + System.out.println("step 591"); + + + flow_592 + flow_593 + System.out.println("step 592"); + + + flow_593 + flow_594 + System.out.println("step 593"); + + + flow_594 + flow_595 + System.out.println("step 594"); + + + flow_595 + flow_596 + System.out.println("step 595"); + + + flow_596 + flow_597 + System.out.println("step 596"); + + + flow_597 + flow_598 + System.out.println("step 597"); + + + flow_598 + flow_599 + System.out.println("step 598"); + + + flow_599 + flow_600 + System.out.println("step 599"); + + + flow_600 + flow_601 + System.out.println("step 600"); + + + flow_601 + flow_602 + System.out.println("step 601"); + + + flow_602 + flow_603 + System.out.println("step 602"); + + + flow_603 + flow_604 + System.out.println("step 603"); + + + flow_604 + flow_605 + System.out.println("step 604"); + + + flow_605 + flow_606 + System.out.println("step 605"); + + + flow_606 + flow_607 + System.out.println("step 606"); + + + flow_607 + flow_608 + System.out.println("step 607"); + + + flow_608 + flow_609 + System.out.println("step 608"); + + + flow_609 + flow_610 + System.out.println("step 609"); + + + flow_610 + flow_611 + System.out.println("step 610"); + + + flow_611 + flow_612 + System.out.println("step 611"); + + + flow_612 + flow_613 + System.out.println("step 612"); + + + flow_613 + flow_614 + System.out.println("step 613"); + + + flow_614 + flow_615 + System.out.println("step 614"); + + + flow_615 + flow_616 + System.out.println("step 615"); + + + flow_616 + flow_617 + System.out.println("step 616"); + + + flow_617 + flow_618 + System.out.println("step 617"); + + + flow_618 + flow_619 + System.out.println("step 618"); + + + flow_619 + flow_620 + System.out.println("step 619"); + + + flow_620 + flow_621 + System.out.println("step 620"); + + + flow_621 + flow_622 + System.out.println("step 621"); + + + flow_622 + flow_623 + System.out.println("step 622"); + + + flow_623 + flow_624 + System.out.println("step 623"); + + + flow_624 + flow_625 + System.out.println("step 624"); + + + flow_625 + flow_626 + System.out.println("step 625"); + + + flow_626 + flow_627 + System.out.println("step 626"); + + + flow_627 + flow_628 + System.out.println("step 627"); + + + flow_628 + flow_629 + System.out.println("step 628"); + + + flow_629 + flow_630 + System.out.println("step 629"); + + + flow_630 + flow_631 + System.out.println("step 630"); + + + flow_631 + flow_632 + System.out.println("step 631"); + + + flow_632 + flow_633 + System.out.println("step 632"); + + + flow_633 + flow_634 + System.out.println("step 633"); + + + flow_634 + flow_635 + System.out.println("step 634"); + + + flow_635 + flow_636 + System.out.println("step 635"); + + + flow_636 + flow_637 + System.out.println("step 636"); + + + flow_637 + flow_638 + System.out.println("step 637"); + + + flow_638 + flow_639 + System.out.println("step 638"); + + + flow_639 + flow_640 + System.out.println("step 639"); + + + flow_640 + flow_641 + System.out.println("step 640"); + + + flow_641 + flow_642 + System.out.println("step 641"); + + + flow_642 + flow_643 + System.out.println("step 642"); + + + flow_643 + flow_644 + System.out.println("step 643"); + + + flow_644 + flow_645 + System.out.println("step 644"); + + + flow_645 + flow_646 + System.out.println("step 645"); + + + flow_646 + flow_647 + System.out.println("step 646"); + + + flow_647 + flow_648 + System.out.println("step 647"); + + + flow_648 + flow_649 + System.out.println("step 648"); + + + flow_649 + flow_650 + System.out.println("step 649"); + + + flow_650 + flow_651 + System.out.println("step 650"); + + + flow_651 + flow_652 + System.out.println("step 651"); + + + flow_652 + flow_653 + System.out.println("step 652"); + + + flow_653 + flow_654 + System.out.println("step 653"); + + + flow_654 + flow_655 + System.out.println("step 654"); + + + flow_655 + flow_656 + System.out.println("step 655"); + + + flow_656 + flow_657 + System.out.println("step 656"); + + + flow_657 + flow_658 + System.out.println("step 657"); + + + flow_658 + flow_659 + System.out.println("step 658"); + + + flow_659 + flow_660 + System.out.println("step 659"); + + + flow_660 + flow_661 + System.out.println("step 660"); + + + flow_661 + flow_662 + System.out.println("step 661"); + + + flow_662 + flow_663 + System.out.println("step 662"); + + + flow_663 + flow_664 + System.out.println("step 663"); + + + flow_664 + flow_665 + System.out.println("step 664"); + + + flow_665 + flow_666 + System.out.println("step 665"); + + + flow_666 + flow_667 + System.out.println("step 666"); + + + flow_667 + flow_668 + System.out.println("step 667"); + + + flow_668 + flow_669 + System.out.println("step 668"); + + + flow_669 + flow_670 + System.out.println("step 669"); + + + flow_670 + flow_671 + System.out.println("step 670"); + + + flow_671 + flow_672 + System.out.println("step 671"); + + + flow_672 + flow_673 + System.out.println("step 672"); + + + flow_673 + flow_674 + System.out.println("step 673"); + + + flow_674 + flow_675 + System.out.println("step 674"); + + + flow_675 + flow_676 + System.out.println("step 675"); + + + flow_676 + flow_677 + System.out.println("step 676"); + + + flow_677 + flow_678 + System.out.println("step 677"); + + + flow_678 + flow_679 + System.out.println("step 678"); + + + flow_679 + flow_680 + System.out.println("step 679"); + + + flow_680 + flow_681 + System.out.println("step 680"); + + + flow_681 + flow_682 + System.out.println("step 681"); + + + flow_682 + flow_683 + System.out.println("step 682"); + + + flow_683 + flow_684 + System.out.println("step 683"); + + + flow_684 + flow_685 + System.out.println("step 684"); + + + flow_685 + flow_686 + System.out.println("step 685"); + + + flow_686 + flow_687 + System.out.println("step 686"); + + + flow_687 + flow_688 + System.out.println("step 687"); + + + flow_688 + flow_689 + System.out.println("step 688"); + + + flow_689 + flow_690 + System.out.println("step 689"); + + + flow_690 + flow_691 + System.out.println("step 690"); + + + flow_691 + flow_692 + System.out.println("step 691"); + + + flow_692 + flow_693 + System.out.println("step 692"); + + + flow_693 + flow_694 + System.out.println("step 693"); + + + flow_694 + flow_695 + System.out.println("step 694"); + + + flow_695 + flow_696 + System.out.println("step 695"); + + + flow_696 + flow_697 + System.out.println("step 696"); + + + flow_697 + flow_698 + System.out.println("step 697"); + + + flow_698 + flow_699 + System.out.println("step 698"); + + + flow_699 + flow_700 + System.out.println("step 699"); + + + flow_700 + flow_701 + System.out.println("step 700"); + + + flow_701 + flow_702 + System.out.println("step 701"); + + + flow_702 + flow_703 + System.out.println("step 702"); + + + flow_703 + flow_704 + System.out.println("step 703"); + + + flow_704 + flow_705 + System.out.println("step 704"); + + + flow_705 + flow_706 + System.out.println("step 705"); + + + flow_706 + flow_707 + System.out.println("step 706"); + + + flow_707 + flow_708 + System.out.println("step 707"); + + + flow_708 + flow_709 + System.out.println("step 708"); + + + flow_709 + flow_710 + System.out.println("step 709"); + + + flow_710 + flow_711 + System.out.println("step 710"); + + + flow_711 + flow_712 + System.out.println("step 711"); + + + flow_712 + flow_713 + System.out.println("step 712"); + + + flow_713 + flow_714 + System.out.println("step 713"); + + + flow_714 + flow_715 + System.out.println("step 714"); + + + flow_715 + flow_716 + System.out.println("step 715"); + + + flow_716 + flow_717 + System.out.println("step 716"); + + + flow_717 + flow_718 + System.out.println("step 717"); + + + flow_718 + flow_719 + System.out.println("step 718"); + + + flow_719 + flow_720 + System.out.println("step 719"); + + + flow_720 + flow_721 + System.out.println("step 720"); + + + flow_721 + flow_722 + System.out.println("step 721"); + + + flow_722 + flow_723 + System.out.println("step 722"); + + + flow_723 + flow_724 + System.out.println("step 723"); + + + flow_724 + flow_725 + System.out.println("step 724"); + + + flow_725 + flow_726 + System.out.println("step 725"); + + + flow_726 + flow_727 + System.out.println("step 726"); + + + flow_727 + flow_728 + System.out.println("step 727"); + + + flow_728 + flow_729 + System.out.println("step 728"); + + + flow_729 + flow_730 + System.out.println("step 729"); + + + flow_730 + flow_731 + System.out.println("step 730"); + + + flow_731 + flow_732 + System.out.println("step 731"); + + + flow_732 + flow_733 + System.out.println("step 732"); + + + flow_733 + flow_734 + System.out.println("step 733"); + + + flow_734 + flow_735 + System.out.println("step 734"); + + + flow_735 + flow_736 + System.out.println("step 735"); + + + flow_736 + flow_737 + System.out.println("step 736"); + + + flow_737 + flow_738 + System.out.println("step 737"); + + + flow_738 + flow_739 + System.out.println("step 738"); + + + flow_739 + flow_740 + System.out.println("step 739"); + + + flow_740 + flow_741 + System.out.println("step 740"); + + + flow_741 + flow_742 + System.out.println("step 741"); + + + flow_742 + flow_743 + System.out.println("step 742"); + + + flow_743 + flow_744 + System.out.println("step 743"); + + + flow_744 + flow_745 + System.out.println("step 744"); + + + flow_745 + flow_746 + System.out.println("step 745"); + + + flow_746 + flow_747 + System.out.println("step 746"); + + + flow_747 + flow_748 + System.out.println("step 747"); + + + flow_748 + flow_749 + System.out.println("step 748"); + + + flow_749 + flow_750 + System.out.println("step 749"); + + + flow_750 + flow_751 + System.out.println("step 750"); + + + flow_751 + flow_752 + System.out.println("step 751"); + + + flow_752 + flow_753 + System.out.println("step 752"); + + + flow_753 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/codetoolarge/repro-fails.bpmn b/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/codetoolarge/repro-fails.bpmn new file mode 100644 index 000000000000..047952b09114 --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/codetoolarge/repro-fails.bpmn @@ -0,0 +1,9833 @@ + + + + + flow_0 + + + flow_0 + flow_1 + System.out.println("step 0"); + + + flow_1 + flow_2 + System.out.println("step 1"); + + + flow_2 + flow_3 + System.out.println("step 2"); + + + flow_3 + flow_4 + System.out.println("step 3"); + + + flow_4 + flow_5 + System.out.println("step 4"); + + + flow_5 + flow_6 + System.out.println("step 5"); + + + flow_6 + flow_7 + System.out.println("step 6"); + + + flow_7 + flow_8 + System.out.println("step 7"); + + + flow_8 + flow_9 + System.out.println("step 8"); + + + flow_9 + flow_10 + System.out.println("step 9"); + + + flow_10 + flow_11 + System.out.println("step 10"); + + + flow_11 + flow_12 + System.out.println("step 11"); + + + flow_12 + flow_13 + System.out.println("step 12"); + + + flow_13 + flow_14 + System.out.println("step 13"); + + + flow_14 + flow_15 + System.out.println("step 14"); + + + flow_15 + flow_16 + System.out.println("step 15"); + + + flow_16 + flow_17 + System.out.println("step 16"); + + + flow_17 + flow_18 + System.out.println("step 17"); + + + flow_18 + flow_19 + System.out.println("step 18"); + + + flow_19 + flow_20 + System.out.println("step 19"); + + + flow_20 + flow_21 + System.out.println("step 20"); + + + flow_21 + flow_22 + System.out.println("step 21"); + + + flow_22 + flow_23 + System.out.println("step 22"); + + + flow_23 + flow_24 + System.out.println("step 23"); + + + flow_24 + flow_25 + System.out.println("step 24"); + + + flow_25 + flow_26 + System.out.println("step 25"); + + + flow_26 + flow_27 + System.out.println("step 26"); + + + flow_27 + flow_28 + System.out.println("step 27"); + + + flow_28 + flow_29 + System.out.println("step 28"); + + + flow_29 + flow_30 + System.out.println("step 29"); + + + flow_30 + flow_31 + System.out.println("step 30"); + + + flow_31 + flow_32 + System.out.println("step 31"); + + + flow_32 + flow_33 + System.out.println("step 32"); + + + flow_33 + flow_34 + System.out.println("step 33"); + + + flow_34 + flow_35 + System.out.println("step 34"); + + + flow_35 + flow_36 + System.out.println("step 35"); + + + flow_36 + flow_37 + System.out.println("step 36"); + + + flow_37 + flow_38 + System.out.println("step 37"); + + + flow_38 + flow_39 + System.out.println("step 38"); + + + flow_39 + flow_40 + System.out.println("step 39"); + + + flow_40 + flow_41 + System.out.println("step 40"); + + + flow_41 + flow_42 + System.out.println("step 41"); + + + flow_42 + flow_43 + System.out.println("step 42"); + + + flow_43 + flow_44 + System.out.println("step 43"); + + + flow_44 + flow_45 + System.out.println("step 44"); + + + flow_45 + flow_46 + System.out.println("step 45"); + + + flow_46 + flow_47 + System.out.println("step 46"); + + + flow_47 + flow_48 + System.out.println("step 47"); + + + flow_48 + flow_49 + System.out.println("step 48"); + + + flow_49 + flow_50 + System.out.println("step 49"); + + + flow_50 + flow_51 + System.out.println("step 50"); + + + flow_51 + flow_52 + System.out.println("step 51"); + + + flow_52 + flow_53 + System.out.println("step 52"); + + + flow_53 + flow_54 + System.out.println("step 53"); + + + flow_54 + flow_55 + System.out.println("step 54"); + + + flow_55 + flow_56 + System.out.println("step 55"); + + + flow_56 + flow_57 + System.out.println("step 56"); + + + flow_57 + flow_58 + System.out.println("step 57"); + + + flow_58 + flow_59 + System.out.println("step 58"); + + + flow_59 + flow_60 + System.out.println("step 59"); + + + flow_60 + flow_61 + System.out.println("step 60"); + + + flow_61 + flow_62 + System.out.println("step 61"); + + + flow_62 + flow_63 + System.out.println("step 62"); + + + flow_63 + flow_64 + System.out.println("step 63"); + + + flow_64 + flow_65 + System.out.println("step 64"); + + + flow_65 + flow_66 + System.out.println("step 65"); + + + flow_66 + flow_67 + System.out.println("step 66"); + + + flow_67 + flow_68 + System.out.println("step 67"); + + + flow_68 + flow_69 + System.out.println("step 68"); + + + flow_69 + flow_70 + System.out.println("step 69"); + + + flow_70 + flow_71 + System.out.println("step 70"); + + + flow_71 + flow_72 + System.out.println("step 71"); + + + flow_72 + flow_73 + System.out.println("step 72"); + + + flow_73 + flow_74 + System.out.println("step 73"); + + + flow_74 + flow_75 + System.out.println("step 74"); + + + flow_75 + flow_76 + System.out.println("step 75"); + + + flow_76 + flow_77 + System.out.println("step 76"); + + + flow_77 + flow_78 + System.out.println("step 77"); + + + flow_78 + flow_79 + System.out.println("step 78"); + + + flow_79 + flow_80 + System.out.println("step 79"); + + + flow_80 + flow_81 + System.out.println("step 80"); + + + flow_81 + flow_82 + System.out.println("step 81"); + + + flow_82 + flow_83 + System.out.println("step 82"); + + + flow_83 + flow_84 + System.out.println("step 83"); + + + flow_84 + flow_85 + System.out.println("step 84"); + + + flow_85 + flow_86 + System.out.println("step 85"); + + + flow_86 + flow_87 + System.out.println("step 86"); + + + flow_87 + flow_88 + System.out.println("step 87"); + + + flow_88 + flow_89 + System.out.println("step 88"); + + + flow_89 + flow_90 + System.out.println("step 89"); + + + flow_90 + flow_91 + System.out.println("step 90"); + + + flow_91 + flow_92 + System.out.println("step 91"); + + + flow_92 + flow_93 + System.out.println("step 92"); + + + flow_93 + flow_94 + System.out.println("step 93"); + + + flow_94 + flow_95 + System.out.println("step 94"); + + + flow_95 + flow_96 + System.out.println("step 95"); + + + flow_96 + flow_97 + System.out.println("step 96"); + + + flow_97 + flow_98 + System.out.println("step 97"); + + + flow_98 + flow_99 + System.out.println("step 98"); + + + flow_99 + flow_100 + System.out.println("step 99"); + + + flow_100 + flow_101 + System.out.println("step 100"); + + + flow_101 + flow_102 + System.out.println("step 101"); + + + flow_102 + flow_103 + System.out.println("step 102"); + + + flow_103 + flow_104 + System.out.println("step 103"); + + + flow_104 + flow_105 + System.out.println("step 104"); + + + flow_105 + flow_106 + System.out.println("step 105"); + + + flow_106 + flow_107 + System.out.println("step 106"); + + + flow_107 + flow_108 + System.out.println("step 107"); + + + flow_108 + flow_109 + System.out.println("step 108"); + + + flow_109 + flow_110 + System.out.println("step 109"); + + + flow_110 + flow_111 + System.out.println("step 110"); + + + flow_111 + flow_112 + System.out.println("step 111"); + + + flow_112 + flow_113 + System.out.println("step 112"); + + + flow_113 + flow_114 + System.out.println("step 113"); + + + flow_114 + flow_115 + System.out.println("step 114"); + + + flow_115 + flow_116 + System.out.println("step 115"); + + + flow_116 + flow_117 + System.out.println("step 116"); + + + flow_117 + flow_118 + System.out.println("step 117"); + + + flow_118 + flow_119 + System.out.println("step 118"); + + + flow_119 + flow_120 + System.out.println("step 119"); + + + flow_120 + flow_121 + System.out.println("step 120"); + + + flow_121 + flow_122 + System.out.println("step 121"); + + + flow_122 + flow_123 + System.out.println("step 122"); + + + flow_123 + flow_124 + System.out.println("step 123"); + + + flow_124 + flow_125 + System.out.println("step 124"); + + + flow_125 + flow_126 + System.out.println("step 125"); + + + flow_126 + flow_127 + System.out.println("step 126"); + + + flow_127 + flow_128 + System.out.println("step 127"); + + + flow_128 + flow_129 + System.out.println("step 128"); + + + flow_129 + flow_130 + System.out.println("step 129"); + + + flow_130 + flow_131 + System.out.println("step 130"); + + + flow_131 + flow_132 + System.out.println("step 131"); + + + flow_132 + flow_133 + System.out.println("step 132"); + + + flow_133 + flow_134 + System.out.println("step 133"); + + + flow_134 + flow_135 + System.out.println("step 134"); + + + flow_135 + flow_136 + System.out.println("step 135"); + + + flow_136 + flow_137 + System.out.println("step 136"); + + + flow_137 + flow_138 + System.out.println("step 137"); + + + flow_138 + flow_139 + System.out.println("step 138"); + + + flow_139 + flow_140 + System.out.println("step 139"); + + + flow_140 + flow_141 + System.out.println("step 140"); + + + flow_141 + flow_142 + System.out.println("step 141"); + + + flow_142 + flow_143 + System.out.println("step 142"); + + + flow_143 + flow_144 + System.out.println("step 143"); + + + flow_144 + flow_145 + System.out.println("step 144"); + + + flow_145 + flow_146 + System.out.println("step 145"); + + + flow_146 + flow_147 + System.out.println("step 146"); + + + flow_147 + flow_148 + System.out.println("step 147"); + + + flow_148 + flow_149 + System.out.println("step 148"); + + + flow_149 + flow_150 + System.out.println("step 149"); + + + flow_150 + flow_151 + System.out.println("step 150"); + + + flow_151 + flow_152 + System.out.println("step 151"); + + + flow_152 + flow_153 + System.out.println("step 152"); + + + flow_153 + flow_154 + System.out.println("step 153"); + + + flow_154 + flow_155 + System.out.println("step 154"); + + + flow_155 + flow_156 + System.out.println("step 155"); + + + flow_156 + flow_157 + System.out.println("step 156"); + + + flow_157 + flow_158 + System.out.println("step 157"); + + + flow_158 + flow_159 + System.out.println("step 158"); + + + flow_159 + flow_160 + System.out.println("step 159"); + + + flow_160 + flow_161 + System.out.println("step 160"); + + + flow_161 + flow_162 + System.out.println("step 161"); + + + flow_162 + flow_163 + System.out.println("step 162"); + + + flow_163 + flow_164 + System.out.println("step 163"); + + + flow_164 + flow_165 + System.out.println("step 164"); + + + flow_165 + flow_166 + System.out.println("step 165"); + + + flow_166 + flow_167 + System.out.println("step 166"); + + + flow_167 + flow_168 + System.out.println("step 167"); + + + flow_168 + flow_169 + System.out.println("step 168"); + + + flow_169 + flow_170 + System.out.println("step 169"); + + + flow_170 + flow_171 + System.out.println("step 170"); + + + flow_171 + flow_172 + System.out.println("step 171"); + + + flow_172 + flow_173 + System.out.println("step 172"); + + + flow_173 + flow_174 + System.out.println("step 173"); + + + flow_174 + flow_175 + System.out.println("step 174"); + + + flow_175 + flow_176 + System.out.println("step 175"); + + + flow_176 + flow_177 + System.out.println("step 176"); + + + flow_177 + flow_178 + System.out.println("step 177"); + + + flow_178 + flow_179 + System.out.println("step 178"); + + + flow_179 + flow_180 + System.out.println("step 179"); + + + flow_180 + flow_181 + System.out.println("step 180"); + + + flow_181 + flow_182 + System.out.println("step 181"); + + + flow_182 + flow_183 + System.out.println("step 182"); + + + flow_183 + flow_184 + System.out.println("step 183"); + + + flow_184 + flow_185 + System.out.println("step 184"); + + + flow_185 + flow_186 + System.out.println("step 185"); + + + flow_186 + flow_187 + System.out.println("step 186"); + + + flow_187 + flow_188 + System.out.println("step 187"); + + + flow_188 + flow_189 + System.out.println("step 188"); + + + flow_189 + flow_190 + System.out.println("step 189"); + + + flow_190 + flow_191 + System.out.println("step 190"); + + + flow_191 + flow_192 + System.out.println("step 191"); + + + flow_192 + flow_193 + System.out.println("step 192"); + + + flow_193 + flow_194 + System.out.println("step 193"); + + + flow_194 + flow_195 + System.out.println("step 194"); + + + flow_195 + flow_196 + System.out.println("step 195"); + + + flow_196 + flow_197 + System.out.println("step 196"); + + + flow_197 + flow_198 + System.out.println("step 197"); + + + flow_198 + flow_199 + System.out.println("step 198"); + + + flow_199 + flow_200 + System.out.println("step 199"); + + + flow_200 + flow_201 + System.out.println("step 200"); + + + flow_201 + flow_202 + System.out.println("step 201"); + + + flow_202 + flow_203 + System.out.println("step 202"); + + + flow_203 + flow_204 + System.out.println("step 203"); + + + flow_204 + flow_205 + System.out.println("step 204"); + + + flow_205 + flow_206 + System.out.println("step 205"); + + + flow_206 + flow_207 + System.out.println("step 206"); + + + flow_207 + flow_208 + System.out.println("step 207"); + + + flow_208 + flow_209 + System.out.println("step 208"); + + + flow_209 + flow_210 + System.out.println("step 209"); + + + flow_210 + flow_211 + System.out.println("step 210"); + + + flow_211 + flow_212 + System.out.println("step 211"); + + + flow_212 + flow_213 + System.out.println("step 212"); + + + flow_213 + flow_214 + System.out.println("step 213"); + + + flow_214 + flow_215 + System.out.println("step 214"); + + + flow_215 + flow_216 + System.out.println("step 215"); + + + flow_216 + flow_217 + System.out.println("step 216"); + + + flow_217 + flow_218 + System.out.println("step 217"); + + + flow_218 + flow_219 + System.out.println("step 218"); + + + flow_219 + flow_220 + System.out.println("step 219"); + + + flow_220 + flow_221 + System.out.println("step 220"); + + + flow_221 + flow_222 + System.out.println("step 221"); + + + flow_222 + flow_223 + System.out.println("step 222"); + + + flow_223 + flow_224 + System.out.println("step 223"); + + + flow_224 + flow_225 + System.out.println("step 224"); + + + flow_225 + flow_226 + System.out.println("step 225"); + + + flow_226 + flow_227 + System.out.println("step 226"); + + + flow_227 + flow_228 + System.out.println("step 227"); + + + flow_228 + flow_229 + System.out.println("step 228"); + + + flow_229 + flow_230 + System.out.println("step 229"); + + + flow_230 + flow_231 + System.out.println("step 230"); + + + flow_231 + flow_232 + System.out.println("step 231"); + + + flow_232 + flow_233 + System.out.println("step 232"); + + + flow_233 + flow_234 + System.out.println("step 233"); + + + flow_234 + flow_235 + System.out.println("step 234"); + + + flow_235 + flow_236 + System.out.println("step 235"); + + + flow_236 + flow_237 + System.out.println("step 236"); + + + flow_237 + flow_238 + System.out.println("step 237"); + + + flow_238 + flow_239 + System.out.println("step 238"); + + + flow_239 + flow_240 + System.out.println("step 239"); + + + flow_240 + flow_241 + System.out.println("step 240"); + + + flow_241 + flow_242 + System.out.println("step 241"); + + + flow_242 + flow_243 + System.out.println("step 242"); + + + flow_243 + flow_244 + System.out.println("step 243"); + + + flow_244 + flow_245 + System.out.println("step 244"); + + + flow_245 + flow_246 + System.out.println("step 245"); + + + flow_246 + flow_247 + System.out.println("step 246"); + + + flow_247 + flow_248 + System.out.println("step 247"); + + + flow_248 + flow_249 + System.out.println("step 248"); + + + flow_249 + flow_250 + System.out.println("step 249"); + + + flow_250 + flow_251 + System.out.println("step 250"); + + + flow_251 + flow_252 + System.out.println("step 251"); + + + flow_252 + flow_253 + System.out.println("step 252"); + + + flow_253 + flow_254 + System.out.println("step 253"); + + + flow_254 + flow_255 + System.out.println("step 254"); + + + flow_255 + flow_256 + System.out.println("step 255"); + + + flow_256 + flow_257 + System.out.println("step 256"); + + + flow_257 + flow_258 + System.out.println("step 257"); + + + flow_258 + flow_259 + System.out.println("step 258"); + + + flow_259 + flow_260 + System.out.println("step 259"); + + + flow_260 + flow_261 + System.out.println("step 260"); + + + flow_261 + flow_262 + System.out.println("step 261"); + + + flow_262 + flow_263 + System.out.println("step 262"); + + + flow_263 + flow_264 + System.out.println("step 263"); + + + flow_264 + flow_265 + System.out.println("step 264"); + + + flow_265 + flow_266 + System.out.println("step 265"); + + + flow_266 + flow_267 + System.out.println("step 266"); + + + flow_267 + flow_268 + System.out.println("step 267"); + + + flow_268 + flow_269 + System.out.println("step 268"); + + + flow_269 + flow_270 + System.out.println("step 269"); + + + flow_270 + flow_271 + System.out.println("step 270"); + + + flow_271 + flow_272 + System.out.println("step 271"); + + + flow_272 + flow_273 + System.out.println("step 272"); + + + flow_273 + flow_274 + System.out.println("step 273"); + + + flow_274 + flow_275 + System.out.println("step 274"); + + + flow_275 + flow_276 + System.out.println("step 275"); + + + flow_276 + flow_277 + System.out.println("step 276"); + + + flow_277 + flow_278 + System.out.println("step 277"); + + + flow_278 + flow_279 + System.out.println("step 278"); + + + flow_279 + flow_280 + System.out.println("step 279"); + + + flow_280 + flow_281 + System.out.println("step 280"); + + + flow_281 + flow_282 + System.out.println("step 281"); + + + flow_282 + flow_283 + System.out.println("step 282"); + + + flow_283 + flow_284 + System.out.println("step 283"); + + + flow_284 + flow_285 + System.out.println("step 284"); + + + flow_285 + flow_286 + System.out.println("step 285"); + + + flow_286 + flow_287 + System.out.println("step 286"); + + + flow_287 + flow_288 + System.out.println("step 287"); + + + flow_288 + flow_289 + System.out.println("step 288"); + + + flow_289 + flow_290 + System.out.println("step 289"); + + + flow_290 + flow_291 + System.out.println("step 290"); + + + flow_291 + flow_292 + System.out.println("step 291"); + + + flow_292 + flow_293 + System.out.println("step 292"); + + + flow_293 + flow_294 + System.out.println("step 293"); + + + flow_294 + flow_295 + System.out.println("step 294"); + + + flow_295 + flow_296 + System.out.println("step 295"); + + + flow_296 + flow_297 + System.out.println("step 296"); + + + flow_297 + flow_298 + System.out.println("step 297"); + + + flow_298 + flow_299 + System.out.println("step 298"); + + + flow_299 + flow_300 + System.out.println("step 299"); + + + flow_300 + flow_301 + System.out.println("step 300"); + + + flow_301 + flow_302 + System.out.println("step 301"); + + + flow_302 + flow_303 + System.out.println("step 302"); + + + flow_303 + flow_304 + System.out.println("step 303"); + + + flow_304 + flow_305 + System.out.println("step 304"); + + + flow_305 + flow_306 + System.out.println("step 305"); + + + flow_306 + flow_307 + System.out.println("step 306"); + + + flow_307 + flow_308 + System.out.println("step 307"); + + + flow_308 + flow_309 + System.out.println("step 308"); + + + flow_309 + flow_310 + System.out.println("step 309"); + + + flow_310 + flow_311 + System.out.println("step 310"); + + + flow_311 + flow_312 + System.out.println("step 311"); + + + flow_312 + flow_313 + System.out.println("step 312"); + + + flow_313 + flow_314 + System.out.println("step 313"); + + + flow_314 + flow_315 + System.out.println("step 314"); + + + flow_315 + flow_316 + System.out.println("step 315"); + + + flow_316 + flow_317 + System.out.println("step 316"); + + + flow_317 + flow_318 + System.out.println("step 317"); + + + flow_318 + flow_319 + System.out.println("step 318"); + + + flow_319 + flow_320 + System.out.println("step 319"); + + + flow_320 + flow_321 + System.out.println("step 320"); + + + flow_321 + flow_322 + System.out.println("step 321"); + + + flow_322 + flow_323 + System.out.println("step 322"); + + + flow_323 + flow_324 + System.out.println("step 323"); + + + flow_324 + flow_325 + System.out.println("step 324"); + + + flow_325 + flow_326 + System.out.println("step 325"); + + + flow_326 + flow_327 + System.out.println("step 326"); + + + flow_327 + flow_328 + System.out.println("step 327"); + + + flow_328 + flow_329 + System.out.println("step 328"); + + + flow_329 + flow_330 + System.out.println("step 329"); + + + flow_330 + flow_331 + System.out.println("step 330"); + + + flow_331 + flow_332 + System.out.println("step 331"); + + + flow_332 + flow_333 + System.out.println("step 332"); + + + flow_333 + flow_334 + System.out.println("step 333"); + + + flow_334 + flow_335 + System.out.println("step 334"); + + + flow_335 + flow_336 + System.out.println("step 335"); + + + flow_336 + flow_337 + System.out.println("step 336"); + + + flow_337 + flow_338 + System.out.println("step 337"); + + + flow_338 + flow_339 + System.out.println("step 338"); + + + flow_339 + flow_340 + System.out.println("step 339"); + + + flow_340 + flow_341 + System.out.println("step 340"); + + + flow_341 + flow_342 + System.out.println("step 341"); + + + flow_342 + flow_343 + System.out.println("step 342"); + + + flow_343 + flow_344 + System.out.println("step 343"); + + + flow_344 + flow_345 + System.out.println("step 344"); + + + flow_345 + flow_346 + System.out.println("step 345"); + + + flow_346 + flow_347 + System.out.println("step 346"); + + + flow_347 + flow_348 + System.out.println("step 347"); + + + flow_348 + flow_349 + System.out.println("step 348"); + + + flow_349 + flow_350 + System.out.println("step 349"); + + + flow_350 + flow_351 + System.out.println("step 350"); + + + flow_351 + flow_352 + System.out.println("step 351"); + + + flow_352 + flow_353 + System.out.println("step 352"); + + + flow_353 + flow_354 + System.out.println("step 353"); + + + flow_354 + flow_355 + System.out.println("step 354"); + + + flow_355 + flow_356 + System.out.println("step 355"); + + + flow_356 + flow_357 + System.out.println("step 356"); + + + flow_357 + flow_358 + System.out.println("step 357"); + + + flow_358 + flow_359 + System.out.println("step 358"); + + + flow_359 + flow_360 + System.out.println("step 359"); + + + flow_360 + flow_361 + System.out.println("step 360"); + + + flow_361 + flow_362 + System.out.println("step 361"); + + + flow_362 + flow_363 + System.out.println("step 362"); + + + flow_363 + flow_364 + System.out.println("step 363"); + + + flow_364 + flow_365 + System.out.println("step 364"); + + + flow_365 + flow_366 + System.out.println("step 365"); + + + flow_366 + flow_367 + System.out.println("step 366"); + + + flow_367 + flow_368 + System.out.println("step 367"); + + + flow_368 + flow_369 + System.out.println("step 368"); + + + flow_369 + flow_370 + System.out.println("step 369"); + + + flow_370 + flow_371 + System.out.println("step 370"); + + + flow_371 + flow_372 + System.out.println("step 371"); + + + flow_372 + flow_373 + System.out.println("step 372"); + + + flow_373 + flow_374 + System.out.println("step 373"); + + + flow_374 + flow_375 + System.out.println("step 374"); + + + flow_375 + flow_376 + System.out.println("step 375"); + + + flow_376 + flow_377 + System.out.println("step 376"); + + + flow_377 + flow_378 + System.out.println("step 377"); + + + flow_378 + flow_379 + System.out.println("step 378"); + + + flow_379 + flow_380 + System.out.println("step 379"); + + + flow_380 + flow_381 + System.out.println("step 380"); + + + flow_381 + flow_382 + System.out.println("step 381"); + + + flow_382 + flow_383 + System.out.println("step 382"); + + + flow_383 + flow_384 + System.out.println("step 383"); + + + flow_384 + flow_385 + System.out.println("step 384"); + + + flow_385 + flow_386 + System.out.println("step 385"); + + + flow_386 + flow_387 + System.out.println("step 386"); + + + flow_387 + flow_388 + System.out.println("step 387"); + + + flow_388 + flow_389 + System.out.println("step 388"); + + + flow_389 + flow_390 + System.out.println("step 389"); + + + flow_390 + flow_391 + System.out.println("step 390"); + + + flow_391 + flow_392 + System.out.println("step 391"); + + + flow_392 + flow_393 + System.out.println("step 392"); + + + flow_393 + flow_394 + System.out.println("step 393"); + + + flow_394 + flow_395 + System.out.println("step 394"); + + + flow_395 + flow_396 + System.out.println("step 395"); + + + flow_396 + flow_397 + System.out.println("step 396"); + + + flow_397 + flow_398 + System.out.println("step 397"); + + + flow_398 + flow_399 + System.out.println("step 398"); + + + flow_399 + flow_400 + System.out.println("step 399"); + + + flow_400 + flow_401 + System.out.println("step 400"); + + + flow_401 + flow_402 + System.out.println("step 401"); + + + flow_402 + flow_403 + System.out.println("step 402"); + + + flow_403 + flow_404 + System.out.println("step 403"); + + + flow_404 + flow_405 + System.out.println("step 404"); + + + flow_405 + flow_406 + System.out.println("step 405"); + + + flow_406 + flow_407 + System.out.println("step 406"); + + + flow_407 + flow_408 + System.out.println("step 407"); + + + flow_408 + flow_409 + System.out.println("step 408"); + + + flow_409 + flow_410 + System.out.println("step 409"); + + + flow_410 + flow_411 + System.out.println("step 410"); + + + flow_411 + flow_412 + System.out.println("step 411"); + + + flow_412 + flow_413 + System.out.println("step 412"); + + + flow_413 + flow_414 + System.out.println("step 413"); + + + flow_414 + flow_415 + System.out.println("step 414"); + + + flow_415 + flow_416 + System.out.println("step 415"); + + + flow_416 + flow_417 + System.out.println("step 416"); + + + flow_417 + flow_418 + System.out.println("step 417"); + + + flow_418 + flow_419 + System.out.println("step 418"); + + + flow_419 + flow_420 + System.out.println("step 419"); + + + flow_420 + flow_421 + System.out.println("step 420"); + + + flow_421 + flow_422 + System.out.println("step 421"); + + + flow_422 + flow_423 + System.out.println("step 422"); + + + flow_423 + flow_424 + System.out.println("step 423"); + + + flow_424 + flow_425 + System.out.println("step 424"); + + + flow_425 + flow_426 + System.out.println("step 425"); + + + flow_426 + flow_427 + System.out.println("step 426"); + + + flow_427 + flow_428 + System.out.println("step 427"); + + + flow_428 + flow_429 + System.out.println("step 428"); + + + flow_429 + flow_430 + System.out.println("step 429"); + + + flow_430 + flow_431 + System.out.println("step 430"); + + + flow_431 + flow_432 + System.out.println("step 431"); + + + flow_432 + flow_433 + System.out.println("step 432"); + + + flow_433 + flow_434 + System.out.println("step 433"); + + + flow_434 + flow_435 + System.out.println("step 434"); + + + flow_435 + flow_436 + System.out.println("step 435"); + + + flow_436 + flow_437 + System.out.println("step 436"); + + + flow_437 + flow_438 + System.out.println("step 437"); + + + flow_438 + flow_439 + System.out.println("step 438"); + + + flow_439 + flow_440 + System.out.println("step 439"); + + + flow_440 + flow_441 + System.out.println("step 440"); + + + flow_441 + flow_442 + System.out.println("step 441"); + + + flow_442 + flow_443 + System.out.println("step 442"); + + + flow_443 + flow_444 + System.out.println("step 443"); + + + flow_444 + flow_445 + System.out.println("step 444"); + + + flow_445 + flow_446 + System.out.println("step 445"); + + + flow_446 + flow_447 + System.out.println("step 446"); + + + flow_447 + flow_448 + System.out.println("step 447"); + + + flow_448 + flow_449 + System.out.println("step 448"); + + + flow_449 + flow_450 + System.out.println("step 449"); + + + flow_450 + flow_451 + System.out.println("step 450"); + + + flow_451 + flow_452 + System.out.println("step 451"); + + + flow_452 + flow_453 + System.out.println("step 452"); + + + flow_453 + flow_454 + System.out.println("step 453"); + + + flow_454 + flow_455 + System.out.println("step 454"); + + + flow_455 + flow_456 + System.out.println("step 455"); + + + flow_456 + flow_457 + System.out.println("step 456"); + + + flow_457 + flow_458 + System.out.println("step 457"); + + + flow_458 + flow_459 + System.out.println("step 458"); + + + flow_459 + flow_460 + System.out.println("step 459"); + + + flow_460 + flow_461 + System.out.println("step 460"); + + + flow_461 + flow_462 + System.out.println("step 461"); + + + flow_462 + flow_463 + System.out.println("step 462"); + + + flow_463 + flow_464 + System.out.println("step 463"); + + + flow_464 + flow_465 + System.out.println("step 464"); + + + flow_465 + flow_466 + System.out.println("step 465"); + + + flow_466 + flow_467 + System.out.println("step 466"); + + + flow_467 + flow_468 + System.out.println("step 467"); + + + flow_468 + flow_469 + System.out.println("step 468"); + + + flow_469 + flow_470 + System.out.println("step 469"); + + + flow_470 + flow_471 + System.out.println("step 470"); + + + flow_471 + flow_472 + System.out.println("step 471"); + + + flow_472 + flow_473 + System.out.println("step 472"); + + + flow_473 + flow_474 + System.out.println("step 473"); + + + flow_474 + flow_475 + System.out.println("step 474"); + + + flow_475 + flow_476 + System.out.println("step 475"); + + + flow_476 + flow_477 + System.out.println("step 476"); + + + flow_477 + flow_478 + System.out.println("step 477"); + + + flow_478 + flow_479 + System.out.println("step 478"); + + + flow_479 + flow_480 + System.out.println("step 479"); + + + flow_480 + flow_481 + System.out.println("step 480"); + + + flow_481 + flow_482 + System.out.println("step 481"); + + + flow_482 + flow_483 + System.out.println("step 482"); + + + flow_483 + flow_484 + System.out.println("step 483"); + + + flow_484 + flow_485 + System.out.println("step 484"); + + + flow_485 + flow_486 + System.out.println("step 485"); + + + flow_486 + flow_487 + System.out.println("step 486"); + + + flow_487 + flow_488 + System.out.println("step 487"); + + + flow_488 + flow_489 + System.out.println("step 488"); + + + flow_489 + flow_490 + System.out.println("step 489"); + + + flow_490 + flow_491 + System.out.println("step 490"); + + + flow_491 + flow_492 + System.out.println("step 491"); + + + flow_492 + flow_493 + System.out.println("step 492"); + + + flow_493 + flow_494 + System.out.println("step 493"); + + + flow_494 + flow_495 + System.out.println("step 494"); + + + flow_495 + flow_496 + System.out.println("step 495"); + + + flow_496 + flow_497 + System.out.println("step 496"); + + + flow_497 + flow_498 + System.out.println("step 497"); + + + flow_498 + flow_499 + System.out.println("step 498"); + + + flow_499 + flow_500 + System.out.println("step 499"); + + + flow_500 + flow_501 + System.out.println("step 500"); + + + flow_501 + flow_502 + System.out.println("step 501"); + + + flow_502 + flow_503 + System.out.println("step 502"); + + + flow_503 + flow_504 + System.out.println("step 503"); + + + flow_504 + flow_505 + System.out.println("step 504"); + + + flow_505 + flow_506 + System.out.println("step 505"); + + + flow_506 + flow_507 + System.out.println("step 506"); + + + flow_507 + flow_508 + System.out.println("step 507"); + + + flow_508 + flow_509 + System.out.println("step 508"); + + + flow_509 + flow_510 + System.out.println("step 509"); + + + flow_510 + flow_511 + System.out.println("step 510"); + + + flow_511 + flow_512 + System.out.println("step 511"); + + + flow_512 + flow_513 + System.out.println("step 512"); + + + flow_513 + flow_514 + System.out.println("step 513"); + + + flow_514 + flow_515 + System.out.println("step 514"); + + + flow_515 + flow_516 + System.out.println("step 515"); + + + flow_516 + flow_517 + System.out.println("step 516"); + + + flow_517 + flow_518 + System.out.println("step 517"); + + + flow_518 + flow_519 + System.out.println("step 518"); + + + flow_519 + flow_520 + System.out.println("step 519"); + + + flow_520 + flow_521 + System.out.println("step 520"); + + + flow_521 + flow_522 + System.out.println("step 521"); + + + flow_522 + flow_523 + System.out.println("step 522"); + + + flow_523 + flow_524 + System.out.println("step 523"); + + + flow_524 + flow_525 + System.out.println("step 524"); + + + flow_525 + flow_526 + System.out.println("step 525"); + + + flow_526 + flow_527 + System.out.println("step 526"); + + + flow_527 + flow_528 + System.out.println("step 527"); + + + flow_528 + flow_529 + System.out.println("step 528"); + + + flow_529 + flow_530 + System.out.println("step 529"); + + + flow_530 + flow_531 + System.out.println("step 530"); + + + flow_531 + flow_532 + System.out.println("step 531"); + + + flow_532 + flow_533 + System.out.println("step 532"); + + + flow_533 + flow_534 + System.out.println("step 533"); + + + flow_534 + flow_535 + System.out.println("step 534"); + + + flow_535 + flow_536 + System.out.println("step 535"); + + + flow_536 + flow_537 + System.out.println("step 536"); + + + flow_537 + flow_538 + System.out.println("step 537"); + + + flow_538 + flow_539 + System.out.println("step 538"); + + + flow_539 + flow_540 + System.out.println("step 539"); + + + flow_540 + flow_541 + System.out.println("step 540"); + + + flow_541 + flow_542 + System.out.println("step 541"); + + + flow_542 + flow_543 + System.out.println("step 542"); + + + flow_543 + flow_544 + System.out.println("step 543"); + + + flow_544 + flow_545 + System.out.println("step 544"); + + + flow_545 + flow_546 + System.out.println("step 545"); + + + flow_546 + flow_547 + System.out.println("step 546"); + + + flow_547 + flow_548 + System.out.println("step 547"); + + + flow_548 + flow_549 + System.out.println("step 548"); + + + flow_549 + flow_550 + System.out.println("step 549"); + + + flow_550 + flow_551 + System.out.println("step 550"); + + + flow_551 + flow_552 + System.out.println("step 551"); + + + flow_552 + flow_553 + System.out.println("step 552"); + + + flow_553 + flow_554 + System.out.println("step 553"); + + + flow_554 + flow_555 + System.out.println("step 554"); + + + flow_555 + flow_556 + System.out.println("step 555"); + + + flow_556 + flow_557 + System.out.println("step 556"); + + + flow_557 + flow_558 + System.out.println("step 557"); + + + flow_558 + flow_559 + System.out.println("step 558"); + + + flow_559 + flow_560 + System.out.println("step 559"); + + + flow_560 + flow_561 + System.out.println("step 560"); + + + flow_561 + flow_562 + System.out.println("step 561"); + + + flow_562 + flow_563 + System.out.println("step 562"); + + + flow_563 + flow_564 + System.out.println("step 563"); + + + flow_564 + flow_565 + System.out.println("step 564"); + + + flow_565 + flow_566 + System.out.println("step 565"); + + + flow_566 + flow_567 + System.out.println("step 566"); + + + flow_567 + flow_568 + System.out.println("step 567"); + + + flow_568 + flow_569 + System.out.println("step 568"); + + + flow_569 + flow_570 + System.out.println("step 569"); + + + flow_570 + flow_571 + System.out.println("step 570"); + + + flow_571 + flow_572 + System.out.println("step 571"); + + + flow_572 + flow_573 + System.out.println("step 572"); + + + flow_573 + flow_574 + System.out.println("step 573"); + + + flow_574 + flow_575 + System.out.println("step 574"); + + + flow_575 + flow_576 + System.out.println("step 575"); + + + flow_576 + flow_577 + System.out.println("step 576"); + + + flow_577 + flow_578 + System.out.println("step 577"); + + + flow_578 + flow_579 + System.out.println("step 578"); + + + flow_579 + flow_580 + System.out.println("step 579"); + + + flow_580 + flow_581 + System.out.println("step 580"); + + + flow_581 + flow_582 + System.out.println("step 581"); + + + flow_582 + flow_583 + System.out.println("step 582"); + + + flow_583 + flow_584 + System.out.println("step 583"); + + + flow_584 + flow_585 + System.out.println("step 584"); + + + flow_585 + flow_586 + System.out.println("step 585"); + + + flow_586 + flow_587 + System.out.println("step 586"); + + + flow_587 + flow_588 + System.out.println("step 587"); + + + flow_588 + flow_589 + System.out.println("step 588"); + + + flow_589 + flow_590 + System.out.println("step 589"); + + + flow_590 + flow_591 + System.out.println("step 590"); + + + flow_591 + flow_592 + System.out.println("step 591"); + + + flow_592 + flow_593 + System.out.println("step 592"); + + + flow_593 + flow_594 + System.out.println("step 593"); + + + flow_594 + flow_595 + System.out.println("step 594"); + + + flow_595 + flow_596 + System.out.println("step 595"); + + + flow_596 + flow_597 + System.out.println("step 596"); + + + flow_597 + flow_598 + System.out.println("step 597"); + + + flow_598 + flow_599 + System.out.println("step 598"); + + + flow_599 + flow_600 + System.out.println("step 599"); + + + flow_600 + flow_601 + System.out.println("step 600"); + + + flow_601 + flow_602 + System.out.println("step 601"); + + + flow_602 + flow_603 + System.out.println("step 602"); + + + flow_603 + flow_604 + System.out.println("step 603"); + + + flow_604 + flow_605 + System.out.println("step 604"); + + + flow_605 + flow_606 + System.out.println("step 605"); + + + flow_606 + flow_607 + System.out.println("step 606"); + + + flow_607 + flow_608 + System.out.println("step 607"); + + + flow_608 + flow_609 + System.out.println("step 608"); + + + flow_609 + flow_610 + System.out.println("step 609"); + + + flow_610 + flow_611 + System.out.println("step 610"); + + + flow_611 + flow_612 + System.out.println("step 611"); + + + flow_612 + flow_613 + System.out.println("step 612"); + + + flow_613 + flow_614 + System.out.println("step 613"); + + + flow_614 + flow_615 + System.out.println("step 614"); + + + flow_615 + flow_616 + System.out.println("step 615"); + + + flow_616 + flow_617 + System.out.println("step 616"); + + + flow_617 + flow_618 + System.out.println("step 617"); + + + flow_618 + flow_619 + System.out.println("step 618"); + + + flow_619 + flow_620 + System.out.println("step 619"); + + + flow_620 + flow_621 + System.out.println("step 620"); + + + flow_621 + flow_622 + System.out.println("step 621"); + + + flow_622 + flow_623 + System.out.println("step 622"); + + + flow_623 + flow_624 + System.out.println("step 623"); + + + flow_624 + flow_625 + System.out.println("step 624"); + + + flow_625 + flow_626 + System.out.println("step 625"); + + + flow_626 + flow_627 + System.out.println("step 626"); + + + flow_627 + flow_628 + System.out.println("step 627"); + + + flow_628 + flow_629 + System.out.println("step 628"); + + + flow_629 + flow_630 + System.out.println("step 629"); + + + flow_630 + flow_631 + System.out.println("step 630"); + + + flow_631 + flow_632 + System.out.println("step 631"); + + + flow_632 + flow_633 + System.out.println("step 632"); + + + flow_633 + flow_634 + System.out.println("step 633"); + + + flow_634 + flow_635 + System.out.println("step 634"); + + + flow_635 + flow_636 + System.out.println("step 635"); + + + flow_636 + flow_637 + System.out.println("step 636"); + + + flow_637 + flow_638 + System.out.println("step 637"); + + + flow_638 + flow_639 + System.out.println("step 638"); + + + flow_639 + flow_640 + System.out.println("step 639"); + + + flow_640 + flow_641 + System.out.println("step 640"); + + + flow_641 + flow_642 + System.out.println("step 641"); + + + flow_642 + flow_643 + System.out.println("step 642"); + + + flow_643 + flow_644 + System.out.println("step 643"); + + + flow_644 + flow_645 + System.out.println("step 644"); + + + flow_645 + flow_646 + System.out.println("step 645"); + + + flow_646 + flow_647 + System.out.println("step 646"); + + + flow_647 + flow_648 + System.out.println("step 647"); + + + flow_648 + flow_649 + System.out.println("step 648"); + + + flow_649 + flow_650 + System.out.println("step 649"); + + + flow_650 + flow_651 + System.out.println("step 650"); + + + flow_651 + flow_652 + System.out.println("step 651"); + + + flow_652 + flow_653 + System.out.println("step 652"); + + + flow_653 + flow_654 + System.out.println("step 653"); + + + flow_654 + flow_655 + System.out.println("step 654"); + + + flow_655 + flow_656 + System.out.println("step 655"); + + + flow_656 + flow_657 + System.out.println("step 656"); + + + flow_657 + flow_658 + System.out.println("step 657"); + + + flow_658 + flow_659 + System.out.println("step 658"); + + + flow_659 + flow_660 + System.out.println("step 659"); + + + flow_660 + flow_661 + System.out.println("step 660"); + + + flow_661 + flow_662 + System.out.println("step 661"); + + + flow_662 + flow_663 + System.out.println("step 662"); + + + flow_663 + flow_664 + System.out.println("step 663"); + + + flow_664 + flow_665 + System.out.println("step 664"); + + + flow_665 + flow_666 + System.out.println("step 665"); + + + flow_666 + flow_667 + System.out.println("step 666"); + + + flow_667 + flow_668 + System.out.println("step 667"); + + + flow_668 + flow_669 + System.out.println("step 668"); + + + flow_669 + flow_670 + System.out.println("step 669"); + + + flow_670 + flow_671 + System.out.println("step 670"); + + + flow_671 + flow_672 + System.out.println("step 671"); + + + flow_672 + flow_673 + System.out.println("step 672"); + + + flow_673 + flow_674 + System.out.println("step 673"); + + + flow_674 + flow_675 + System.out.println("step 674"); + + + flow_675 + flow_676 + System.out.println("step 675"); + + + flow_676 + flow_677 + System.out.println("step 676"); + + + flow_677 + flow_678 + System.out.println("step 677"); + + + flow_678 + flow_679 + System.out.println("step 678"); + + + flow_679 + flow_680 + System.out.println("step 679"); + + + flow_680 + flow_681 + System.out.println("step 680"); + + + flow_681 + flow_682 + System.out.println("step 681"); + + + flow_682 + flow_683 + System.out.println("step 682"); + + + flow_683 + flow_684 + System.out.println("step 683"); + + + flow_684 + flow_685 + System.out.println("step 684"); + + + flow_685 + flow_686 + System.out.println("step 685"); + + + flow_686 + flow_687 + System.out.println("step 686"); + + + flow_687 + flow_688 + System.out.println("step 687"); + + + flow_688 + flow_689 + System.out.println("step 688"); + + + flow_689 + flow_690 + System.out.println("step 689"); + + + flow_690 + flow_691 + System.out.println("step 690"); + + + flow_691 + flow_692 + System.out.println("step 691"); + + + flow_692 + flow_693 + System.out.println("step 692"); + + + flow_693 + flow_694 + System.out.println("step 693"); + + + flow_694 + flow_695 + System.out.println("step 694"); + + + flow_695 + flow_696 + System.out.println("step 695"); + + + flow_696 + flow_697 + System.out.println("step 696"); + + + flow_697 + flow_698 + System.out.println("step 697"); + + + flow_698 + flow_699 + System.out.println("step 698"); + + + flow_699 + flow_700 + System.out.println("step 699"); + + + flow_700 + flow_701 + System.out.println("step 700"); + + + flow_701 + flow_702 + System.out.println("step 701"); + + + flow_702 + flow_703 + System.out.println("step 702"); + + + flow_703 + flow_704 + System.out.println("step 703"); + + + flow_704 + flow_705 + System.out.println("step 704"); + + + flow_705 + flow_706 + System.out.println("step 705"); + + + flow_706 + flow_707 + System.out.println("step 706"); + + + flow_707 + flow_708 + System.out.println("step 707"); + + + flow_708 + flow_709 + System.out.println("step 708"); + + + flow_709 + flow_710 + System.out.println("step 709"); + + + flow_710 + flow_711 + System.out.println("step 710"); + + + flow_711 + flow_712 + System.out.println("step 711"); + + + flow_712 + flow_713 + System.out.println("step 712"); + + + flow_713 + flow_714 + System.out.println("step 713"); + + + flow_714 + flow_715 + System.out.println("step 714"); + + + flow_715 + flow_716 + System.out.println("step 715"); + + + flow_716 + flow_717 + System.out.println("step 716"); + + + flow_717 + flow_718 + System.out.println("step 717"); + + + flow_718 + flow_719 + System.out.println("step 718"); + + + flow_719 + flow_720 + System.out.println("step 719"); + + + flow_720 + flow_721 + System.out.println("step 720"); + + + flow_721 + flow_722 + System.out.println("step 721"); + + + flow_722 + flow_723 + System.out.println("step 722"); + + + flow_723 + flow_724 + System.out.println("step 723"); + + + flow_724 + flow_725 + System.out.println("step 724"); + + + flow_725 + flow_726 + System.out.println("step 725"); + + + flow_726 + flow_727 + System.out.println("step 726"); + + + flow_727 + flow_728 + System.out.println("step 727"); + + + flow_728 + flow_729 + System.out.println("step 728"); + + + flow_729 + flow_730 + System.out.println("step 729"); + + + flow_730 + flow_731 + System.out.println("step 730"); + + + flow_731 + flow_732 + System.out.println("step 731"); + + + flow_732 + flow_733 + System.out.println("step 732"); + + + flow_733 + flow_734 + System.out.println("step 733"); + + + flow_734 + flow_735 + System.out.println("step 734"); + + + flow_735 + flow_736 + System.out.println("step 735"); + + + flow_736 + flow_737 + System.out.println("step 736"); + + + flow_737 + flow_738 + System.out.println("step 737"); + + + flow_738 + flow_739 + System.out.println("step 738"); + + + flow_739 + flow_740 + System.out.println("step 739"); + + + flow_740 + flow_741 + System.out.println("step 740"); + + + flow_741 + flow_742 + System.out.println("step 741"); + + + flow_742 + flow_743 + System.out.println("step 742"); + + + flow_743 + flow_744 + System.out.println("step 743"); + + + flow_744 + flow_745 + System.out.println("step 744"); + + + flow_745 + flow_746 + System.out.println("step 745"); + + + flow_746 + flow_747 + System.out.println("step 746"); + + + flow_747 + flow_748 + System.out.println("step 747"); + + + flow_748 + flow_749 + System.out.println("step 748"); + + + flow_749 + flow_750 + System.out.println("step 749"); + + + flow_750 + flow_751 + System.out.println("step 750"); + + + flow_751 + flow_752 + System.out.println("step 751"); + + + flow_752 + flow_753 + System.out.println("step 752"); + + + flow_753 + flow_754 + System.out.println("step 753"); + + + flow_754 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kogito-jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessToExecModelGenerator.java b/kogito-jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessToExecModelGenerator.java index 1692b928f539..5d02f100e4e7 100644 --- a/kogito-jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessToExecModelGenerator.java +++ b/kogito-jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessToExecModelGenerator.java @@ -114,7 +114,7 @@ public ProcessMetaData generate(WorkflowProcess process) { .asString() .equals("process")); - processVisitor.visitProcess(process, processMethod.get(), metadata); + processVisitor.visitProcess(process, processClazz, processMethod.get(), metadata); metadata.setGeneratedClassModel(parsedClazzFile); return metadata; diff --git a/kogito-jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessVisitor.java b/kogito-jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessVisitor.java index 0883e0d0ec53..995bf6a07c45 100644 --- a/kogito-jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessVisitor.java +++ b/kogito-jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ProcessVisitor.java @@ -53,7 +53,10 @@ import org.kie.api.definition.process.WorkflowProcess; import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcess; +import com.github.javaparser.ast.Modifier; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.expr.AssignExpr; import com.github.javaparser.ast.expr.BooleanLiteralExpr; import com.github.javaparser.ast.expr.Expression; @@ -84,6 +87,13 @@ public class ProcessVisitor extends AbstractVisitor { public static final String DEFAULT_VERSION = "1.0"; + private static final String INIT_VARIABLES_METHOD_NAME = "initVariables"; + private static final String INIT_METADATA_METHOD_NAME = "initMetadata"; + private static final String INIT_NODES_METHOD_NAME = "initNodes"; + private static final String INIT_CONNECTIONS_METHOD_NAME = "initConnections"; + + private static final int NODE_CHUNK_STATEMENT_THRESHOLD = 1500; + private NodeVisitorBuilderService nodeVisitorService; private ReturnValueEvaluatorBuilderService returnValueEvaluatorBuilderService; @@ -93,12 +103,12 @@ public ProcessVisitor(ClassLoader contextClassLoader) { returnValueEvaluatorBuilderService = ReturnValueEvaluatorBuilderService.instance(contextClassLoader); } - public void visitProcess(WorkflowProcess process, MethodDeclaration processMethod, ProcessMetaData metadata) { - BlockStmt body = new BlockStmt(); - processMethod.setBody(body); - + public void visitProcess(WorkflowProcess process, ClassOrInterfaceDeclaration processClazz, MethodDeclaration processMethod, ProcessMetaData metadata) { ClassOrInterfaceType processFactoryType = new ClassOrInterfaceType(null, RuleFlowProcessFactory.class.getSimpleName()); + BlockStmt processBody = new BlockStmt(); + processMethod.setBody(processBody); + // create local variable factory and assign new fluent process to it VariableDeclarationExpr factoryField = new VariableDeclarationExpr(processFactoryType, FACTORY_FIELD_NAME); MethodCallExpr assignFactoryMethod = new MethodCallExpr(new NameExpr(processFactoryType.getName().asString()), "createProcess"); @@ -106,20 +116,20 @@ public void visitProcess(WorkflowProcess process, MethodDeclaration processMetho if (process instanceof org.jbpm.workflow.core.WorkflowProcess) { assignFactoryMethod.addArgument(new BooleanLiteralExpr(((org.jbpm.workflow.core.WorkflowProcess) process).isAutoComplete())); } - - body.addStatement(new AssignExpr(factoryField, assignFactoryMethod, AssignExpr.Operator.ASSIGN)); + processBody.addStatement(new AssignExpr(factoryField, assignFactoryMethod, AssignExpr.Operator.ASSIGN)); // item definitions + BlockStmt variablesBody = new BlockStmt(); Set visitedVariables = new HashSet<>(); VariableScope variableScope = (VariableScope) ((org.jbpm.process.core.Process) process).getDefaultContext(VariableScope.VARIABLE_SCOPE); - visitVariableScope(FACTORY_FIELD_NAME, variableScope, body, visitedVariables, metadata.getProcessClassName()); - visitSubVariableScopes(process.getNodes(), body, visitedVariables); + visitVariableScope(FACTORY_FIELD_NAME, variableScope, variablesBody, visitedVariables, metadata.getProcessClassName()); + visitSubVariableScopes(process.getNodes(), variablesBody, visitedVariables); if (process instanceof org.jbpm.workflow.core.WorkflowProcess) { org.jbpm.workflow.core.WorkflowProcess processImpl = (org.jbpm.workflow.core.WorkflowProcess) process; if (processImpl.getExpressionLanguage() != null) { - body.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, "expressionLanguage", new StringLiteralExpr(processImpl.getExpressionLanguage()))); + variablesBody.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, "expressionLanguage", new StringLiteralExpr(processImpl.getExpressionLanguage()))); } } @@ -127,7 +137,8 @@ public void visitProcess(WorkflowProcess process, MethodDeclaration processMetho metadata.setDynamic(((org.jbpm.workflow.core.WorkflowProcess) process).isDynamic()); // the process itself - body.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, METHOD_NAME, new StringLiteralExpr(process.getName()))) + BlockStmt metadataBody = new BlockStmt(); + metadataBody.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, METHOD_NAME, new StringLiteralExpr(process.getName()))) .addStatement(getFactoryMethod(FACTORY_FIELD_NAME, METHOD_PACKAGE_NAME, new StringLiteralExpr(process.getPackageName()))) .addStatement(getFactoryMethod(FACTORY_FIELD_NAME, METHOD_DYNAMIC, new BooleanLiteralExpr(metadata.isDynamic()))) .addStatement(getFactoryMethod(FACTORY_FIELD_NAME, METHOD_VERSION, new StringLiteralExpr(getOrDefault(process.getVersion(), DEFAULT_VERSION)))) @@ -136,28 +147,69 @@ public void visitProcess(WorkflowProcess process, MethodDeclaration processMetho new StringLiteralExpr(getOrDefault(((KogitoWorkflowProcess) process).getVisibility(), KogitoWorkflowProcess.PUBLIC_VISIBILITY)))); ((org.jbpm.workflow.core.WorkflowProcess) process).getInputValidator().ifPresent( - v -> body.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, "inputValidator", ExpressionUtils.getLiteralExpr(v)))); + v -> metadataBody.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, "inputValidator", ExpressionUtils.getLiteralExpr(v)))); ((org.jbpm.workflow.core.WorkflowProcess) process).getOutputValidator().ifPresent( - v -> body.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, "outputValidator", ExpressionUtils.getLiteralExpr(v)))); + v -> metadataBody.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, "outputValidator", ExpressionUtils.getLiteralExpr(v)))); - visitMetaData(process.getMetaData(), body, FACTORY_FIELD_NAME); - visitCollaboration(process, body); - visitCompensationScope(process, body); - visitHeader(process, body); + visitMetaData(process.getMetaData(), metadataBody, FACTORY_FIELD_NAME); + visitCollaboration(process, metadataBody); + visitCompensationScope(process, metadataBody); + visitHeader(process, metadataBody); List processNodes = new ArrayList<>(); for (org.kie.api.definition.process.Node procNode : process.getNodes()) { processNodes.add((Node) procNode); } - visitNodes(processNodes, body, variableScope, metadata); + List nodeChunks = visitNodes(processNodes, variableScope, metadata); + //exception scope - visitExceptionScope(process, body); - visitConnections(process.getNodes(), body); + BlockStmt connectionsBody = new BlockStmt(); + visitExceptionScope(process, connectionsBody); + visitConnections(process.getNodes(), connectionsBody); - body.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, METHOD_VALIDATE)); + addPhaseMethod(processClazz, processFactoryType, INIT_VARIABLES_METHOD_NAME, variablesBody); + addPhaseMethod(processClazz, processFactoryType, INIT_METADATA_METHOD_NAME, metadataBody); + emitInitNodes(processClazz, processFactoryType, nodeChunks); + addPhaseMethod(processClazz, processFactoryType, INIT_CONNECTIONS_METHOD_NAME, connectionsBody); + + processBody.addStatement(phaseMethodCallStatement(INIT_VARIABLES_METHOD_NAME)); + processBody.addStatement(phaseMethodCallStatement(INIT_METADATA_METHOD_NAME)); + processBody.addStatement(phaseMethodCallStatement(INIT_NODES_METHOD_NAME)); + processBody.addStatement(phaseMethodCallStatement(INIT_CONNECTIONS_METHOD_NAME)); + + processBody.addStatement(getFactoryMethod(FACTORY_FIELD_NAME, METHOD_VALIDATE)); MethodCallExpr getProcessMethod = new MethodCallExpr(new NameExpr(FACTORY_FIELD_NAME), "getProcess"); - body.addStatement(new ReturnStmt(getProcessMethod)); + processBody.addStatement(new ReturnStmt(getProcessMethod)); + } + + private void addPhaseMethod(ClassOrInterfaceDeclaration processClazz, ClassOrInterfaceType processFactoryType, String name, BlockStmt body) { + MethodDeclaration method = processClazz.addMethod(name, Modifier.Keyword.PRIVATE, Modifier.Keyword.STATIC); + method.addParameter(new Parameter(processFactoryType, FACTORY_FIELD_NAME)); + method.setBody(body); + } + + private MethodCallExpr phaseMethodCallStatement(String name) { + MethodCallExpr call = new MethodCallExpr(null, name); + call.addArgument(new NameExpr(FACTORY_FIELD_NAME)); + return call; + } + + private void emitInitNodes(ClassOrInterfaceDeclaration processClazz, ClassOrInterfaceType processFactoryType, List nodeChunks) { + if (nodeChunks.size() == 1) { + addPhaseMethod(processClazz, processFactoryType, INIT_NODES_METHOD_NAME, nodeChunks.get(0)); + return; + } + + BlockStmt dispatcherBody = new BlockStmt(); + for (int i = 0; i < nodeChunks.size(); i++) { + String chunkMethodName = INIT_NODES_METHOD_NAME + "_" + i; + addPhaseMethod(processClazz, processFactoryType, chunkMethodName, nodeChunks.get(i)); + dispatcherBody.addStatement(phaseMethodCallStatement(chunkMethodName)); + } + MethodDeclaration dispatcher = processClazz.addMethod(INIT_NODES_METHOD_NAME, Modifier.Keyword.PRIVATE, Modifier.Keyword.STATIC); + dispatcher.addParameter(new Parameter(processFactoryType, FACTORY_FIELD_NAME)); + dispatcher.setBody(dispatcherBody); } private void visitCollaboration(WorkflowProcess process, BlockStmt body) { @@ -223,15 +275,28 @@ private void visitHeader(WorkflowProcess process, BlockStmt body) { } } - private void visitNodes(List nodes, BlockStmt body, VariableScope variableScope, ProcessMetaData metadata) { + private List visitNodes(List nodes, VariableScope variableScope, ProcessMetaData metadata) { + List chunks = new ArrayList<>(); + BlockStmt currentChunk = new BlockStmt(); + chunks.add(currentChunk); + for (U node : nodes) { @SuppressWarnings("unchecked") AbstractNodeVisitor visitor = (AbstractNodeVisitor) this.nodeVisitorService.findNodeVisitor(node.getClass()); if (visitor == null) { throw new IllegalStateException("No visitor found for node " + node.getClass().getName()); } - visitor.visitNodeEntryPoint(null, node, body, variableScope, metadata); + visitor.visitNodeEntryPoint(null, node, currentChunk, variableScope, metadata); + + if (currentChunk.getStatements().size() >= NODE_CHUNK_STATEMENT_THRESHOLD) { + currentChunk = new BlockStmt(); + chunks.add(currentChunk); + } + } + if (chunks.size() > 1 && chunks.get(chunks.size() - 1).getStatements().isEmpty()) { + chunks.remove(chunks.size() - 1); } + return chunks; } @SuppressWarnings("unchecked")