diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..65a05197
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.keras filter=lfs diff=lfs merge=lfs -text
diff --git a/.run/NNFormatLTSPSamplesBuilderKt.run.xml b/.run/NNFormatLTSPSamplesBuilderKt.run.xml
new file mode 100644
index 00000000..f6d47c15
--- /dev/null
+++ b/.run/NNFormatLTSPSamplesBuilderKt.run.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/RunCodegenOnTest.run.xml b/.run/RunCodegenOnTest.run.xml
index a8ca5b41..9fb38eca 100644
--- a/.run/RunCodegenOnTest.run.xml
+++ b/.run/RunCodegenOnTest.run.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/cgen-console/src/main/kotlin/ce/entrypoints/BuildProject.kt b/cgen-console/src/main/kotlin/ce/entrypoints/BuildProject.kt
index 86e2fb07..11bd8343 100644
--- a/cgen-console/src/main/kotlin/ce/entrypoints/BuildProject.kt
+++ b/cgen-console/src/main/kotlin/ce/entrypoints/BuildProject.kt
@@ -16,6 +16,7 @@ import kotlin.script.experimental.jsr223.KotlinJsr223DefaultScriptEngineFactory
fun main(args: Array) {
var needToStoreInTree = false
var needToStoreOutTree = false
+ var needToStoreOutTreeFormatted = false
var projectFile = ""
val it = args.iterator()
@@ -23,6 +24,7 @@ fun main(args: Array) {
when (it.next()) {
"--project" -> projectFile = it.next()
"--storeOutTree" -> needToStoreOutTree = true
+ "--storeOutTreeFormatted" -> needToStoreOutTreeFormatted = true
"--storeInTree" -> needToStoreInTree = true
}
}
@@ -54,6 +56,10 @@ fun main(args: Array) {
val dir = DirsConfiguration(
workingDir = File(".").absolutePath
)
- buildProjectUseCase(projectFile, needToStoreInTree, needToStoreOutTree,
- dir)
+ buildProjectUseCase(
+ projectFile = projectFile,
+ writeInTree = needToStoreInTree,
+ writeOutTree = needToStoreOutTree,
+ writeOutTreeFormated = needToStoreOutTreeFormatted,
+ dirsConfiguration = dir)
}
diff --git a/cgen-lib/src/main/kotlin/ce/domain/usecase/entry/BuildProjectUseCase.kt b/cgen-lib/src/main/kotlin/ce/domain/usecase/entry/BuildProjectUseCase.kt
index e63e3ff5..65a15a06 100644
--- a/cgen-lib/src/main/kotlin/ce/domain/usecase/entry/BuildProjectUseCase.kt
+++ b/cgen-lib/src/main/kotlin/ce/domain/usecase/entry/BuildProjectUseCase.kt
@@ -23,7 +23,8 @@ class BuildProjectUseCase(
operator fun invoke(projectFile: String,
writeInTree: Boolean = false,
writeOutTree : Boolean = false,
- dirsConfiguration: DirsConfiguration) {
+ dirsConfiguration: DirsConfiguration,
+ writeOutTreeFormated: Boolean = false) {
val project : Project = getProjectUseCase(projectFile, dirsConfiguration)
val codeStyleRepo = CodestyleRepoImpl(project)
val reportsRepo = ReportsRepoImpl()
@@ -31,7 +32,8 @@ class BuildProjectUseCase(
val generatorsRepo = GeneratorsRepo(
project = project,
codestylesRepo = codeStyleRepo)
- val writtersRepo = WrittersRepoImpl(codestylesRepo = codeStyleRepo,
+ val writersRepo = WrittersRepoImpl(
+ codestylesRepo = codeStyleRepo,
reportsRepo = reportsRepo
)
@@ -48,7 +50,10 @@ class BuildProjectUseCase(
codeFormatter = generatorsRepo.getFormatter(target.type)
)
val codeStyleTree = prepareCodeStyleTreeUseCase.prepareCodeStyleTree(outTree)
- writtersRepo.getWritter(target).write(codeStyleTree)
+ if (writeOutTreeFormated) {
+ storeOutTreeUseCase(target.outputFolder + "output_tree_formatted_${target.type.name}.xml", codeStyleTree)
+ }
+ writersRepo.getWritter(target).write(codeStyleTree)
}
}
}
\ No newline at end of file
diff --git a/cgen-lib/src/main/kotlin/ce/treeio/TreeReader.kt b/cgen-lib/src/main/kotlin/ce/treeio/TreeReader.kt
index 9b777971..f1c99c87 100644
--- a/cgen-lib/src/main/kotlin/ce/treeio/TreeReader.kt
+++ b/cgen-lib/src/main/kotlin/ce/treeio/TreeReader.kt
@@ -2,7 +2,23 @@ package ce.treeio
import generators.obj.abstractSyntaxTree.Leaf
+/**
+ * Interface for reading a tree structure from a file or a string.
+ */
interface TreeReader {
+ /**
+ * Loads the tree structure from the specified file path.
+ *
+ * @param filePath The path of the file from which the tree will be loaded.
+ * @return The loaded tree structure as a Leaf object.
+ */
fun load(filePath: String): Leaf
+
+ /**
+ * Loads the tree structure from the given string data.
+ *
+ * @param data The string data from which the tree will be loaded.
+ * @return The loaded tree structure as a Leaf object.
+ */
fun loadFromString(data: String): Leaf
}
\ No newline at end of file
diff --git a/cgen-lib/src/main/kotlin/ce/treeio/TreeWritter.kt b/cgen-lib/src/main/kotlin/ce/treeio/TreeWritter.kt
index b0167842..0bcfd615 100644
--- a/cgen-lib/src/main/kotlin/ce/treeio/TreeWritter.kt
+++ b/cgen-lib/src/main/kotlin/ce/treeio/TreeWritter.kt
@@ -2,6 +2,15 @@ package ce.treeio
import generators.obj.abstractSyntaxTree.Leaf
+/**
+ * Interface for writing a tree structure to a file.
+ */
interface TreeWritter {
+ /**
+ * Stores the given tree structure to the specified file path.
+ *
+ * @param filePath The path of the file where the tree will be stored.
+ * @param tree The tree structure to store.
+ */
fun storeTree(filePath: String, tree: Leaf)
}
\ No newline at end of file
diff --git a/cgen-lib/src/main/kotlin/generators/cpp/CppClasses.kt b/cgen-lib/src/main/kotlin/generators/cpp/CppClasses.kt
index d3b4f9c0..3d175de6 100644
--- a/cgen-lib/src/main/kotlin/generators/cpp/CppClasses.kt
+++ b/cgen-lib/src/main/kotlin/generators/cpp/CppClasses.kt
@@ -21,12 +21,6 @@ data class CppHeaderFile(
override var isDirty: Boolean = false
) : FileData {
- init {
- addSub(CompilerDirective("pragma once"))
- addSub(ImportsBlock())
- isDirty = false
- }
-
override fun copyLeaf(parent: Node?, copySubs: Boolean) =
this.copyNodeExt(parent, copySubs) { this.copy(subs = mutableListOf()).apply { subs.clear() }}
@@ -44,11 +38,6 @@ data class CppFileData(
override var isDirty: Boolean = false
) : FileData {
- init {
- addSub(ImportsBlock())
- isDirty = false
- }
-
override fun toString(): String = name
override fun copyLeaf(parent: Node?, copySubs: Boolean) =
diff --git a/cgen-lib/src/main/kotlin/generators/cpp/CppFileGenerator.kt b/cgen-lib/src/main/kotlin/generators/cpp/CppFileGenerator.kt
index 95599146..f7dac709 100644
--- a/cgen-lib/src/main/kotlin/generators/cpp/CppFileGenerator.kt
+++ b/cgen-lib/src/main/kotlin/generators/cpp/CppFileGenerator.kt
@@ -2,17 +2,33 @@ package generators.cpp
import generators.obj.CLikeFileGenerator
import generators.obj.abstractSyntaxTree.Block
+import generators.obj.abstractSyntaxTree.addSub
import generators.obj.syntaxParseTree.FileData
+import generators.obj.syntaxParseTree.ImportsBlock
import generators.obj.syntaxParseTree.OutputTree
+import generators.obj.syntaxParseTree.FileMetaInformation
class CppFileGenerator() : CLikeFileGenerator() {
- override fun createFile(project: OutputTree, outputFile: String, block: Block): List {
+ override fun createFile(
+ project: OutputTree,
+ workingDirectory: String,
+ packageDirectory: String,
+ outputFile: String,
+ block: Block
+ ): List {
return listOf(
CppFileData(outputFile + ".cpp").apply {
setParent2(project)
+ addSub(FileMetaInformation(workingDirectory))
+ addSub(ImportsBlock())
+ isDirty = false
},
CppHeaderFile(outputFile + ".h").apply {
setParent2(project)
+ addSub(FileMetaInformation(workingDirectory))
+ addSub(CompilerDirective("pragma once"))
+ addSub(ImportsBlock())
+ isDirty = false
}
)
}
diff --git a/cgen-lib/src/main/kotlin/generators/cpp/CppWritter.kt b/cgen-lib/src/main/kotlin/generators/cpp/CppWritter.kt
index d32d36d3..f19f48fe 100644
--- a/cgen-lib/src/main/kotlin/generators/cpp/CppWritter.kt
+++ b/cgen-lib/src/main/kotlin/generators/cpp/CppWritter.kt
@@ -14,6 +14,7 @@ import generators.obj.syntaxParseTree.ImportLeaf
import generators.obj.syntaxParseTree.NamespaceBlock
import generators.obj.syntaxParseTree.OutBlock
import generators.obj.syntaxParseTree.OutBlockArguments
+import generators.obj.syntaxParseTree.FileMetaInformation
import java.io.File
class CppWritter(
@@ -33,6 +34,7 @@ class CppWritter(
out.write("#include \"${leaf.name}\"")
}
}
+
else -> super.writeLeaf(leaf, out, indent)
}
}
@@ -62,7 +64,9 @@ class CppWritter(
reportsRepo.loge("No data to write ${fileData.name}")
return
}
- val outputFile = File(fileData.name)
+ val fileMetaInformation = fileData.findOrNull(FileMetaInformation::class.java)?.name
+ ?: throw IllegalStateException("No working directory found in fileData ${fileData.name}")
+ val outputFile = File(fileMetaInformation + "/" + fileData.name)
outputFile.parentFile.mkdirs()
reportsRepo.logi("Writing $outputFile")
outputFile.bufferedWriter().use { out ->
diff --git a/cgen-lib/src/main/kotlin/generators/java/JavaFileGenerator.kt b/cgen-lib/src/main/kotlin/generators/java/JavaFileGenerator.kt
index 369d4805..37b14b29 100644
--- a/cgen-lib/src/main/kotlin/generators/java/JavaFileGenerator.kt
+++ b/cgen-lib/src/main/kotlin/generators/java/JavaFileGenerator.kt
@@ -9,23 +9,35 @@ import generators.obj.syntaxParseTree.FileDataImpl
import generators.obj.syntaxParseTree.ImportsBlock
import generators.obj.syntaxParseTree.NamespaceDeclaration
import generators.obj.syntaxParseTree.OutputTree
+import generators.obj.syntaxParseTree.FileMetaInformation
import java.io.File
class JavaFileGenerator() : CLikeFileGenerator() {
- override fun createFile(project: OutputTree, outputFile: String, block: Block): List {
+ override fun createFile(
+ project: OutputTree,
+ workingDirectory: String,
+ packageDirectory: String,
+ outputFile: String,
+ block: Block
+ ): List {
return listOf(FileDataImpl(outputFile).apply {
setParent2(project)
+ addSub(FileMetaInformation(workingDirectory))
addSub(NamespaceDeclaration(block.getParentPath()))
addSub(ImportsBlock())
})
}
- override fun getBlockFilePath(block: Block): String {
+ override fun getBlockFilePath(block: Block): BlockPath {
var fileName = block.name
if (block.outputFile.isNotEmpty()) {
fileName = block.outputFile
}
val namespace = block.getParentPath().replace('.', File.separatorChar)
- return block.objectBaseFolder + File.separatorChar + namespace + File.separatorChar + fileName
+ return BlockPath(
+ baseObjectDirecotry = block.objectBaseFolder,
+ namespacePath = namespace,
+ fileName = fileName
+ )
}
}
\ No newline at end of file
diff --git a/cgen-lib/src/main/kotlin/generators/java/JavaWritter.kt b/cgen-lib/src/main/kotlin/generators/java/JavaWritter.kt
index 8e35f946..f00285fc 100644
--- a/cgen-lib/src/main/kotlin/generators/java/JavaWritter.kt
+++ b/cgen-lib/src/main/kotlin/generators/java/JavaWritter.kt
@@ -7,10 +7,12 @@ import ce.repository.ReportsRepo
import generators.obj.Writter
import generators.obj.abstractSyntaxTree.Leaf
import generators.obj.abstractSyntaxTree.Node
+import generators.obj.abstractSyntaxTree.findOrNull
import generators.obj.syntaxParseTree.FileData
import generators.obj.syntaxParseTree.ImportLeaf
import generators.obj.syntaxParseTree.NamespaceDeclaration
import generators.obj.syntaxParseTree.OutBlock
+import generators.obj.syntaxParseTree.FileMetaInformation
import java.io.File
class JavaWritter(
@@ -20,7 +22,9 @@ class JavaWritter(
: Writter(codeStyleRepo, outputFolder) {
override fun writeFile(fileData: FileData) {
- val outputFile = File(fileData.name + ".java")
+ val fileMetaInformation = fileData.findOrNull(FileMetaInformation::class.java)?.name ?:
+ throw IllegalStateException("No working directory found in fileData ${fileData.name}")
+ val outputFile = File(fileMetaInformation + "/" + fileData.name + ".java")
outputFile.parentFile.mkdirs()
reportsRepo.logi("Writing $outputFile")
outputFile.bufferedWriter().use { out ->
diff --git a/cgen-lib/src/main/kotlin/generators/kotlin/KotlinFileGenerator.kt b/cgen-lib/src/main/kotlin/generators/kotlin/KotlinFileGenerator.kt
index e42ab1a9..76191e52 100644
--- a/cgen-lib/src/main/kotlin/generators/kotlin/KotlinFileGenerator.kt
+++ b/cgen-lib/src/main/kotlin/generators/kotlin/KotlinFileGenerator.kt
@@ -11,12 +11,25 @@ import generators.obj.syntaxParseTree.Keyword
import generators.obj.syntaxParseTree.NamespaceDeclaration
import generators.obj.syntaxParseTree.OutputTree
import generators.obj.syntaxParseTree.VariableName
+import generators.obj.syntaxParseTree.FileMetaInformation
+import generators.obj.syntaxParseTree.PackageDirectory
+import generators.obj.syntaxParseTree.WorkingDirectory
import java.io.File
class KotlinFileGenerator() : CLikeFileGenerator() {
- override fun createFile(project: OutputTree, outputFile: String, block: Block): List {
+ override fun createFile(
+ project: OutputTree,
+ workingDirectory: String,
+ packageDirectory: String,
+ outputFile: String,
+ block: Block
+ ): List {
return listOf(FileDataImpl(outputFile).apply {
setParent2(project)
+ addSub(FileMetaInformation("").apply {
+ addSub(WorkingDirectory(workingDirectory))
+ addSub(PackageDirectory(packageDirectory))
+ })
addSub(NamespaceDeclaration("").apply {
addSub(Keyword("package"))
addSub(VariableName(block.getParentPath()))
@@ -25,12 +38,16 @@ class KotlinFileGenerator() : CLikeFileGenerator() {
})
}
- override fun getBlockFilePath(block: Block): String {
+ override fun getBlockFilePath(block: Block): BlockPath {
var fileName = "${block.name}"
if (block.outputFile.isNotEmpty()) {
fileName = "${block.outputFile}"
}
val namespace = block.getParentPath().replace('.', File.separatorChar)
- return block.objectBaseFolder + File.separatorChar + namespace + File.separatorChar + fileName
+ return BlockPath(
+ baseObjectDirecotry = block.objectBaseFolder,
+ namespacePath = namespace,
+ fileName = fileName
+ )
}
}
\ No newline at end of file
diff --git a/cgen-lib/src/main/kotlin/generators/kotlin/KotlinWriter.kt b/cgen-lib/src/main/kotlin/generators/kotlin/KotlinWriter.kt
index 759acc21..0c1fd3ed 100644
--- a/cgen-lib/src/main/kotlin/generators/kotlin/KotlinWriter.kt
+++ b/cgen-lib/src/main/kotlin/generators/kotlin/KotlinWriter.kt
@@ -9,19 +9,31 @@ import generators.obj.abstractSyntaxTree.Leaf
import generators.obj.abstractSyntaxTree.Method
import generators.obj.abstractSyntaxTree.Node
import generators.obj.abstractSyntaxTree.findOrNull
+import generators.obj.abstractSyntaxTree.findParent
import generators.obj.abstractSyntaxTree.removeSub
import generators.obj.syntaxParseTree.FileData
import generators.obj.syntaxParseTree.ImportLeaf
import generators.obj.syntaxParseTree.NamespaceDeclaration
import generators.obj.syntaxParseTree.OutBlock
import generators.obj.syntaxParseTree.ResultLeaf
+import generators.obj.syntaxParseTree.FileMetaInformation
+import generators.obj.syntaxParseTree.PackageDirectory
+import generators.obj.syntaxParseTree.WorkingDirectory
import java.io.File
class KotlinWriter(codeStyleRepo: CodeStyleRepo, outputFolder: String)
: Writter(codeStyleRepo, outputFolder) {
override fun writeFile(fileData: FileData) {
- val outputFile = File(fileData.name + ".kt")
+ val fileMetaInformation = fileData.findOrNull(FileMetaInformation::class.java) ?:
+ throw IllegalStateException("No working directory found in fileData ${fileData.name}")
+ val workingDirectory = fileMetaInformation.findOrNull(WorkingDirectory::class.java)?.name ?:
+ throw IllegalStateException("No working directory found in fileData ${fileData.name}")
+ val packageDirectory = fileMetaInformation.findOrNull(PackageDirectory::class.java)?.name ?:
+ throw IllegalStateException("No working directory found in fileData ${fileData.name}")
+ val outputFile = File(workingDirectory + File.separator +
+ packageDirectory + File.separator +
+ fileData.name + ".kt")
outputFile.parentFile.mkdirs()
println("KotlinWriter writing ${outputFile.absolutePath}")
outputFile.bufferedWriter().use { out ->
diff --git a/cgen-lib/src/main/kotlin/generators/obj/CLikeFileGenerator.kt b/cgen-lib/src/main/kotlin/generators/obj/CLikeFileGenerator.kt
index af632ec3..807db1f5 100644
--- a/cgen-lib/src/main/kotlin/generators/obj/CLikeFileGenerator.kt
+++ b/cgen-lib/src/main/kotlin/generators/obj/CLikeFileGenerator.kt
@@ -5,12 +5,16 @@ import java.io.File
abstract class CLikeFileGenerator() : FileGenerator() {
- override fun getBlockFilePath(block: Block): String {
+ override fun getBlockFilePath(block: Block): BlockPath {
var fileName = "${block.name}"
if (block.outputFile.isNotEmpty()) {
fileName = "${block.outputFile}"
}
// val namespace = block.namespace.replace('.', File.separatorChar)
- return block.objectBaseFolder + File.separatorChar + fileName
+ return BlockPath(
+ baseObjectDirecotry = block.objectBaseFolder,
+ namespacePath = "",
+ fileName = fileName
+ )
}
}
\ No newline at end of file
diff --git a/cgen-lib/src/main/kotlin/generators/obj/FileGenerator.kt b/cgen-lib/src/main/kotlin/generators/obj/FileGenerator.kt
index 4221ec67..0295c674 100644
--- a/cgen-lib/src/main/kotlin/generators/obj/FileGenerator.kt
+++ b/cgen-lib/src/main/kotlin/generators/obj/FileGenerator.kt
@@ -5,7 +5,19 @@ import generators.obj.syntaxParseTree.FileData
import generators.obj.syntaxParseTree.OutputTree
abstract class FileGenerator() {
- abstract fun createFile(project: OutputTree, outputFile: String, block: Block): List
+ data class BlockPath(
+ val baseObjectDirecotry: String = "",
+ val namespacePath: String = "",
+ val fileName: String =""
+ )
- abstract fun getBlockFilePath(block: Block): String
+ abstract fun createFile(
+ project: OutputTree,
+ workingDirectory: String,
+ packageDirectory: String,
+ outputFile: String,
+ block: Block
+ ): List
+
+ abstract fun getBlockFilePath(block: Block): BlockPath
}
\ No newline at end of file
diff --git a/cgen-lib/src/main/kotlin/generators/obj/MetaGenerator.kt b/cgen-lib/src/main/kotlin/generators/obj/MetaGenerator.kt
index 1970f39f..66c56d85 100644
--- a/cgen-lib/src/main/kotlin/generators/obj/MetaGenerator.kt
+++ b/cgen-lib/src/main/kotlin/generators/obj/MetaGenerator.kt
@@ -14,7 +14,7 @@ open class MetaGenerator(
) {
- private fun translateTree(root: Node, files: Map>) {
+ private fun translateTree(root: Node, files: Map>) {
root.subs.forEach {
if (it is Block) {
val outputFile = fileGenerator.getBlockFilePath(it)
diff --git a/cgen-lib/src/main/kotlin/generators/obj/PrepareFilesListUseCase.kt b/cgen-lib/src/main/kotlin/generators/obj/PrepareFilesListUseCase.kt
index ec4c5051..e017e189 100644
--- a/cgen-lib/src/main/kotlin/generators/obj/PrepareFilesListUseCase.kt
+++ b/cgen-lib/src/main/kotlin/generators/obj/PrepareFilesListUseCase.kt
@@ -10,30 +10,36 @@ import java.nio.file.Paths
import javax.inject.Inject
interface PrepareFilesListUseCase {
- operator fun invoke(root: Node, projectOut: OutputTree): Map>
+ operator fun invoke(root: Node, projectOut: OutputTree): Map>
}
class PrepareFilesListUseCaseImpl @Inject constructor(
private val project: Project,
private val fileGenerator: FileGenerator,
) : PrepareFilesListUseCase {
- override fun invoke(root: Node, projectOut: OutputTree): Map> {
- val files = mutableMapOf>()
+ override fun invoke(root: Node, projectOut: OutputTree): Map> {
+ val files = mutableMapOf>()
prepareFilesByTree(projectOut, root, files)
return files
}
- private fun prepareFilesByTree(projectOut: OutputTree, root: Node, files: MutableMap>) {
+ private fun prepareFilesByTree(projectOut: OutputTree, root: Node, files: MutableMap>) {
root.subs.forEach {
if (it is Block) {
val outputFile = fileGenerator.getBlockFilePath(it)
if (!files.contains(outputFile)) {
- val fullFileName = project.dirsConfiguration.workingDir + File.separator + outputFile
- val listOfFiles = fileGenerator.createFile(projectOut, fullFileName, it)
+ val listOfFiles = fileGenerator.createFile(projectOut,
+ workingDirectory = project.dirsConfiguration.workingDir + File.separator + outputFile.baseObjectDirecotry,
+ packageDirectory = outputFile.namespacePath,
+ outputFile = outputFile.fileName,
+ block = it)
listOfFiles.forEach { fileData ->
projectOut.addSub(fileData)
if (project.addAutogeneratedCommentNotification) {
- val fileObject = File(outputFile).canonicalFile
+ val fullPath = project.dirsConfiguration.workingDir + File.separator +
+ outputFile.baseObjectDirecotry + File.separator +
+ outputFile.namespacePath + File.separator + outputFile.fileName
+ val fileObject = File(fullPath).canonicalFile
val pathAbsolute = Paths.get(it.sourceFile)
val pathBase = Paths.get(fileObject.absolutePath)
val pathRelative = pathBase.relativize(pathAbsolute)
diff --git a/cgen-lib/src/main/kotlin/generators/obj/Writter.kt b/cgen-lib/src/main/kotlin/generators/obj/Writter.kt
index a7fc6a1f..330379a0 100644
--- a/cgen-lib/src/main/kotlin/generators/obj/Writter.kt
+++ b/cgen-lib/src/main/kotlin/generators/obj/Writter.kt
@@ -20,6 +20,7 @@ import generators.obj.syntaxParseTree.ResultLeaf
import generators.obj.syntaxParseTree.Separator
import generators.obj.syntaxParseTree.Space
import generators.obj.syntaxParseTree.VariableName
+import generators.obj.syntaxParseTree.FileMetaInformation
import java.io.File
abstract class Writter(val codeStyleRepo: CodeStyleRepo,
@@ -83,6 +84,9 @@ abstract class Writter(val codeStyleRepo: CodeStyleRepo,
open fun writeNode(node: Node, out: CodeWriter, indent: String) {
when (node) {
+ is FileMetaInformation -> {
+ // do nothing, this is just meta info
+ }
is EnumNode, is RValue, is Constructor -> {
out.write(node.name)
writeSubNodes(node, out, indent)
diff --git a/cgen-lib/src/main/kotlin/generators/obj/syntaxParseTree/FileData.kt b/cgen-lib/src/main/kotlin/generators/obj/syntaxParseTree/FileData.kt
index 29bbe4f0..079088a7 100644
--- a/cgen-lib/src/main/kotlin/generators/obj/syntaxParseTree/FileData.kt
+++ b/cgen-lib/src/main/kotlin/generators/obj/syntaxParseTree/FileData.kt
@@ -8,10 +8,40 @@ interface FileData: Node {
var isDirty: Boolean
}
+data class FileMetaInformation(
+ override val name: String,
+ override val subs: MutableList = mutableListOf(),
+): Node {
+ var parent: Node? = null
+ override fun copyLeaf(parent: Node?, copySubs: Boolean): FileMetaInformation =
+ this.copyLeafExt(parent, { this.copy(subs = mutableListOf()) })
+ override fun getParent2(): Node? = parent
+ override fun setParent2(parent: Node?) { this.parent = parent }
+}
+
+data class WorkingDirectory(
+ override val name: String,
+): Leaf {
+ var parent: Node? = null
+ override fun copyLeaf(parent: Node?, copySubs: Boolean): Leaf = this.copyLeafExt(parent) { WorkingDirectory(name) }
+ override fun getParent2(): Node? = parent
+ override fun setParent2(parent: Node?) { this.parent = parent }
+}
+
+data class PackageDirectory(
+ override val name: String,
+): Leaf {
+ var parent: Node? = null
+ override fun copyLeaf(parent: Node?, copySubs: Boolean): Leaf = this.copyLeafExt(parent) { PackageDirectory(name) }
+ override fun getParent2(): Node? = parent
+ override fun setParent2(parent: Node?) { this.parent = parent }
+}
+
+
data class FileDataImpl(
override val name: String,
override val subs: MutableList = mutableListOf(),
- override var isDirty: Boolean = false
+ override var isDirty: Boolean = false,
) : FileData {
override fun toString(): String = name
diff --git a/cgen-lib/src/main/kotlin/generators/rust/RustFileGenerator.kt b/cgen-lib/src/main/kotlin/generators/rust/RustFileGenerator.kt
index 1d932ccb..6af742b6 100644
--- a/cgen-lib/src/main/kotlin/generators/rust/RustFileGenerator.kt
+++ b/cgen-lib/src/main/kotlin/generators/rust/RustFileGenerator.kt
@@ -2,25 +2,38 @@ package generators.rust
import generators.obj.CLikeFileGenerator
import generators.obj.abstractSyntaxTree.Block
+import generators.obj.abstractSyntaxTree.addSub
import generators.obj.abstractSyntaxTree.getParentPath
import generators.obj.syntaxParseTree.FileData
import generators.obj.syntaxParseTree.FileDataImpl
import generators.obj.syntaxParseTree.OutputTree
+import generators.obj.syntaxParseTree.FileMetaInformation
import java.io.File
class RustFileGenerator() : CLikeFileGenerator() {
- override fun createFile(project: OutputTree, outputFile: String, block: Block): List {
+ override fun createFile(
+ project: OutputTree,
+ workingDirectory: String,
+ packageDirectory: String,
+ outputFile: String,
+ block: Block
+ ): List {
return listOf(FileDataImpl(outputFile).apply {
setParent2(project)
+ addSub(FileMetaInformation(workingDirectory))
})
}
- override fun getBlockFilePath(block: Block): String {
+ override fun getBlockFilePath(block: Block): BlockPath {
var fileName = "${block.name}"
if (block.outputFile.isNotEmpty()) {
fileName = "${block.outputFile}"
}
val namespace = block.getParentPath().replace('.', File.separatorChar)
- return block.objectBaseFolder + File.separatorChar + namespace + File.separatorChar + fileName
+ return BlockPath(
+ baseObjectDirecotry = block.objectBaseFolder,
+ namespacePath = namespace,
+ fileName = fileName
+ )
}
}
\ No newline at end of file
diff --git a/cgen-lib/src/main/kotlin/generators/swift/SwiftFileGenerator.kt b/cgen-lib/src/main/kotlin/generators/swift/SwiftFileGenerator.kt
index 49f6fc68..8e5048f9 100644
--- a/cgen-lib/src/main/kotlin/generators/swift/SwiftFileGenerator.kt
+++ b/cgen-lib/src/main/kotlin/generators/swift/SwiftFileGenerator.kt
@@ -2,14 +2,24 @@ package generators.swift
import generators.obj.CLikeFileGenerator
import generators.obj.abstractSyntaxTree.Block
+import generators.obj.abstractSyntaxTree.addSub
import generators.obj.syntaxParseTree.FileData
import generators.obj.syntaxParseTree.FileDataImpl
import generators.obj.syntaxParseTree.OutputTree
+import generators.obj.syntaxParseTree.FileMetaInformation
+import generators.obj.syntaxParseTree.PackageDirectory
class SwiftFileGenerator() : CLikeFileGenerator() {
- override fun createFile(project: OutputTree, outputFile: String, block: Block): List {
+ override fun createFile(
+ project: OutputTree,
+ workingDirectory: String,
+ packageDirectory: String,
+ outputFile: String,
+ block: Block
+ ): List {
return listOf(FileDataImpl(outputFile).apply {
setParent2(project)
+ addSub(FileMetaInformation(workingDirectory))
})
}
}
\ No newline at end of file
diff --git a/cgen-lib/src/test/java/ce/formatters/cxx/CodeFormatterUseCaseImplTest.kt b/cgen-lib/src/test/java/ce/formatters/cxx/CodeFormatterUseCaseImplTest.kt
index ad0be98e..c088dac6 100644
--- a/cgen-lib/src/test/java/ce/formatters/cxx/CodeFormatterUseCaseImplTest.kt
+++ b/cgen-lib/src/test/java/ce/formatters/cxx/CodeFormatterUseCaseImplTest.kt
@@ -1,10 +1,13 @@
package ce.formatters.cxx
import ce.defs.Target
+import ce.defs.target
import ce.formatters.CLikeCodestyleRepo
import ce.formatters.CodeFormatterUseCaseImpl
import ce.settings.CodeStyle
+import generators.cpp.CppFileGenerator
import generators.cpp.CppHeaderFile
+import generators.obj.abstractSyntaxTree.ConstantsEnum
import generators.obj.abstractSyntaxTree.addSub
import generators.obj.syntaxParseTree.NamespaceBlock
import generators.obj.syntaxParseTree.OutputTree
@@ -29,14 +32,23 @@ class CodeFormatterUseCaseImplTest {
@Test
fun testCxxPragma() {
+ val cppFileGenerator = CppFileGenerator()
val formatter = CodeFormatterUseCaseImpl(repo1NL)
- val input = CppHeaderFile("ns1").apply {
- addSub(NamespaceBlock("b"))
- }
+ val input = cppFileGenerator.createFile(
+ project = OutputTree(
+ target = Target.Cpp
+ ),
+ workingDirectory = "/tmp",
+ packageDirectory = "",
+ outputFile = "ns1",
+ block = ConstantsEnum("b")
+ )
+ input[1].addSub(NamespaceBlock("b"))
- val output = formatter(input)
+ val output = formatter(input[1])
// expected result
//
+ // /tmp
//
//
//
@@ -45,8 +57,8 @@ class CodeFormatterUseCaseImplTest {
//
//
//
- Assert.assertEquals(5, output.subs.size)
- Assert.assertEquals(4, (output.subs[3] as NamespaceBlock).subs.size)
+ Assert.assertEquals(6, output.subs.size)
+ Assert.assertEquals(4, (output.subs[4] as NamespaceBlock).subs.size)
}
@Test
diff --git a/cgen-lib/src/test/java/ce/formatters/cxx/FormatInclude.kt b/cgen-lib/src/test/java/ce/formatters/cxx/FormatInclude.kt
index 0daa914d..1c264a3b 100644
--- a/cgen-lib/src/test/java/ce/formatters/cxx/FormatInclude.kt
+++ b/cgen-lib/src/test/java/ce/formatters/cxx/FormatInclude.kt
@@ -22,6 +22,7 @@ import generators.obj.syntaxParseTree.ImportsBlock
import generators.obj.syntaxParseTree.NamespaceBlock
import generators.obj.syntaxParseTree.NlSeparator
import generators.obj.syntaxParseTree.OutputTree
+import generators.obj.syntaxParseTree.FileMetaInformation
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
@@ -74,7 +75,11 @@ class FormatInclude {
add("C")
}
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(
+ projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val headerFile = files.first { it is CppHeaderFile } as CppHeaderFile
cppConstantsBlockGenerator(files, block)
@@ -82,6 +87,7 @@ class FormatInclude {
val output = formatter(headerFile)
// expected output
//
+ //
//
//
// <"">
@@ -89,14 +95,15 @@ class FormatInclude {
//
//
Assertions.assertEquals(CppHeaderFile::class.java, output.javaClass)
- Assertions.assertEquals(5, output.subs.size)
- Assertions.assertEquals(CompilerDirective::class.java, output.subs[0]::class.java)
- Assertions.assertEquals(NlSeparator::class.java, output.subs[1]::class.java)
- Assertions.assertEquals(ImportsBlock::class.java, output.subs[2]::class.java)
- Assertions.assertEquals(NamespaceBlock::class.java, output.subs[3]::class.java)
- Assertions.assertEquals(NlSeparator::class.java, output.subs[4]::class.java)
+ Assertions.assertEquals(6, output.subs.size)
+ Assertions.assertEquals(FileMetaInformation::class.java, output.subs[0]::class.java)
+ Assertions.assertEquals(CompilerDirective::class.java, output.subs[1]::class.java)
+ Assertions.assertEquals(NlSeparator::class.java, output.subs[2]::class.java)
+ Assertions.assertEquals(ImportsBlock::class.java, output.subs[3]::class.java)
+ Assertions.assertEquals(NamespaceBlock::class.java, output.subs[4]::class.java)
+ Assertions.assertEquals(NlSeparator::class.java, output.subs[5]::class.java)
- val importsBlock = output.subs[2] as ImportsBlock
+ val importsBlock = output.subs[3] as ImportsBlock
Assertions.assertEquals(2, importsBlock.subs.size)
}
diff --git a/cgen-lib/src/test/java/ce/formatters/kotlin/KotlinDataClassFormattingTests.kt b/cgen-lib/src/test/java/ce/formatters/kotlin/KotlinDataClassFormattingTests.kt
index eaeaee33..3d704a64 100644
--- a/cgen-lib/src/test/java/ce/formatters/kotlin/KotlinDataClassFormattingTests.kt
+++ b/cgen-lib/src/test/java/ce/formatters/kotlin/KotlinDataClassFormattingTests.kt
@@ -198,10 +198,13 @@ class KotlinDataClassFormattingTests {
val block = namespace.addSub(dataClassDescriptor)
val projectOutput = OutputTree(Target.Kotlin)
- val files = ktFileGenerator.createFile(projectOutput, "a", block)
+ val files = ktFileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
ktDataClassGenerator(files, block)
- val region = mainFile.subs[2] as Region
+ val region = mainFile.subs[3] as Region
val output = formatter(region)
// expected result
diff --git a/cgen-lib/src/test/java/ce/writers/kotlin/KotlinWriterTest.kt b/cgen-lib/src/test/java/ce/writers/kotlin/KotlinWriterTest.kt
index 4033e5c2..6494c57e 100644
--- a/cgen-lib/src/test/java/ce/writers/kotlin/KotlinWriterTest.kt
+++ b/cgen-lib/src/test/java/ce/writers/kotlin/KotlinWriterTest.kt
@@ -75,7 +75,10 @@ class KotlinWriterTest: KotlinBaseTest() {
}
val block = tree.subs.first() as ConstantsEnum
val projectOutput = OutputTree(Target.Kotlin)
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
val process = KotlinEnumGenerator(
addBlockDefaultsUseCase = AddRegionDefaultsUseCaseImpl(repo),
@@ -83,7 +86,7 @@ class KotlinWriterTest: KotlinBaseTest() {
prepareRightValueUseCase = prepareRightValueUseCase
)
process(files, block)
- val inputEnumNode = ((mainFile.subs[2] as Region).subs[0] as OutBlock).subs[1] as EnumNode
+ val inputEnumNode = ((mainFile.subs[3] as Region).subs[0] as OutBlock).subs[1] as EnumNode
val formatedNode = formatter(inputEnumNode)
val buffer = StringBuffer()
diff --git a/cgen-lib/src/test/java/ce/writers/kotlin/WritePackageAndImportsTests.kt b/cgen-lib/src/test/java/ce/writers/kotlin/WritePackageAndImportsTests.kt
index a92494a8..f705d360 100644
--- a/cgen-lib/src/test/java/ce/writers/kotlin/WritePackageAndImportsTests.kt
+++ b/cgen-lib/src/test/java/ce/writers/kotlin/WritePackageAndImportsTests.kt
@@ -34,7 +34,10 @@ class WritePackageAndImportsTests: KotlinBaseTest() {
val block = lastNs.subs.first() as ConstantsBlock
val projectOutput = OutputTree(Target.Kotlin)
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
ktConstantsGenerator(files, block)
val formatted = formatter(input = mainFile)
diff --git a/cgen-lib/src/test/java/generators/cpp/CppConstantsBlockGeneratorTest.kt b/cgen-lib/src/test/java/generators/cpp/CppConstantsBlockGeneratorTest.kt
index 1f70661a..9a53b34e 100644
--- a/cgen-lib/src/test/java/generators/cpp/CppConstantsBlockGeneratorTest.kt
+++ b/cgen-lib/src/test/java/generators/cpp/CppConstantsBlockGeneratorTest.kt
@@ -55,7 +55,10 @@ class CppConstantsBlockGeneratorTest {
add("C")
}
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val headerFile = files.first { it is CppHeaderFile } as CppHeaderFile
val cxxFile = files.first { it is CppFileData } as CppFileData
@@ -64,6 +67,7 @@ class CppConstantsBlockGeneratorTest {
item(files, block)
// expected result
//
+ //
//
//
//
@@ -85,12 +89,12 @@ class CppConstantsBlockGeneratorTest {
Assert.assertTrue("Dirty flag should be true", headerFile.isDirty)
Assert.assertFalse("Dirty flag should be false", cxxFile.isDirty)
- Assert.assertEquals(3, headerFile.subs.size)
- Assert.assertEquals(CompilerDirective::class, headerFile.subs[0]::class)
- Assert.assertEquals(ImportsBlock::class, headerFile.subs[1]::class)
- Assert.assertEquals(NamespaceBlock::class, headerFile.subs[2]::class)
+ Assert.assertEquals(4, headerFile.subs.size)
+ Assert.assertEquals(CompilerDirective::class, headerFile.subs[1]::class)
+ Assert.assertEquals(ImportsBlock::class, headerFile.subs[2]::class)
+ Assert.assertEquals(NamespaceBlock::class, headerFile.subs[3]::class)
- val outNamespace = headerFile.subs[2] as NamespaceBlock
+ val outNamespace = headerFile.subs[3] as NamespaceBlock
Assert.assertEquals(1, outNamespace.subs.size)
val constantsBlock = outNamespace.findOrNull(RegionImpl::class.java)!!
Assert.assertEquals(4, constantsBlock.subs.size)
diff --git a/cgen-lib/src/test/java/generators/java/JavaConstantsGeneratorTest.kt b/cgen-lib/src/test/java/generators/java/JavaConstantsGeneratorTest.kt
index c26ce8c9..2fcea893 100644
--- a/cgen-lib/src/test/java/generators/java/JavaConstantsGeneratorTest.kt
+++ b/cgen-lib/src/test/java/generators/java/JavaConstantsGeneratorTest.kt
@@ -55,12 +55,16 @@ class JavaConstantsGeneratorTest {
val block = lastNs.subs.first() as ConstantsBlock
val projectOutput = OutputTree(Target.Java)
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
item(files, block)
// expected result
//
+ //
//
//
//
@@ -80,9 +84,9 @@ class JavaConstantsGeneratorTest {
//
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(1, region.subs.size)
Assert.assertTrue(region.subs[0] is OutBlock)
val outBlock = region.findOrNull(OutBlock::class.java)!!
diff --git a/cgen-lib/src/test/java/generators/java/JavaDataClassGeneratorTest.kt b/cgen-lib/src/test/java/generators/java/JavaDataClassGeneratorTest.kt
index ccbe7f3d..90e30460 100644
--- a/cgen-lib/src/test/java/generators/java/JavaDataClassGeneratorTest.kt
+++ b/cgen-lib/src/test/java/generators/java/JavaDataClassGeneratorTest.kt
@@ -44,12 +44,16 @@ class JavaDataClassGeneratorTest {
}
val projectOutput = OutputTree(Target.Kotlin)
- val files = ktFileGenerator.createFile(projectOutput, "a", block)
+ val files = ktFileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
item(files, block)
// expected result
//
+ //
//
//
//
@@ -66,9 +70,9 @@ class JavaDataClassGeneratorTest {
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(2, region.subs.size)
Assert.assertTrue(region.subs[0] is CommentsBlock)
Assert.assertTrue(region.subs[1] is OutBlock)
diff --git a/cgen-lib/src/test/java/generators/java/JavaEnumGeneratorTest.kt b/cgen-lib/src/test/java/generators/java/JavaEnumGeneratorTest.kt
index dc7cb238..243e7fe0 100644
--- a/cgen-lib/src/test/java/generators/java/JavaEnumGeneratorTest.kt
+++ b/cgen-lib/src/test/java/generators/java/JavaEnumGeneratorTest.kt
@@ -47,12 +47,16 @@ class JavaEnumGeneratorTest {
val block = tree.subs.first() as ConstantsEnum
val projectOutput = OutputTree(Target.Kotlin)
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
item(files, block)
// expected result
//
+ //
//
//
//
@@ -66,9 +70,9 @@ class JavaEnumGeneratorTest {
//
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(2, region.subs.size)
Assert.assertTrue(region.subs[0] is CommentsBlock)
Assert.assertTrue(region.subs[1] is OutBlock)
diff --git a/cgen-lib/src/test/java/generators/kotlin/KotlinConstantsGeneratorTest.kt b/cgen-lib/src/test/java/generators/kotlin/KotlinConstantsGeneratorTest.kt
index 7348ffca..4b5e3178 100644
--- a/cgen-lib/src/test/java/generators/kotlin/KotlinConstantsGeneratorTest.kt
+++ b/cgen-lib/src/test/java/generators/kotlin/KotlinConstantsGeneratorTest.kt
@@ -48,12 +48,16 @@ class KotlinConstantsGeneratorTest {
val block = lastNs.subs.first() as ConstantsBlock
val projectOutput = OutputTree(Target.Kotlin)
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
item(files, block)
// expected result
//
+ //
//
//
//
@@ -74,9 +78,9 @@ class KotlinConstantsGeneratorTest {
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(1, region.subs.size)
Assert.assertTrue(region.subs[0] is OutBlock)
val outBlock = region.findOrNull(OutBlock::class.java)!!
@@ -112,11 +116,15 @@ class KotlinConstantsGeneratorTest {
val block = lastNs.subs.first() as ConstantsBlock
val projectOutput = OutputTree(Target.Kotlin)
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
item(files, block)
// expected result
//
+ //
//
//
//
@@ -136,9 +144,9 @@ class KotlinConstantsGeneratorTest {
//
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(1, region.subs.size)
Assert.assertTrue(region.subs[0] is OutBlock)
val outBlock = region.subs[0] as OutBlock
diff --git a/cgen-lib/src/test/java/generators/kotlin/KotlinDataClassGeneratorTest.kt b/cgen-lib/src/test/java/generators/kotlin/KotlinDataClassGeneratorTest.kt
index a0d94033..4065c0da 100644
--- a/cgen-lib/src/test/java/generators/kotlin/KotlinDataClassGeneratorTest.kt
+++ b/cgen-lib/src/test/java/generators/kotlin/KotlinDataClassGeneratorTest.kt
@@ -56,12 +56,16 @@ class KotlinDataClassGeneratorTest {
}
val projectOutput = OutputTree(Target.Kotlin)
- val files = ktFileGenerator.createFile(projectOutput, "a", block)
+ val files = ktFileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
ktDataClassGenerator(files, block)
// expected result
//
+ //
//
//
//
@@ -78,9 +82,9 @@ class KotlinDataClassGeneratorTest {
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(2, region.subs.size)
Assert.assertTrue(region.subs[0] is CommentsBlock)
Assert.assertTrue(region.subs[1] is OutBlock)
@@ -120,12 +124,16 @@ class KotlinDataClassGeneratorTest {
val block = namespace.addSub(dataClassDescriptor)
val projectOutput = OutputTree(Target.Kotlin)
- val files = ktFileGenerator.createFile(projectOutput, "a", block)
+ val files = ktFileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
ktDataClassGenerator(files, block)
// expected result
//
+ //
//
//
//
@@ -150,9 +158,9 @@ class KotlinDataClassGeneratorTest {
//
//
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(1, region.subs.size)
Assert.assertTrue(region.subs[0] is OutBlock)
val outBlock = region.findOrNull(OutBlock::class.java)!!
diff --git a/cgen-lib/src/test/java/generators/kotlin/KotlinEnumGeneratorTest.kt b/cgen-lib/src/test/java/generators/kotlin/KotlinEnumGeneratorTest.kt
index 8fb4f4dc..07af0d7e 100644
--- a/cgen-lib/src/test/java/generators/kotlin/KotlinEnumGeneratorTest.kt
+++ b/cgen-lib/src/test/java/generators/kotlin/KotlinEnumGeneratorTest.kt
@@ -57,14 +57,17 @@ class KotlinEnumGeneratorTest {
val block = tree.subs.first() as ConstantsEnum
val projectOutput = OutputTree(Target.Kotlin)
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
process(files, block)
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(1, region.subs.size)
Assert.assertTrue(region.subs[0] is OutBlock)
val outBlock = region.findOrNull(OutBlock::class.java)!!
@@ -108,12 +111,16 @@ class KotlinEnumGeneratorTest {
val block = tree.subs.first() as ConstantsEnum
val projectOutput = OutputTree(Target.Kotlin)
- val files = fileGenerator.createFile(projectOutput, "a", block)
+ val files = fileGenerator.createFile(projectOutput,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "a", block)
val mainFile = files.first()
item(files, block)
// expected result
//
+ // ./
//
//
//
@@ -127,9 +134,9 @@ class KotlinEnumGeneratorTest {
//
Assert.assertTrue("Dirty flag should be true", mainFile.isDirty)
- Assert.assertEquals(3, mainFile.subs.size)
- Assert.assertTrue(mainFile.subs[2] is RegionImpl)
- val region = mainFile.subs[2] as Region
+ Assert.assertEquals(4, mainFile.subs.size)
+ Assert.assertTrue(mainFile.subs[3] is RegionImpl)
+ val region = mainFile.subs[3] as Region
Assert.assertEquals(2, region.subs.size)
Assert.assertTrue(region.subs[0] is CommentsBlock)
Assert.assertTrue(region.subs[1] is OutBlock)
diff --git a/cgen-lib/src/test/java/generators/kotlin/KotlinFileGeneratorTest.kt b/cgen-lib/src/test/java/generators/kotlin/KotlinFileGeneratorTest.kt
index f39e3ffa..8e418903 100644
--- a/cgen-lib/src/test/java/generators/kotlin/KotlinFileGeneratorTest.kt
+++ b/cgen-lib/src/test/java/generators/kotlin/KotlinFileGeneratorTest.kt
@@ -8,6 +8,7 @@ import generators.obj.syntaxParseTree.FileData
import generators.obj.syntaxParseTree.Keyword
import generators.obj.syntaxParseTree.NamespaceDeclaration
import generators.obj.syntaxParseTree.OutputTree
+import generators.obj.syntaxParseTree.FileMetaInformation
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
@@ -28,10 +29,14 @@ class KotlinFileGeneratorTest {
name = "TestBlock",
outputFile = "testOutputFile")
workNs.addSub(block)
- val result = generator.createFile(project, "testOutputFile", block)
+ val result = generator.createFile(project,
+ workingDirectory = "./",
+ packageDirectory = "",
+ "testOutputFile", block)
// expected result
//
+ //
//
// package
// com.example.test
@@ -39,8 +44,9 @@ class KotlinFileGeneratorTest {
assertEquals(1, result.size)
assertTrue(result[0] is FileData)
val fileData = result[0] as FileData
- assertEquals(NamespaceDeclaration::class.java, fileData.subs[0].javaClass)
- val nsDeclaration = fileData.subs[0] as NamespaceDeclaration
+ assertEquals(FileMetaInformation::class.java, fileData.subs[0].javaClass)
+ assertEquals(NamespaceDeclaration::class.java, fileData.subs[1].javaClass)
+ val nsDeclaration = fileData.subs[1] as NamespaceDeclaration
assertEquals(2, nsDeclaration.subs.size)
assertEquals(Keyword::class.java, nsDeclaration.subs[0].javaClass)
assertEquals("package", (nsDeclaration.subs[0] as Keyword).name)
diff --git a/cgen-nnparser/build.gradle.kts b/cgen-nnparser/build.gradle.kts
index 92f09a06..464a0c41 100644
--- a/cgen-nnparser/build.gradle.kts
+++ b/cgen-nnparser/build.gradle.kts
@@ -18,6 +18,10 @@ dependencies {
implementation("com.opencsv:opencsv:5.7.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
+ implementation("com.fasterxml.jackson.core:jackson-core:2.15.0")
+ implementation("com.fasterxml.jackson.core:jackson-databind:2.15.0")
+ // https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-kotlin
+ implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.5")
}
tasks.getByName("test") {
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/ExpParse.kt b/cgen-nnparser/src/main/kotlin/ce/parser/ExpParse.kt
index 6c5d06a3..16594728 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/ExpParse.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/ExpParse.kt
@@ -2,10 +2,11 @@ package ce.parser
import ce.defs.Target
import ce.domain.usecase.execute.ExecuteScriptByExtUseCaseImpl
-import ce.parser.domain.dictionaries.NamesDictionary
+import ce.parser.domain.dictionaries.natural.NamesDictionary
import ce.parser.domain.usecase.*
-import ce.parser.domain.dictionaries.DynamicDictionariesImpl
-import ce.parser.domain.dictionaries.StaticDictionaries
+import ce.parser.domain.dictionaries.natural.DynamicDictionariesImpl
+import ce.parser.domain.dictionaries.natural.StaticDictionaries
+import ce.parser.domain.usecase.save.WriteResultsUseCaseImpl
import ce.parser.nnparser.Type
import ce.parser.nnparser.Word
import kotlinx.coroutines.CoroutineScope
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/NNFormatLTSPSamplesBuilder.kt b/cgen-nnparser/src/main/kotlin/ce/parser/NNFormatLTSPSamplesBuilder.kt
new file mode 100644
index 00000000..66178949
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/NNFormatLTSPSamplesBuilder.kt
@@ -0,0 +1,110 @@
+package ce.parser
+
+import ce.formatters.CLikeCodestyleRepo
+import ce.formatters.CodeFormatterJavaUseCaseImpl
+import ce.parser.domain.FormatProject
+import ce.parser.domain.usecase.LoadTreeDictionaryFromJson
+import ce.parser.domain.usecase.neuralnetworks.TreeToFormatProjectImpl
+import ce.parser.domain.usecase.save.SaveTreeDictrionaryToJson
+import ce.parser.domain.usecase.save.StoreFormatProjectToJsonImpl
+import ce.settings.CodeStyle
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.module.kotlin.KotlinModule
+import generators.obj.abstractSyntaxTree.Node
+import generators.obj.abstractSyntaxTree.addDatatype
+import generators.obj.abstractSyntaxTree.addOutBlock
+import generators.obj.abstractSyntaxTree.addSub
+import generators.obj.abstractSyntaxTree.addVarName
+import generators.obj.syntaxParseTree.ArgumentNode
+import generators.obj.syntaxParseTree.OutBlockArguments
+import generators.obj.syntaxParseTree.RegionImpl
+import java.io.File
+import kotlin.random.Random
+
+fun main(args: Array) {
+ BuildLtspSampels(args[0], 1000).build()
+}
+
+class BuildLtspSampels(
+ private val outputDir: String,
+ private val samplesCount: Int
+) {
+ val codeStyleNoSpace = CodeStyle(
+ newLinesBeforeClass = 0,
+ tabSize = 2,
+ preventEmptyBlocks = true,
+ )
+ private val repoNoSpace = CLikeCodestyleRepo(codeStyleNoSpace)
+
+ fun buildTree(rnd: Random): Node {
+ val fieldsCount = rnd.nextInt(1,3)
+ val input = RegionImpl().apply {
+ addOutBlock("record TEST") {
+ addSub(OutBlockArguments().apply {
+ for (j in 0..fieldsCount) {
+ addSub(ArgumentNode()).apply {
+ addDatatype("int")
+ addVarName("A$j")
+ }
+ }
+ })
+ }
+ }
+ return input
+ }
+
+ fun build() {
+ val rnd = Random(System.currentTimeMillis())
+ val dictionaryFileName = "dictionary.json"
+ val objectMapper = ObjectMapper().registerModule(KotlinModule.Builder().build())
+ val loadDictionary = LoadTreeDictionaryFromJson(objectMapper)
+ val treeToNNProject = TreeToFormatProjectImpl()
+
+ val dict = loadDictionary.load(File(outputDir, dictionaryFileName))
+
+ val storeFormatProject = StoreFormatProjectToJsonImpl(objectMapper)
+ val saveTreeDictionary = SaveTreeDictrionaryToJson()
+ val formatter = CodeFormatterJavaUseCaseImpl(repoNoSpace)
+
+ var trainingFormatProject = FormatProject(
+ name = "Training data",
+ type = "RNNTrainingData",
+ process = "samples_builder",
+ dictionary = dict,
+ samples = emptyList(),
+ author = System.getProperty("user.name")
+ )
+
+ var sourceProject = FormatProject(
+ name = "Format sources",
+ type = "RNNSources",
+ process = "samples_builder",
+ dictionary = dict,
+ samples = emptyList(),
+ author = System.getProperty("user.name")
+ )
+
+ for (i in 0..samplesCount) {
+ val input = buildTree(rnd)
+ sourceProject = treeToNNProject.addTree(input, sourceProject)
+
+ val output = formatter(input)
+ trainingFormatProject = treeToNNProject.addTree(output, trainingFormatProject)
+
+ trainingFormatProject.samples.last().filter { it !in sourceProject.samples.last() }.toSet().forEach { id ->
+ dict.map.filter { it.value.openId == id || it.value.closeId == id }.forEach {
+ dict.map[it.key] = it.value.copy(priority = 1)
+ }
+ }
+ }
+ storeFormatProject.store(
+ trainingFormatProject,
+ File(outputDir, "training.json")
+ )
+ storeFormatProject.store(
+ sourceProject,
+ File(outputDir, "sources.json")
+ )
+ saveTreeDictionary.save(File(outputDir, dictionaryFileName), dict)
+ }
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/FormatProject.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/FormatProject.kt
new file mode 100644
index 00000000..378de487
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/FormatProject.kt
@@ -0,0 +1,12 @@
+package ce.parser.domain
+
+import ce.parser.domain.dictionaries.tree.Dictionary
+
+data class FormatProject(
+ val name: String,
+ val type: String,
+ val author: String,
+ val process: String,
+ val dictionary: Dictionary,
+ val samples: List>
+)
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/DynamicDictionaries.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/DynamicDictionaries.kt
similarity index 93%
rename from cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/DynamicDictionaries.kt
rename to cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/DynamicDictionaries.kt
index be8c4e23..a46d1946 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/DynamicDictionaries.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/DynamicDictionaries.kt
@@ -1,4 +1,4 @@
-package ce.parser.domain.dictionaries
+package ce.parser.domain.dictionaries.natural
import org.jetbrains.kotlin.javax.inject.Inject
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/NamesDictionary.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/NamesDictionary.kt
similarity index 95%
rename from cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/NamesDictionary.kt
rename to cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/NamesDictionary.kt
index 3451d17d..36a8fb7a 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/NamesDictionary.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/NamesDictionary.kt
@@ -1,4 +1,4 @@
-package ce.parser.domain.dictionaries
+package ce.parser.domain.dictionaries.natural
import ce.parser.nnparser.Type
import ce.parser.nnparser.Word
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/StaticDictionaries.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/StaticDictionaries.kt
similarity index 95%
rename from cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/StaticDictionaries.kt
rename to cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/StaticDictionaries.kt
index 008e8453..8d5792db 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/StaticDictionaries.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/StaticDictionaries.kt
@@ -1,4 +1,4 @@
-package ce.parser.domain.dictionaries
+package ce.parser.domain.dictionaries.natural
import org.jetbrains.kotlin.javax.inject.Inject
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/StaticDictionary.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/StaticDictionary.kt
similarity index 87%
rename from cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/StaticDictionary.kt
rename to cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/StaticDictionary.kt
index 1b901827..ef002f2b 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/StaticDictionary.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/natural/StaticDictionary.kt
@@ -1,6 +1,5 @@
-package ce.parser.domain.dictionaries
+package ce.parser.domain.dictionaries.natural
-import ce.parser.nnparser.Word
import ce.parser.nnparser.WordItem
class StaticDictionary(
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/tree/Dictionary.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/tree/Dictionary.kt
new file mode 100644
index 00000000..cc11129f
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/tree/Dictionary.kt
@@ -0,0 +1,6 @@
+package ce.parser.domain.dictionaries.tree
+
+data class Dictionary (
+ val map: MutableMap,
+ var maxId: Int = 1
+)
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/tree/TreeNodeData.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/tree/TreeNodeData.kt
new file mode 100644
index 00000000..1a0d9272
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/dictionaries/tree/TreeNodeData.kt
@@ -0,0 +1,47 @@
+package ce.parser.domain.dictionaries.tree
+
+import generators.obj.abstractSyntaxTree.Leaf
+import generators.obj.syntaxParseTree.Keyword
+import generators.obj.syntaxParseTree.VariableName
+
+/**
+ * Data class representing the data of a tree node.
+ *
+ * @property openId The ID when the node is opened.
+ * @property closeId The ID when the node is closed. Default is -1.
+ * @property priority The priority of the node. Default is 0.
+ */
+data class TreeNodeData(
+ val openId: Int,
+ val closeId: Int = -1,
+ val priority: Int = 0,
+) {
+ companion object {
+ /**
+ * Checks if the given leaf is unique.
+ *
+ * @param leaf The leaf to check.
+ * @return True if the leaf is a VariableName or Keyword, false otherwise.
+ */
+ fun isUniq(leaf: Leaf): Boolean {
+ return when (leaf) {
+ is VariableName -> true
+ is Keyword -> true
+ else -> false
+ }
+ }
+
+ /**
+ * Converts the given leaf to an ID string.
+ *
+ * @param leaf The leaf to convert.
+ * @return The ID string of the leaf. If the leaf is unique, the ID includes the leaf's name.
+ */
+ fun toId(leaf: Leaf): String {
+ if (isUniq(leaf)) {
+ return leaf.javaClass.simpleName + "_" + leaf.name
+ }
+ return leaf.javaClass.simpleName
+ }
+ }
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/CheckStringInDictionary.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/CheckStringInDictionary.kt
index afee7663..48dd4fcb 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/CheckStringInDictionary.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/CheckStringInDictionary.kt
@@ -2,7 +2,7 @@ package ce.parser.domain.usecase
import ce.parser.nnparser.ProgrammableWord
import ce.parser.nnparser.SourceBuffer
-import ce.parser.domain.dictionaries.StaticDictionary
+import ce.parser.domain.dictionaries.natural.StaticDictionary
import ce.parser.nnparser.WordItem
interface CheckStringInDictionaryUseCase {
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadAllDictionariesUseCase.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadAllDictionariesUseCase.kt
index 48416d1f..05cf903c 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadAllDictionariesUseCase.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadAllDictionariesUseCase.kt
@@ -1,7 +1,7 @@
package ce.parser.domain.usecase
import ce.defs.Target
-import ce.parser.domain.dictionaries.StaticDictionaries
+import ce.parser.domain.dictionaries.natural.StaticDictionaries
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.async
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadDictionaryUseCase.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadDictionaryUseCase.kt
index 03808c2c..c4101b8a 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadDictionaryUseCase.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadDictionaryUseCase.kt
@@ -2,7 +2,7 @@ package ce.parser.domain.usecase
import ce.parser.nnparser.Type
import ce.parser.nnparser.Word
-import ce.parser.domain.dictionaries.StaticDictionary
+import ce.parser.domain.dictionaries.natural.StaticDictionary
import com.opencsv.CSVReader
import org.jetbrains.kotlin.javax.inject.Inject
import java.io.File
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTargetDictionariesUseCase.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTargetDictionariesUseCase.kt
index 1b1afa7a..2e93600c 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTargetDictionariesUseCase.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTargetDictionariesUseCase.kt
@@ -1,8 +1,8 @@
package ce.parser.domain.usecase
import ce.defs.Target
-import ce.parser.domain.dictionaries.StaticDictionaries
-import ce.parser.domain.dictionaries.StaticDictionariesImpl
+import ce.parser.domain.dictionaries.natural.StaticDictionaries
+import ce.parser.domain.dictionaries.natural.StaticDictionariesImpl
import ce.parser.nnparser.Type
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.async
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTreeDictionary.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTreeDictionary.kt
new file mode 100644
index 00000000..9aab9e6f
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTreeDictionary.kt
@@ -0,0 +1,8 @@
+package ce.parser.domain.usecase
+
+import ce.parser.domain.dictionaries.tree.Dictionary
+import java.io.File
+
+interface LoadTreeDictionary {
+ fun load(file: File) : Dictionary
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTreeDictionaryFromJson.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTreeDictionaryFromJson.kt
new file mode 100644
index 00000000..a2df1a85
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/LoadTreeDictionaryFromJson.kt
@@ -0,0 +1,27 @@
+package ce.parser.domain.usecase
+
+import ce.parser.domain.dictionaries.tree.Dictionary
+import ce.parser.domain.dictionaries.tree.TreeNodeData
+import com.fasterxml.jackson.databind.ObjectMapper
+import java.io.File
+
+class LoadTreeDictionaryFromJson(
+ private val objectMapper: ObjectMapper
+): LoadTreeDictionary {
+ override fun load(file: File): Dictionary {
+ val dictionary = Dictionary(
+ map = mutableMapOf()
+ )
+ if (file.exists()) {
+ val map : Map = objectMapper.readValue(
+ file,
+ objectMapper.typeFactory.constructMapType(Map::class.java, String::class.java, TreeNodeData::class.java)
+ )
+ map.forEach { (key, value) ->
+ dictionary.maxId = maxOf(dictionary.maxId, value.openId, value.closeId)
+ dictionary.map[key] = value
+ }
+ }
+ return dictionary
+ }
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/MetaTokenizerUseCaseImpl.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/MetaTokenizerUseCaseImpl.kt
index 6db9d37e..0ccd194b 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/MetaTokenizerUseCaseImpl.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/MetaTokenizerUseCaseImpl.kt
@@ -1,6 +1,6 @@
package ce.parser.domain.usecase
-import ce.parser.domain.dictionaries.StaticDictionaries
+import ce.parser.domain.dictionaries.natural.StaticDictionaries
import ce.parser.nnparser.SourceBuffer
import ce.parser.nnparser.WordItem
import org.jetbrains.kotlin.javax.inject.Inject
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/ProcessSampleUseCase.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/ProcessSampleUseCase.kt
index f2db04ae..2ded3357 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/ProcessSampleUseCase.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/ProcessSampleUseCase.kt
@@ -2,8 +2,9 @@ package ce.parser.domain.usecase
import ce.defs.Target
import ce.parser.SampleData
-import ce.parser.domain.dictionaries.DynamicDictionaries
-import ce.parser.domain.dictionaries.StaticDictionaries
+import ce.parser.domain.dictionaries.natural.DynamicDictionaries
+import ce.parser.domain.dictionaries.natural.StaticDictionaries
+import ce.parser.domain.usecase.save.WriteResultsUseCase
import ce.parser.nnparser.SourceBuffer
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.withContext
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/TokenizerUseCaseImpl.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/TokenizerUseCaseImpl.kt
index d1ec6aa9..b1a1b990 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/TokenizerUseCaseImpl.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/TokenizerUseCaseImpl.kt
@@ -1,8 +1,8 @@
package ce.parser.domain.usecase
-import ce.parser.domain.dictionaries.DynamicDictionaries
-import ce.parser.domain.dictionaries.StaticDictionaries
-import ce.parser.domain.dictionaries.StaticDictionary
+import ce.parser.domain.dictionaries.natural.DynamicDictionaries
+import ce.parser.domain.dictionaries.natural.StaticDictionaries
+import ce.parser.domain.dictionaries.natural.StaticDictionary
import ce.parser.nnparser.*
import org.jetbrains.kotlin.javax.inject.Inject
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/neuralnetworks/TreeToNNProject.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/neuralnetworks/TreeToNNProject.kt
new file mode 100644
index 00000000..bc833552
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/neuralnetworks/TreeToNNProject.kt
@@ -0,0 +1,10 @@
+package ce.parser.domain.usecase.neuralnetworks
+
+import ce.parser.domain.FormatProject
+import generators.obj.abstractSyntaxTree.Leaf
+
+interface TreeToFormatProject {
+ fun addTree(tree: Leaf,
+ project: FormatProject) : FormatProject
+
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/neuralnetworks/TreeToNNProjectImpl.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/neuralnetworks/TreeToNNProjectImpl.kt
new file mode 100644
index 00000000..f33925df
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/neuralnetworks/TreeToNNProjectImpl.kt
@@ -0,0 +1,49 @@
+package ce.parser.domain.usecase.neuralnetworks
+
+import ce.parser.domain.FormatProject
+import ce.parser.domain.dictionaries.tree.Dictionary
+import ce.parser.domain.dictionaries.tree.TreeNodeData
+import generators.obj.abstractSyntaxTree.Leaf
+import generators.obj.abstractSyntaxTree.Node
+
+class TreeToFormatProjectImpl: TreeToFormatProject {
+
+ private fun toVector(leaf: Leaf, vector: MutableList, map: Dictionary) {
+ val nodeId = TreeNodeData.toId(leaf)
+ if (!map.map.containsKey(nodeId)) {
+ // create new one
+ val newData = if (leaf is Node) {
+ TreeNodeData(
+ openId = map.maxId++,
+ closeId = map.maxId++
+ )
+ } else {
+ TreeNodeData(openId = map.maxId++, closeId = -1)
+ }
+ map.map[nodeId] = newData
+ }
+
+ val description = map.map[nodeId]!!
+ vector.add(description.openId)
+ if (leaf is Node) {
+ leaf.subs.forEach {
+ toVector(it, vector, map)
+ }
+ vector.add(description.closeId)
+ }
+ }
+
+ override fun addTree(tree: Leaf,
+ project: FormatProject) : FormatProject {
+ val vector = mutableListOf()
+ toVector(leaf = tree,
+ vector = vector,
+ map = project.dictionary)
+ return project.copy(
+ samples = project.samples.toMutableList().apply {
+ add(vector)
+ }
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/SaveTreeDictionary.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/SaveTreeDictionary.kt
new file mode 100644
index 00000000..ab470efb
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/SaveTreeDictionary.kt
@@ -0,0 +1,8 @@
+package ce.parser.domain.usecase.save
+
+import ce.parser.domain.dictionaries.tree.Dictionary
+import java.io.File
+
+interface SaveTreeDictionary {
+ fun save(file: File, dictionary: Dictionary)
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/SaveTreeDictrionaryToJson.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/SaveTreeDictrionaryToJson.kt
new file mode 100644
index 00000000..27a8a100
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/SaveTreeDictrionaryToJson.kt
@@ -0,0 +1,16 @@
+package ce.parser.domain.usecase.save
+
+import ce.parser.domain.dictionaries.tree.Dictionary
+import com.fasterxml.jackson.databind.ObjectMapper
+import java.io.File
+import java.io.FileOutputStream
+import java.io.OutputStreamWriter
+
+class SaveTreeDictrionaryToJson: SaveTreeDictionary {
+ override fun save(file: File, dictionary: Dictionary) {
+ val mapper = ObjectMapper()
+ val writer = OutputStreamWriter(FileOutputStream(file))
+ mapper.writerWithDefaultPrettyPrinter().writeValue(writer, dictionary.map)
+ writer.close()
+ }
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/StoreFormatProject.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/StoreFormatProject.kt
new file mode 100644
index 00000000..ae86b2f2
--- /dev/null
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/StoreFormatProject.kt
@@ -0,0 +1,18 @@
+package ce.parser.domain.usecase.save
+
+import ce.parser.domain.FormatProject
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.jetbrains.kotlin.javax.inject.Inject
+import java.io.File
+
+interface StoreFormatProject {
+ fun store(project: FormatProject, file: File)
+}
+
+class StoreFormatProjectToJsonImpl @Inject constructor(
+ private val objectMapper: ObjectMapper,
+): StoreFormatProject {
+ override fun store(project: FormatProject, file: File) {
+ objectMapper.writeValue(file, project)
+ }
+}
\ No newline at end of file
diff --git a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/WriteResultsUseCase.kt b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/WriteResultsUseCase.kt
similarity index 97%
rename from cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/WriteResultsUseCase.kt
rename to cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/WriteResultsUseCase.kt
index bd14c408..84f20197 100644
--- a/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/WriteResultsUseCase.kt
+++ b/cgen-nnparser/src/main/kotlin/ce/parser/domain/usecase/save/WriteResultsUseCase.kt
@@ -1,6 +1,7 @@
-package ce.parser.domain.usecase
+package ce.parser.domain.usecase.save
import ce.defs.Target
+import ce.parser.domain.usecase.TokenizerUseCase
import ce.parser.nnparser.Type
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.withContext
@@ -12,7 +13,8 @@ interface WriteResultsUseCase {
operator suspend fun invoke(outBasePath: String,
sampleName: String,
sampleTraget: Target,
- results: TokenizerUseCase.Result)
+ results: TokenizerUseCase.Result
+ )
}
class WriteResultsUseCaseImpl(
diff --git a/cgen-nnparser/src/test/kotlin/ce/parser/domain/NamesDictionaryTest.kt b/cgen-nnparser/src/test/kotlin/ce/parser/domain/NamesDictionaryTest.kt
index a6a1dea9..3806b6de 100644
--- a/cgen-nnparser/src/test/kotlin/ce/parser/domain/NamesDictionaryTest.kt
+++ b/cgen-nnparser/src/test/kotlin/ce/parser/domain/NamesDictionaryTest.kt
@@ -1,6 +1,6 @@
package ce.parser.domain
-import ce.parser.domain.dictionaries.NamesDictionary
+import ce.parser.domain.dictionaries.natural.NamesDictionary
import ce.parser.nnparser.Type
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
diff --git a/cgen-nnparser/src/test/kotlin/ce/parser/domain/TestDictionary.kt b/cgen-nnparser/src/test/kotlin/ce/parser/domain/TestDictionary.kt
index d2307d01..286e0927 100644
--- a/cgen-nnparser/src/test/kotlin/ce/parser/domain/TestDictionary.kt
+++ b/cgen-nnparser/src/test/kotlin/ce/parser/domain/TestDictionary.kt
@@ -1,6 +1,10 @@
package ce.parser.domain
-import ce.parser.domain.dictionaries.*
+import ce.parser.domain.dictionaries.natural.DynamicDictionaries
+import ce.parser.domain.dictionaries.natural.DynamicDictionariesImpl
+import ce.parser.domain.dictionaries.natural.NamesDictionary
+import ce.parser.domain.dictionaries.natural.StaticDictionariesImpl
+import ce.parser.domain.dictionaries.natural.StaticDictionary
import ce.parser.nnparser.*
object TestDictionary {
diff --git a/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/CheckStringInDictionaryImplTest.kt b/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/CheckStringInDictionaryImplTest.kt
index 6c542d64..dfd1a197 100644
--- a/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/CheckStringInDictionaryImplTest.kt
+++ b/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/CheckStringInDictionaryImplTest.kt
@@ -1,7 +1,7 @@
package ce.parser.domain.usecase
import ce.parser.domain.TestDictionary
-import ce.parser.domain.dictionaries.StaticDictionary
+import ce.parser.domain.dictionaries.natural.StaticDictionary
import ce.parser.nnparser.*
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test
diff --git a/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/MetaTokenizerUseCaseImplTest.kt b/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/MetaTokenizerUseCaseImplTest.kt
index 9b675a5a..b9a7979c 100644
--- a/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/MetaTokenizerUseCaseImplTest.kt
+++ b/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/MetaTokenizerUseCaseImplTest.kt
@@ -1,7 +1,7 @@
package ce.parser.domain.usecase
import ce.parser.domain.TestDictionary
-import ce.parser.domain.dictionaries.DynamicDictionaries
+import ce.parser.domain.dictionaries.natural.DynamicDictionaries
import ce.parser.nnparser.SourceBuffer
import ce.parser.nnparser.Type
import org.junit.jupiter.api.Assertions.*
diff --git a/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/TokenizerUseCaseImplTest.kt b/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/TokenizerUseCaseImplTest.kt
index 7586ab6d..0cd0025e 100644
--- a/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/TokenizerUseCaseImplTest.kt
+++ b/cgen-nnparser/src/test/kotlin/ce/parser/domain/usecase/TokenizerUseCaseImplTest.kt
@@ -1,7 +1,7 @@
package ce.parser.domain.usecase
import ce.parser.domain.TestDictionary
-import ce.parser.domain.dictionaries.DynamicDictionaries
+import ce.parser.domain.dictionaries.natural.DynamicDictionaries
import ce.parser.nnparser.SourceBuffer
import ce.parser.nnparser.Type
import org.junit.jupiter.api.Assertions.assertEquals
diff --git a/keras/format/data/kotlin_vocab.json b/keras/format/data/kotlin_vocab.json
new file mode 100644
index 00000000..6e88ee73
--- /dev/null
+++ b/keras/format/data/kotlin_vocab.json
@@ -0,0 +1,210 @@
+{
+ "name": "Kotlin AST Dictionary",
+ "type": "LSTMVocabulary",
+ "author": "mrco",
+ "version": "1.0",
+ "process": "PrepareTrainDataFromASTXml",
+ "updateDate": "2025-09-20T18:40:58.186300",
+ "dictionary": {
+ "NamespaceDeclaration_open": {
+ "id": 1,
+ "priority": 0
+ },
+ "NamespaceDeclaration_close": {
+ "id": 2,
+ "priority": 0
+ },
+ "Keyword_package": {
+ "id": 3,
+ "priority": 0
+ },
+ "Space": {
+ "id": 4,
+ "priority": 0
+ },
+ "VariableName": {
+ "id": 5,
+ "priority": 0
+ },
+ "NlSeparator": {
+ "id": 6,
+ "priority": 0
+ },
+ "CommentsBlock_open": {
+ "id": 7,
+ "priority": 0
+ },
+ "CommentsBlock_close": {
+ "id": 8,
+ "priority": 0
+ },
+ "CommentLeaf": {
+ "id": 9,
+ "priority": 0
+ },
+ "Region_open": {
+ "id": 10,
+ "priority": 0
+ },
+ "Region_close": {
+ "id": 11,
+ "priority": 0
+ },
+ "OutBlock_open": {
+ "id": 12,
+ "priority": 0
+ },
+ "OutBlock_close": {
+ "id": 13,
+ "priority": 0
+ },
+ "Keyword_(": {
+ "id": 14,
+ "priority": 0
+ },
+ "OutBlockArguments_open": {
+ "id": 15,
+ "priority": 0
+ },
+ "OutBlockArguments_close": {
+ "id": 16,
+ "priority": 0
+ },
+ "ArgumentNode_open": {
+ "id": 17,
+ "priority": 0
+ },
+ "ArgumentNode_close": {
+ "id": 18,
+ "priority": 0
+ },
+ "Keyword_val": {
+ "id": 19,
+ "priority": 0
+ },
+ "Keyword_:": {
+ "id": 20,
+ "priority": 0
+ },
+ "AstTypeLeaf": {
+ "id": 21,
+ "priority": 0
+ },
+ "Keyword_)": {
+ "id": 22,
+ "priority": 0
+ },
+ "Keyword_{": {
+ "id": 23,
+ "priority": 0
+ },
+ "Indent": {
+ "id": 24,
+ "priority": 0
+ },
+ "EnumNode_open": {
+ "id": 25,
+ "priority": 0
+ },
+ "EnumNode_close": {
+ "id": 26,
+ "priority": 0
+ },
+ "Arguments_open": {
+ "id": 27,
+ "priority": 0
+ },
+ "Arguments_close": {
+ "id": 28,
+ "priority": 0
+ },
+ "RValue_open": {
+ "id": 29,
+ "priority": 0
+ },
+ "RValue_close": {
+ "id": 30,
+ "priority": 0
+ },
+ "Separator_open": {
+ "id": 31,
+ "priority": 0
+ },
+ "Separator_close": {
+ "id": 32,
+ "priority": 0
+ },
+ "Keyword_}": {
+ "id": 33,
+ "priority": 0
+ },
+ "FieldNode_open": {
+ "id": 34,
+ "priority": 0
+ },
+ "FieldNode_close": {
+ "id": 35,
+ "priority": 0
+ },
+ "Keyword_const": {
+ "id": 36,
+ "priority": 0
+ },
+ "Keyword_=": {
+ "id": 37,
+ "priority": 0
+ },
+ "ImportsBlock_open": {
+ "id": 38,
+ "priority": 0
+ },
+ "ImportsBlock_close": {
+ "id": 39,
+ "priority": 0
+ },
+ "ImportLeaf": {
+ "id": 40,
+ "priority": 0
+ },
+ "Constructor_open": {
+ "id": 41,
+ "priority": 0
+ },
+ "Constructor_close": {
+ "id": 42,
+ "priority": 0
+ },
+ "KotlinClassData_open": {
+ "id": 43,
+ "priority": 0
+ },
+ "KotlinClassData_close": {
+ "id": 44,
+ "priority": 0
+ },
+ "Method_open": {
+ "id": 45,
+ "priority": 0
+ },
+ "Method_close": {
+ "id": 46,
+ "priority": 0
+ },
+ "ResultLeaf_open": {
+ "id": 47,
+ "priority": 0
+ },
+ "ResultLeaf_close": {
+ "id": 48,
+ "priority": 0
+ },
+ "Container_open": {
+ "id": 49,
+ "priority": 0
+ },
+ "Container_close": {
+ "id": 50,
+ "priority": 0
+ }
+ }
+}
\ No newline at end of file
diff --git a/keras/format/format_file.py b/keras/format/format_file.py
new file mode 100644
index 00000000..e5c88769
--- /dev/null
+++ b/keras/format/format_file.py
@@ -0,0 +1,84 @@
+from keras import optimizers
+import numpy as np
+from keras.models import load_model
+import json
+import queue
+import sys
+import os
+import tensorflow as tf
+
+def read_project_data(filename):
+ with open(filename, 'r') as file:
+ data = json.load(file)
+ return data
+
+def findWord(dictionary, index):
+ for word, i in dictionary.items():
+ if i['openId'] == index or i['closeId'] == index:
+ return i
+ return None
+
+def processSample(sample, dictionary, idx, total):
+ print(f"\rProcessing sample {idx} of {total}")
+ sys.stdout.flush()
+ x = [0,0] + sample
+ input = x[:4]
+ x = x[4:]
+ output = input.copy()
+
+ while len(x) > 0:
+ pred = model.predict(np.array([input]))
+ pred = np.argmax(pred)
+ takeSrc = False
+
+ if (pred == 0):
+ takeSrc = True
+ elif (pred == x[0]):
+ takeSrc = True
+ else:
+ wordPredicated = dictionary[pred]
+ wordSrc = dictionary[x[0]]
+ if wordPredicated == None or wordSrc == None:
+ print(f"Error: predicated word {wordPredicated} or source word {wordSrc} not found")
+ break
+
+ if wordSrc['priority'] >= wordPredicated['priority']:
+ takeSrc = True
+
+ if takeSrc:
+ next = x[0]
+ x.pop(0)
+ output.append(next)
+ input = input[1:] + [next]
+ else:
+ output.append(int(pred))
+ input = input[1:] + [int(pred)]
+ return output[2:]
+
+modelFilename = 'lstm-formatting-model.h1.keras'
+projectFilename = 'sources.json'
+model = load_model(modelFilename)
+project = read_project_data(projectFilename)
+if project['type'] != "RNNSources":
+ print(f"Error: Invalid data file type - {project['type']}")
+ exit(1)
+
+dictionary = project['dictionary']['map']
+id_to_word_map = {}
+for word, details in dictionary.items():
+ id_to_word_map[details['openId']] = details
+ closeId = details['closeId']
+ if (closeId > 0):
+ id_to_word_map[closeId] = details
+
+samples = project['samples']
+total = len(samples)
+mapped_samples = [processSample(sample, id_to_word_map, index, total) for index, sample in enumerate(samples)]
+
+project['samples'] = mapped_samples
+project['type'] = "RNNFormattedSources"
+output_filename = 'formated_sources.json'
+with open(output_filename, 'w') as outfile:
+ json.dump(project, outfile, indent=4)
+
+print(f"Processed project data saved to {output_filename}")
diff --git a/keras/format/formated_sources.json b/keras/format/formated_sources.json
new file mode 100644
index 00000000..ca5048b8
--- /dev/null
+++ b/keras/format/formated_sources.json
@@ -0,0 +1,198 @@
+{
+ "name": "Format sources",
+ "type": "RNNFormattedSources",
+ "author": "mrco",
+ "process": "samples_builder",
+ "dictionary": {
+ "map": {
+ "RegionImpl": {
+ "openId": 1,
+ "closeId": 2,
+ "priority": 0
+ },
+ "OutBlock": {
+ "openId": 3,
+ "closeId": 4,
+ "priority": 0
+ },
+ "OutBlockArguments": {
+ "openId": 5,
+ "closeId": 6,
+ "priority": 0
+ },
+ "ArgumentNode": {
+ "openId": 7,
+ "closeId": 8,
+ "priority": 0
+ },
+ "Datatype": {
+ "openId": 9,
+ "closeId": -1,
+ "priority": 0
+ },
+ "VariableName_A0": {
+ "openId": 10,
+ "closeId": -1,
+ "priority": 0
+ },
+ "VariableName_A1": {
+ "openId": 11,
+ "closeId": -1,
+ "priority": 0
+ },
+ "Keyword_(": {
+ "openId": 12,
+ "closeId": -1,
+ "priority": 1
+ },
+ "NlSeparator": {
+ "openId": 13,
+ "closeId": -1,
+ "priority": 1
+ },
+ "Indent": {
+ "openId": 14,
+ "closeId": -1,
+ "priority": 1
+ },
+ "Space": {
+ "openId": 15,
+ "closeId": -1,
+ "priority": 1
+ },
+ "Separator": {
+ "openId": 16,
+ "closeId": -1,
+ "priority": 1
+ },
+ "Keyword_)": {
+ "openId": 17,
+ "closeId": -1,
+ "priority": 1
+ },
+ "Keyword_{": {
+ "openId": 18,
+ "closeId": -1,
+ "priority": 1
+ },
+ "Keyword_}": {
+ "openId": 19,
+ "closeId": -1,
+ "priority": 1
+ },
+ "VariableName_A2": {
+ "openId": 20,
+ "closeId": -1,
+ "priority": 0
+ }
+ },
+ "maxId": 21
+ },
+ "samples": [
+ [
+ 1,
+ 3,
+ 12,
+ 13,
+ 5,
+ 14,
+ 7,
+ 9,
+ 15,
+ 10,
+ 8,
+ 16,
+ 13,
+ 14,
+ 7,
+ 9,
+ 15,
+ 11,
+ 8,
+ 16,
+ 13,
+ 14,
+ 6,
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 3,
+ 12,
+ 13,
+ 5,
+ 14,
+ 7,
+ 9,
+ 15,
+ 10,
+ 8,
+ 16,
+ 13,
+ 14,
+ 7,
+ 9,
+ 15,
+ 11,
+ 8,
+ 16,
+ 13,
+ 14,
+ 7,
+ 9,
+ 15,
+ 20,
+ 8,
+ 6,
+ 13,
+ 17,
+ 15,
+ 18,
+ 13,
+ 19,
+ 4,
+ 13,
+ 2
+ ],
+ [
+ 1,
+ 3,
+ 12,
+ 13,
+ 5,
+ 14,
+ 7,
+ 9,
+ 15,
+ 10,
+ 8,
+ 16,
+ 13,
+ 14,
+ 7,
+ 9,
+ 15,
+ 11,
+ 8,
+ 16,
+ 13,
+ 14,
+ 7,
+ 9,
+ 15,
+ 20,
+ 8,
+ 6,
+ 13,
+ 17,
+ 15,
+ 18,
+ 13,
+ 19,
+ 4,
+ 13,
+ 2
+ ]
+ ]
+}
\ No newline at end of file
diff --git a/keras/format/lstm-formatting-model.h1.keras b/keras/format/lstm-formatting-model.h1.keras
new file mode 100644
index 00000000..eb381fa6
--- /dev/null
+++ b/keras/format/lstm-formatting-model.h1.keras
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:70d4cfacdfc9623e969c099409580c081171e7ee1a128f9eb228f86216eb83bf
+size 311493
diff --git a/keras/format/prepare_format_model.py b/keras/format/prepare_format_model.py
new file mode 100644
index 00000000..cd11c95e
--- /dev/null
+++ b/keras/format/prepare_format_model.py
@@ -0,0 +1,89 @@
+from tensorflow.keras.models import Sequential
+from tensorflow.keras.layers import Embedding, LSTM, RepeatVector, Dense
+from tensorflow.keras.utils import plot_model
+from keras import optimizers
+import numpy as np
+from tensorflow.keras.utils import to_categorical
+from keras.models import load_model
+from keras.callbacks import ModelCheckpoint
+import json
+
+def read_training_data(filename):
+ with open(filename, 'r') as file:
+ data = json.load(file)
+ return data
+
+def define_model(vocab,in_timesteps,units):
+ model = Sequential()
+ model.add(Embedding(vocab,
+ output_dim = units,
+ input_length=in_timesteps,
+ mask_zero=True))
+ model.add(LSTM(units))
+ model.add(Dense(vocab, activation='softmax'))
+ model.build(input_shape=(None, in_timesteps))
+ model.summary()
+ return model
+
+NEW_MODEL = True
+TRAIN_MODEL = True
+filename = 'lstm-formatting-model.h1.keras'
+inp_words = 4
+paddingVec = [0] * (inp_words - 1)
+training_data = read_training_data("./training.json")
+
+if training_data['type'] != "RNNTrainingData":
+ print(f"Error: Invalid training data file type - {training_data['type']}")
+ exit(1)
+
+vectors = training_data['samples']
+vocab = max(max(sublist) for sublist in vectors) + 1
+max_length_out = max(len(sublist) for sublist in vectors)
+vectors = [paddingVec + sb for sb in vectors]
+
+print(f"vocab={vocab} max_length_out={max_length_out}")
+X = []
+Y = []
+for sb in vectors:
+ for i in range(len(sb) - inp_words):
+ X.append(sb[i:i + inp_words ])
+ Y.append(sb[i + inp_words])
+X = np.array(X)
+Y= np.array(Y)
+
+units = 64
+in_timesteps = inp_words
+out_timesteps = max_length_out
+
+if NEW_MODEL:
+ # model compilation
+ model = define_model(
+ vocab=vocab,
+ in_timesteps=in_timesteps,
+ units=units
+ )
+ rms = optimizers.RMSprop(learning_rate=0.05) ##lr=0.001
+ # model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
+ # Y= to_categorical(Y, num_classes=vocab)
+
+ model.compile(optimizer=rms, loss='sparse_categorical_crossentropy')
+else:
+ model = load_model(filename)
+
+if TRAIN_MODEL:
+ checkpoint = ModelCheckpoint(filename, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
+
+ # train model
+ history = model.fit(x = X,
+ y = Y,
+ batch_size=16,
+ validation_split = 0.2,
+ callbacks=[checkpoint],
+ epochs=128)
+
+x = [0,0,1,3]
+inp = np.expand_dims(x, axis=0)
+print(x)
+print(inp)
+pred = model.predict(inp)
+print(f"pred={pred}")
\ No newline at end of file
diff --git a/keras/format/sequences/.gitignore b/keras/format/sequences/.gitignore
new file mode 100644
index 00000000..ba0430d2
--- /dev/null
+++ b/keras/format/sequences/.gitignore
@@ -0,0 +1 @@
+__pycache__/
\ No newline at end of file
diff --git a/keras/format/sequences/Dictionary.py b/keras/format/sequences/Dictionary.py
new file mode 100644
index 00000000..da01ec68
--- /dev/null
+++ b/keras/format/sequences/Dictionary.py
@@ -0,0 +1,46 @@
+from datetime import datetime
+import json
+import os
+
+class Dictionary:
+ def __init__(self, username: str, process: str):
+ self.entries = {}
+ self.name = "Kotlin AST Dictionary"
+ self.type = "LSTMVocabulary"
+ self.author = username
+ self.version = "1.0"
+ self.process = process
+ self.updateDate = datetime.now().isoformat()
+
+class DictionaryOperations:
+ def __init__(self):
+ self.data = {}
+
+ def load(self, filepath: str, username: str, process: str) -> Dictionary:
+ if not os.path.exists(filepath):
+ return Dictionary(username=username, process=process)
+ with open(filepath, 'r') as f:
+ self.data = json.load(f)
+ dictionary = Dictionary(
+ username=self.data.get("author", "unknown"),
+ process=self.data.get("process", "unknown")
+ )
+ dictionary.entries = self.data.get("dictionary", {})
+ dictionary.name = self.data.get("name", "unknown")
+ dictionary.type = self.data.get("type", "unknown")
+ dictionary.version = self.data.get("version", "unknown")
+ dictionary.updateDate = self.data.get("updateDate", datetime.now().isoformat())
+ return dictionary
+
+ def store(self, dictionary: Dictionary, filepath: str):
+ self.data = {
+ "name": dictionary.name,
+ "type": dictionary.type,
+ "author": dictionary.author,
+ "version": dictionary.version,
+ "process": dictionary.process,
+ "updateDate": dictionary.updateDate,
+ "dictionary": dictionary.entries
+ }
+ with open(filepath, 'w') as f:
+ json.dump(self.data, f, indent=4)
\ No newline at end of file
diff --git a/keras/format/sequences/Sequence.py b/keras/format/sequences/Sequence.py
new file mode 100644
index 00000000..992420bb
--- /dev/null
+++ b/keras/format/sequences/Sequence.py
@@ -0,0 +1,21 @@
+from datetime import datetime
+import json
+
+class Sequence:
+ def __init__(self, username: str, process: str):
+ self.entries = {}
+ self.name = "Kotlin AST Training Sequences"
+ self.type = "LSTMTrainingSequences"
+ self.author = username
+ self.version = "1.0"
+ self.process = process
+ self.updateDate = datetime.now().isoformat()
+
+class SequenceOperations:
+ def __init__(self):
+ pass
+
+ def store(self, data: Sequence, filepath: str) -> Sequence:
+ with open(filepath, 'w') as f:
+ json.dump(data.__dict__, f, indent=2)
+ return data
\ No newline at end of file
diff --git a/keras/format/sequences/__init__.py b/keras/format/sequences/__init__.py
new file mode 100644
index 00000000..097a70cf
--- /dev/null
+++ b/keras/format/sequences/__init__.py
@@ -0,0 +1,6 @@
+# styxlib/__init__.py
+
+from .Dictionary import Dictionary, DictionaryOperations
+from .Sequence import Sequence, SequenceOperations
+
+__all__ = ['Dictionary', 'DictionaryOperations', 'Sequence', 'SequenceOperations']
\ No newline at end of file
diff --git a/keras/format/sources.json b/keras/format/sources.json
new file mode 100644
index 00000000..9bf8936f
--- /dev/null
+++ b/keras/format/sources.json
@@ -0,0 +1 @@
+{"name":"Format sources","type":"RNNSources","author":"mrco","process":"samples_builder","dictionary":{"map":{"RegionImpl":{"openId":1,"closeId":2,"priority":0},"OutBlock":{"openId":3,"closeId":4,"priority":0},"OutBlockArguments":{"openId":5,"closeId":6,"priority":0},"ArgumentNode":{"openId":7,"closeId":8,"priority":0},"Datatype":{"openId":9,"closeId":-1,"priority":0},"VariableName_A0":{"openId":10,"closeId":-1,"priority":0},"VariableName_A1":{"openId":11,"closeId":-1,"priority":0},"Keyword_(":{"openId":12,"closeId":-1,"priority":1},"NlSeparator":{"openId":13,"closeId":-1,"priority":1},"Indent":{"openId":14,"closeId":-1,"priority":1},"Space":{"openId":15,"closeId":-1,"priority":1},"Separator":{"openId":16,"closeId":-1,"priority":1},"Keyword_)":{"openId":17,"closeId":-1,"priority":1},"Keyword_{":{"openId":18,"closeId":-1,"priority":1},"Keyword_}":{"openId":19,"closeId":-1,"priority":1},"VariableName_A2":{"openId":20,"closeId":-1,"priority":0}},"maxId":21},"samples":[[1,3,5,7,9,10,8,7,9,11,8,6,4,2],[1,3,5,7,9,10,8,7,9,11,8,7,9,20,8,6,4,2],[1,3,5,7,9,10,8,7,9,11,8,7,9,20,8,6,4,2]]}
\ No newline at end of file
diff --git a/keras/format/train_from_xml.py b/keras/format/train_from_xml.py
new file mode 100644
index 00000000..8c6f82f0
--- /dev/null
+++ b/keras/format/train_from_xml.py
@@ -0,0 +1,158 @@
+# from tensorflow.keras.models import Sequential
+# from tensorflow.keras.layers import Embedding, LSTM, RepeatVector, Dense
+# from tensorflow.keras.utils import plot_model
+# from keras import optimizers
+# import numpy as np
+# from tensorflow.keras.utils import to_categorical
+# from keras.models import load_model
+# from keras.callbacks import ModelCheckpoint
+from lxml import etree
+import json
+import getpass
+from datetime import datetime
+
+from sequences import Dictionary, DictionaryOperations
+from sequences import Sequence, SequenceOperations
+
+OPEN_ONLY_TAGS = [
+ "WorkingDirectory",
+ "PackageDirectory",
+ "VariableName",
+ "CommentLeaf",
+ "AstTypeLeaf",
+ "ImportLeaf",
+ "Space",
+ "NlSeparator",
+ "Indent",
+ "Keyword"
+ ]
+SKIP_TAGS = [
+ "FileMetaInformation"
+]
+
+
+def process_childs(elem,
+ vocab,
+ id):
+ for child in elem:
+ if child.tag in SKIP_TAGS:
+ ## Skip this tag and its children
+ continue
+ tagName = child.tag
+ tagCanBeClosed = tagName not in OPEN_ONLY_TAGS
+ openTag = f"{tagName}_open" if tagCanBeClosed else f"{tagName}"
+ if tagName == "Keyword":
+ openTag = f"{tagName}_{child.attrib['name']}"
+
+ if openTag not in vocab:
+ vocab[openTag] = {"id": id, "priority": 0}
+ id += 1
+
+ if tagCanBeClosed:
+ closeTag = f"{tagName}_close"
+ if closeTag not in vocab:
+ vocab[closeTag] = {"id": id, "priority": 0}
+ id += 1
+
+ id = process_childs(child, vocab, id)
+
+ return id
+
+def read_and_update_vocab(directory, filename, vocab):
+ tree = etree.parse(directory + "/" + filename)
+ root = tree.getroot()
+
+ if vocab:
+ id = max(entry["id"] for entry in vocab.values()) + 1
+ else:
+ id = 1
+
+ for child in root:
+ print(f"Child tag: {child.tag}, attributes: {child.attrib}")
+ id = process_childs(child, vocab, id)
+
+ print(f"Vocabulary size: {len(vocab)}")
+ return vocab
+
+def read_and_split_out_tree(directory, filename):
+ tree = etree.parse(directory + "/" + filename)
+ root = tree.getroot()
+
+ for child in root:
+ output_filename = f"{directory}/{child.attrib['name']}.xml"
+ # print(output_filename)
+ with open(output_filename, "wb") as f:
+ f.write(etree.tostring(child, pretty_print=True, xml_declaration=True, encoding="UTF-8"))
+
+def process_childs_for_sequence(elem, vocab, sequence):
+ for child in elem:
+ if child.tag in SKIP_TAGS:
+ ## Skip this tag and its children
+ continue
+ tagName = child.tag
+ tagCanBeClosed = tagName not in OPEN_ONLY_TAGS
+ openTag = f"{tagName}_open" if tagCanBeClosed else f"{tagName}"
+ if tagName == "Keyword":
+ openTag = f"{tagName}_{child.attrib['name']}"
+
+ if openTag in vocab:
+ sequence.append(vocab[openTag]["id"])
+
+ if tagCanBeClosed:
+ closeTag = f"{tagName}_close"
+ if closeTag in vocab:
+ # Process children first (depth-first)
+ process_childs_for_sequence(child, vocab, sequence)
+ sequence.append(vocab[closeTag]["id"])
+ else:
+ raise Exception(f"'{closeTag}' not found in vocabulary")
+ return sequence
+
+def read_and_prepare_training_sequence(directory, filename, vocab, sequences: Sequence):
+ tree = etree.parse(directory + "/" + filename)
+ root = tree.getroot()
+
+ for child in root:
+ blockName = child.attrib['name']
+ # print(f"Child tag: {child.tag}, attributes: {child.attrib['name']}")
+ sequence = []
+ process_childs_for_sequence(child, vocab, sequence)
+ sequences.entries[blockName] = {"sequence": sequence}
+
+ print(f"Training sequence length: {len(sequences.entries)}")
+ return sequences
+
+
+if __name__ == "__main__":
+ KOTLIN_VOCAB_FILE = "./data/kotlin_vocab.json"
+ sequence_file = "./data/kotlin_sequence.json"
+ process = "PrepareTrainDataFromASTXml"
+ sequence_operations = SequenceOperations()
+ dictionary_operations = DictionaryOperations()
+
+ dictionary = dictionary_operations.load(
+ filepath = KOTLIN_VOCAB_FILE,
+ username = getpass.getuser(),
+ process = process
+ )
+
+ read_and_update_vocab(
+ directory="../../generated/kotlin/",
+ filename="output_tree_formatted_Kotlin.xml",
+ vocab = dictionary.entries
+ )
+ dictionary.updateDate = datetime.now().isoformat()
+ dictionary_operations.store(dictionary, KOTLIN_VOCAB_FILE)
+
+ sequences = Sequence(
+ username = getpass.getuser(),
+ process = process
+ )
+
+ read_and_prepare_training_sequence(
+ directory="../../generated/kotlin/",
+ filename="output_tree_formatted_Kotlin.xml",
+ vocab = dictionary.entries,
+ sequences = sequences
+ )
+ sequence_operations.store(sequences, sequence_file)
diff --git a/keras/format/training.json b/keras/format/training.json
new file mode 100644
index 00000000..f9f2abee
--- /dev/null
+++ b/keras/format/training.json
@@ -0,0 +1 @@
+{"name":"Training data","type":"RNNTrainingData","author":"mrco","process":"samples_builder","dictionary":{"map":{"RegionImpl":{"openId":1,"closeId":2,"priority":0},"OutBlock":{"openId":3,"closeId":4,"priority":0},"OutBlockArguments":{"openId":5,"closeId":6,"priority":0},"ArgumentNode":{"openId":7,"closeId":8,"priority":0},"Datatype":{"openId":9,"closeId":-1,"priority":0},"VariableName_A0":{"openId":10,"closeId":-1,"priority":0},"VariableName_A1":{"openId":11,"closeId":-1,"priority":0},"Keyword_(":{"openId":12,"closeId":-1,"priority":1},"NlSeparator":{"openId":13,"closeId":-1,"priority":1},"Indent":{"openId":14,"closeId":-1,"priority":1},"Space":{"openId":15,"closeId":-1,"priority":1},"Separator":{"openId":16,"closeId":-1,"priority":1},"Keyword_)":{"openId":17,"closeId":-1,"priority":1},"Keyword_{":{"openId":18,"closeId":-1,"priority":1},"Keyword_}":{"openId":19,"closeId":-1,"priority":1},"VariableName_A2":{"openId":20,"closeId":-1,"priority":0}},"maxId":21},"samples":[[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,6,13,17,15,18,13,19,4,13,2],[1,3,12,13,5,14,7,9,15,10,8,16,13,14,7,9,15,11,8,16,13,14,7,9,15,20,8,6,13,17,15,18,13,19,4,13,2]]}
\ No newline at end of file