WIP.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4 b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4
index 038f193..613dfc5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4
@@ -72,8 +72,19 @@
 term: 'term' termId? termEq ((LBRACE vars? expr RBRACE) | mtdDecl) minMax?;
 mtdRef: javaFqn? POUND id;
 javaFqn
+    : javaClass
+    | javaFqn DOT javaClass
+    ;
+javaClass
     : id
-    | javaFqn DOT id
+    // We need to include keywords to make sure they don't conflict.
+    | IMPORT
+    | INTENT
+    | ORDERED
+    | FLOW
+    | META
+    | TERM
+    | FRAG
     ;
 termId: LPAR id RPAR;
 expr
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.interp
index 459779b..f3a74b6 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.interp
@@ -135,6 +135,7 @@
 term
 mtdRef
 javaFqn
+javaClass
 termId
 expr
 vars
@@ -149,4 +150,4 @@
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 54, 365, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 3, 2, 3, 2, 3, 2, 3, 3, 5, 3, 81, 10, 3, 3, 3, 3, 3, 5, 3, 85, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 7, 5, 100, 10, 5, 12, 5, 14, 5, 103, 11, 5, 3, 6, 3, 6, 3, 6, 5, 6, 108, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 126, 10, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 5, 12, 135, 10, 12, 3, 12, 5, 12, 138, 10, 12, 3, 12, 5, 12, 141, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 161, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 171, 10, 18, 12, 18, 14, 18, 174, 11, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 180, 10, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 188, 10, 20, 3, 20, 3, 20, 5, 20, 192, 10, 20, 3, 20, 5, 20, 195, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 201, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 207, 10, 21, 12, 21, 14, 21, 210, 11, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 216, 10, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 223, 10, 22, 12, 22, 14, 22, 226, 11, 22, 3, 23, 3, 23, 5, 23, 230, 10, 23, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 236, 10, 25, 3, 25, 3, 25, 3, 25, 5, 25, 241, 10, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 247, 10, 25, 3, 25, 5, 25, 250, 10, 25, 3, 26, 5, 26, 253, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 264, 10, 27, 12, 27, 14, 27, 267, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 284, 10, 29, 3, 29, 3, 29, 3, 29, 5, 29, 289, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 306, 10, 29, 12, 29, 14, 29, 309, 11, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 316, 10, 30, 12, 30, 14, 30, 319, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 332, 10, 32, 12, 32, 14, 32, 335, 11, 32, 3, 33, 3, 33, 3, 33, 5, 33, 340, 10, 33, 3, 33, 5, 33, 343, 10, 33, 3, 33, 3, 33, 5, 33, 347, 10, 33, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 353, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 2, 8, 8, 42, 52, 56, 58, 62, 39, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 2, 12, 4, 2, 31, 31, 40, 40, 4, 2, 24, 24, 37, 37, 3, 2, 43, 45, 4, 2, 37, 37, 41, 41, 3, 2, 17, 20, 3, 2, 15, 16, 3, 2, 21, 22, 3, 2, 11, 12, 3, 2, 41, 43, 4, 2, 3, 3, 51, 51, 2, 375, 2, 76, 3, 2, 2, 2, 4, 80, 3, 2, 2, 2, 6, 90, 3, 2, 2, 2, 8, 94, 3, 2, 2, 2, 10, 107, 3, 2, 2, 2, 12, 109, 3, 2, 2, 2, 14, 114, 3, 2, 2, 2, 16, 117, 3, 2, 2, 2, 18, 121, 3, 2, 2, 2, 20, 129, 3, 2, 2, 2, 22, 132, 3, 2, 2, 2, 24, 144, 3, 2, 2, 2, 26, 148, 3, 2, 2, 2, 28, 152, 3, 2, 2, 2, 30, 156, 3, 2, 2, 2, 32, 162, 3, 2, 2, 2, 34, 179, 3, 2, 2, 2, 36, 181, 3, 2, 2, 2, 38, 200, 3, 2, 2, 2, 40, 215, 3, 2, 2, 2, 42, 217, 3, 2, 2, 2, 44, 229, 3, 2, 2, 2, 46, 231, 3, 2, 2, 2, 48, 233, 3, 2, 2, 2, 50, 252, 3, 2, 2, 2, 52, 257, 3, 2, 2, 2, 54, 268, 3, 2, 2, 2, 56, 288, 3, 2, 2, 2, 58, 310, 3, 2, 2, 2, 60, 320, 3, 2, 2, 2, 62, 325, 3, 2, 2, 2, 64, 346, 3, 2, 2, 2, 66, 348, 3, 2, 2, 2, 68, 352, 3, 2, 2, 2, 70, 354, 3, 2, 2, 2, 72, 356, 3, 2, 2, 2, 74, 362, 3, 2, 2, 2, 76, 77, 5, 8, 5, 2, 77, 78, 7, 2, 2, 3, 78, 3, 3, 2, 2, 2, 79, 81, 5, 6, 4, 2, 80, 79, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 82, 3, 2, 2, 2, 82, 84, 7, 27, 2, 2, 83, 85, 5, 58, 30, 2, 84, 83, 3, 2, 2, 2, 84, 85, 3, 2, 2, 2, 85, 86, 3, 2, 2, 2, 86, 87, 5, 56, 29, 2, 87, 88, 7, 28, 2, 2, 88, 89, 7, 2, 2, 3, 89, 5, 3, 2, 2, 2, 90, 91, 7, 32, 2, 2, 91, 92, 5, 74, 38, 2, 92, 93, 7, 33, 2, 2, 93, 7, 3, 2, 2, 2, 94, 95, 8, 5, 1, 2, 95, 96, 5, 10, 6, 2, 96, 101, 3, 2, 2, 2, 97, 98, 12, 3, 2, 2, 98, 100, 5, 10, 6, 2, 99, 97, 3, 2, 2, 2, 100, 103, 3, 2, 2, 2, 101, 99, 3, 2, 2, 2, 101, 102, 3, 2, 2, 2, 102, 9, 3, 2, 2, 2, 103, 101, 3, 2, 2, 2, 104, 108, 5, 22, 12, 2, 105, 108, 5, 14, 8, 2, 106, 108, 5, 12, 7, 2, 107, 104, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 106, 3, 2, 2, 2, 108, 11, 3, 2, 2, 2, 109, 110, 7, 4, 2, 2, 110, 111, 7, 25, 2, 2, 111, 112, 5, 66, 34, 2, 112, 113, 7, 26, 2, 2, 113, 13, 3, 2, 2, 2, 114, 115, 5, 16, 9, 2, 115, 116, 5, 42, 22, 2, 116, 15, 3, 2, 2, 2, 117, 118, 7, 10, 2, 2, 118, 119, 7, 40, 2, 2, 119, 120, 5, 74, 38, 2, 120, 17, 3, 2, 2, 2, 121, 122, 7, 10, 2, 2, 122, 123, 7, 25, 2, 2, 123, 125, 5, 74, 38, 2, 124, 126, 5, 20, 11, 2, 125, 124, 3, 2, 2, 2, 125, 126, 3, 2, 2, 2, 126, 127, 3, 2, 2, 2, 127, 128, 7, 26, 2, 2, 128, 19, 3, 2, 2, 2, 129, 130, 7, 35, 2, 2, 130, 131, 5, 34, 18, 2, 131, 21, 3, 2, 2, 2, 132, 134, 5, 24, 13, 2, 133, 135, 5, 26, 14, 2, 134, 133, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 135, 137, 3, 2, 2, 2, 136, 138, 5, 30, 16, 2, 137, 136, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 140, 3, 2, 2, 2, 139, 141, 5, 32, 17, 2, 140, 139, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 143, 5, 42, 22, 2, 143, 23, 3, 2, 2, 2, 144, 145, 7, 5, 2, 2, 145, 146, 7, 40, 2, 2, 146, 147, 5, 74, 38, 2, 147, 25, 3, 2, 2, 2, 148, 149, 7, 6, 2, 2, 149, 150, 7, 40, 2, 2, 150, 151, 7, 13, 2, 2, 151, 27, 3, 2, 2, 2, 152, 153, 7, 44, 2, 2, 153, 154, 5, 50, 26, 2, 154, 155, 7, 44, 2, 2, 155, 29, 3, 2, 2, 2, 156, 157, 7, 7, 2, 2, 157, 160, 7, 40, 2, 2, 158, 161, 5, 66, 34, 2, 159, 161, 5, 28, 15, 2, 160, 158, 3, 2, 2, 2, 160, 159, 3, 2, 2, 2, 161, 31, 3, 2, 2, 2, 162, 163, 7, 8, 2, 2, 163, 164, 7, 40, 2, 2, 164, 165, 5, 34, 18, 2, 165, 33, 3, 2, 2, 2, 166, 167, 7, 27, 2, 2, 167, 172, 5, 36, 19, 2, 168, 169, 7, 35, 2, 2, 169, 171, 5, 36, 19, 2, 170, 168, 3, 2, 2, 2, 171, 174, 3, 2, 2, 2, 172, 170, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 175, 3, 2, 2, 2, 174, 172, 3, 2, 2, 2, 175, 176, 7, 28, 2, 2, 176, 180, 3, 2, 2, 2, 177, 178, 7, 27, 2, 2, 178, 180, 7, 28, 2, 2, 179, 166, 3, 2, 2, 2, 179, 177, 3, 2, 2, 2, 180, 35, 3, 2, 2, 2, 181, 182, 5, 66, 34, 2, 182, 183, 7, 36, 2, 2, 183, 184, 5, 38, 20, 2, 184, 37, 3, 2, 2, 2, 185, 201, 5, 66, 34, 2, 186, 188, 7, 37, 2, 2, 187, 186, 3, 2, 2, 2, 187, 188, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 7, 48, 2, 2, 190, 192, 7, 49, 2, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 195, 7, 50, 2, 2, 194, 193, 3, 2, 2, 2, 194, 195, 3, 2, 2, 2, 195, 201, 3, 2, 2, 2, 196, 201, 5, 34, 18, 2, 197, 201, 5, 40, 21, 2, 198, 201, 7, 13, 2, 2, 199, 201, 7, 14, 2, 2, 200, 185, 3, 2, 2, 2, 200, 187, 3, 2, 2, 2, 200, 196, 3, 2, 2, 2, 200, 197, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 199, 3, 2, 2, 2, 201, 39, 3, 2, 2, 2, 202, 203, 7, 32, 2, 2, 203, 208, 5, 38, 20, 2, 204, 205, 7, 35, 2, 2, 205, 207, 5, 38, 20, 2, 206, 204, 3, 2, 2, 2, 207, 210, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 211, 3, 2, 2, 2, 210, 208, 3, 2, 2, 2, 211, 212, 7, 33, 2, 2, 212, 216, 3, 2, 2, 2, 213, 214, 7, 32, 2, 2, 214, 216, 7, 33, 2, 2, 215, 202, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 41, 3, 2, 2, 2, 217, 218, 8, 22, 1, 2, 218, 219, 5, 44, 23, 2, 219, 224, 3, 2, 2, 2, 220, 221, 12, 3, 2, 2, 221, 223, 5, 44, 23, 2, 222, 220, 3, 2, 2, 2, 223, 226, 3, 2, 2, 2, 224, 222, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 43, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 227, 230, 5, 48, 25, 2, 228, 230, 5, 18, 10, 2, 229, 227, 3, 2, 2, 2, 229, 228, 3, 2, 2, 2, 230, 45, 3, 2, 2, 2, 231, 232, 9, 2, 2, 2, 232, 47, 3, 2, 2, 2, 233, 235, 7, 9, 2, 2, 234, 236, 5, 54, 28, 2, 235, 234, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 246, 5, 46, 24, 2, 238, 240, 7, 27, 2, 2, 239, 241, 5, 58, 30, 2, 240, 239, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 5, 56, 29, 2, 243, 244, 7, 28, 2, 2, 244, 247, 3, 2, 2, 2, 245, 247, 5, 28, 15, 2, 246, 238, 3, 2, 2, 2, 246, 245, 3, 2, 2, 2, 247, 249, 3, 2, 2, 2, 248, 250, 5, 68, 35, 2, 249, 248, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 49, 3, 2, 2, 2, 251, 253, 5, 52, 27, 2, 252, 251, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 254, 3, 2, 2, 2, 254, 255, 7, 34, 2, 2, 255, 256, 5, 74, 38, 2, 256, 51, 3, 2, 2, 2, 257, 258, 8, 27, 1, 2, 258, 259, 5, 74, 38, 2, 259, 265, 3, 2, 2, 2, 260, 261, 12, 3, 2, 2, 261, 262, 7, 38, 2, 2, 262, 264, 5, 74, 38, 2, 263, 260, 3, 2, 2, 2, 264, 267, 3, 2, 2, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 53, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 268, 269, 7, 25, 2, 2, 269, 270, 5, 74, 38, 2, 270, 271, 7, 26, 2, 2, 271, 55, 3, 2, 2, 2, 272, 273, 8, 29, 1, 2, 273, 274, 9, 3, 2, 2, 274, 289, 5, 56, 29, 12, 275, 276, 7, 25, 2, 2, 276, 277, 5, 56, 29, 2, 277, 278, 7, 26, 2, 2, 278, 289, 3, 2, 2, 2, 279, 289, 5, 64, 33, 2, 280, 281, 7, 3, 2, 2, 281, 283, 7, 25, 2, 2, 282, 284, 5, 62, 32, 2, 283, 282, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 289, 7, 26, 2, 2, 286, 287, 7, 46, 2, 2, 287, 289, 5, 74, 38, 2, 288, 272, 3, 2, 2, 2, 288, 275, 3, 2, 2, 2, 288, 279, 3, 2, 2, 2, 288, 280, 3, 2, 2, 2, 288, 286, 3, 2, 2, 2, 289, 307, 3, 2, 2, 2, 290, 291, 12, 10, 2, 2, 291, 292, 9, 4, 2, 2, 292, 306, 5, 56, 29, 11, 293, 294, 12, 9, 2, 2, 294, 295, 9, 5, 2, 2, 295, 306, 5, 56, 29, 10, 296, 297, 12, 8, 2, 2, 297, 298, 9, 6, 2, 2, 298, 306, 5, 56, 29, 9, 299, 300, 12, 7, 2, 2, 300, 301, 9, 7, 2, 2, 301, 306, 5, 56, 29, 8, 302, 303, 12, 6, 2, 2, 303, 304, 9, 8, 2, 2, 304, 306, 5, 56, 29, 7, 305, 290, 3, 2, 2, 2, 305, 293, 3, 2, 2, 2, 305, 296, 3, 2, 2, 2, 305, 299, 3, 2, 2, 2, 305, 302, 3, 2, 2, 2, 306, 309, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 57, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 310, 311, 8, 30, 1, 2, 311, 312, 5, 60, 31, 2, 312, 317, 3, 2, 2, 2, 313, 314, 12, 3, 2, 2, 314, 316, 5, 60, 31, 2, 315, 313, 3, 2, 2, 2, 316, 319, 3, 2, 2, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 59, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 320, 321, 7, 46, 2, 2, 321, 322, 5, 74, 38, 2, 322, 323, 7, 40, 2, 2, 323, 324, 5, 56, 29, 2, 324, 61, 3, 2, 2, 2, 325, 326, 8, 32, 1, 2, 326, 327, 5, 56, 29, 2, 327, 333, 3, 2, 2, 2, 328, 329, 12, 3, 2, 2, 329, 330, 7, 35, 2, 2, 330, 332, 5, 56, 29, 2, 331, 328, 3, 2, 2, 2, 332, 335, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 63, 3, 2, 2, 2, 335, 333, 3, 2, 2, 2, 336, 347, 7, 14, 2, 2, 337, 339, 7, 48, 2, 2, 338, 340, 7, 49, 2, 2, 339, 338, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 342, 3, 2, 2, 2, 341, 343, 7, 50, 2, 2, 342, 341, 3, 2, 2, 2, 342, 343, 3, 2, 2, 2, 343, 347, 3, 2, 2, 2, 344, 347, 7, 13, 2, 2, 345, 347, 5, 66, 34, 2, 346, 336, 3, 2, 2, 2, 346, 337, 3, 2, 2, 2, 346, 344, 3, 2, 2, 2, 346, 345, 3, 2, 2, 2, 347, 65, 3, 2, 2, 2, 348, 349, 9, 9, 2, 2, 349, 67, 3, 2, 2, 2, 350, 353, 5, 70, 36, 2, 351, 353, 5, 72, 37, 2, 352, 350, 3, 2, 2, 2, 352, 351, 3, 2, 2, 2, 353, 69, 3, 2, 2, 2, 354, 355, 9, 10, 2, 2, 355, 71, 3, 2, 2, 2, 356, 357, 7, 32, 2, 2, 357, 358, 7, 48, 2, 2, 358, 359, 7, 35, 2, 2, 359, 360, 7, 48, 2, 2, 360, 361, 7, 33, 2, 2, 361, 73, 3, 2, 2, 2, 362, 363, 9, 11, 2, 2, 363, 75, 3, 2, 2, 2, 37, 80, 84, 101, 107, 125, 134, 137, 140, 160, 172, 179, 187, 191, 194, 200, 208, 215, 224, 229, 235, 240, 246, 249, 252, 265, 283, 288, 305, 307, 317, 333, 339, 342, 346, 352]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 54, 377, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 3, 2, 3, 2, 3, 2, 3, 3, 5, 3, 83, 10, 3, 3, 3, 3, 3, 5, 3, 87, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 7, 5, 102, 10, 5, 12, 5, 14, 5, 105, 11, 5, 3, 6, 3, 6, 3, 6, 5, 6, 110, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 128, 10, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 5, 12, 137, 10, 12, 3, 12, 5, 12, 140, 10, 12, 3, 12, 5, 12, 143, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 163, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 173, 10, 18, 12, 18, 14, 18, 176, 11, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 182, 10, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 190, 10, 20, 3, 20, 3, 20, 5, 20, 194, 10, 20, 3, 20, 5, 20, 197, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 203, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 209, 10, 21, 12, 21, 14, 21, 212, 11, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 218, 10, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 225, 10, 22, 12, 22, 14, 22, 228, 11, 22, 3, 23, 3, 23, 5, 23, 232, 10, 23, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 238, 10, 25, 3, 25, 3, 25, 3, 25, 5, 25, 243, 10, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 249, 10, 25, 3, 25, 5, 25, 252, 10, 25, 3, 26, 5, 26, 255, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 266, 10, 27, 12, 27, 14, 27, 269, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 279, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 296, 10, 30, 3, 30, 3, 30, 3, 30, 5, 30, 301, 10, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 318, 10, 30, 12, 30, 14, 30, 321, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 328, 10, 31, 12, 31, 14, 31, 331, 11, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 344, 10, 33, 12, 33, 14, 33, 347, 11, 33, 3, 34, 3, 34, 3, 34, 5, 34, 352, 10, 34, 3, 34, 5, 34, 355, 10, 34, 3, 34, 3, 34, 5, 34, 359, 10, 34, 3, 35, 3, 35, 3, 36, 3, 36, 5, 36, 365, 10, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 2, 8, 8, 42, 52, 58, 60, 64, 40, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 2, 12, 4, 2, 31, 31, 40, 40, 4, 2, 24, 24, 37, 37, 3, 2, 43, 45, 4, 2, 37, 37, 41, 41, 3, 2, 17, 20, 3, 2, 15, 16, 3, 2, 21, 22, 3, 2, 11, 12, 3, 2, 41, 43, 4, 2, 3, 3, 51, 51, 2, 393, 2, 78, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 92, 3, 2, 2, 2, 8, 96, 3, 2, 2, 2, 10, 109, 3, 2, 2, 2, 12, 111, 3, 2, 2, 2, 14, 116, 3, 2, 2, 2, 16, 119, 3, 2, 2, 2, 18, 123, 3, 2, 2, 2, 20, 131, 3, 2, 2, 2, 22, 134, 3, 2, 2, 2, 24, 146, 3, 2, 2, 2, 26, 150, 3, 2, 2, 2, 28, 154, 3, 2, 2, 2, 30, 158, 3, 2, 2, 2, 32, 164, 3, 2, 2, 2, 34, 181, 3, 2, 2, 2, 36, 183, 3, 2, 2, 2, 38, 202, 3, 2, 2, 2, 40, 217, 3, 2, 2, 2, 42, 219, 3, 2, 2, 2, 44, 231, 3, 2, 2, 2, 46, 233, 3, 2, 2, 2, 48, 235, 3, 2, 2, 2, 50, 254, 3, 2, 2, 2, 52, 259, 3, 2, 2, 2, 54, 278, 3, 2, 2, 2, 56, 280, 3, 2, 2, 2, 58, 300, 3, 2, 2, 2, 60, 322, 3, 2, 2, 2, 62, 332, 3, 2, 2, 2, 64, 337, 3, 2, 2, 2, 66, 358, 3, 2, 2, 2, 68, 360, 3, 2, 2, 2, 70, 364, 3, 2, 2, 2, 72, 366, 3, 2, 2, 2, 74, 368, 3, 2, 2, 2, 76, 374, 3, 2, 2, 2, 78, 79, 5, 8, 5, 2, 79, 80, 7, 2, 2, 3, 80, 3, 3, 2, 2, 2, 81, 83, 5, 6, 4, 2, 82, 81, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 84, 3, 2, 2, 2, 84, 86, 7, 27, 2, 2, 85, 87, 5, 60, 31, 2, 86, 85, 3, 2, 2, 2, 86, 87, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, 88, 89, 5, 58, 30, 2, 89, 90, 7, 28, 2, 2, 90, 91, 7, 2, 2, 3, 91, 5, 3, 2, 2, 2, 92, 93, 7, 32, 2, 2, 93, 94, 5, 76, 39, 2, 94, 95, 7, 33, 2, 2, 95, 7, 3, 2, 2, 2, 96, 97, 8, 5, 1, 2, 97, 98, 5, 10, 6, 2, 98, 103, 3, 2, 2, 2, 99, 100, 12, 3, 2, 2, 100, 102, 5, 10, 6, 2, 101, 99, 3, 2, 2, 2, 102, 105, 3, 2, 2, 2, 103, 101, 3, 2, 2, 2, 103, 104, 3, 2, 2, 2, 104, 9, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 106, 110, 5, 22, 12, 2, 107, 110, 5, 14, 8, 2, 108, 110, 5, 12, 7, 2, 109, 106, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 109, 108, 3, 2, 2, 2, 110, 11, 3, 2, 2, 2, 111, 112, 7, 4, 2, 2, 112, 113, 7, 25, 2, 2, 113, 114, 5, 68, 35, 2, 114, 115, 7, 26, 2, 2, 115, 13, 3, 2, 2, 2, 116, 117, 5, 16, 9, 2, 117, 118, 5, 42, 22, 2, 118, 15, 3, 2, 2, 2, 119, 120, 7, 10, 2, 2, 120, 121, 7, 40, 2, 2, 121, 122, 5, 76, 39, 2, 122, 17, 3, 2, 2, 2, 123, 124, 7, 10, 2, 2, 124, 125, 7, 25, 2, 2, 125, 127, 5, 76, 39, 2, 126, 128, 5, 20, 11, 2, 127, 126, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 129, 3, 2, 2, 2, 129, 130, 7, 26, 2, 2, 130, 19, 3, 2, 2, 2, 131, 132, 7, 35, 2, 2, 132, 133, 5, 34, 18, 2, 133, 21, 3, 2, 2, 2, 134, 136, 5, 24, 13, 2, 135, 137, 5, 26, 14, 2, 136, 135, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 139, 3, 2, 2, 2, 138, 140, 5, 30, 16, 2, 139, 138, 3, 2, 2, 2, 139, 140, 3, 2, 2, 2, 140, 142, 3, 2, 2, 2, 141, 143, 5, 32, 17, 2, 142, 141, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 5, 42, 22, 2, 145, 23, 3, 2, 2, 2, 146, 147, 7, 5, 2, 2, 147, 148, 7, 40, 2, 2, 148, 149, 5, 76, 39, 2, 149, 25, 3, 2, 2, 2, 150, 151, 7, 6, 2, 2, 151, 152, 7, 40, 2, 2, 152, 153, 7, 13, 2, 2, 153, 27, 3, 2, 2, 2, 154, 155, 7, 44, 2, 2, 155, 156, 5, 50, 26, 2, 156, 157, 7, 44, 2, 2, 157, 29, 3, 2, 2, 2, 158, 159, 7, 7, 2, 2, 159, 162, 7, 40, 2, 2, 160, 163, 5, 68, 35, 2, 161, 163, 5, 28, 15, 2, 162, 160, 3, 2, 2, 2, 162, 161, 3, 2, 2, 2, 163, 31, 3, 2, 2, 2, 164, 165, 7, 8, 2, 2, 165, 166, 7, 40, 2, 2, 166, 167, 5, 34, 18, 2, 167, 33, 3, 2, 2, 2, 168, 169, 7, 27, 2, 2, 169, 174, 5, 36, 19, 2, 170, 171, 7, 35, 2, 2, 171, 173, 5, 36, 19, 2, 172, 170, 3, 2, 2, 2, 173, 176, 3, 2, 2, 2, 174, 172, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 177, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 177, 178, 7, 28, 2, 2, 178, 182, 3, 2, 2, 2, 179, 180, 7, 27, 2, 2, 180, 182, 7, 28, 2, 2, 181, 168, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 182, 35, 3, 2, 2, 2, 183, 184, 5, 68, 35, 2, 184, 185, 7, 36, 2, 2, 185, 186, 5, 38, 20, 2, 186, 37, 3, 2, 2, 2, 187, 203, 5, 68, 35, 2, 188, 190, 7, 37, 2, 2, 189, 188, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 193, 7, 48, 2, 2, 192, 194, 7, 49, 2, 2, 193, 192, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 196, 3, 2, 2, 2, 195, 197, 7, 50, 2, 2, 196, 195, 3, 2, 2, 2, 196, 197, 3, 2, 2, 2, 197, 203, 3, 2, 2, 2, 198, 203, 5, 34, 18, 2, 199, 203, 5, 40, 21, 2, 200, 203, 7, 13, 2, 2, 201, 203, 7, 14, 2, 2, 202, 187, 3, 2, 2, 2, 202, 189, 3, 2, 2, 2, 202, 198, 3, 2, 2, 2, 202, 199, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 202, 201, 3, 2, 2, 2, 203, 39, 3, 2, 2, 2, 204, 205, 7, 32, 2, 2, 205, 210, 5, 38, 20, 2, 206, 207, 7, 35, 2, 2, 207, 209, 5, 38, 20, 2, 208, 206, 3, 2, 2, 2, 209, 212, 3, 2, 2, 2, 210, 208, 3, 2, 2, 2, 210, 211, 3, 2, 2, 2, 211, 213, 3, 2, 2, 2, 212, 210, 3, 2, 2, 2, 213, 214, 7, 33, 2, 2, 214, 218, 3, 2, 2, 2, 215, 216, 7, 32, 2, 2, 216, 218, 7, 33, 2, 2, 217, 204, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 218, 41, 3, 2, 2, 2, 219, 220, 8, 22, 1, 2, 220, 221, 5, 44, 23, 2, 221, 226, 3, 2, 2, 2, 222, 223, 12, 3, 2, 2, 223, 225, 5, 44, 23, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 43, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 232, 5, 48, 25, 2, 230, 232, 5, 18, 10, 2, 231, 229, 3, 2, 2, 2, 231, 230, 3, 2, 2, 2, 232, 45, 3, 2, 2, 2, 233, 234, 9, 2, 2, 2, 234, 47, 3, 2, 2, 2, 235, 237, 7, 9, 2, 2, 236, 238, 5, 56, 29, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 248, 5, 46, 24, 2, 240, 242, 7, 27, 2, 2, 241, 243, 5, 60, 31, 2, 242, 241, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 5, 58, 30, 2, 245, 246, 7, 28, 2, 2, 246, 249, 3, 2, 2, 2, 247, 249, 5, 28, 15, 2, 248, 240, 3, 2, 2, 2, 248, 247, 3, 2, 2, 2, 249, 251, 3, 2, 2, 2, 250, 252, 5, 70, 36, 2, 251, 250, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 49, 3, 2, 2, 2, 253, 255, 5, 52, 27, 2, 254, 253, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 7, 34, 2, 2, 257, 258, 5, 76, 39, 2, 258, 51, 3, 2, 2, 2, 259, 260, 8, 27, 1, 2, 260, 261, 5, 54, 28, 2, 261, 267, 3, 2, 2, 2, 262, 263, 12, 3, 2, 2, 263, 264, 7, 38, 2, 2, 264, 266, 5, 54, 28, 2, 265, 262, 3, 2, 2, 2, 266, 269, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 53, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 270, 279, 5, 76, 39, 2, 271, 279, 7, 4, 2, 2, 272, 279, 7, 5, 2, 2, 273, 279, 7, 6, 2, 2, 274, 279, 7, 7, 2, 2, 275, 279, 7, 8, 2, 2, 276, 279, 7, 9, 2, 2, 277, 279, 7, 10, 2, 2, 278, 270, 3, 2, 2, 2, 278, 271, 3, 2, 2, 2, 278, 272, 3, 2, 2, 2, 278, 273, 3, 2, 2, 2, 278, 274, 3, 2, 2, 2, 278, 275, 3, 2, 2, 2, 278, 276, 3, 2, 2, 2, 278, 277, 3, 2, 2, 2, 279, 55, 3, 2, 2, 2, 280, 281, 7, 25, 2, 2, 281, 282, 5, 76, 39, 2, 282, 283, 7, 26, 2, 2, 283, 57, 3, 2, 2, 2, 284, 285, 8, 30, 1, 2, 285, 286, 9, 3, 2, 2, 286, 301, 5, 58, 30, 12, 287, 288, 7, 25, 2, 2, 288, 289, 5, 58, 30, 2, 289, 290, 7, 26, 2, 2, 290, 301, 3, 2, 2, 2, 291, 301, 5, 66, 34, 2, 292, 293, 7, 3, 2, 2, 293, 295, 7, 25, 2, 2, 294, 296, 5, 64, 33, 2, 295, 294, 3, 2, 2, 2, 295, 296, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 301, 7, 26, 2, 2, 298, 299, 7, 46, 2, 2, 299, 301, 5, 76, 39, 2, 300, 284, 3, 2, 2, 2, 300, 287, 3, 2, 2, 2, 300, 291, 3, 2, 2, 2, 300, 292, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 301, 319, 3, 2, 2, 2, 302, 303, 12, 10, 2, 2, 303, 304, 9, 4, 2, 2, 304, 318, 5, 58, 30, 11, 305, 306, 12, 9, 2, 2, 306, 307, 9, 5, 2, 2, 307, 318, 5, 58, 30, 10, 308, 309, 12, 8, 2, 2, 309, 310, 9, 6, 2, 2, 310, 318, 5, 58, 30, 9, 311, 312, 12, 7, 2, 2, 312, 313, 9, 7, 2, 2, 313, 318, 5, 58, 30, 8, 314, 315, 12, 6, 2, 2, 315, 316, 9, 8, 2, 2, 316, 318, 5, 58, 30, 7, 317, 302, 3, 2, 2, 2, 317, 305, 3, 2, 2, 2, 317, 308, 3, 2, 2, 2, 317, 311, 3, 2, 2, 2, 317, 314, 3, 2, 2, 2, 318, 321, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 59, 3, 2, 2, 2, 321, 319, 3, 2, 2, 2, 322, 323, 8, 31, 1, 2, 323, 324, 5, 62, 32, 2, 324, 329, 3, 2, 2, 2, 325, 326, 12, 3, 2, 2, 326, 328, 5, 62, 32, 2, 327, 325, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 61, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 46, 2, 2, 333, 334, 5, 76, 39, 2, 334, 335, 7, 40, 2, 2, 335, 336, 5, 58, 30, 2, 336, 63, 3, 2, 2, 2, 337, 338, 8, 33, 1, 2, 338, 339, 5, 58, 30, 2, 339, 345, 3, 2, 2, 2, 340, 341, 12, 3, 2, 2, 341, 342, 7, 35, 2, 2, 342, 344, 5, 58, 30, 2, 343, 340, 3, 2, 2, 2, 344, 347, 3, 2, 2, 2, 345, 343, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 65, 3, 2, 2, 2, 347, 345, 3, 2, 2, 2, 348, 359, 7, 14, 2, 2, 349, 351, 7, 48, 2, 2, 350, 352, 7, 49, 2, 2, 351, 350, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 3, 2, 2, 2, 353, 355, 7, 50, 2, 2, 354, 353, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 359, 3, 2, 2, 2, 356, 359, 7, 13, 2, 2, 357, 359, 5, 68, 35, 2, 358, 348, 3, 2, 2, 2, 358, 349, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 357, 3, 2, 2, 2, 359, 67, 3, 2, 2, 2, 360, 361, 9, 9, 2, 2, 361, 69, 3, 2, 2, 2, 362, 365, 5, 72, 37, 2, 363, 365, 5, 74, 38, 2, 364, 362, 3, 2, 2, 2, 364, 363, 3, 2, 2, 2, 365, 71, 3, 2, 2, 2, 366, 367, 9, 10, 2, 2, 367, 73, 3, 2, 2, 2, 368, 369, 7, 32, 2, 2, 369, 370, 7, 48, 2, 2, 370, 371, 7, 35, 2, 2, 371, 372, 7, 48, 2, 2, 372, 373, 7, 33, 2, 2, 373, 75, 3, 2, 2, 2, 374, 375, 9, 11, 2, 2, 375, 77, 3, 2, 2, 2, 38, 82, 86, 103, 109, 127, 136, 139, 142, 162, 174, 181, 189, 193, 196, 202, 210, 217, 226, 231, 237, 242, 248, 251, 254, 267, 278, 295, 300, 317, 319, 329, 345, 351, 354, 358, 364]
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlBaseListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlBaseListener.java
index 9f6e068..1101df2 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlBaseListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlBaseListener.java
@@ -328,6 +328,18 @@
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
+	@Override public void enterJavaClass(NCIdlParser.JavaClassContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitJavaClass(NCIdlParser.JavaClassContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
 	@Override public void enterTermId(NCIdlParser.TermIdContext ctx) { }
 	/**
 	 * {@inheritDoc}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlListener.java
index 7ad1ddb..d497b65 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlListener.java
@@ -268,6 +268,16 @@
 	 */
 	void exitJavaFqn(NCIdlParser.JavaFqnContext ctx);
 	/**
+	 * Enter a parse tree produced by {@link NCIdlParser#javaClass}.
+	 * @param ctx the parse tree
+	 */
+	void enterJavaClass(NCIdlParser.JavaClassContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIdlParser#javaClass}.
+	 * @param ctx the parse tree
+	 */
+	void exitJavaClass(NCIdlParser.JavaClassContext ctx);
+	/**
 	 * Enter a parse tree produced by {@link NCIdlParser#termId}.
 	 * @param ctx the parse tree
 	 */
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlParser.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlParser.java
index 9106ee2..fe02e69 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlParser.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdlParser.java
@@ -31,17 +31,17 @@
 		RULE_flowDecl = 14, RULE_metaDecl = 15, RULE_jsonObj = 16, RULE_jsonPair = 17, 
 		RULE_jsonVal = 18, RULE_jsonArr = 19, RULE_termDecls = 20, RULE_termDecl = 21, 
 		RULE_termEq = 22, RULE_term = 23, RULE_mtdRef = 24, RULE_javaFqn = 25, 
-		RULE_termId = 26, RULE_expr = 27, RULE_vars = 28, RULE_varDecl = 29, RULE_paramList = 30, 
-		RULE_atom = 31, RULE_qstring = 32, RULE_minMax = 33, RULE_minMaxShortcut = 34, 
-		RULE_minMaxRange = 35, RULE_id = 36;
+		RULE_javaClass = 26, RULE_termId = 27, RULE_expr = 28, RULE_vars = 29, 
+		RULE_varDecl = 30, RULE_paramList = 31, RULE_atom = 32, RULE_qstring = 33, 
+		RULE_minMax = 34, RULE_minMaxShortcut = 35, RULE_minMaxRange = 36, RULE_id = 37;
 	private static String[] makeRuleNames() {
 		return new String[] {
 			"idl", "synonym", "alias", "idlDecls", "idlDecl", "imp", "frag", "fragId", 
 			"fragRef", "fragMeta", "intent", "intentId", "orderedDecl", "mtdDecl", 
 			"flowDecl", "metaDecl", "jsonObj", "jsonPair", "jsonVal", "jsonArr", 
-			"termDecls", "termDecl", "termEq", "term", "mtdRef", "javaFqn", "termId", 
-			"expr", "vars", "varDecl", "paramList", "atom", "qstring", "minMax", 
-			"minMaxShortcut", "minMaxRange", "id"
+			"termDecls", "termDecl", "termEq", "term", "mtdRef", "javaFqn", "javaClass", 
+			"termId", "expr", "vars", "varDecl", "paramList", "atom", "qstring", 
+			"minMax", "minMaxShortcut", "minMaxRange", "id"
 		};
 	}
 	public static final String[] ruleNames = makeRuleNames();
@@ -143,9 +143,9 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(74);
+			setState(76);
 			idlDecls(0);
-			setState(75);
+			setState(77);
 			match(EOF);
 			}
 		}
@@ -194,33 +194,33 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(78);
+			setState(80);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==LBR) {
 				{
-				setState(77);
+				setState(79);
 				alias();
 				}
 			}
 
-			setState(80);
-			match(LBRACE);
 			setState(82);
+			match(LBRACE);
+			setState(84);
 			_errHandler.sync(this);
 			switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) {
 			case 1:
 				{
-				setState(81);
+				setState(83);
 				vars(0);
 				}
 				break;
 			}
-			setState(84);
-			expr(0);
-			setState(85);
-			match(RBRACE);
 			setState(86);
+			expr(0);
+			setState(87);
+			match(RBRACE);
+			setState(88);
 			match(EOF);
 			}
 		}
@@ -261,11 +261,11 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(88);
-			match(LBR);
-			setState(89);
-			id();
 			setState(90);
+			match(LBR);
+			setState(91);
+			id();
+			setState(92);
 			match(RBR);
 			}
 		}
@@ -317,11 +317,11 @@
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(93);
+			setState(95);
 			idlDecl();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(99);
+			setState(101);
 			_errHandler.sync(this);
 			_alt = getInterpreter().adaptivePredict(_input,2,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -332,14 +332,14 @@
 					{
 					_localctx = new IdlDeclsContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_idlDecls);
-					setState(95);
+					setState(97);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(96);
+					setState(98);
 					idlDecl();
 					}
 					} 
 				}
-				setState(101);
+				setState(103);
 				_errHandler.sync(this);
 				_alt = getInterpreter().adaptivePredict(_input,2,_ctx);
 			}
@@ -384,27 +384,27 @@
 		IdlDeclContext _localctx = new IdlDeclContext(_ctx, getState());
 		enterRule(_localctx, 8, RULE_idlDecl);
 		try {
-			setState(105);
+			setState(107);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case INTENT:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(102);
+				setState(104);
 				intent();
 				}
 				break;
 			case FRAG:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(103);
+				setState(105);
 				frag();
 				}
 				break;
 			case IMPORT:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(104);
+				setState(106);
 				imp();
 				}
 				break;
@@ -450,13 +450,13 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(107);
-			match(IMPORT);
-			setState(108);
-			match(LPAR);
 			setState(109);
-			qstring();
+			match(IMPORT);
 			setState(110);
+			match(LPAR);
+			setState(111);
+			qstring();
+			setState(112);
 			match(RPAR);
 			}
 		}
@@ -498,9 +498,9 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(112);
+			setState(114);
 			fragId();
-			setState(113);
+			setState(115);
 			termDecls(0);
 			}
 		}
@@ -541,11 +541,11 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(115);
-			match(FRAG);
-			setState(116);
-			match(ASSIGN);
 			setState(117);
+			match(FRAG);
+			setState(118);
+			match(ASSIGN);
+			setState(119);
 			id();
 			}
 		}
@@ -591,23 +591,23 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(119);
-			match(FRAG);
-			setState(120);
-			match(LPAR);
 			setState(121);
-			id();
+			match(FRAG);
+			setState(122);
+			match(LPAR);
 			setState(123);
+			id();
+			setState(125);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==COMMA) {
 				{
-				setState(122);
+				setState(124);
 				fragMeta();
 				}
 			}
 
-			setState(125);
+			setState(127);
 			match(RPAR);
 			}
 		}
@@ -647,9 +647,9 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(127);
+			setState(129);
 			match(COMMA);
-			setState(128);
+			setState(130);
 			jsonObj();
 			}
 		}
@@ -701,39 +701,39 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(130);
-			intentId();
 			setState(132);
+			intentId();
+			setState(134);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==ORDERED) {
 				{
-				setState(131);
+				setState(133);
 				orderedDecl();
 				}
 			}
 
-			setState(135);
+			setState(137);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==FLOW) {
 				{
-				setState(134);
+				setState(136);
 				flowDecl();
 				}
 			}
 
-			setState(138);
+			setState(140);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==META) {
 				{
-				setState(137);
+				setState(139);
 				metaDecl();
 				}
 			}
 
-			setState(140);
+			setState(142);
 			termDecls(0);
 			}
 		}
@@ -774,11 +774,11 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(142);
-			match(INTENT);
-			setState(143);
-			match(ASSIGN);
 			setState(144);
+			match(INTENT);
+			setState(145);
+			match(ASSIGN);
+			setState(146);
 			id();
 			}
 		}
@@ -817,11 +817,11 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(146);
-			match(ORDERED);
-			setState(147);
-			match(ASSIGN);
 			setState(148);
+			match(ORDERED);
+			setState(149);
+			match(ASSIGN);
+			setState(150);
 			match(BOOL);
 			}
 		}
@@ -864,12 +864,12 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(150);
-			match(DIV);
-			setState(151);
-			mtdRef();
 			setState(152);
 			match(DIV);
+			setState(153);
+			mtdRef();
+			setState(154);
+			match(DIV);
 			}
 		}
 		catch (RecognitionException re) {
@@ -912,23 +912,23 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(154);
+			setState(156);
 			match(FLOW);
-			setState(155);
+			setState(157);
 			match(ASSIGN);
-			setState(158);
+			setState(160);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case SQSTRING:
 			case DQSTRING:
 				{
-				setState(156);
+				setState(158);
 				qstring();
 				}
 				break;
 			case DIV:
 				{
-				setState(157);
+				setState(159);
 				mtdDecl();
 				}
 				break;
@@ -974,11 +974,11 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(160);
-			match(META);
-			setState(161);
-			match(ASSIGN);
 			setState(162);
+			match(META);
+			setState(163);
+			match(ASSIGN);
+			setState(164);
 			jsonObj();
 			}
 		}
@@ -1025,42 +1025,42 @@
 		enterRule(_localctx, 32, RULE_jsonObj);
 		int _la;
 		try {
-			setState(177);
+			setState(179);
 			_errHandler.sync(this);
 			switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(164);
+				setState(166);
 				match(LBRACE);
-				setState(165);
+				setState(167);
 				jsonPair();
-				setState(170);
+				setState(172);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				while (_la==COMMA) {
 					{
 					{
-					setState(166);
+					setState(168);
 					match(COMMA);
-					setState(167);
+					setState(169);
 					jsonPair();
 					}
 					}
-					setState(172);
+					setState(174);
 					_errHandler.sync(this);
 					_la = _input.LA(1);
 				}
-				setState(173);
+				setState(175);
 				match(RBRACE);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(175);
+				setState(177);
 				match(LBRACE);
-				setState(176);
+				setState(178);
 				match(RBRACE);
 				}
 				break;
@@ -1105,11 +1105,11 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(179);
-			qstring();
-			setState(180);
-			match(COLON);
 			setState(181);
+			qstring();
+			setState(182);
+			match(COLON);
+			setState(183);
 			jsonVal();
 			}
 		}
@@ -1159,14 +1159,14 @@
 		enterRule(_localctx, 36, RULE_jsonVal);
 		int _la;
 		try {
-			setState(198);
+			setState(200);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case SQSTRING:
 			case DQSTRING:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(183);
+				setState(185);
 				qstring();
 				}
 				break;
@@ -1174,34 +1174,34 @@
 			case INT:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(185);
+				setState(187);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				if (_la==MINUS) {
 					{
-					setState(184);
+					setState(186);
 					match(MINUS);
 					}
 				}
 
-				setState(187);
-				match(INT);
 				setState(189);
+				match(INT);
+				setState(191);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				if (_la==REAL) {
 					{
-					setState(188);
+					setState(190);
 					match(REAL);
 					}
 				}
 
-				setState(192);
+				setState(194);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				if (_la==EXP) {
 					{
-					setState(191);
+					setState(193);
 					match(EXP);
 					}
 				}
@@ -1211,28 +1211,28 @@
 			case LBRACE:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(194);
+				setState(196);
 				jsonObj();
 				}
 				break;
 			case LBR:
 				enterOuterAlt(_localctx, 4);
 				{
-				setState(195);
+				setState(197);
 				jsonArr();
 				}
 				break;
 			case BOOL:
 				enterOuterAlt(_localctx, 5);
 				{
-				setState(196);
+				setState(198);
 				match(BOOL);
 				}
 				break;
 			case NULL:
 				enterOuterAlt(_localctx, 6);
 				{
-				setState(197);
+				setState(199);
 				match(NULL);
 				}
 				break;
@@ -1283,42 +1283,42 @@
 		enterRule(_localctx, 38, RULE_jsonArr);
 		int _la;
 		try {
-			setState(213);
+			setState(215);
 			_errHandler.sync(this);
 			switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(200);
+				setState(202);
 				match(LBR);
-				setState(201);
+				setState(203);
 				jsonVal();
-				setState(206);
+				setState(208);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				while (_la==COMMA) {
 					{
 					{
-					setState(202);
+					setState(204);
 					match(COMMA);
-					setState(203);
+					setState(205);
 					jsonVal();
 					}
 					}
-					setState(208);
+					setState(210);
 					_errHandler.sync(this);
 					_la = _input.LA(1);
 				}
-				setState(209);
+				setState(211);
 				match(RBR);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(211);
+				setState(213);
 				match(LBR);
-				setState(212);
+				setState(214);
 				match(RBR);
 				}
 				break;
@@ -1372,11 +1372,11 @@
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(216);
+			setState(218);
 			termDecl();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(222);
+			setState(224);
 			_errHandler.sync(this);
 			_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -1387,14 +1387,14 @@
 					{
 					_localctx = new TermDeclsContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_termDecls);
-					setState(218);
+					setState(220);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(219);
+					setState(221);
 					termDecl();
 					}
 					} 
 				}
-				setState(224);
+				setState(226);
 				_errHandler.sync(this);
 				_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
 			}
@@ -1436,20 +1436,20 @@
 		TermDeclContext _localctx = new TermDeclContext(_ctx, getState());
 		enterRule(_localctx, 42, RULE_termDecl);
 		try {
-			setState(227);
+			setState(229);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case TERM:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(225);
+				setState(227);
 				term();
 				}
 				break;
 			case FRAG:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(226);
+				setState(228);
 				fragRef();
 				}
 				break;
@@ -1492,7 +1492,7 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(229);
+			setState(231);
 			_la = _input.LA(1);
 			if ( !(_la==TILDA || _la==ASSIGN) ) {
 			_errHandler.recoverInline(this);
@@ -1558,60 +1558,60 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(231);
-			match(TERM);
 			setState(233);
+			match(TERM);
+			setState(235);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==LPAR) {
 				{
-				setState(232);
+				setState(234);
 				termId();
 				}
 			}
 
-			setState(235);
+			setState(237);
 			termEq();
-			setState(244);
+			setState(246);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case LBRACE:
 				{
 				{
-				setState(236);
-				match(LBRACE);
 				setState(238);
+				match(LBRACE);
+				setState(240);
 				_errHandler.sync(this);
 				switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) {
 				case 1:
 					{
-					setState(237);
+					setState(239);
 					vars(0);
 					}
 					break;
 				}
-				setState(240);
+				setState(242);
 				expr(0);
-				setState(241);
+				setState(243);
 				match(RBRACE);
 				}
 				}
 				break;
 			case DIV:
 				{
-				setState(243);
+				setState(245);
 				mtdDecl();
 				}
 				break;
 			default:
 				throw new NoViableAltException(this);
 			}
-			setState(247);
+			setState(249);
 			_errHandler.sync(this);
 			switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) {
 			case 1:
 				{
-				setState(246);
+				setState(248);
 				minMax();
 				}
 				break;
@@ -1658,19 +1658,19 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(250);
+			setState(252);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
-			if (_la==FUN_NAME || _la==ID) {
+			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FUN_NAME) | (1L << IMPORT) | (1L << INTENT) | (1L << ORDERED) | (1L << FLOW) | (1L << META) | (1L << TERM) | (1L << FRAG) | (1L << ID))) != 0)) {
 				{
-				setState(249);
+				setState(251);
 				javaFqn(0);
 				}
 			}
 
-			setState(252);
+			setState(254);
 			match(POUND);
-			setState(253);
+			setState(255);
 			id();
 			}
 		}
@@ -1686,8 +1686,8 @@
 	}
 
 	public static class JavaFqnContext extends ParserRuleContext {
-		public IdContext id() {
-			return getRuleContext(IdContext.class,0);
+		public JavaClassContext javaClass() {
+			return getRuleContext(JavaClassContext.class,0);
 		}
 		public JavaFqnContext javaFqn() {
 			return getRuleContext(JavaFqnContext.class,0);
@@ -1723,11 +1723,11 @@
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(256);
-			id();
+			setState(258);
+			javaClass();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(263);
+			setState(265);
 			_errHandler.sync(this);
 			_alt = getInterpreter().adaptivePredict(_input,24,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -1738,16 +1738,16 @@
 					{
 					_localctx = new JavaFqnContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_javaFqn);
-					setState(258);
-					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(259);
-					match(DOT);
 					setState(260);
-					id();
+					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+					setState(261);
+					match(DOT);
+					setState(262);
+					javaClass();
 					}
 					} 
 				}
-				setState(265);
+				setState(267);
 				_errHandler.sync(this);
 				_alt = getInterpreter().adaptivePredict(_input,24,_ctx);
 			}
@@ -1764,6 +1764,110 @@
 		return _localctx;
 	}
 
+	public static class JavaClassContext extends ParserRuleContext {
+		public IdContext id() {
+			return getRuleContext(IdContext.class,0);
+		}
+		public TerminalNode IMPORT() { return getToken(NCIdlParser.IMPORT, 0); }
+		public TerminalNode INTENT() { return getToken(NCIdlParser.INTENT, 0); }
+		public TerminalNode ORDERED() { return getToken(NCIdlParser.ORDERED, 0); }
+		public TerminalNode FLOW() { return getToken(NCIdlParser.FLOW, 0); }
+		public TerminalNode META() { return getToken(NCIdlParser.META, 0); }
+		public TerminalNode TERM() { return getToken(NCIdlParser.TERM, 0); }
+		public TerminalNode FRAG() { return getToken(NCIdlParser.FRAG, 0); }
+		public JavaClassContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_javaClass; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).enterJavaClass(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIdlListener ) ((NCIdlListener)listener).exitJavaClass(this);
+		}
+	}
+
+	public final JavaClassContext javaClass() throws RecognitionException {
+		JavaClassContext _localctx = new JavaClassContext(_ctx, getState());
+		enterRule(_localctx, 52, RULE_javaClass);
+		try {
+			setState(276);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case FUN_NAME:
+			case ID:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(268);
+				id();
+				}
+				break;
+			case IMPORT:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(269);
+				match(IMPORT);
+				}
+				break;
+			case INTENT:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(270);
+				match(INTENT);
+				}
+				break;
+			case ORDERED:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(271);
+				match(ORDERED);
+				}
+				break;
+			case FLOW:
+				enterOuterAlt(_localctx, 5);
+				{
+				setState(272);
+				match(FLOW);
+				}
+				break;
+			case META:
+				enterOuterAlt(_localctx, 6);
+				{
+				setState(273);
+				match(META);
+				}
+				break;
+			case TERM:
+				enterOuterAlt(_localctx, 7);
+				{
+				setState(274);
+				match(TERM);
+				}
+				break;
+			case FRAG:
+				enterOuterAlt(_localctx, 8);
+				{
+				setState(275);
+				match(FRAG);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
 	public static class TermIdContext extends ParserRuleContext {
 		public TerminalNode LPAR() { return getToken(NCIdlParser.LPAR, 0); }
 		public IdContext id() {
@@ -1786,15 +1890,15 @@
 
 	public final TermIdContext termId() throws RecognitionException {
 		TermIdContext _localctx = new TermIdContext(_ctx, getState());
-		enterRule(_localctx, 52, RULE_termId);
+		enterRule(_localctx, 54, RULE_termId);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(266);
+			setState(278);
 			match(LPAR);
-			setState(267);
+			setState(279);
 			id();
-			setState(268);
+			setState(280);
 			match(RPAR);
 			}
 		}
@@ -2012,14 +2116,14 @@
 		int _parentState = getState();
 		ExprContext _localctx = new ExprContext(_ctx, _parentState);
 		ExprContext _prevctx = _localctx;
-		int _startState = 54;
-		enterRecursionRule(_localctx, 54, RULE_expr, _p);
+		int _startState = 56;
+		enterRecursionRule(_localctx, 56, RULE_expr, _p);
 		int _la;
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(286);
+			setState(298);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case NOT:
@@ -2029,7 +2133,7 @@
 				_ctx = _localctx;
 				_prevctx = _localctx;
 
-				setState(271);
+				setState(283);
 				((UnaryExprContext)_localctx).op = _input.LT(1);
 				_la = _input.LA(1);
 				if ( !(_la==NOT || _la==MINUS) ) {
@@ -2040,7 +2144,7 @@
 					_errHandler.reportMatch(this);
 					consume();
 				}
-				setState(272);
+				setState(284);
 				expr(10);
 				}
 				break;
@@ -2049,11 +2153,11 @@
 				_localctx = new ParExprContext(_localctx);
 				_ctx = _localctx;
 				_prevctx = _localctx;
-				setState(273);
+				setState(285);
 				match(LPAR);
-				setState(274);
+				setState(286);
 				expr(0);
-				setState(275);
+				setState(287);
 				match(RPAR);
 				}
 				break;
@@ -2066,7 +2170,7 @@
 				_localctx = new AtomExprContext(_localctx);
 				_ctx = _localctx;
 				_prevctx = _localctx;
-				setState(277);
+				setState(289);
 				atom();
 				}
 				break;
@@ -2075,21 +2179,21 @@
 				_localctx = new CallExprContext(_localctx);
 				_ctx = _localctx;
 				_prevctx = _localctx;
-				setState(278);
+				setState(290);
 				match(FUN_NAME);
-				setState(279);
+				setState(291);
 				match(LPAR);
-				setState(281);
+				setState(293);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FUN_NAME) | (1L << SQSTRING) | (1L << DQSTRING) | (1L << BOOL) | (1L << NULL) | (1L << NOT) | (1L << LPAR) | (1L << MINUS) | (1L << AT) | (1L << INT))) != 0)) {
 					{
-					setState(280);
+					setState(292);
 					paramList(0);
 					}
 				}
 
-				setState(283);
+				setState(295);
 				match(RPAR);
 				}
 				break;
@@ -2098,9 +2202,9 @@
 				_localctx = new VarRefContext(_localctx);
 				_ctx = _localctx;
 				_prevctx = _localctx;
-				setState(284);
+				setState(296);
 				match(AT);
-				setState(285);
+				setState(297);
 				id();
 				}
 				break;
@@ -2108,24 +2212,24 @@
 				throw new NoViableAltException(this);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(305);
+			setState(317);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,28,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,29,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
-					setState(303);
+					setState(315);
 					_errHandler.sync(this);
-					switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
+					switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
 					case 1:
 						{
 						_localctx = new MultDivModExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(288);
+						setState(300);
 						if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
-						setState(289);
+						setState(301);
 						((MultDivModExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << MULT) | (1L << DIV) | (1L << MOD))) != 0)) ) {
@@ -2136,7 +2240,7 @@
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(290);
+						setState(302);
 						expr(9);
 						}
 						break;
@@ -2144,9 +2248,9 @@
 						{
 						_localctx = new PlusMinusExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(291);
+						setState(303);
 						if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
-						setState(292);
+						setState(304);
 						((PlusMinusExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !(_la==MINUS || _la==PLUS) ) {
@@ -2157,7 +2261,7 @@
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(293);
+						setState(305);
 						expr(8);
 						}
 						break;
@@ -2165,9 +2269,9 @@
 						{
 						_localctx = new CompExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(294);
+						setState(306);
 						if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
-						setState(295);
+						setState(307);
 						((CompExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GTEQ) | (1L << LTEQ) | (1L << GT) | (1L << LT))) != 0)) ) {
@@ -2178,7 +2282,7 @@
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(296);
+						setState(308);
 						expr(7);
 						}
 						break;
@@ -2186,9 +2290,9 @@
 						{
 						_localctx = new EqNeqExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(297);
+						setState(309);
 						if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
-						setState(298);
+						setState(310);
 						((EqNeqExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !(_la==EQ || _la==NEQ) ) {
@@ -2199,7 +2303,7 @@
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(299);
+						setState(311);
 						expr(6);
 						}
 						break;
@@ -2207,9 +2311,9 @@
 						{
 						_localctx = new AndOrExprContext(new ExprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(300);
+						setState(312);
 						if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
-						setState(301);
+						setState(313);
 						((AndOrExprContext)_localctx).op = _input.LT(1);
 						_la = _input.LA(1);
 						if ( !(_la==AND || _la==OR) ) {
@@ -2220,16 +2324,16 @@
 							_errHandler.reportMatch(this);
 							consume();
 						}
-						setState(302);
+						setState(314);
 						expr(5);
 						}
 						break;
 					}
 					} 
 				}
-				setState(307);
+				setState(319);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,28,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,29,_ctx);
 			}
 			}
 		}
@@ -2274,20 +2378,20 @@
 		int _parentState = getState();
 		VarsContext _localctx = new VarsContext(_ctx, _parentState);
 		VarsContext _prevctx = _localctx;
-		int _startState = 56;
-		enterRecursionRule(_localctx, 56, RULE_vars, _p);
+		int _startState = 58;
+		enterRecursionRule(_localctx, 58, RULE_vars, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(309);
+			setState(321);
 			varDecl();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(315);
+			setState(327);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,29,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -2296,16 +2400,16 @@
 					{
 					_localctx = new VarsContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_vars);
-					setState(311);
+					setState(323);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(312);
+					setState(324);
 					varDecl();
 					}
 					} 
 				}
-				setState(317);
+				setState(329);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,29,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
 			}
 			}
 		}
@@ -2345,17 +2449,17 @@
 
 	public final VarDeclContext varDecl() throws RecognitionException {
 		VarDeclContext _localctx = new VarDeclContext(_ctx, getState());
-		enterRule(_localctx, 58, RULE_varDecl);
+		enterRule(_localctx, 60, RULE_varDecl);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(318);
+			setState(330);
 			match(AT);
-			setState(319);
+			setState(331);
 			id();
-			setState(320);
+			setState(332);
 			match(ASSIGN);
-			setState(321);
+			setState(333);
 			expr(0);
 			}
 		}
@@ -2401,20 +2505,20 @@
 		int _parentState = getState();
 		ParamListContext _localctx = new ParamListContext(_ctx, _parentState);
 		ParamListContext _prevctx = _localctx;
-		int _startState = 60;
-		enterRecursionRule(_localctx, 60, RULE_paramList, _p);
+		int _startState = 62;
+		enterRecursionRule(_localctx, 62, RULE_paramList, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(324);
+			setState(336);
 			expr(0);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(331);
+			setState(343);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,31,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -2423,18 +2527,18 @@
 					{
 					_localctx = new ParamListContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_paramList);
-					setState(326);
+					setState(338);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(327);
+					setState(339);
 					match(COMMA);
-					setState(328);
+					setState(340);
 					expr(0);
 					}
 					} 
 				}
-				setState(333);
+				setState(345);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,31,_ctx);
 			}
 			}
 		}
@@ -2474,39 +2578,39 @@
 
 	public final AtomContext atom() throws RecognitionException {
 		AtomContext _localctx = new AtomContext(_ctx, getState());
-		enterRule(_localctx, 62, RULE_atom);
+		enterRule(_localctx, 64, RULE_atom);
 		try {
-			setState(344);
+			setState(356);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case NULL:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(334);
+				setState(346);
 				match(NULL);
 				}
 				break;
 			case INT:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(335);
+				setState(347);
 				match(INT);
-				setState(337);
-				_errHandler.sync(this);
-				switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) {
-				case 1:
-					{
-					setState(336);
-					match(REAL);
-					}
-					break;
-				}
-				setState(340);
+				setState(349);
 				_errHandler.sync(this);
 				switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
 				case 1:
 					{
-					setState(339);
+					setState(348);
+					match(REAL);
+					}
+					break;
+				}
+				setState(352);
+				_errHandler.sync(this);
+				switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) {
+				case 1:
+					{
+					setState(351);
 					match(EXP);
 					}
 					break;
@@ -2516,7 +2620,7 @@
 			case BOOL:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(342);
+				setState(354);
 				match(BOOL);
 				}
 				break;
@@ -2524,7 +2628,7 @@
 			case DQSTRING:
 				enterOuterAlt(_localctx, 4);
 				{
-				setState(343);
+				setState(355);
 				qstring();
 				}
 				break;
@@ -2562,12 +2666,12 @@
 
 	public final QstringContext qstring() throws RecognitionException {
 		QstringContext _localctx = new QstringContext(_ctx, getState());
-		enterRule(_localctx, 64, RULE_qstring);
+		enterRule(_localctx, 66, RULE_qstring);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(346);
+			setState(358);
 			_la = _input.LA(1);
 			if ( !(_la==SQSTRING || _la==DQSTRING) ) {
 			_errHandler.recoverInline(this);
@@ -2613,9 +2717,9 @@
 
 	public final MinMaxContext minMax() throws RecognitionException {
 		MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
-		enterRule(_localctx, 66, RULE_minMax);
+		enterRule(_localctx, 68, RULE_minMax);
 		try {
-			setState(350);
+			setState(362);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case PLUS:
@@ -2623,14 +2727,14 @@
 			case MULT:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(348);
+				setState(360);
 				minMaxShortcut();
 				}
 				break;
 			case LBR:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(349);
+				setState(361);
 				minMaxRange();
 				}
 				break;
@@ -2669,12 +2773,12 @@
 
 	public final MinMaxShortcutContext minMaxShortcut() throws RecognitionException {
 		MinMaxShortcutContext _localctx = new MinMaxShortcutContext(_ctx, getState());
-		enterRule(_localctx, 68, RULE_minMaxShortcut);
+		enterRule(_localctx, 70, RULE_minMaxShortcut);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(352);
+			setState(364);
 			_la = _input.LA(1);
 			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PLUS) | (1L << QUESTION) | (1L << MULT))) != 0)) ) {
 			_errHandler.recoverInline(this);
@@ -2721,19 +2825,19 @@
 
 	public final MinMaxRangeContext minMaxRange() throws RecognitionException {
 		MinMaxRangeContext _localctx = new MinMaxRangeContext(_ctx, getState());
-		enterRule(_localctx, 70, RULE_minMaxRange);
+		enterRule(_localctx, 72, RULE_minMaxRange);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(354);
+			setState(366);
 			match(LBR);
-			setState(355);
+			setState(367);
 			match(INT);
-			setState(356);
+			setState(368);
 			match(COMMA);
-			setState(357);
+			setState(369);
 			match(INT);
-			setState(358);
+			setState(370);
 			match(RBR);
 			}
 		}
@@ -2767,12 +2871,12 @@
 
 	public final IdContext id() throws RecognitionException {
 		IdContext _localctx = new IdContext(_ctx, getState());
-		enterRule(_localctx, 72, RULE_id);
+		enterRule(_localctx, 74, RULE_id);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(360);
+			setState(372);
 			_la = _input.LA(1);
 			if ( !(_la==FUN_NAME || _la==ID) ) {
 			_errHandler.recoverInline(this);
@@ -2803,11 +2907,11 @@
 			return termDecls_sempred((TermDeclsContext)_localctx, predIndex);
 		case 25:
 			return javaFqn_sempred((JavaFqnContext)_localctx, predIndex);
-		case 27:
-			return expr_sempred((ExprContext)_localctx, predIndex);
 		case 28:
+			return expr_sempred((ExprContext)_localctx, predIndex);
+		case 29:
 			return vars_sempred((VarsContext)_localctx, predIndex);
-		case 30:
+		case 31:
 			return paramList_sempred((ParamListContext)_localctx, predIndex);
 		}
 		return true;
@@ -2864,133 +2968,139 @@
 	}
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\66\u016d\4\2\t\2"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\66\u0179\4\2\t\2"+
 		"\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
 		"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
 		"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
-		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\3\2\3\2\3\2\3\3\5\3Q\n\3\3\3\3\3\5"+
-		"\3U\n\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\7\5d\n\5\f"+
-		"\5\16\5g\13\5\3\6\3\6\3\6\5\6l\n\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\t"+
-		"\3\t\3\t\3\t\3\n\3\n\3\n\3\n\5\n~\n\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\5"+
-		"\f\u0087\n\f\3\f\5\f\u008a\n\f\3\f\5\f\u008d\n\f\3\f\3\f\3\r\3\r\3\r\3"+
-		"\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\5\20\u00a1"+
-		"\n\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\7\22\u00ab\n\22\f\22\16"+
-		"\22\u00ae\13\22\3\22\3\22\3\22\3\22\5\22\u00b4\n\22\3\23\3\23\3\23\3\23"+
-		"\3\24\3\24\5\24\u00bc\n\24\3\24\3\24\5\24\u00c0\n\24\3\24\5\24\u00c3\n"+
-		"\24\3\24\3\24\3\24\3\24\5\24\u00c9\n\24\3\25\3\25\3\25\3\25\7\25\u00cf"+
-		"\n\25\f\25\16\25\u00d2\13\25\3\25\3\25\3\25\3\25\5\25\u00d8\n\25\3\26"+
-		"\3\26\3\26\3\26\3\26\7\26\u00df\n\26\f\26\16\26\u00e2\13\26\3\27\3\27"+
-		"\5\27\u00e6\n\27\3\30\3\30\3\31\3\31\5\31\u00ec\n\31\3\31\3\31\3\31\5"+
-		"\31\u00f1\n\31\3\31\3\31\3\31\3\31\5\31\u00f7\n\31\3\31\5\31\u00fa\n\31"+
-		"\3\32\5\32\u00fd\n\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\7\33"+
-		"\u0108\n\33\f\33\16\33\u010b\13\33\3\34\3\34\3\34\3\34\3\35\3\35\3\35"+
-		"\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u011c\n\35\3\35\3\35\3\35"+
-		"\5\35\u0121\n\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
-		"\3\35\3\35\3\35\3\35\7\35\u0132\n\35\f\35\16\35\u0135\13\35\3\36\3\36"+
-		"\3\36\3\36\3\36\7\36\u013c\n\36\f\36\16\36\u013f\13\36\3\37\3\37\3\37"+
-		"\3\37\3\37\3 \3 \3 \3 \3 \3 \7 \u014c\n \f \16 \u014f\13 \3!\3!\3!\5!"+
-		"\u0154\n!\3!\5!\u0157\n!\3!\3!\5!\u015b\n!\3\"\3\"\3#\3#\5#\u0161\n#\3"+
-		"$\3$\3%\3%\3%\3%\3%\3%\3&\3&\3&\2\b\b*\648:>\'\2\4\6\b\n\f\16\20\22\24"+
-		"\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJ\2\f\4\2\37\37((\4\2\30"+
-		"\30%%\3\2+-\4\2%%))\3\2\21\24\3\2\17\20\3\2\25\26\3\2\13\f\3\2)+\4\2\3"+
-		"\3\63\63\2\u0177\2L\3\2\2\2\4P\3\2\2\2\6Z\3\2\2\2\b^\3\2\2\2\nk\3\2\2"+
-		"\2\fm\3\2\2\2\16r\3\2\2\2\20u\3\2\2\2\22y\3\2\2\2\24\u0081\3\2\2\2\26"+
-		"\u0084\3\2\2\2\30\u0090\3\2\2\2\32\u0094\3\2\2\2\34\u0098\3\2\2\2\36\u009c"+
-		"\3\2\2\2 \u00a2\3\2\2\2\"\u00b3\3\2\2\2$\u00b5\3\2\2\2&\u00c8\3\2\2\2"+
-		"(\u00d7\3\2\2\2*\u00d9\3\2\2\2,\u00e5\3\2\2\2.\u00e7\3\2\2\2\60\u00e9"+
-		"\3\2\2\2\62\u00fc\3\2\2\2\64\u0101\3\2\2\2\66\u010c\3\2\2\28\u0120\3\2"+
-		"\2\2:\u0136\3\2\2\2<\u0140\3\2\2\2>\u0145\3\2\2\2@\u015a\3\2\2\2B\u015c"+
-		"\3\2\2\2D\u0160\3\2\2\2F\u0162\3\2\2\2H\u0164\3\2\2\2J\u016a\3\2\2\2L"+
-		"M\5\b\5\2MN\7\2\2\3N\3\3\2\2\2OQ\5\6\4\2PO\3\2\2\2PQ\3\2\2\2QR\3\2\2\2"+
-		"RT\7\33\2\2SU\5:\36\2TS\3\2\2\2TU\3\2\2\2UV\3\2\2\2VW\58\35\2WX\7\34\2"+
-		"\2XY\7\2\2\3Y\5\3\2\2\2Z[\7 \2\2[\\\5J&\2\\]\7!\2\2]\7\3\2\2\2^_\b\5\1"+
-		"\2_`\5\n\6\2`e\3\2\2\2ab\f\3\2\2bd\5\n\6\2ca\3\2\2\2dg\3\2\2\2ec\3\2\2"+
-		"\2ef\3\2\2\2f\t\3\2\2\2ge\3\2\2\2hl\5\26\f\2il\5\16\b\2jl\5\f\7\2kh\3"+
-		"\2\2\2ki\3\2\2\2kj\3\2\2\2l\13\3\2\2\2mn\7\4\2\2no\7\31\2\2op\5B\"\2p"+
-		"q\7\32\2\2q\r\3\2\2\2rs\5\20\t\2st\5*\26\2t\17\3\2\2\2uv\7\n\2\2vw\7("+
-		"\2\2wx\5J&\2x\21\3\2\2\2yz\7\n\2\2z{\7\31\2\2{}\5J&\2|~\5\24\13\2}|\3"+
-		"\2\2\2}~\3\2\2\2~\177\3\2\2\2\177\u0080\7\32\2\2\u0080\23\3\2\2\2\u0081"+
-		"\u0082\7#\2\2\u0082\u0083\5\"\22\2\u0083\25\3\2\2\2\u0084\u0086\5\30\r"+
-		"\2\u0085\u0087\5\32\16\2\u0086\u0085\3\2\2\2\u0086\u0087\3\2\2\2\u0087"+
-		"\u0089\3\2\2\2\u0088\u008a\5\36\20\2\u0089\u0088\3\2\2\2\u0089\u008a\3"+
-		"\2\2\2\u008a\u008c\3\2\2\2\u008b\u008d\5 \21\2\u008c\u008b\3\2\2\2\u008c"+
-		"\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008f\5*\26\2\u008f\27\3\2\2"+
-		"\2\u0090\u0091\7\5\2\2\u0091\u0092\7(\2\2\u0092\u0093\5J&\2\u0093\31\3"+
-		"\2\2\2\u0094\u0095\7\6\2\2\u0095\u0096\7(\2\2\u0096\u0097\7\r\2\2\u0097"+
-		"\33\3\2\2\2\u0098\u0099\7,\2\2\u0099\u009a\5\62\32\2\u009a\u009b\7,\2"+
-		"\2\u009b\35\3\2\2\2\u009c\u009d\7\7\2\2\u009d\u00a0\7(\2\2\u009e\u00a1"+
-		"\5B\"\2\u009f\u00a1\5\34\17\2\u00a0\u009e\3\2\2\2\u00a0\u009f\3\2\2\2"+
-		"\u00a1\37\3\2\2\2\u00a2\u00a3\7\b\2\2\u00a3\u00a4\7(\2\2\u00a4\u00a5\5"+
-		"\"\22\2\u00a5!\3\2\2\2\u00a6\u00a7\7\33\2\2\u00a7\u00ac\5$\23\2\u00a8"+
-		"\u00a9\7#\2\2\u00a9\u00ab\5$\23\2\u00aa\u00a8\3\2\2\2\u00ab\u00ae\3\2"+
-		"\2\2\u00ac\u00aa\3\2\2\2\u00ac\u00ad\3\2\2\2\u00ad\u00af\3\2\2\2\u00ae"+
-		"\u00ac\3\2\2\2\u00af\u00b0\7\34\2\2\u00b0\u00b4\3\2\2\2\u00b1\u00b2\7"+
-		"\33\2\2\u00b2\u00b4\7\34\2\2\u00b3\u00a6\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4"+
-		"#\3\2\2\2\u00b5\u00b6\5B\"\2\u00b6\u00b7\7$\2\2\u00b7\u00b8\5&\24\2\u00b8"+
-		"%\3\2\2\2\u00b9\u00c9\5B\"\2\u00ba\u00bc\7%\2\2\u00bb\u00ba\3\2\2\2\u00bb"+
-		"\u00bc\3\2\2\2\u00bc\u00bd\3\2\2\2\u00bd\u00bf\7\60\2\2\u00be\u00c0\7"+
-		"\61\2\2\u00bf\u00be\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c2\3\2\2\2\u00c1"+
-		"\u00c3\7\62\2\2\u00c2\u00c1\3\2\2\2\u00c2\u00c3\3\2\2\2\u00c3\u00c9\3"+
-		"\2\2\2\u00c4\u00c9\5\"\22\2\u00c5\u00c9\5(\25\2\u00c6\u00c9\7\r\2\2\u00c7"+
-		"\u00c9\7\16\2\2\u00c8\u00b9\3\2\2\2\u00c8\u00bb\3\2\2\2\u00c8\u00c4\3"+
-		"\2\2\2\u00c8\u00c5\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c7\3\2\2\2\u00c9"+
-		"\'\3\2\2\2\u00ca\u00cb\7 \2\2\u00cb\u00d0\5&\24\2\u00cc\u00cd\7#\2\2\u00cd"+
-		"\u00cf\5&\24\2\u00ce\u00cc\3\2\2\2\u00cf\u00d2\3\2\2\2\u00d0\u00ce\3\2"+
-		"\2\2\u00d0\u00d1\3\2\2\2\u00d1\u00d3\3\2\2\2\u00d2\u00d0\3\2\2\2\u00d3"+
-		"\u00d4\7!\2\2\u00d4\u00d8\3\2\2\2\u00d5\u00d6\7 \2\2\u00d6\u00d8\7!\2"+
-		"\2\u00d7\u00ca\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d8)\3\2\2\2\u00d9\u00da"+
-		"\b\26\1\2\u00da\u00db\5,\27\2\u00db\u00e0\3\2\2\2\u00dc\u00dd\f\3\2\2"+
-		"\u00dd\u00df\5,\27\2\u00de\u00dc\3\2\2\2\u00df\u00e2\3\2\2\2\u00e0\u00de"+
-		"\3\2\2\2\u00e0\u00e1\3\2\2\2\u00e1+\3\2\2\2\u00e2\u00e0\3\2\2\2\u00e3"+
-		"\u00e6\5\60\31\2\u00e4\u00e6\5\22\n\2\u00e5\u00e3\3\2\2\2\u00e5\u00e4"+
-		"\3\2\2\2\u00e6-\3\2\2\2\u00e7\u00e8\t\2\2\2\u00e8/\3\2\2\2\u00e9\u00eb"+
-		"\7\t\2\2\u00ea\u00ec\5\66\34\2\u00eb\u00ea\3\2\2\2\u00eb\u00ec\3\2\2\2"+
-		"\u00ec\u00ed\3\2\2\2\u00ed\u00f6\5.\30\2\u00ee\u00f0\7\33\2\2\u00ef\u00f1"+
-		"\5:\36\2\u00f0\u00ef\3\2\2\2\u00f0\u00f1\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2"+
-		"\u00f3\58\35\2\u00f3\u00f4\7\34\2\2\u00f4\u00f7\3\2\2\2\u00f5\u00f7\5"+
-		"\34\17\2\u00f6\u00ee\3\2\2\2\u00f6\u00f5\3\2\2\2\u00f7\u00f9\3\2\2\2\u00f8"+
-		"\u00fa\5D#\2\u00f9\u00f8\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\61\3\2\2\2"+
-		"\u00fb\u00fd\5\64\33\2\u00fc\u00fb\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u00fe"+
-		"\3\2\2\2\u00fe\u00ff\7\"\2\2\u00ff\u0100\5J&\2\u0100\63\3\2\2\2\u0101"+
-		"\u0102\b\33\1\2\u0102\u0103\5J&\2\u0103\u0109\3\2\2\2\u0104\u0105\f\3"+
-		"\2\2\u0105\u0106\7&\2\2\u0106\u0108\5J&\2\u0107\u0104\3\2\2\2\u0108\u010b"+
-		"\3\2\2\2\u0109\u0107\3\2\2\2\u0109\u010a\3\2\2\2\u010a\65\3\2\2\2\u010b"+
-		"\u0109\3\2\2\2\u010c\u010d\7\31\2\2\u010d\u010e\5J&\2\u010e\u010f\7\32"+
-		"\2\2\u010f\67\3\2\2\2\u0110\u0111\b\35\1\2\u0111\u0112\t\3\2\2\u0112\u0121"+
-		"\58\35\f\u0113\u0114\7\31\2\2\u0114\u0115\58\35\2\u0115\u0116\7\32\2\2"+
-		"\u0116\u0121\3\2\2\2\u0117\u0121\5@!\2\u0118\u0119\7\3\2\2\u0119\u011b"+
-		"\7\31\2\2\u011a\u011c\5> \2\u011b\u011a\3\2\2\2\u011b\u011c\3\2\2\2\u011c"+
-		"\u011d\3\2\2\2\u011d\u0121\7\32\2\2\u011e\u011f\7.\2\2\u011f\u0121\5J"+
-		"&\2\u0120\u0110\3\2\2\2\u0120\u0113\3\2\2\2\u0120\u0117\3\2\2\2\u0120"+
-		"\u0118\3\2\2\2\u0120\u011e\3\2\2\2\u0121\u0133\3\2\2\2\u0122\u0123\f\n"+
-		"\2\2\u0123\u0124\t\4\2\2\u0124\u0132\58\35\13\u0125\u0126\f\t\2\2\u0126"+
-		"\u0127\t\5\2\2\u0127\u0132\58\35\n\u0128\u0129\f\b\2\2\u0129\u012a\t\6"+
-		"\2\2\u012a\u0132\58\35\t\u012b\u012c\f\7\2\2\u012c\u012d\t\7\2\2\u012d"+
-		"\u0132\58\35\b\u012e\u012f\f\6\2\2\u012f\u0130\t\b\2\2\u0130\u0132\58"+
-		"\35\7\u0131\u0122\3\2\2\2\u0131\u0125\3\2\2\2\u0131\u0128\3\2\2\2\u0131"+
-		"\u012b\3\2\2\2\u0131\u012e\3\2\2\2\u0132\u0135\3\2\2\2\u0133\u0131\3\2"+
-		"\2\2\u0133\u0134\3\2\2\2\u01349\3\2\2\2\u0135\u0133\3\2\2\2\u0136\u0137"+
-		"\b\36\1\2\u0137\u0138\5<\37\2\u0138\u013d\3\2\2\2\u0139\u013a\f\3\2\2"+
-		"\u013a\u013c\5<\37\2\u013b\u0139\3\2\2\2\u013c\u013f\3\2\2\2\u013d\u013b"+
-		"\3\2\2\2\u013d\u013e\3\2\2\2\u013e;\3\2\2\2\u013f\u013d\3\2\2\2\u0140"+
-		"\u0141\7.\2\2\u0141\u0142\5J&\2\u0142\u0143\7(\2\2\u0143\u0144\58\35\2"+
-		"\u0144=\3\2\2\2\u0145\u0146\b \1\2\u0146\u0147\58\35\2\u0147\u014d\3\2"+
-		"\2\2\u0148\u0149\f\3\2\2\u0149\u014a\7#\2\2\u014a\u014c\58\35\2\u014b"+
-		"\u0148\3\2\2\2\u014c\u014f\3\2\2\2\u014d\u014b\3\2\2\2\u014d\u014e\3\2"+
-		"\2\2\u014e?\3\2\2\2\u014f\u014d\3\2\2\2\u0150\u015b\7\16\2\2\u0151\u0153"+
-		"\7\60\2\2\u0152\u0154\7\61\2\2\u0153\u0152\3\2\2\2\u0153\u0154\3\2\2\2"+
-		"\u0154\u0156\3\2\2\2\u0155\u0157\7\62\2\2\u0156\u0155\3\2\2\2\u0156\u0157"+
-		"\3\2\2\2\u0157\u015b\3\2\2\2\u0158\u015b\7\r\2\2\u0159\u015b\5B\"\2\u015a"+
-		"\u0150\3\2\2\2\u015a\u0151\3\2\2\2\u015a\u0158\3\2\2\2\u015a\u0159\3\2"+
-		"\2\2\u015bA\3\2\2\2\u015c\u015d\t\t\2\2\u015dC\3\2\2\2\u015e\u0161\5F"+
-		"$\2\u015f\u0161\5H%\2\u0160\u015e\3\2\2\2\u0160\u015f\3\2\2\2\u0161E\3"+
-		"\2\2\2\u0162\u0163\t\n\2\2\u0163G\3\2\2\2\u0164\u0165\7 \2\2\u0165\u0166"+
-		"\7\60\2\2\u0166\u0167\7#\2\2\u0167\u0168\7\60\2\2\u0168\u0169\7!\2\2\u0169"+
-		"I\3\2\2\2\u016a\u016b\t\13\2\2\u016bK\3\2\2\2%PTek}\u0086\u0089\u008c"+
-		"\u00a0\u00ac\u00b3\u00bb\u00bf\u00c2\u00c8\u00d0\u00d7\u00e0\u00e5\u00eb"+
-		"\u00f0\u00f6\u00f9\u00fc\u0109\u011b\u0120\u0131\u0133\u013d\u014d\u0153"+
-		"\u0156\u015a\u0160";
+		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\3\2\3\2\3\2\3\3\5\3S\n\3\3"+
+		"\3\3\3\5\3W\n\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\7"+
+		"\5f\n\5\f\5\16\5i\13\5\3\6\3\6\3\6\5\6n\n\6\3\7\3\7\3\7\3\7\3\7\3\b\3"+
+		"\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\5\n\u0080\n\n\3\n\3\n\3\13\3\13"+
+		"\3\13\3\f\3\f\5\f\u0089\n\f\3\f\5\f\u008c\n\f\3\f\5\f\u008f\n\f\3\f\3"+
+		"\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3"+
+		"\20\3\20\5\20\u00a3\n\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\7\22"+
+		"\u00ad\n\22\f\22\16\22\u00b0\13\22\3\22\3\22\3\22\3\22\5\22\u00b6\n\22"+
+		"\3\23\3\23\3\23\3\23\3\24\3\24\5\24\u00be\n\24\3\24\3\24\5\24\u00c2\n"+
+		"\24\3\24\5\24\u00c5\n\24\3\24\3\24\3\24\3\24\5\24\u00cb\n\24\3\25\3\25"+
+		"\3\25\3\25\7\25\u00d1\n\25\f\25\16\25\u00d4\13\25\3\25\3\25\3\25\3\25"+
+		"\5\25\u00da\n\25\3\26\3\26\3\26\3\26\3\26\7\26\u00e1\n\26\f\26\16\26\u00e4"+
+		"\13\26\3\27\3\27\5\27\u00e8\n\27\3\30\3\30\3\31\3\31\5\31\u00ee\n\31\3"+
+		"\31\3\31\3\31\5\31\u00f3\n\31\3\31\3\31\3\31\3\31\5\31\u00f9\n\31\3\31"+
+		"\5\31\u00fc\n\31\3\32\5\32\u00ff\n\32\3\32\3\32\3\32\3\33\3\33\3\33\3"+
+		"\33\3\33\3\33\7\33\u010a\n\33\f\33\16\33\u010d\13\33\3\34\3\34\3\34\3"+
+		"\34\3\34\3\34\3\34\3\34\5\34\u0117\n\34\3\35\3\35\3\35\3\35\3\36\3\36"+
+		"\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\5\36\u0128\n\36\3\36\3\36"+
+		"\3\36\5\36\u012d\n\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36"+
+		"\3\36\3\36\3\36\3\36\3\36\7\36\u013e\n\36\f\36\16\36\u0141\13\36\3\37"+
+		"\3\37\3\37\3\37\3\37\7\37\u0148\n\37\f\37\16\37\u014b\13\37\3 \3 \3 \3"+
+		" \3 \3!\3!\3!\3!\3!\3!\7!\u0158\n!\f!\16!\u015b\13!\3\"\3\"\3\"\5\"\u0160"+
+		"\n\"\3\"\5\"\u0163\n\"\3\"\3\"\5\"\u0167\n\"\3#\3#\3$\3$\5$\u016d\n$\3"+
+		"%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\2\b\b*\64:<@(\2\4\6\b\n\f\16\20\22"+
+		"\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJL\2\f\4\2\37\37((\4\2"+
+		"\30\30%%\3\2+-\4\2%%))\3\2\21\24\3\2\17\20\3\2\25\26\3\2\13\f\3\2)+\4"+
+		"\2\3\3\63\63\2\u0189\2N\3\2\2\2\4R\3\2\2\2\6\\\3\2\2\2\b`\3\2\2\2\nm\3"+
+		"\2\2\2\fo\3\2\2\2\16t\3\2\2\2\20w\3\2\2\2\22{\3\2\2\2\24\u0083\3\2\2\2"+
+		"\26\u0086\3\2\2\2\30\u0092\3\2\2\2\32\u0096\3\2\2\2\34\u009a\3\2\2\2\36"+
+		"\u009e\3\2\2\2 \u00a4\3\2\2\2\"\u00b5\3\2\2\2$\u00b7\3\2\2\2&\u00ca\3"+
+		"\2\2\2(\u00d9\3\2\2\2*\u00db\3\2\2\2,\u00e7\3\2\2\2.\u00e9\3\2\2\2\60"+
+		"\u00eb\3\2\2\2\62\u00fe\3\2\2\2\64\u0103\3\2\2\2\66\u0116\3\2\2\28\u0118"+
+		"\3\2\2\2:\u012c\3\2\2\2<\u0142\3\2\2\2>\u014c\3\2\2\2@\u0151\3\2\2\2B"+
+		"\u0166\3\2\2\2D\u0168\3\2\2\2F\u016c\3\2\2\2H\u016e\3\2\2\2J\u0170\3\2"+
+		"\2\2L\u0176\3\2\2\2NO\5\b\5\2OP\7\2\2\3P\3\3\2\2\2QS\5\6\4\2RQ\3\2\2\2"+
+		"RS\3\2\2\2ST\3\2\2\2TV\7\33\2\2UW\5<\37\2VU\3\2\2\2VW\3\2\2\2WX\3\2\2"+
+		"\2XY\5:\36\2YZ\7\34\2\2Z[\7\2\2\3[\5\3\2\2\2\\]\7 \2\2]^\5L\'\2^_\7!\2"+
+		"\2_\7\3\2\2\2`a\b\5\1\2ab\5\n\6\2bg\3\2\2\2cd\f\3\2\2df\5\n\6\2ec\3\2"+
+		"\2\2fi\3\2\2\2ge\3\2\2\2gh\3\2\2\2h\t\3\2\2\2ig\3\2\2\2jn\5\26\f\2kn\5"+
+		"\16\b\2ln\5\f\7\2mj\3\2\2\2mk\3\2\2\2ml\3\2\2\2n\13\3\2\2\2op\7\4\2\2"+
+		"pq\7\31\2\2qr\5D#\2rs\7\32\2\2s\r\3\2\2\2tu\5\20\t\2uv\5*\26\2v\17\3\2"+
+		"\2\2wx\7\n\2\2xy\7(\2\2yz\5L\'\2z\21\3\2\2\2{|\7\n\2\2|}\7\31\2\2}\177"+
+		"\5L\'\2~\u0080\5\24\13\2\177~\3\2\2\2\177\u0080\3\2\2\2\u0080\u0081\3"+
+		"\2\2\2\u0081\u0082\7\32\2\2\u0082\23\3\2\2\2\u0083\u0084\7#\2\2\u0084"+
+		"\u0085\5\"\22\2\u0085\25\3\2\2\2\u0086\u0088\5\30\r\2\u0087\u0089\5\32"+
+		"\16\2\u0088\u0087\3\2\2\2\u0088\u0089\3\2\2\2\u0089\u008b\3\2\2\2\u008a"+
+		"\u008c\5\36\20\2\u008b\u008a\3\2\2\2\u008b\u008c\3\2\2\2\u008c\u008e\3"+
+		"\2\2\2\u008d\u008f\5 \21\2\u008e\u008d\3\2\2\2\u008e\u008f\3\2\2\2\u008f"+
+		"\u0090\3\2\2\2\u0090\u0091\5*\26\2\u0091\27\3\2\2\2\u0092\u0093\7\5\2"+
+		"\2\u0093\u0094\7(\2\2\u0094\u0095\5L\'\2\u0095\31\3\2\2\2\u0096\u0097"+
+		"\7\6\2\2\u0097\u0098\7(\2\2\u0098\u0099\7\r\2\2\u0099\33\3\2\2\2\u009a"+
+		"\u009b\7,\2\2\u009b\u009c\5\62\32\2\u009c\u009d\7,\2\2\u009d\35\3\2\2"+
+		"\2\u009e\u009f\7\7\2\2\u009f\u00a2\7(\2\2\u00a0\u00a3\5D#\2\u00a1\u00a3"+
+		"\5\34\17\2\u00a2\u00a0\3\2\2\2\u00a2\u00a1\3\2\2\2\u00a3\37\3\2\2\2\u00a4"+
+		"\u00a5\7\b\2\2\u00a5\u00a6\7(\2\2\u00a6\u00a7\5\"\22\2\u00a7!\3\2\2\2"+
+		"\u00a8\u00a9\7\33\2\2\u00a9\u00ae\5$\23\2\u00aa\u00ab\7#\2\2\u00ab\u00ad"+
+		"\5$\23\2\u00ac\u00aa\3\2\2\2\u00ad\u00b0\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae"+
+		"\u00af\3\2\2\2\u00af\u00b1\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b1\u00b2\7\34"+
+		"\2\2\u00b2\u00b6\3\2\2\2\u00b3\u00b4\7\33\2\2\u00b4\u00b6\7\34\2\2\u00b5"+
+		"\u00a8\3\2\2\2\u00b5\u00b3\3\2\2\2\u00b6#\3\2\2\2\u00b7\u00b8\5D#\2\u00b8"+
+		"\u00b9\7$\2\2\u00b9\u00ba\5&\24\2\u00ba%\3\2\2\2\u00bb\u00cb\5D#\2\u00bc"+
+		"\u00be\7%\2\2\u00bd\u00bc\3\2\2\2\u00bd\u00be\3\2\2\2\u00be\u00bf\3\2"+
+		"\2\2\u00bf\u00c1\7\60\2\2\u00c0\u00c2\7\61\2\2\u00c1\u00c0\3\2\2\2\u00c1"+
+		"\u00c2\3\2\2\2\u00c2\u00c4\3\2\2\2\u00c3\u00c5\7\62\2\2\u00c4\u00c3\3"+
+		"\2\2\2\u00c4\u00c5\3\2\2\2\u00c5\u00cb\3\2\2\2\u00c6\u00cb\5\"\22\2\u00c7"+
+		"\u00cb\5(\25\2\u00c8\u00cb\7\r\2\2\u00c9\u00cb\7\16\2\2\u00ca\u00bb\3"+
+		"\2\2\2\u00ca\u00bd\3\2\2\2\u00ca\u00c6\3\2\2\2\u00ca\u00c7\3\2\2\2\u00ca"+
+		"\u00c8\3\2\2\2\u00ca\u00c9\3\2\2\2\u00cb\'\3\2\2\2\u00cc\u00cd\7 \2\2"+
+		"\u00cd\u00d2\5&\24\2\u00ce\u00cf\7#\2\2\u00cf\u00d1\5&\24\2\u00d0\u00ce"+
+		"\3\2\2\2\u00d1\u00d4\3\2\2\2\u00d2\u00d0\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3"+
+		"\u00d5\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d5\u00d6\7!\2\2\u00d6\u00da\3\2"+
+		"\2\2\u00d7\u00d8\7 \2\2\u00d8\u00da\7!\2\2\u00d9\u00cc\3\2\2\2\u00d9\u00d7"+
+		"\3\2\2\2\u00da)\3\2\2\2\u00db\u00dc\b\26\1\2\u00dc\u00dd\5,\27\2\u00dd"+
+		"\u00e2\3\2\2\2\u00de\u00df\f\3\2\2\u00df\u00e1\5,\27\2\u00e0\u00de\3\2"+
+		"\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3"+
+		"+\3\2\2\2\u00e4\u00e2\3\2\2\2\u00e5\u00e8\5\60\31\2\u00e6\u00e8\5\22\n"+
+		"\2\u00e7\u00e5\3\2\2\2\u00e7\u00e6\3\2\2\2\u00e8-\3\2\2\2\u00e9\u00ea"+
+		"\t\2\2\2\u00ea/\3\2\2\2\u00eb\u00ed\7\t\2\2\u00ec\u00ee\58\35\2\u00ed"+
+		"\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2\u00ee\u00ef\3\2\2\2\u00ef\u00f8\5."+
+		"\30\2\u00f0\u00f2\7\33\2\2\u00f1\u00f3\5<\37\2\u00f2\u00f1\3\2\2\2\u00f2"+
+		"\u00f3\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4\u00f5\5:\36\2\u00f5\u00f6\7\34"+
+		"\2\2\u00f6\u00f9\3\2\2\2\u00f7\u00f9\5\34\17\2\u00f8\u00f0\3\2\2\2\u00f8"+
+		"\u00f7\3\2\2\2\u00f9\u00fb\3\2\2\2\u00fa\u00fc\5F$\2\u00fb\u00fa\3\2\2"+
+		"\2\u00fb\u00fc\3\2\2\2\u00fc\61\3\2\2\2\u00fd\u00ff\5\64\33\2\u00fe\u00fd"+
+		"\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101\7\"\2\2\u0101"+
+		"\u0102\5L\'\2\u0102\63\3\2\2\2\u0103\u0104\b\33\1\2\u0104\u0105\5\66\34"+
+		"\2\u0105\u010b\3\2\2\2\u0106\u0107\f\3\2\2\u0107\u0108\7&\2\2\u0108\u010a"+
+		"\5\66\34\2\u0109\u0106\3\2\2\2\u010a\u010d\3\2\2\2\u010b\u0109\3\2\2\2"+
+		"\u010b\u010c\3\2\2\2\u010c\65\3\2\2\2\u010d\u010b\3\2\2\2\u010e\u0117"+
+		"\5L\'\2\u010f\u0117\7\4\2\2\u0110\u0117\7\5\2\2\u0111\u0117\7\6\2\2\u0112"+
+		"\u0117\7\7\2\2\u0113\u0117\7\b\2\2\u0114\u0117\7\t\2\2\u0115\u0117\7\n"+
+		"\2\2\u0116\u010e\3\2\2\2\u0116\u010f\3\2\2\2\u0116\u0110\3\2\2\2\u0116"+
+		"\u0111\3\2\2\2\u0116\u0112\3\2\2\2\u0116\u0113\3\2\2\2\u0116\u0114\3\2"+
+		"\2\2\u0116\u0115\3\2\2\2\u0117\67\3\2\2\2\u0118\u0119\7\31\2\2\u0119\u011a"+
+		"\5L\'\2\u011a\u011b\7\32\2\2\u011b9\3\2\2\2\u011c\u011d\b\36\1\2\u011d"+
+		"\u011e\t\3\2\2\u011e\u012d\5:\36\f\u011f\u0120\7\31\2\2\u0120\u0121\5"+
+		":\36\2\u0121\u0122\7\32\2\2\u0122\u012d\3\2\2\2\u0123\u012d\5B\"\2\u0124"+
+		"\u0125\7\3\2\2\u0125\u0127\7\31\2\2\u0126\u0128\5@!\2\u0127\u0126\3\2"+
+		"\2\2\u0127\u0128\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u012d\7\32\2\2\u012a"+
+		"\u012b\7.\2\2\u012b\u012d\5L\'\2\u012c\u011c\3\2\2\2\u012c\u011f\3\2\2"+
+		"\2\u012c\u0123\3\2\2\2\u012c\u0124\3\2\2\2\u012c\u012a\3\2\2\2\u012d\u013f"+
+		"\3\2\2\2\u012e\u012f\f\n\2\2\u012f\u0130\t\4\2\2\u0130\u013e\5:\36\13"+
+		"\u0131\u0132\f\t\2\2\u0132\u0133\t\5\2\2\u0133\u013e\5:\36\n\u0134\u0135"+
+		"\f\b\2\2\u0135\u0136\t\6\2\2\u0136\u013e\5:\36\t\u0137\u0138\f\7\2\2\u0138"+
+		"\u0139\t\7\2\2\u0139\u013e\5:\36\b\u013a\u013b\f\6\2\2\u013b\u013c\t\b"+
+		"\2\2\u013c\u013e\5:\36\7\u013d\u012e\3\2\2\2\u013d\u0131\3\2\2\2\u013d"+
+		"\u0134\3\2\2\2\u013d\u0137\3\2\2\2\u013d\u013a\3\2\2\2\u013e\u0141\3\2"+
+		"\2\2\u013f\u013d\3\2\2\2\u013f\u0140\3\2\2\2\u0140;\3\2\2\2\u0141\u013f"+
+		"\3\2\2\2\u0142\u0143\b\37\1\2\u0143\u0144\5> \2\u0144\u0149\3\2\2\2\u0145"+
+		"\u0146\f\3\2\2\u0146\u0148\5> \2\u0147\u0145\3\2\2\2\u0148\u014b\3\2\2"+
+		"\2\u0149\u0147\3\2\2\2\u0149\u014a\3\2\2\2\u014a=\3\2\2\2\u014b\u0149"+
+		"\3\2\2\2\u014c\u014d\7.\2\2\u014d\u014e\5L\'\2\u014e\u014f\7(\2\2\u014f"+
+		"\u0150\5:\36\2\u0150?\3\2\2\2\u0151\u0152\b!\1\2\u0152\u0153\5:\36\2\u0153"+
+		"\u0159\3\2\2\2\u0154\u0155\f\3\2\2\u0155\u0156\7#\2\2\u0156\u0158\5:\36"+
+		"\2\u0157\u0154\3\2\2\2\u0158\u015b\3\2\2\2\u0159\u0157\3\2\2\2\u0159\u015a"+
+		"\3\2\2\2\u015aA\3\2\2\2\u015b\u0159\3\2\2\2\u015c\u0167\7\16\2\2\u015d"+
+		"\u015f\7\60\2\2\u015e\u0160\7\61\2\2\u015f\u015e\3\2\2\2\u015f\u0160\3"+
+		"\2\2\2\u0160\u0162\3\2\2\2\u0161\u0163\7\62\2\2\u0162\u0161\3\2\2\2\u0162"+
+		"\u0163\3\2\2\2\u0163\u0167\3\2\2\2\u0164\u0167\7\r\2\2\u0165\u0167\5D"+
+		"#\2\u0166\u015c\3\2\2\2\u0166\u015d\3\2\2\2\u0166\u0164\3\2\2\2\u0166"+
+		"\u0165\3\2\2\2\u0167C\3\2\2\2\u0168\u0169\t\t\2\2\u0169E\3\2\2\2\u016a"+
+		"\u016d\5H%\2\u016b\u016d\5J&\2\u016c\u016a\3\2\2\2\u016c\u016b\3\2\2\2"+
+		"\u016dG\3\2\2\2\u016e\u016f\t\n\2\2\u016fI\3\2\2\2\u0170\u0171\7 \2\2"+
+		"\u0171\u0172\7\60\2\2\u0172\u0173\7#\2\2\u0173\u0174\7\60\2\2\u0174\u0175"+
+		"\7!\2\2\u0175K\3\2\2\2\u0176\u0177\t\13\2\2\u0177M\3\2\2\2&RVgm\177\u0088"+
+		"\u008b\u008e\u00a2\u00ae\u00b5\u00bd\u00c1\u00c4\u00ca\u00d2\u00d9\u00e2"+
+		"\u00e7\u00ed\u00f2\u00f8\u00fb\u00fe\u010b\u0116\u0127\u012c\u013d\u013f"+
+		"\u0149\u0159\u015f\u0162\u0166\u016c";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {